Home | History | Annotate | Download | only in setuptools
      1 #!/usr/bin/env python
      2 """
      3 Distutils setup file, used to install or test 'setuptools'
      4 """
      5 
      6 import io
      7 import os
      8 import sys
      9 import textwrap
     10 
     11 import setuptools
     12 
     13 here = os.path.dirname(__file__)
     14 
     15 
     16 def require_metadata():
     17     "Prevent improper installs without necessary metadata. See #659"
     18     egg_info_dir = os.path.join(here, 'setuptools.egg-info')
     19     if not os.path.exists(egg_info_dir):
     20         msg = (
     21             "Cannot build setuptools without metadata. "
     22             "Run `bootstrap.py`."
     23         )
     24         raise RuntimeError(msg)
     25 
     26 
     27 def read_commands():
     28     command_ns = {}
     29     cmd_module_path = 'setuptools/command/__init__.py'
     30     init_path = os.path.join(here, cmd_module_path)
     31     with open(init_path) as init_file:
     32         exec(init_file.read(), command_ns)
     33     return command_ns['__all__']
     34 
     35 
     36 def _gen_console_scripts():
     37     yield "easy_install = setuptools.command.easy_install:main"
     38 
     39     # Gentoo distributions manage the python-version-specific scripts
     40     # themselves, so those platforms define an environment variable to
     41     # suppress the creation of the version-specific scripts.
     42     var_names = (
     43         'SETUPTOOLS_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT',
     44         'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT',
     45     )
     46     if any(os.environ.get(var) not in (None, "", "0") for var in var_names):
     47         return
     48     tmpl = "easy_install-{shortver} = setuptools.command.easy_install:main"
     49     yield tmpl.format(shortver=sys.version[:3])
     50 
     51 
     52 readme_path = os.path.join(here, 'README.rst')
     53 with io.open(readme_path, encoding='utf-8') as readme_file:
     54     long_description = readme_file.read()
     55 
     56 package_data = dict(
     57     setuptools=['script (dev).tmpl', 'script.tmpl', 'site-patch.py'],
     58 )
     59 
     60 force_windows_specific_files = (
     61     os.environ.get("SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES", "1").lower()
     62     not in ("", "0", "false", "no")
     63 )
     64 
     65 include_windows_files = (
     66     sys.platform == 'win32' or
     67     os.name == 'java' and os._name == 'nt' or
     68     force_windows_specific_files
     69 )
     70 
     71 if include_windows_files:
     72     package_data.setdefault('setuptools', []).extend(['*.exe'])
     73     package_data.setdefault('setuptools.command', []).extend(['*.xml'])
     74 
     75 needs_wheel = set(['release', 'bdist_wheel']).intersection(sys.argv)
     76 wheel = ['wheel'] if needs_wheel else []
     77 
     78 
     79 def pypi_link(pkg_filename):
     80     """
     81     Given the filename, including md5 fragment, construct the
     82     dependency link for PyPI.
     83     """
     84     root = 'https://files.pythonhosted.org/packages/source'
     85     name, sep, rest = pkg_filename.partition('-')
     86     parts = root, name[0], name, pkg_filename
     87     return '/'.join(parts)
     88 
     89 
     90 setup_params = dict(
     91     name="setuptools",
     92     version="39.1.0",
     93     description=(
     94         "Easily download, build, install, upgrade, and uninstall "
     95         "Python packages"
     96     ),
     97     author="Python Packaging Authority",
     98     author_email="distutils-sig (at] python.org",
     99     long_description=long_description,
    100     long_description_content_type='text/x-rst; charset=UTF-8',
    101     keywords="CPAN PyPI distutils eggs package management",
    102     url="https://github.com/pypa/setuptools",
    103     project_urls={
    104         "Documentation": "https://setuptools.readthedocs.io/",
    105     },
    106     src_root=None,
    107     packages=setuptools.find_packages(exclude=['*.tests']),
    108     package_data=package_data,
    109     py_modules=['easy_install'],
    110     zip_safe=True,
    111     entry_points={
    112         "distutils.commands": [
    113             "%(cmd)s = setuptools.command.%(cmd)s:%(cmd)s" % locals()
    114             for cmd in read_commands()
    115         ],
    116         "distutils.setup_keywords": [
    117             "eager_resources        = setuptools.dist:assert_string_list",
    118             "namespace_packages     = setuptools.dist:check_nsp",
    119             "extras_require         = setuptools.dist:check_extras",
    120             "install_requires       = setuptools.dist:check_requirements",
    121             "tests_require          = setuptools.dist:check_requirements",
    122             "setup_requires         = setuptools.dist:check_requirements",
    123             "python_requires        = setuptools.dist:check_specifier",
    124             "entry_points           = setuptools.dist:check_entry_points",
    125             "test_suite             = setuptools.dist:check_test_suite",
    126             "zip_safe               = setuptools.dist:assert_bool",
    127             "package_data           = setuptools.dist:check_package_data",
    128             "exclude_package_data   = setuptools.dist:check_package_data",
    129             "include_package_data   = setuptools.dist:assert_bool",
    130             "packages               = setuptools.dist:check_packages",
    131             "dependency_links       = setuptools.dist:assert_string_list",
    132             "test_loader            = setuptools.dist:check_importable",
    133             "test_runner            = setuptools.dist:check_importable",
    134             "use_2to3               = setuptools.dist:assert_bool",
    135             "convert_2to3_doctests  = setuptools.dist:assert_string_list",
    136             "use_2to3_fixers        = setuptools.dist:assert_string_list",
    137             "use_2to3_exclude_fixers = setuptools.dist:assert_string_list",
    138         ],
    139         "egg_info.writers": [
    140             "PKG-INFO = setuptools.command.egg_info:write_pkg_info",
    141             "requires.txt = setuptools.command.egg_info:write_requirements",
    142             "entry_points.txt = setuptools.command.egg_info:write_entries",
    143             "eager_resources.txt = setuptools.command.egg_info:overwrite_arg",
    144             (
    145                 "namespace_packages.txt = "
    146                 "setuptools.command.egg_info:overwrite_arg"
    147             ),
    148             "top_level.txt = setuptools.command.egg_info:write_toplevel_names",
    149             "depends.txt = setuptools.command.egg_info:warn_depends_obsolete",
    150             "dependency_links.txt = setuptools.command.egg_info:overwrite_arg",
    151         ],
    152         "console_scripts": list(_gen_console_scripts()),
    153         "setuptools.installation":
    154             ['eggsecutable = setuptools.command.easy_install:bootstrap'],
    155     },
    156     classifiers=textwrap.dedent("""
    157         Development Status :: 5 - Production/Stable
    158         Intended Audience :: Developers
    159         License :: OSI Approved :: MIT License
    160         Operating System :: OS Independent
    161         Programming Language :: Python :: 2
    162         Programming Language :: Python :: 2.7
    163         Programming Language :: Python :: 3
    164         Programming Language :: Python :: 3.3
    165         Programming Language :: Python :: 3.4
    166         Programming Language :: Python :: 3.5
    167         Programming Language :: Python :: 3.6
    168         Topic :: Software Development :: Libraries :: Python Modules
    169         Topic :: System :: Archiving :: Packaging
    170         Topic :: System :: Systems Administration
    171         Topic :: Utilities
    172         """).strip().splitlines(),
    173     python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*',
    174     extras_require={
    175         "ssl:sys_platform=='win32'": "wincertstore==0.2",
    176         "certs": "certifi==2016.9.26",
    177     },
    178     dependency_links=[
    179         pypi_link(
    180             'certifi-2016.9.26.tar.gz#md5=baa81e951a29958563689d868ef1064d',
    181         ),
    182         pypi_link(
    183             'wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2',
    184         ),
    185     ],
    186     scripts=[],
    187     setup_requires=[
    188     ] + wheel,
    189 )
    190 
    191 if __name__ == '__main__':
    192     # allow setup.py to run from another directory
    193     here and os.chdir(here)
    194     require_metadata()
    195     dist = setuptools.setup(**setup_params)
    196