Imported Upstream version 45.2.0 upstream/45.2.0
authorDongHun Kwak <dh0128.kwak@samsung.com>
Tue, 29 Dec 2020 22:05:02 +0000 (07:05 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Tue, 29 Dec 2020 22:05:02 +0000 (07:05 +0900)
56 files changed:
.bumpversion.cfg
.flake8 [new file with mode: 0644]
.github/workflows/python-tests.yml
.readthedocs.yml
.travis.yml
CHANGES.rst
appveyor.yml
azure-pipelines.yml [new file with mode: 0644]
bootstrap.py
docs/conf.py
docs/developer-guide.txt
docs/requirements.txt [deleted file]
pkg_resources/__init__.py
pkg_resources/tests/test_pkg_resources.py
pkg_resources/tests/test_resources.py
pytest.ini
setup.cfg
setuptools/__init__.py
setuptools/_imp.py
setuptools/archive_util.py
setuptools/build_meta.py
setuptools/command/build_clib.py
setuptools/command/build_ext.py
setuptools/command/easy_install.py
setuptools/command/egg_info.py
setuptools/command/install_lib.py
setuptools/command/install_scripts.py
setuptools/command/py36compat.py
setuptools/command/test.py
setuptools/command/upload_docs.py
setuptools/dep_util.py
setuptools/dist.py
setuptools/installer.py
setuptools/msvc.py
setuptools/namespaces.py
setuptools/package_index.py
setuptools/py27compat.py
setuptools/sandbox.py
setuptools/site-patch.py
setuptools/ssl_support.py
setuptools/tests/__init__.py
setuptools/tests/requirements.txt [new file with mode: 0644]
setuptools/tests/test_build_clib.py
setuptools/tests/test_build_meta.py
setuptools/tests/test_config.py
setuptools/tests/test_dist.py
setuptools/tests/test_easy_install.py
setuptools/tests/test_egg_info.py
setuptools/tests/test_setuptools.py
setuptools/tests/test_test.py
setuptools/tests/test_virtualenv.py
setuptools/tests/test_wheel.py
setuptools/wheel.py
tests/requirements.txt [deleted file]
tools/tox_pip.py
tox.ini

index ef8a3877519eb337c64c21ea6c84c9f27e422024..8e86f31f0962228a94b1fb8425735b14bc7b13b8 100644 (file)
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 45.1.0
+current_version = 45.2.0
 commit = True
 tag = True
 
diff --git a/.flake8 b/.flake8
new file mode 100644 (file)
index 0000000..c658061
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,12 @@
+[flake8]
+exclude=
+    .tox
+    setuptools/_vendor,
+    pkg_resources/_vendor
+ignore =
+    # W503 violates spec https://github.com/PyCQA/pycodestyle/issues/513
+    W503
+    # W504 has issues https://github.com/OCA/maintainer-quality-tools/issues/545
+    W504
+    setuptools/site-patch.py F821
+    setuptools/py*compat.py F811
index 71957abaa8aae923bc407c09097202d9890a473b..e3663cf0b891931b4e8d7b76c9fdb723c83c82ba 100644 (file)
@@ -1,4 +1,6 @@
-name: Test suite
+name: >-
+  ðŸ‘·
+  Test suite
 
 on:
   push:
@@ -8,32 +10,55 @@ on:
 
 jobs:
   tests:
-    name: ðŸ‘·
+    name: >-
+      ${{ matrix.python-version }}
+      /
+      ${{ matrix.os }}
     runs-on: ${{ matrix.os }}
     strategy:
       # max-parallel: 5
       matrix:
         python-version:
         - 3.8
+        - pypy3
         - 3.7
         - 3.6
         - 3.5
-        - 2.7
         os:
-        - ubuntu-18.04
+        - ubuntu-latest
         - ubuntu-16.04
         - macOS-latest
         # - windows-2019
         # - windows-2016
-        env:
-        - TOXENV: python
+
+    env:
+      NETWORK_REQUIRED: 1
+      TOX_PARALLEL_NO_SPINNER: 1
+      TOXENV: python
 
     steps:
     - uses: actions/checkout@master
     - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v1
+      uses: actions/setup-python@v1.1.1
+      with:
+        python-version: ${{ matrix.python-version }}
+    - name: Log Python version
+      run: >-
+        python --version
+    - name: Log Python location
+      run: >-
+        which python
+    - name: Log Python env
+      run: >-
+        python -m sysconfig
+    - name: Pip cache
+      uses: actions/cache@v1
       with:
-        version: ${{ matrix.python-version }}
+        path: ~/.cache/pip
+        key: ${{ runner.os }}-pip-${{ hashFiles('setup.cfg') }}
+        restore-keys: |
+          ${{ runner.os }}-pip-
+          ${{ runner.os }}-
     - name: Upgrade pip/setuptools/wheel
       run: >-
         python
@@ -47,15 +72,14 @@ jobs:
     - name: Log installed dists
       run: >-
         python -m pip freeze --all
+    - name: Adjust TOXENV for PyPy
+      if: startsWith(matrix.python-version, 'pypy')
+      run: >-
+        echo "::set-env name=TOXENV::${{ matrix.python-version }}"
     - name: Log env vars
       run: >-
         env
-      env: ${{ matrix.env }}
 
-    - name: Update egg_info based on setup.py in checkout
-      run: >-
-        python -m bootstrap
-      env: ${{ matrix.env }}
     - name: Verify that there's no cached Python modules in sources
       if: >-
         ! startsWith(matrix.os, 'windows-')
@@ -63,14 +87,16 @@ jobs:
         ! grep pyc setuptools.egg-info/SOURCES.txt
 
     - name: 'Initialize tox envs: ${{ matrix.env.TOXENV }}'
-      run: |
-        python -m tox --parallel auto --notest --skip-missing-interpreters false
-      env: ${{ matrix.env }}
+      run: >-
+        python -m
+        tox
+        --parallel auto
+        --notest
+        --skip-missing-interpreters false
     - name: Test with tox
-      run: |
-        ${{ startsWith(matrix.os, 'windows-') && 'setx NETWORK_REQUIRED ' || 'export NETWORK_REQUIRED=' }}1
-        python -m tox \
-        --parallel 0 \
-        -- \
+      run: >-
+        python -m
+        tox
+        --parallel auto
+        --
         --cov
-      env: ${{ matrix.env }}
index 3aef6b6be4e517d133562b4644564cf161da0ecf..7b994a3579a1e679ae38323184f8a8473f41cebe 100644 (file)
@@ -1,4 +1,5 @@
 python:
   version: 3
-  requirements_file: docs/requirements.txt
-  pip_install: false
+  extra_requirements:
+  - docs
+  pip_install: true
index 263386c8ddd1ef2743ec8bd205b62921e9bbf2fa..fe875ab64f9556bc59f78be5b460d7971e89fc1d 100644 (file)
@@ -40,8 +40,6 @@ install:
 - pip freeze --all
 - env
 
-# update egg_info based on setup.py in checkout
-- python bootstrap.py
 - "! grep pyc setuptools.egg-info/SOURCES.txt"
 
 script:
index 198854fc24d16d79094734c047dda3755011b069..f97f514208551a93409402d300ab07f64d5661c3 100644 (file)
@@ -1,3 +1,16 @@
+v45.2.0
+-------
+
+* #1905: Fixed defect in _imp, introduced in 41.6.0 when the 'tests' directory is not present.
+* #1941: Improve editable installs with PEP 518 build isolation:
+
+  * The ``--user`` option is now always available. A warning is issued if the user site directory is not available.
+  * The error shown when the install directory is not in ``PYTHONPATH`` has been turned into a warning.
+* #1981: Setuptools now declares its ``tests`` and ``docs`` dependencies in metadata (extras).
+* #1985: Add support for installing scripts in environments where bdist_wininst is missing (i.e. Python 3.9).
+* #1968: Add flake8-2020 to check for misuse of sys.version or sys.version_info.
+
+
 v45.1.0
 -------
 
index fc65a9a70df0240661405035b673a099e8342f95..f7ab22f6af19b1fe03e77ea1f22af04ce306fdbc 100644 (file)
@@ -28,7 +28,6 @@ test_script:
   - python -m pip install --disable-pip-version-check --upgrade pip setuptools wheel
   - pip install --upgrade tox tox-venv virtualenv
   - pip freeze --all
-  - python bootstrap.py
   - tox -- --cov
 
 after_test:
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
new file mode 100644 (file)
index 0000000..3e80bf4
--- /dev/null
@@ -0,0 +1,71 @@
+# Create the project in Azure with:
+# az devops project create --name $name --organization https://dev.azure.com/$org/ --visibility public
+# then configure the pipelines (through web UI)
+
+trigger:
+  branches:
+    include:
+    - '*'
+  tags:
+    include:
+    - '*'
+
+pool:
+  vmimage: 'Ubuntu-18.04'
+
+variables:
+- group: Azure secrets
+
+stages:
+- stage: Test
+  jobs:
+
+  - job: 'Test'
+    strategy:
+      matrix:
+        Python36:
+          python.version: '3.6'
+        Python38:
+          python.version: '3.8'
+      maxParallel: 4
+
+    steps:
+    - task: UsePythonVersion@0
+      inputs:
+        versionSpec: '$(python.version)'
+        architecture: 'x64'
+
+    - script: python -m pip install tox
+      displayName: 'Install tox'
+
+    - script: |
+        tox -- --junit-xml=test-results.xml
+      displayName: 'run tests'
+
+    - task: PublishTestResults@2
+      inputs:
+        testResultsFiles: '**/test-results.xml'
+        testRunTitle: 'Python $(python.version)'
+      condition: succeededOrFailed()
+
+- stage: Publish
+  dependsOn: Test
+  jobs:
+  - job: 'Publish'
+
+    steps:
+    - task: UsePythonVersion@0
+      inputs:
+        versionSpec: '3.8'
+        architecture: 'x64'
+
+    - script: python -m pip install tox
+      displayName: 'Install tox'
+
+    - script: |
+        tox -e release
+      env:
+        TWINE_PASSWORD: $(PyPI-token)
+      displayName: 'publish to PyPI'
+
+  condition: contains(variables['Build.SourceBranch'], 'tags')
index 8c7d7fc3e636f6d695ecfb9dda1f89658b2e7341..8fa9e4b554a51beab57bdc0e257808be69275f12 100644 (file)
@@ -25,6 +25,7 @@ minimal_egg_info = textwrap.dedent("""
     entry_points = setuptools.dist:check_entry_points
 
     [egg_info.writers]
+    PKG-INFO = setuptools.command.egg_info:write_pkg_info
     dependency_links.txt = setuptools.command.egg_info:overwrite_arg
     entry_points.txt = setuptools.command.egg_info:write_entries
     requires.txt = setuptools.command.egg_info:write_requirements
@@ -35,10 +36,11 @@ def ensure_egg_info():
     if os.path.exists('setuptools.egg-info'):
         return
     print("adding minimal entry_points")
-    build_egg_info()
+    add_minimal_info()
+    run_egg_info()
 
 
-def build_egg_info():
+def add_minimal_info():
     """
     Build a minimal egg-info, enough to invoke egg_info
     """
@@ -52,13 +54,6 @@ def run_egg_info():
     cmd = [sys.executable, 'setup.py', 'egg_info']
     print("Regenerating egg_info")
     subprocess.check_call(cmd)
-    print("...and again.")
-    subprocess.check_call(cmd)
-
-
-def main():
-    ensure_egg_info()
-    run_egg_info()
 
 
-__name__ == '__main__' and main()
+__name__ == '__main__' and ensure_egg_info()
index cbd19fb470c7a1f957bf0c7a571bbc1d021231fa..b92b50cccfe56ff33b3cbf49f8049fcccc305e6a 100644 (file)
@@ -1,23 +1,3 @@
-# -*- coding: utf-8 -*-
-#
-# Setuptools documentation build configuration file, created by
-# sphinx-quickstart on Fri Jul 17 14:22:37 2009.
-#
-# This file is execfile()d with the current directory set to its containing dir.
-#
-# The contents of this file are pickled, so don't put values in the namespace
-# that aren't pickleable (module imports are okay, they're removed automatically).
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-
 import subprocess
 import sys
 import os
@@ -26,14 +6,12 @@ import os
 # hack to run the bootstrap script so that jaraco.packaging.sphinx
 # can invoke setup.py
 'READTHEDOCS' in os.environ and subprocess.check_call(
-    [sys.executable, 'bootstrap.py'],
+    [sys.executable, '-m', 'bootstrap'],
     cwd=os.path.join(os.path.dirname(__file__), os.path.pardir),
 )
 
-# -- General configuration -----------------------------------------------------
+# -- General configuration --
 
-# Add any Sphinx extension module names here, as strings. They can be extensions
-# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
 extensions = ['jaraco.packaging.sphinx', 'rst.linker']
 
 # Add any paths that contain templates here, relative to this directory.
@@ -45,7 +23,8 @@ source_suffix = '.txt'
 # The master toctree document.
 master_doc = 'index'
 
-# A list of glob-style patterns that should be excluded when looking for source files.
+# A list of glob-style patterns that should be excluded
+# when looking for source files.
 exclude_patterns = ['requirements.txt']
 
 # List of directories, relative to source directory, that shouldn't be searched
@@ -55,7 +34,7 @@ exclude_trees = []
 # The name of the Pygments (syntax highlighting) style to use.
 pygments_style = 'sphinx'
 
-# -- Options for HTML output ---------------------------------------------------
+# -- Options for HTML output --
 
 # The theme to use for HTML and HTML Help pages.  Major themes that come with
 # Sphinx are currently 'default' and 'sphinxdoc'.
@@ -69,7 +48,10 @@ html_theme_path = ['_theme']
 html_use_smartypants = True
 
 # Custom sidebar templates, maps document names to template names.
-html_sidebars = {'index': ['relations.html', 'sourcelink.html', 'indexsidebar.html', 'searchbox.html']}
+html_sidebars = {
+    'index': [
+        'relations.html', 'sourcelink.html', 'indexsidebar.html',
+        'searchbox.html']}
 
 # If false, no module index is generated.
 html_use_modindex = False
@@ -77,14 +59,15 @@ html_use_modindex = False
 # If false, no index is generated.
 html_use_index = False
 
-# -- Options for LaTeX output --------------------------------------------------
+# -- Options for LaTeX output --
 
 # Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title, author, documentclass [howto/manual]).
-latex_documents = [
-  ('index', 'Setuptools.tex', 'Setuptools Documentation',
-   'The fellowship of the packaging', 'manual'),
-]
+# (source start file, target name, title, author,
+# documentclass [howto/manual]).
+latex_documents = [(
+    'index', 'Setuptools.tex', 'Setuptools Documentation',
+    'The fellowship of the packaging', 'manual',
+)]
 
 link_files = {
     '../CHANGES.rst': dict(
index d145fba140546448b528ef8364af9ec8c89a1b02..0b4ae4d4c37937c515c45ff44ecae895f208cced 100644 (file)
@@ -104,12 +104,8 @@ from the command line after pushing a new branch.
 Testing
 -------
 
-The primary tests are run using tox. To run the tests, first create the metadata
-needed to run the tests::
-
-    $ python bootstrap.py
-
-Then make sure you have tox installed, and invoke it::
+The primary tests are run using tox.  Make sure you have tox installed,
+and invoke it::
 
     $ tox
 
diff --git a/docs/requirements.txt b/docs/requirements.txt
deleted file mode 100644 (file)
index bc27165..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-sphinx!=1.8.0
-rst.linker>=1.9
-jaraco.packaging>=6.1
-
-setuptools>=34
index 3fa883ceb451d1b1c00bd203c4153f0bff30e4e9..75563f95dfd980c6f8c097aec3856a32e9425d8a 100644 (file)
@@ -2329,7 +2329,8 @@ register_namespace_handler(object, null_ns_handler)
 
 def normalize_path(filename):
     """Normalize a file/dir name for comparison purposes"""
-    return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename))))
+    return os.path.normcase(os.path.realpath(os.path.normpath(
+        _cygwin_patch(filename))))
 
 
 def _cygwin_patch(filename):  # pragma: nocover
@@ -3288,6 +3289,7 @@ def _initialize_master_working_set():
     list(map(working_set.add_entry, sys.path))
     globals().update(locals())
 
+
 class PkgResourcesDeprecationWarning(Warning):
     """
     Base class for warning about deprecations in ``pkg_resources``
index 5960868a52eaeb6532d63b2e7797735a8ce72c75..78281869a6a8a22a18bdd039d611e84cd1952380 100644 (file)
@@ -17,7 +17,9 @@ try:
 except ImportError:
     import mock
 
-from pkg_resources import DistInfoDistribution, Distribution, EggInfoDistribution
+from pkg_resources import (
+    DistInfoDistribution, Distribution, EggInfoDistribution,
+)
 from setuptools.extern import six
 from pkg_resources.extern.six.moves import map
 from pkg_resources.extern.six import text_type, string_types
@@ -279,8 +281,8 @@ def make_distribution_no_version(tmpdir, basename):
         ('dist-info', 'METADATA', DistInfoDistribution),
     ],
 )
-def test_distribution_version_missing(tmpdir, suffix, expected_filename,
-    expected_dist_type):
+def test_distribution_version_missing(
+        tmpdir, suffix, expected_filename, expected_dist_type):
     """
     Test Distribution.version when the "Version" header is missing.
     """
index 93fa711438b699dc0284b8d847309b2b52eb4dca..ed7cdfcc3f8e66fcfe1f3b3d261ebcf1c91dfae5 100644 (file)
@@ -15,7 +15,7 @@ import pkg_resources
 from pkg_resources import (
     parse_requirements, VersionConflict, parse_version,
     Distribution, EntryPoint, Requirement, safe_version, safe_name,
-    WorkingSet, PkgResourcesDeprecationWarning)
+    WorkingSet)
 
 
 # from Python 3.6 docs.
@@ -501,7 +501,6 @@ class TestEntryPoints:
             ep.load(require=False)
 
 
-
 class TestRequirements:
     def testBasics(self):
         r = Requirement.parse("Twisted>=1.2")
index 0bc1ec01140cec2dd74577314cd22091ee787a8a..904fe3363c701386b2b6b18c64a21256b5de05a5 100644 (file)
@@ -1,9 +1,6 @@
 [pytest]
-addopts=--doctest-modules --doctest-glob=pkg_resources/api_tests.txt -r sxX
-norecursedirs=dist build *.egg setuptools/extern pkg_resources/extern pkg_resources/tests/data tools .*
-flake8-ignore =
-    setuptools/site-patch.py F821
-    setuptools/py*compat.py F811
+addopts=--doctest-modules --flake8 --doctest-glob=pkg_resources/api_tests.txt -r sxX
+norecursedirs=dist build *.egg setuptools/extern pkg_resources/extern pkg_resources/tests/data tools .* setuptools/_vendor pkg_resources/_vendor
 doctest_optionflags=ELLIPSIS ALLOW_UNICODE
 filterwarnings =
        # https://github.com/pypa/setuptools/issues/1823
index bef019eed8acb6c3e007b5d1cf91928549d20224..8cca64774d088e5b080358345f0c9e677c376a9b 100644 (file)
--- a/setup.cfg
+++ b/setup.cfg
@@ -16,7 +16,7 @@ formats = zip
 
 [metadata]
 name = setuptools
-version = 45.1.0
+version = 45.2.0
 description = Easily download, build, install, upgrade, and uninstall Python packages
 author = Python Packaging Authority
 author_email = distutils-sig@python.org
@@ -55,5 +55,25 @@ exclude = *.tests
 [options.extras_require]
 ssl =
     wincertstore==0.2; sys_platform=='win32'
+
 certs =
     certifi==2016.9.26
+
+tests =
+    mock
+    pytest-flake8
+    flake8-2020; python_version>="3.6"
+    virtualenv>=13.0.0
+    pytest-virtualenv>=1.2.7
+    pytest>=3.7
+    wheel
+    coverage>=4.5.1
+    pytest-cov>=2.5.1
+    paver; python_version>="3.6"
+    futures; python_version=="2.7"
+    pip>=19.1 # For proper file:// URLs support.
+
+docs =
+    sphinx
+    jaraco.packaging>=6.1
+    rst.linker>=1.9
index a71b2bbdc6170963a66959c48080c1dedc7bb703..07d6b6fa3bc0c382eeab0af6c9953799e284c23a 100644 (file)
@@ -1,7 +1,6 @@
 """Extensions to the 'distutils' for large or complex distributions"""
 
 import os
-import sys
 import functools
 import distutils.core
 import distutils.filelist
@@ -31,7 +30,7 @@ __all__ = [
 ]
 
 if PY3:
-  __all__.append('find_namespace_packages')
+    __all__.append('find_namespace_packages')
 
 __version__ = setuptools.version.__version__
 
@@ -123,7 +122,7 @@ class PEP420PackageFinder(PackageFinder):
 find_packages = PackageFinder.find
 
 if PY3:
-  find_namespace_packages = PEP420PackageFinder.find
+    find_namespace_packages = PEP420PackageFinder.find
 
 
 def _install_setup_requires(attrs):
@@ -144,6 +143,7 @@ def setup(**attrs):
     _install_setup_requires(attrs)
     return distutils.core.setup(**attrs)
 
+
 setup.__doc__ = distutils.core.setup.__doc__
 
 
@@ -191,8 +191,8 @@ class Command(_Command):
                 ok = False
             if not ok:
                 raise DistutilsOptionError(
-                      "'%s' must be a list of strings (got %r)"
-                      % (option, val))
+                    "'%s' must be a list of strings (got %r)"
+                    % (option, val))
 
     def reinitialize_command(self, command, reinit_subcommands=0, **kw):
         cmd = _Command.reinitialize_command(self, command, reinit_subcommands)
index a3cce9b284b1e580c1715c5e300a18077d63e8ce..451e45a831d8cf293099ff924a8528b902185fe0 100644 (file)
@@ -17,9 +17,18 @@ C_BUILTIN = 6
 PY_FROZEN = 7
 
 
+def find_spec(module, paths):
+    finder = (
+        importlib.machinery.PathFinder().find_spec
+        if isinstance(paths, list) else
+        importlib.util.find_spec
+    )
+    return finder(module, paths)
+
+
 def find_module(module, paths=None):
     """Just like 'imp.find_module()', but with package support"""
-    spec = importlib.util.find_spec(module, paths)
+    spec = find_spec(module, paths)
     if spec is None:
         raise ImportError("Can't find %s" % module)
     if not spec.has_location and hasattr(spec, 'submodule_search_locations'):
@@ -60,14 +69,14 @@ def find_module(module, paths=None):
 
 
 def get_frozen_object(module, paths=None):
-    spec = importlib.util.find_spec(module, paths)
+    spec = find_spec(module, paths)
     if not spec:
         raise ImportError("Can't find %s" % module)
     return spec.loader.get_code(module)
 
 
 def get_module(module, paths, info):
-    spec = importlib.util.find_spec(module, paths)
+    spec = find_spec(module, paths)
     if not spec:
         raise ImportError("Can't find %s" % module)
     return module_from_spec(spec)
index 81436044d995ff430334a7ef324b08e616f4b7a7..64528ca7a52a44cfd2dd74361f1821925392f316 100644 (file)
@@ -25,7 +25,8 @@ def default_filter(src, dst):
     return dst
 
 
-def unpack_archive(filename, extract_dir, progress_filter=default_filter,
+def unpack_archive(
+        filename, extract_dir, progress_filter=default_filter,
         drivers=None):
     """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat``
 
@@ -148,7 +149,8 @@ def unpack_tarfile(filename, extract_dir, progress_filter=default_filter):
 
                 # resolve any links and to extract the link targets as normal
                 # files
-                while member is not None and (member.islnk() or member.issym()):
+                while member is not None and (
+                        member.islnk() or member.issym()):
                     linkpath = member.linkname
                     if member.issym():
                         base = posixpath.dirname(member.name)
index eb9e815ef85a46382c75022005a9ab5d7a44033d..a1c951cf5996da6b087d1da30c0337af741c7fc1 100644 (file)
@@ -48,6 +48,7 @@ __all__ = ['get_requires_for_build_sdist',
            '__legacy__',
            'SetupRequirementsError']
 
+
 class SetupRequirementsError(BaseException):
     def __init__(self, specifiers):
         self.specifiers = specifiers
@@ -143,7 +144,8 @@ class _BuildMetaBackend(object):
 
     def get_requires_for_build_wheel(self, config_settings=None):
         config_settings = self._fix_config(config_settings)
-        return self._get_build_requires(config_settings, requirements=['wheel'])
+        return self._get_build_requires(
+            config_settings, requirements=['wheel'])
 
     def get_requires_for_build_sdist(self, config_settings=None):
         config_settings = self._fix_config(config_settings)
@@ -160,8 +162,10 @@ class _BuildMetaBackend(object):
             dist_infos = [f for f in os.listdir(dist_info_directory)
                           if f.endswith('.dist-info')]
 
-            if (len(dist_infos) == 0 and
-                len(_get_immediate_subdirectories(dist_info_directory)) == 1):
+            if (
+                len(dist_infos) == 0 and
+                len(_get_immediate_subdirectories(dist_info_directory)) == 1
+            ):
 
                 dist_info_directory = os.path.join(
                     dist_info_directory, os.listdir(dist_info_directory)[0])
@@ -193,7 +197,8 @@ class _BuildMetaBackend(object):
                         config_settings["--global-option"])
             self.run_setup()
 
-            result_basename = _file_with_extension(tmp_dist_dir, result_extension)
+            result_basename = _file_with_extension(
+                tmp_dist_dir, result_extension)
             result_path = os.path.join(result_directory, result_basename)
             if os.path.exists(result_path):
                 # os.rename will fail overwriting on non-Unix.
@@ -202,7 +207,6 @@ class _BuildMetaBackend(object):
 
         return result_basename
 
-
     def build_wheel(self, wheel_directory, config_settings=None,
                     metadata_directory=None):
         return self._build_with_temp_dir(['bdist_wheel'], '.whl',
@@ -217,9 +221,12 @@ class _BuildMetaBackend(object):
 class _BuildMetaLegacyBackend(_BuildMetaBackend):
     """Compatibility backend for setuptools
 
-    This is a version of setuptools.build_meta that endeavors to maintain backwards
-    compatibility with pre-PEP 517 modes of invocation. It exists as a temporary
-    bridge between the old packaging mechanism and the new packaging mechanism,
+    This is a version of setuptools.build_meta that endeavors
+    to maintain backwards
+    compatibility with pre-PEP 517 modes of invocation. It
+    exists as a temporary
+    bridge between the old packaging mechanism and the new
+    packaging mechanism,
     and will eventually be removed.
     """
     def run_setup(self, setup_script='setup.py'):
@@ -250,6 +257,7 @@ class _BuildMetaLegacyBackend(_BuildMetaBackend):
             sys.path[:] = sys_path
             sys.argv[0] = sys_argv_0
 
+
 # The primary backend
 _BACKEND = _BuildMetaBackend()
 
index 09caff6ffde8fc3f368cb635dc3cbbbc8851530d..67ce2444ea69a0bbdfab0bda8c2aa14951187096 100644 (file)
@@ -25,9 +25,9 @@ class build_clib(orig.build_clib):
             sources = build_info.get('sources')
             if sources is None or not isinstance(sources, (list, tuple)):
                 raise DistutilsSetupError(
-                       "in 'libraries' option (library '%s'), "
-                       "'sources' must be present and must be "
-                       "a list of source filenames" % lib_name)
+                    "in 'libraries' option (library '%s'), "
+                    "'sources' must be present and must be "
+                    "a list of source filenames" % lib_name)
             sources = list(sources)
 
             log.info("building '%s' library", lib_name)
@@ -38,9 +38,9 @@ class build_clib(orig.build_clib):
             obj_deps = build_info.get('obj_deps', dict())
             if not isinstance(obj_deps, dict):
                 raise DistutilsSetupError(
-                       "in 'libraries' option (library '%s'), "
-                       "'obj_deps' must be a dictionary of "
-                       "type 'source: list'" % lib_name)
+                    "in 'libraries' option (library '%s'), "
+                    "'obj_deps' must be a dictionary of "
+                    "type 'source: list'" % lib_name)
             dependencies = []
 
             # Get the global dependencies that are specified by the '' key.
@@ -48,9 +48,9 @@ class build_clib(orig.build_clib):
             global_deps = obj_deps.get('', list())
             if not isinstance(global_deps, (list, tuple)):
                 raise DistutilsSetupError(
-                       "in 'libraries' option (library '%s'), "
-                       "'obj_deps' must be a dictionary of "
-                       "type 'source: list'" % lib_name)
+                    "in 'libraries' option (library '%s'), "
+                    "'obj_deps' must be a dictionary of "
+                    "type 'source: list'" % lib_name)
 
             # Build the list to be used by newer_pairwise_group
             # each source will be auto-added to its dependencies.
@@ -60,39 +60,42 @@ class build_clib(orig.build_clib):
                 extra_deps = obj_deps.get(source, list())
                 if not isinstance(extra_deps, (list, tuple)):
                     raise DistutilsSetupError(
-                           "in 'libraries' option (library '%s'), "
-                           "'obj_deps' must be a dictionary of "
-                           "type 'source: list'" % lib_name)
+                        "in 'libraries' option (library '%s'), "
+                        "'obj_deps' must be a dictionary of "
+                        "type 'source: list'" % lib_name)
                 src_deps.extend(extra_deps)
                 dependencies.append(src_deps)
 
             expected_objects = self.compiler.object_filenames(
-                    sources,
-                    output_dir=self.build_temp
-                    )
+                sources,
+                output_dir=self.build_temp,
+            )
 
-            if newer_pairwise_group(dependencies, expected_objects) != ([], []):
+            if (
+                newer_pairwise_group(dependencies, expected_objects)
+                != ([], [])
+            ):
                 # First, compile the source code to object files in the library
                 # directory.  (This should probably change to putting object
                 # files in a temporary build directory.)
                 macros = build_info.get('macros')
                 include_dirs = build_info.get('include_dirs')
                 cflags = build_info.get('cflags')
-                objects = self.compiler.compile(
-                        sources,
-                        output_dir=self.build_temp,
-                        macros=macros,
-                        include_dirs=include_dirs,
-                        extra_postargs=cflags,
-                        debug=self.debug
-                        )
+                self.compiler.compile(
+                    sources,
+                    output_dir=self.build_temp,
+                    macros=macros,
+                    include_dirs=include_dirs,
+                    extra_postargs=cflags,
+                    debug=self.debug
+                )
 
             # Now "link" the object files together into a static library.
             # (On Unix at least, this isn't really linking -- it just
             # builds an archive.  Whatever.)
             self.compiler.create_static_lib(
-                    expected_objects,
-                    lib_name,
-                    output_dir=self.build_clib,
-                    debug=self.debug
-                    )
+                expected_objects,
+                lib_name,
+                output_dir=self.build_clib,
+                debug=self.debug
+            )
index 1b51e040b4560d45cdce245179d2b6a21b2a8b4a..03b6f3467f9e763538180609a888afec457087d5 100644 (file)
@@ -14,7 +14,8 @@ from setuptools.extern import six
 if six.PY2:
     import imp
 
-    EXTENSION_SUFFIXES = [s for s, _, tp in imp.get_suffixes() if tp == imp.C_EXTENSION]
+    EXTENSION_SUFFIXES = [
+        s for s, _, tp in imp.get_suffixes() if tp == imp.C_EXTENSION]
 else:
     from importlib.machinery import EXTENSION_SUFFIXES
 
@@ -29,7 +30,7 @@ except ImportError:
 
 # make sure _config_vars is initialized
 get_config_var("LDSHARED")
-from distutils.sysconfig import _config_vars as _CONFIG_VARS
+from distutils.sysconfig import _config_vars as _CONFIG_VARS  # noqa
 
 
 def _customize_compiler_for_shlib(compiler):
@@ -65,7 +66,9 @@ elif os.name != 'nt':
     except ImportError:
         pass
 
-if_dl = lambda s: s if have_rtld else ''
+
+def if_dl(s):
+    return s if have_rtld else ''
 
 
 def get_abi3_suffix():
index 426301d6f331e38af9236491db566d8107e376f3..abca1ae1996f82b600a3a118900f23d2ac45aac5 100644 (file)
@@ -121,7 +121,8 @@ else:
             return False
 
 
-_one_liner = lambda text: textwrap.dedent(text).strip().replace('\n', '; ')
+def _one_liner(text):
+    return textwrap.dedent(text).strip().replace('\n', '; ')
 
 
 class easy_install(Command):
@@ -156,19 +157,16 @@ class easy_install(Command):
          "allow building eggs from local checkouts"),
         ('version', None, "print version information and exit"),
         ('no-find-links', None,
-         "Don't load find-links defined in packages being installed")
+         "Don't load find-links defined in packages being installed"),
+        ('user', None, "install in user site-package '%s'" % site.USER_SITE)
     ]
     boolean_options = [
         'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy',
         'editable',
-        'no-deps', 'local-snapshots-ok', 'version'
+        'no-deps', 'local-snapshots-ok', 'version',
+        'user'
     ]
 
-    if site.ENABLE_USER_SITE:
-        help_msg = "install in user site-package '%s'" % site.USER_SITE
-        user_options.append(('user', None, help_msg))
-        boolean_options.append('user')
-
     negative_opt = {'always-unzip': 'zip-ok'}
     create_index = PackageIndex
 
@@ -272,6 +270,9 @@ class easy_install(Command):
             self.config_vars['userbase'] = self.install_userbase
             self.config_vars['usersite'] = self.install_usersite
 
+        elif self.user:
+            log.warn("WARNING: The user site-packages directory is disabled.")
+
         self._fix_install_dir_for_user_site()
 
         self.expand_basedirs()
@@ -414,8 +415,8 @@ class easy_install(Command):
         if show_deprecation:
             self.announce(
                 "WARNING: The easy_install command is deprecated "
-                "and will be removed in a future version."
-                log.WARN,
+                "and will be removed in a future version.",
+                log.WARN,
             )
         if self.verbose != self.distribution.verbose:
             log.set_verbosity(self.verbose)
@@ -478,8 +479,9 @@ class easy_install(Command):
                 self.cant_write_to_target()
 
         if not is_site_dir and not self.multi_version:
-            # Can't install non-multi to non-site dir
-            raise DistutilsError(self.no_default_version_msg())
+            # Can't install non-multi to non-site dir with easy_install
+            pythonpath = os.environ.get('PYTHONPATH', '')
+            log.warn(self.__no_default_msg, self.install_dir, pythonpath)
 
         if is_site_dir:
             if self.pth_file is None:
@@ -507,13 +509,13 @@ class easy_install(Command):
         the distutils default setting) was:
 
             %s
-        """).lstrip()
+        """).lstrip()  # noqa
 
     __not_exists_id = textwrap.dedent("""
         This directory does not currently exist.  Please create it and try again, or
         choose a different installation directory (using the -d or --install-dir
         option).
-        """).lstrip()
+        """).lstrip()  # noqa
 
     __access_msg = textwrap.dedent("""
         Perhaps your account does not have write access to this directory?  If the
@@ -529,7 +531,7 @@ class easy_install(Command):
           https://setuptools.readthedocs.io/en/latest/easy_install.html
 
         Please make the appropriate changes for your system and try again.
-        """).lstrip()
+        """).lstrip()  # noqa
 
     def cant_write_to_target(self):
         msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,)
@@ -1093,13 +1095,13 @@ class easy_install(Command):
             pkg_resources.require("%(name)s")  # latest installed version
             pkg_resources.require("%(name)s==%(version)s")  # this exact version
             pkg_resources.require("%(name)s>=%(version)s")  # this version or higher
-        """).lstrip()
+        """).lstrip()  # noqa
 
     __id_warning = textwrap.dedent("""
         Note also that the installation directory must be on sys.path at runtime for
         this to work.  (e.g. by being the application's script directory, by being on
         PYTHONPATH, or by being added to sys.path by your code.)
-        """)
+        """)  # noqa
 
     def installation_report(self, req, dist, what="Installed"):
         """Helpful installation message for display to package users"""
@@ -1124,7 +1126,7 @@ class easy_install(Command):
             %(python)s setup.py develop
 
         See the setuptools documentation for the "develop" command for more info.
-        """).lstrip()
+        """).lstrip()  # noqa
 
     def report_editable(self, spec, setup_script):
         dirname = os.path.dirname(setup_script)
@@ -1307,11 +1309,8 @@ class easy_install(Command):
           https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations
 
 
-        Please make the appropriate changes for your system and try again.""").lstrip()
-
-    def no_default_version_msg(self):
-        template = self.__no_default_msg
-        return template % (self.install_dir, os.environ.get('PYTHONPATH', ''))
+        Please make the appropriate changes for your system and try again.
+        """).strip()
 
     def install_site_py(self):
         """Make sure there's a site.py in the target dir, if needed"""
@@ -2093,7 +2092,8 @@ class ScriptWriter:
     @classmethod
     def get_script_header(cls, script_text, executable=None, wininst=False):
         # for backward compatibility
-        warnings.warn("Use get_header", EasyInstallDeprecationWarning, stacklevel=2)
+        warnings.warn(
+            "Use get_header", EasyInstallDeprecationWarning, stacklevel=2)
         if wininst:
             executable = "python.exe"
         return cls.get_header(script_text, executable)
@@ -2342,6 +2342,8 @@ def _patch_usage():
     finally:
         distutils.core.gen_usage = saved
 
+
 class EasyInstallDeprecationWarning(SetuptoolsDeprecationWarning):
-    """Class for warning about deprecations in EasyInstall in SetupTools. Not ignored by default, unlike DeprecationWarning."""
-    
+    """
+    Warning for EasyInstall deprecations, bypassing suppression.
+    """
index a5c5a2fc197ef679052b09495c85b34ab5544785..7fa89541cdbc98b868f2edf01e0dfcb62306d952 100644 (file)
@@ -33,6 +33,7 @@ from setuptools.glob import glob
 from setuptools.extern import packaging
 from setuptools import SetuptoolsDeprecationWarning
 
+
 def translate_pattern(glob):
     """
     Translate a file path glob like '*.txt' in to a regular expression.
@@ -113,7 +114,7 @@ def translate_pattern(glob):
             pat += sep
 
     pat += r'\Z'
-    return re.compile(pat, flags=re.MULTILINE|re.DOTALL)
+    return re.compile(pat, flags=re.MULTILINE | re.DOTALL)
 
 
 class InfoCommon:
@@ -637,7 +638,9 @@ def warn_depends_obsolete(cmd, basename, filename):
 
 def _write_requirements(stream, reqs):
     lines = yield_lines(reqs or ())
-    append_cr = lambda line: line + '\n'
+
+    def append_cr(line):
+        return line + '\n'
     lines = map(append_cr, lines)
     stream.writelines(lines)
 
@@ -703,7 +706,8 @@ def get_pkg_info_revision():
     Get a -r### off of PKG-INFO Version in case this is an sdist of
     a subversion revision.
     """
-    warnings.warn("get_pkg_info_revision is deprecated.", EggInfoDeprecationWarning)
+    warnings.warn(
+        "get_pkg_info_revision is deprecated.", EggInfoDeprecationWarning)
     if os.path.exists('PKG-INFO'):
         with io.open('PKG-INFO') as f:
             for line in f:
@@ -714,4 +718,4 @@ def get_pkg_info_revision():
 
 
 class EggInfoDeprecationWarning(SetuptoolsDeprecationWarning):
-    """Class for warning about deprecations in eggInfo in setupTools. Not ignored by default, unlike DeprecationWarning."""
+    """Deprecated behavior warning for EggInfo, bypassing suppression."""
index 07d659330930c66cf33615fcb72fe4f6df54326b..2e9d8757a582b1dcdb47a34c35c6cfb3ed23ba90 100644 (file)
@@ -77,7 +77,8 @@ class install_lib(orig.install_lib):
         if not hasattr(sys, 'implementation'):
             return
 
-        base = os.path.join('__pycache__', '__init__.' + sys.implementation.cache_tag)
+        base = os.path.join(
+            '__pycache__', '__init__.' + sys.implementation.cache_tag)
         yield base + '.pyc'
         yield base + '.pyo'
         yield base + '.opt-1.pyc'
index 16234273a2d36b0b3d821a7a97bf8f03cf3f2948..8c9a15e2bbda0ecb1442d1792627b695509e3330 100644 (file)
@@ -32,8 +32,11 @@ class install_scripts(orig.install_scripts):
         )
         bs_cmd = self.get_finalized_command('build_scripts')
         exec_param = getattr(bs_cmd, 'executable', None)
-        bw_cmd = self.get_finalized_command("bdist_wininst")
-        is_wininst = getattr(bw_cmd, '_is_running', False)
+        try:
+            bw_cmd = self.get_finalized_command("bdist_wininst")
+            is_wininst = getattr(bw_cmd, '_is_running', False)
+        except ImportError:
+            is_wininst = False
         writer = ei.ScriptWriter
         if is_wininst:
             exec_param = "python.exe"
index 61063e7542586c05c3af21d31cd917ebd1118272..2886055862c65c7159287191b3eaa54f4ab3913f 100644 (file)
@@ -132,5 +132,5 @@ class sdist_add_defaults:
 
 if hasattr(sdist.sdist, '_add_defaults_standards'):
     # disable the functionality already available upstream
-    class sdist_add_defaults:
+    class sdist_add_defaults:  # noqa
         pass
index f6470e9c346dc1987491a735496628057160a4ef..2d83967dd9182a7cd6c56074d1386e71fd134c64 100644 (file)
@@ -129,7 +129,8 @@ class test(Command):
 
     @contextlib.contextmanager
     def project_on_sys_path(self, include_dists=[]):
-        with_2to3 = not six.PY2 and getattr(self.distribution, 'use_2to3', False)
+        with_2to3 = not six.PY2 and getattr(
+            self.distribution, 'use_2to3', False)
 
         if with_2to3:
             # If we run 2to3 we can not do this inplace:
index 130a0cb6c9f4e469daa4fe638301049a2b7fab70..0351da77738e6857312f5726e3b0bb00032ae9cf 100644 (file)
@@ -127,8 +127,8 @@ class upload_docs(upload):
         """
         Build up the MIME payload for the POST data
         """
-        boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
-        sep_boundary = b'\n--' + boundary
+        boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
+        sep_boundary = b'\n--' + boundary.encode('ascii')
         end_boundary = sep_boundary + b'--'
         end_items = end_boundary, b"\n",
         builder = functools.partial(
@@ -138,7 +138,7 @@ class upload_docs(upload):
         part_groups = map(builder, data.items())
         parts = itertools.chain.from_iterable(part_groups)
         body_items = itertools.chain(parts, end_items)
-        content_type = 'multipart/form-data; boundary=%s' % boundary.decode('ascii')
+        content_type = 'multipart/form-data; boundary=%s' % boundary
         return b''.join(body_items), content_type
 
     def upload_file(self, filename):
index 2931c13ec35aa60b742ac4c46ceabd4ed32a5511..521eb716a5ebbcbc2c59654c4e71c3f0ff1abf26 100644 (file)
@@ -1,5 +1,6 @@
 from distutils.dep_util import newer_group
 
+
 # yes, this is was almost entirely copy-pasted from
 # 'newer_pairwise()', this is just another convenience
 # function.
@@ -10,7 +11,8 @@ def newer_pairwise_group(sources_groups, targets):
     of 'newer_group()'.
     """
     if len(sources_groups) != len(targets):
-        raise ValueError("'sources_group' and 'targets' must be the same length")
+        raise ValueError(
+            "'sources_group' and 'targets' must be the same length")
 
     # build a pair of lists (sources_groups, targets) where source is newer
     n_sources = []
index fe5adf46077d60affda4f2ae300a244c9cd11f61..ad54839b0f674ab60716c9ddcb027c6d408b9cc9 100644 (file)
@@ -162,7 +162,7 @@ def write_pkg_file(self, file):
     if self.download_url:
         write_field('Download-URL', self.download_url)
     for project_url in self.project_urls.items():
-        write_field('Project-URL',  '%s, %s' % project_url)
+        write_field('Project-URL', '%s, %s' % project_url)
 
     long_desc = rfc822_escape(self.get_long_description())
     write_field('Description', long_desc)
index 9f8be2ef8427651e3b0fbef497535e152dde66b1..1f183bd9af390418ef179ac0b2da88d0f6544c42 100644 (file)
@@ -64,8 +64,8 @@ def fetch_build_egg(dist, req):
         dist.announce(
             'WARNING: The pip package is not available, falling back '
             'to EasyInstall for handling setup_requires/test_requires; '
-            'this is deprecated and will be removed in a future version.'
-            log.WARN
+            'this is deprecated and will be removed in a future version.',
+            log.WARN
         )
         return _legacy_fetch_build_egg(dist, req)
     # Warn if wheel is not.
index 2ffe1c81ee629c98246e9e72bf630431fa7905b6..c2cbd1e543cf66b13a0d78be638ae00a5d4c94b0 100644 (file)
@@ -544,7 +544,7 @@ class SystemInfo:
 
         # Except for VS15+, VC version is aligned with VS version
         self.vs_ver = self.vc_ver = (
-                vc_ver or self._find_latest_available_vs_ver())
+            vc_ver or self._find_latest_available_vs_ver())
 
     def _find_latest_available_vs_ver(self):
         """
@@ -1225,7 +1225,7 @@ class EnvironmentInfo:
             arch_subdir = self.pi.target_dir(x64=True)
             lib = join(self.si.WindowsSdkDir, 'lib')
             libver = self._sdk_subdir
-            return [join(lib, '%sum%s' % (libver , arch_subdir))]
+            return [join(lib, '%sum%s' % (libver, arch_subdir))]
 
     @property
     def OSIncludes(self):
@@ -1274,13 +1274,16 @@ class EnvironmentInfo:
             libpath += [
                 ref,
                 join(self.si.WindowsSdkDir, 'UnionMetadata'),
-                join(ref, 'Windows.Foundation.UniversalApiContract', '1.0.0.0'),
+                join(
+                    ref, 'Windows.Foundation.UniversalApiContract', '1.0.0.0'),
                 join(ref, 'Windows.Foundation.FoundationContract', '1.0.0.0'),
-                join(ref,'Windows.Networking.Connectivity.WwanContract',
-                     '1.0.0.0'),
-                join(self.si.WindowsSdkDir, 'ExtensionSDKs', 'Microsoft.VCLibs',
-                     '%0.1f' % self.vs_ver, 'References', 'CommonConfiguration',
-                     'neutral'),
+                join(
+                    ref, 'Windows.Networking.Connectivity.WwanContract',
+                    '1.0.0.0'),
+                join(
+                    self.si.WindowsSdkDir, 'ExtensionSDKs', 'Microsoft.VCLibs',
+                    '%0.1f' % self.vs_ver, 'References', 'CommonConfiguration',
+                    'neutral'),
             ]
         return libpath
 
index dc16106d3dc7048a160129745756bbc9b1fb51d9..5f403c96d7b3df72f0d77d15c3e230f72bc96c24 100644 (file)
@@ -47,13 +47,17 @@ class Installer:
         "p = os.path.join(%(root)s, *%(pth)r)",
         "importlib = has_mfs and __import__('importlib.util')",
         "has_mfs and __import__('importlib.machinery')",
-        "m = has_mfs and "
+        (
+            "m = has_mfs and "
             "sys.modules.setdefault(%(pkg)r, "
-                "importlib.util.module_from_spec("
-                    "importlib.machinery.PathFinder.find_spec(%(pkg)r, "
-                        "[os.path.dirname(p)])))",
-        "m = m or "
-            "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))",
+            "importlib.util.module_from_spec("
+            "importlib.machinery.PathFinder.find_spec(%(pkg)r, "
+            "[os.path.dirname(p)])))"
+        ),
+        (
+            "m = m or "
+            "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))"
+        ),
         "mp = (m or []) and m.__dict__.setdefault('__path__',[])",
         "(p not in mp) and mp.append(p)",
     )
index f419d47167b39a71275744b2f2a78f85c9919a8d..82eb45169fc065b3697fefb436ae5bfcf9fcbcfe 100644 (file)
@@ -46,7 +46,8 @@ __all__ = [
 _SOCKET_TIMEOUT = 15
 
 _tmpl = "setuptools/{setuptools.__version__} Python-urllib/{py_major}"
-user_agent = _tmpl.format(py_major='{}.{}'.format(*sys.version_info), setuptools=setuptools)
+user_agent = _tmpl.format(
+    py_major='{}.{}'.format(*sys.version_info), setuptools=setuptools)
 
 
 def parse_requirement_arg(spec):
@@ -1092,7 +1093,8 @@ def open_with_auth(url, opener=urllib.request.urlopen):
 
 # copy of urllib.parse._splituser from Python 3.8
 def _splituser(host):
-    """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'."""
+    """splituser('user[:passwd]@host[:port]')
+    --> 'user[:passwd]', 'host[:port]'."""
     user, delim, host = host.rpartition('@')
     return (user if delim else None), host
 
index 1d57360f4eff13cd94a25fec989036a0b0b80523..ba39af52b69bc561e2723957b927dae5a3669858 100644 (file)
@@ -16,7 +16,7 @@ def get_all_headers(message, key):
 
 
 if six.PY2:
-    def get_all_headers(message, key):
+    def get_all_headers(message, key):  # noqa
         return message.getheaders(key)
 
 
index 685f3f72e3611a5fa99c999e233ffd179c431a6d..e46dfc8d25e8accf6fb08c13b878da1550e4738f 100644 (file)
@@ -13,6 +13,8 @@ from setuptools.extern import six
 from setuptools.extern.six.moves import builtins, map
 
 import pkg_resources.py31compat
+from distutils.errors import DistutilsError
+from pkg_resources import working_set
 
 if sys.platform.startswith('java'):
     import org.python.modules.posix.PosixModule as _os
@@ -23,8 +25,6 @@ try:
 except NameError:
     _file = None
 _open = open
-from distutils.errors import DistutilsError
-from pkg_resources import working_set
 
 
 __all__ = [
@@ -374,7 +374,7 @@ class AbstractSandbox:
 
 
 if hasattr(os, 'devnull'):
-    _EXCEPTIONS = [os.devnull,]
+    _EXCEPTIONS = [os.devnull]
 else:
     _EXCEPTIONS = []
 
@@ -466,7 +466,8 @@ class DirectorySandbox(AbstractSandbox):
 
 
 WRITE_FLAGS = functools.reduce(
-    operator.or_, [getattr(_os, a, 0) for a in
+    operator.or_, [
+        getattr(_os, a, 0) for a in
         "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()]
 )
 
index 40b00de0a799686485b266fd92abb9fb100ed718..be0d43d3540fa1a413cea3fa00aa2ae9d962a1a0 100644 (file)
@@ -38,22 +38,24 @@ def __boot():
     else:
         raise ImportError("Couldn't find the real 'site' module")
 
-    known_paths = dict([(makepath(item)[1], 1) for item in sys.path])  # 2.2 comp
+    # 2.2 comp
+    known_paths = dict([(
+        makepath(item)[1], 1) for item in sys.path])  # noqa
 
     oldpos = getattr(sys, '__egginsert', 0)  # save old insertion position
     sys.__egginsert = 0  # and reset the current one
 
     for item in PYTHONPATH:
-        addsitedir(item)
+        addsitedir(item)  # noqa
 
     sys.__egginsert += oldpos  # restore effective old position
 
-    d, nd = makepath(stdpath[0])
+    d, nd = makepath(stdpath[0])  # noqa
     insert_at = None
     new_path = []
 
     for item in sys.path:
-        p, np = makepath(item)
+        p, np = makepath(item)  # noqa
 
         if np == nd and insert_at is None:
             # We've hit the first 'system' path entry, so added entries go here
index 226db694bb38791147c6bf2881c4b86025dd2f8f..17c14c4694cd714a385e30503956d4e14ad6dabe 100644 (file)
@@ -35,7 +35,8 @@ try:
 except AttributeError:
     HTTPSHandler = HTTPSConnection = object
 
-is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection)
+is_available = ssl is not None and object not in (
+    HTTPSHandler, HTTPSConnection)
 
 
 try:
@@ -85,8 +86,10 @@ if not match_hostname:
             return dn.lower() == hostname.lower()
 
         # RFC 6125, section 6.4.3, subitem 1.
-        # The client SHOULD NOT attempt to match a presented identifier in which
-        # the wildcard character comprises a label other than the left-most label.
+        # The client SHOULD NOT attempt to match a
+        # presented identifier in which the wildcard
+        # character comprises a label other than the
+        # left-most label.
         if leftmost == '*':
             # When '*' is a fragment by itself, it matches a non-empty dotless
             # fragment.
@@ -137,15 +140,16 @@ if not match_hostname:
                             return
                         dnsnames.append(value)
         if len(dnsnames) > 1:
-            raise CertificateError("hostname %r "
-                "doesn't match either of %s"
+            raise CertificateError(
+                "hostname %r doesn't match either of %s"
                 % (hostname, ', '.join(map(repr, dnsnames))))
         elif len(dnsnames) == 1:
-            raise CertificateError("hostname %r "
-                "doesn't match %r"
+            raise CertificateError(
+                "hostname %r doesn't match %r"
                 % (hostname, dnsnames[0]))
         else:
-            raise CertificateError("no appropriate commonName or "
+            raise CertificateError(
+                "no appropriate commonName or "
                 "subjectAltName fields were found")
 
 
@@ -158,7 +162,8 @@ class VerifyingHTTPSHandler(HTTPSHandler):
 
     def https_open(self, req):
         return self.do_open(
-            lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req
+            lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw),
+            req
         )
 
 
index 5f4a1c2958fdd382f6b08e7ceab5ac9618566b9a..9c77b51f8dbef00c6d2f78b3ee34beabf33ee19f 100644 (file)
@@ -6,7 +6,7 @@ from setuptools.extern.six import PY2, PY3
 
 
 __all__ = [
-  'fail_on_ascii', 'py2_only', 'py3_only'
+    'fail_on_ascii', 'py2_only', 'py3_only'
 ]
 
 
diff --git a/setuptools/tests/requirements.txt b/setuptools/tests/requirements.txt
new file mode 100644 (file)
index 0000000..19bf5ae
--- /dev/null
@@ -0,0 +1,12 @@
+mock
+pytest-flake8
+flake8-2020; python_version>="3.6"
+virtualenv>=13.0.0
+pytest-virtualenv>=1.2.7
+pytest>=3.7
+wheel
+coverage>=4.5.1
+pytest-cov>=2.5.1
+paver; python_version>="3.6"
+futures; python_version=="2.7"
+pip>=19.1 # For proper file:// URLs support.
index 3779e679eaca702389974eb4c0b99237cf13f623..48bea2b43d0c0c9f3e3b797fe2c43114dbded139 100644 (file)
@@ -8,8 +8,7 @@ from setuptools.dist import Distribution
 
 class TestBuildCLib:
     @mock.patch(
-            'setuptools.command.build_clib.newer_pairwise_group'
-            )
+        'setuptools.command.build_clib.newer_pairwise_group')
     def test_build_libraries(self, mock_newer):
         dist = Distribution()
         cmd = build_clib(dist)
index d68444f66470f965eead450ca03cbc721b015a28..8fcf3055ff0807098b5f3000c68590f7b6d64e15 100644 (file)
@@ -23,6 +23,7 @@ class BuildBackendBase:
         self.env = env
         self.backend_name = backend_name
 
+
 class BuildBackend(BuildBackendBase):
     """PEP 517 Build Backend"""
 
index 69d8d00db37a81359a76888118e224cdc47255e7..2fa0b374e265dd421413840da352a5685a650fa5 100644 (file)
@@ -695,7 +695,7 @@ class TestOptions:
         )
         with get_dist(tmpdir) as dist:
             assert set(dist.packages) == set(
-                ['fake_package',  'fake_package.sub_two'])
+                ['fake_package', 'fake_package.sub_two'])
 
     @py2_only
     def test_find_namespace_directive_fails_on_py2(self, tmpdir):
@@ -748,7 +748,7 @@ class TestOptions:
         )
         with get_dist(tmpdir) as dist:
             assert set(dist.packages) == {
-                'fake_package',  'fake_package.sub_two'
+                'fake_package', 'fake_package.sub_two'
             }
 
     def test_extras_require(self, tmpdir):
@@ -881,7 +881,7 @@ class TestExternalSetters:
         return None
 
     @patch.object(_Distribution, '__init__', autospec=True)
-    def test_external_setters(self,  mock_parent_init, tmpdir):
+    def test_external_setters(self, mock_parent_init, tmpdir):
         mock_parent_init.side_effect = self._fake_distribution_init
 
         dist = Distribution(attrs={
index 36237f24a24a427e5da483be953888addeb005f3..6e8c45fd302f699b79955f2a0379c37aa0673058 100644 (file)
@@ -61,7 +61,8 @@ def test_dist_fetch_build_egg(tmpdir):
             dist.fetch_build_egg(r)
             for r in reqs
         ]
-    assert [dist.key for dist in resolved_dists if dist] == reqs
+    # noqa below because on Python 2 it causes flakes
+    assert [dist.key for dist in resolved_dists if dist] == reqs  # noqa
 
 
 def test_dist__get_unpatched_deprecated():
@@ -284,7 +285,7 @@ def test_provides_extras_deterministic_order():
     dist = Distribution(attrs)
     assert dist.metadata.provides_extras == ['b', 'a']
 
-   
+
 CHECK_PACKAGE_DATA_TESTS = (
     # Valid.
     ({
@@ -309,7 +310,8 @@ CHECK_PACKAGE_DATA_TESTS = (
     ({
         'hello': str('*.msg'),
     }, (
-        "\"values of 'package_data' dict\" must be a list of strings (got '*.msg')"
+        "\"values of 'package_data' dict\" "
+        "must be a list of strings (got '*.msg')"
     )),
     # Invalid value type (generators are single use)
     ({
@@ -321,10 +323,12 @@ CHECK_PACKAGE_DATA_TESTS = (
 )
 
 
-@pytest.mark.parametrize('package_data, expected_message', CHECK_PACKAGE_DATA_TESTS)
+@pytest.mark.parametrize(
+    'package_data, expected_message', CHECK_PACKAGE_DATA_TESTS)
 def test_check_package_data(package_data, expected_message):
     if expected_message is None:
         assert check_package_data(None, 'package_data', package_data) is None
     else:
-        with pytest.raises(DistutilsSetupError, match=re.escape(expected_message)):
+        with pytest.raises(
+                DistutilsSetupError, match=re.escape(expected_message)):
             check_package_data(None, str('package_data'), package_data)
index 2be1be47e82739c557bbf16218d1b249135a9586..534392b99d7ac6bd884fa1dad8935210b4a7c83f 100644 (file)
@@ -629,7 +629,7 @@ class TestSetupRequires:
                 test_pkg = create_setup_requires_package(
                     temp_dir, setup_attrs=dict(version='attr: foobar.version'),
                     make_package=make_dependency_sdist,
-                    use_setup_cfg=use_setup_cfg+('version',),
+                    use_setup_cfg=use_setup_cfg + ('version',),
                 )
                 test_setup_py = os.path.join(test_pkg, 'setup.py')
                 with contexts.quiet() as (stdout, stderr):
@@ -671,8 +671,10 @@ class TestSetupRequires:
                 dep_url = path_to_url(dep_sdist, authority='localhost')
                 test_pkg = create_setup_requires_package(
                     temp_dir,
-                    'python-xlib', '0.19', # Ignored (overriden by setup_attrs).
-                    setup_attrs=dict(setup_requires='dependency @ %s' % dep_url))
+                    # Ignored (overriden by setup_attrs)
+                    'python-xlib', '0.19',
+                    setup_attrs=dict(
+                        setup_requires='dependency @ %s' % dep_url))
                 test_setup_py = os.path.join(test_pkg, 'setup.py')
                 run_setup(test_setup_py, [str('--version')])
         assert len(mock_index.requests) == 0
@@ -710,11 +712,14 @@ class TestSetupRequires:
         dep_1_0_sdist = 'dep-1.0.tar.gz'
         dep_1_0_url = path_to_url(str(tmpdir / dep_1_0_sdist))
         dep_1_0_python_requires = '>=2.7'
-        make_python_requires_sdist(str(tmpdir / dep_1_0_sdist), 'dep', '1.0', dep_1_0_python_requires)
+        make_python_requires_sdist(
+            str(tmpdir / dep_1_0_sdist), 'dep', '1.0', dep_1_0_python_requires)
         dep_2_0_sdist = 'dep-2.0.tar.gz'
         dep_2_0_url = path_to_url(str(tmpdir / dep_2_0_sdist))
-        dep_2_0_python_requires = '!=' + '.'.join(map(str, sys.version_info[:2])) + '.*'
-        make_python_requires_sdist(str(tmpdir / dep_2_0_sdist), 'dep', '2.0', dep_2_0_python_requires)
+        dep_2_0_python_requires = '!=' + '.'.join(
+            map(str, sys.version_info[:2])) + '.*'
+        make_python_requires_sdist(
+            str(tmpdir / dep_2_0_sdist), 'dep', '2.0', dep_2_0_python_requires)
         index = tmpdir / 'index.html'
         index.write_text(DALS(
             '''
@@ -726,7 +731,7 @@ class TestSetupRequires:
                 <a href="{dep_2_0_url}" data-requires-python="{dep_2_0_python_requires}">{dep_2_0_sdist}</a><br/>
             </body>
             </html>
-            ''').format(
+            ''').format(  # noqa
                 dep_1_0_url=dep_1_0_url,
                 dep_1_0_sdist=dep_1_0_sdist,
                 dep_1_0_python_requires=dep_1_0_python_requires,
@@ -738,23 +743,29 @@ class TestSetupRequires:
         with contexts.save_pkg_resources_state():
             test_pkg = create_setup_requires_package(
                 str(tmpdir),
-                'python-xlib', '0.19', # Ignored (overriden by setup_attrs).
-                setup_attrs=dict(setup_requires='dep', dependency_links=[index_url]))
+                'python-xlib', '0.19',  # Ignored (overriden by setup_attrs).
+                setup_attrs=dict(
+                    setup_requires='dep', dependency_links=[index_url]))
             test_setup_py = os.path.join(test_pkg, 'setup.py')
             run_setup(test_setup_py, [str('--version')])
-        eggs = list(map(str, pkg_resources.find_distributions(os.path.join(test_pkg, '.eggs'))))
+        eggs = list(map(str, pkg_resources.find_distributions(
+            os.path.join(test_pkg, '.eggs'))))
         assert eggs == ['dep 1.0']
 
-    @pytest.mark.parametrize('use_legacy_installer,with_dependency_links_in_setup_py',
-                             itertools.product((False, True), (False, True)))
-    def test_setup_requires_with_find_links_in_setup_cfg(self, monkeypatch,
-                                                         use_legacy_installer,
-                                                         with_dependency_links_in_setup_py):
+    @pytest.mark.parametrize(
+        'use_legacy_installer,with_dependency_links_in_setup_py',
+        itertools.product((False, True), (False, True)))
+    def test_setup_requires_with_find_links_in_setup_cfg(
+            self, monkeypatch, use_legacy_installer,
+            with_dependency_links_in_setup_py):
         monkeypatch.setenv(str('PIP_RETRIES'), str('0'))
         monkeypatch.setenv(str('PIP_TIMEOUT'), str('0'))
         with contexts.save_pkg_resources_state():
             with contexts.tempdir() as temp_dir:
-                make_trivial_sdist(os.path.join(temp_dir, 'python-xlib-42.tar.gz'), 'python-xlib', '42')
+                make_trivial_sdist(
+                    os.path.join(temp_dir, 'python-xlib-42.tar.gz'),
+                    'python-xlib',
+                    '42')
                 test_pkg = os.path.join(temp_dir, 'test_pkg')
                 test_setup_py = os.path.join(test_pkg, 'setup.py')
                 test_setup_cfg = os.path.join(test_pkg, 'setup.cfg')
@@ -771,7 +782,7 @@ class TestSetupRequires:
                             installer.fetch_build_egg = installer._legacy_fetch_build_egg
                         setup(setup_requires='python-xlib==42',
                         dependency_links={dependency_links!r})
-                        ''').format(use_legacy_installer=use_legacy_installer,
+                        ''').format(use_legacy_installer=use_legacy_installer,  # noqa
                                     dependency_links=dependency_links))
                 with open(test_setup_cfg, 'w') as fp:
                     fp.write(DALS(
@@ -783,14 +794,17 @@ class TestSetupRequires:
                                     find_links=temp_dir))
                 run_setup(test_setup_py, [str('--version')])
 
-    def test_setup_requires_with_transitive_extra_dependency(self, monkeypatch):
+    def test_setup_requires_with_transitive_extra_dependency(
+            self, monkeypatch):
         # Use case: installing a package with a build dependency on
         # an already installed `dep[extra]`, which in turn depends
         # on `extra_dep` (whose is not already installed).
         with contexts.save_pkg_resources_state():
             with contexts.tempdir() as temp_dir:
                 # Create source distribution for `extra_dep`.
-                make_trivial_sdist(os.path.join(temp_dir, 'extra_dep-1.0.tar.gz'), 'extra_dep', '1.0')
+                make_trivial_sdist(
+                    os.path.join(temp_dir, 'extra_dep-1.0.tar.gz'),
+                    'extra_dep', '1.0')
                 # Create source tree for `dep`.
                 dep_pkg = os.path.join(temp_dir, 'dep')
                 os.mkdir(dep_pkg)
@@ -806,12 +820,12 @@ class TestSetupRequires:
                     'setup.cfg': '',
                 }, prefix=dep_pkg)
                 # "Install" dep.
-                run_setup(os.path.join(dep_pkg, 'setup.py'), [str('dist_info')])
+                run_setup(
+                    os.path.join(dep_pkg, 'setup.py'), [str('dist_info')])
                 working_set.add_entry(dep_pkg)
                 # Create source tree for test package.
                 test_pkg = os.path.join(temp_dir, 'test_pkg')
                 test_setup_py = os.path.join(test_pkg, 'setup.py')
-                test_setup_cfg = os.path.join(test_pkg, 'setup.cfg')
                 os.mkdir(test_pkg)
                 with open(test_setup_py, 'w') as fp:
                     fp.write(DALS(
@@ -881,16 +895,19 @@ def make_nspkg_sdist(dist_path, distname, version):
 
 def make_python_requires_sdist(dist_path, distname, version, python_requires):
     make_sdist(dist_path, [
-        ('setup.py', DALS("""\
-                          import setuptools
-                          setuptools.setup(
-                              name={name!r},
-                              version={version!r},
-                              python_requires={python_requires!r},
-                          )
-                          """).format(name=distname, version=version,
-                                      python_requires=python_requires)),
-         ('setup.cfg', ''),
+        (
+            'setup.py',
+            DALS("""\
+                import setuptools
+                setuptools.setup(
+                  name={name!r},
+                  version={version!r},
+                  python_requires={python_requires!r},
+                )
+                """).format(
+                name=distname, version=version,
+                python_requires=python_requires)),
+        ('setup.cfg', ''),
     ])
 
 
@@ -948,16 +965,16 @@ def create_setup_requires_package(path, distname='foobar', version='0.1',
                 value = ';'.join(value)
             section.append('%s: %s' % (name, value))
         test_setup_cfg_contents = DALS(
-                """
-                [metadata]
-                {metadata}
-                [options]
-                {options}
-                """
-            ).format(
-                options='\n'.join(options),
-                metadata='\n'.join(metadata),
-            )
+            """
+            [metadata]
+            {metadata}
+            [options]
+            {options}
+            """
+        ).format(
+            options='\n'.join(options),
+            metadata='\n'.join(metadata),
+        )
     else:
         test_setup_cfg_contents = ''
     with open(os.path.join(test_pkg, 'setup.cfg'), 'w') as f:
index 0db204baa3c0b40c17f3988ba8c594a533a92aa8..109f913587bae9288213a764882905cdd66e30b1 100644 (file)
@@ -525,19 +525,19 @@ class TestEggInfo:
                               license_file = LICENSE
                               """),
             'LICENSE': "Test license"
-        }, True), # with license
+        }, True),  # with license
         ({
             'setup.cfg': DALS("""
                               [metadata]
                               license_file = INVALID_LICENSE
                               """),
             'LICENSE': "Test license"
-        }, False), # with an invalid license
+        }, False),  # with an invalid license
         ({
             'setup.cfg': DALS("""
                               """),
             'LICENSE': "Test license"
-        }, False), # no license_file attribute
+        }, False),  # no license_file attribute
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -545,7 +545,7 @@ class TestEggInfo:
                               """),
             'MANIFEST.in': "exclude LICENSE",
             'LICENSE': "Test license"
-        }, False) # license file is manually excluded
+        }, False)  # license file is manually excluded
     ])
     def test_setup_cfg_license_file(
             self, tmpdir_cwd, env, files, license_in_sources):
@@ -565,7 +565,8 @@ class TestEggInfo:
             assert 'LICENSE' in sources_text
         else:
             assert 'LICENSE' not in sources_text
-            assert 'INVALID_LICENSE' not in sources_text # for invalid license test
+            # for invalid license test
+            assert 'INVALID_LICENSE' not in sources_text
 
     @pytest.mark.parametrize("files, incl_licenses, excl_licenses", [
         ({
@@ -577,7 +578,7 @@ class TestEggInfo:
                               """),
             'LICENSE-ABC': "ABC license",
             'LICENSE-XYZ': "XYZ license"
-        }, ['LICENSE-ABC', 'LICENSE-XYZ'], []), # with licenses
+        }, ['LICENSE-ABC', 'LICENSE-XYZ'], []),  # with licenses
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -585,7 +586,7 @@ class TestEggInfo:
                               """),
             'LICENSE-ABC': "ABC license",
             'LICENSE-XYZ': "XYZ license"
-        }, ['LICENSE-ABC', 'LICENSE-XYZ'], []), # with commas
+        }, ['LICENSE-ABC', 'LICENSE-XYZ'], []),  # with commas
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -594,7 +595,7 @@ class TestEggInfo:
                               """),
             'LICENSE-ABC': "ABC license",
             'LICENSE-XYZ': "XYZ license"
-        }, ['LICENSE-ABC'], ['LICENSE-XYZ']), # with one license
+        }, ['LICENSE-ABC'], ['LICENSE-XYZ']),  # with one license
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -602,7 +603,7 @@ class TestEggInfo:
                               """),
             'LICENSE-ABC': "ABC license",
             'LICENSE-XYZ': "XYZ license"
-        }, [], ['LICENSE-ABC', 'LICENSE-XYZ']), # empty
+        }, [], ['LICENSE-ABC', 'LICENSE-XYZ']),  # empty
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -610,7 +611,7 @@ class TestEggInfo:
                               """),
             'LICENSE-ABC': "ABC license",
             'LICENSE-XYZ': "XYZ license"
-        }, ['LICENSE-XYZ'], ['LICENSE-ABC']), # on same line
+        }, ['LICENSE-XYZ'], ['LICENSE-ABC']),  # on same line
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -619,12 +620,12 @@ class TestEggInfo:
                                   INVALID_LICENSE
                               """),
             'LICENSE-ABC': "Test license"
-        }, ['LICENSE-ABC'], ['INVALID_LICENSE']), # with an invalid license
+        }, ['LICENSE-ABC'], ['INVALID_LICENSE']),  # with an invalid license
         ({
             'setup.cfg': DALS("""
                               """),
             'LICENSE': "Test license"
-        }, [], ['LICENSE']), # no license_files attribute
+        }, [], ['LICENSE']),  # no license_files attribute
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -632,7 +633,7 @@ class TestEggInfo:
                               """),
             'MANIFEST.in': "exclude LICENSE",
             'LICENSE': "Test license"
-        }, [], ['LICENSE']), # license file is manually excluded
+        }, [], ['LICENSE']),  # license file is manually excluded
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -643,7 +644,7 @@ class TestEggInfo:
             'MANIFEST.in': "exclude LICENSE-XYZ",
             'LICENSE-ABC': "ABC license",
             'LICENSE-XYZ': "XYZ license"
-        }, ['LICENSE-ABC'], ['LICENSE-XYZ']) # subset is manually excluded
+        }, ['LICENSE-ABC'], ['LICENSE-XYZ'])  # subset is manually excluded
     ])
     def test_setup_cfg_license_files(
             self, tmpdir_cwd, env, files, incl_licenses, excl_licenses):
@@ -674,7 +675,7 @@ class TestEggInfo:
                               """),
             'LICENSE-ABC': "ABC license",
             'LICENSE-XYZ': "XYZ license"
-        }, [], ['LICENSE-ABC', 'LICENSE-XYZ']), # both empty
+        }, [], ['LICENSE-ABC', 'LICENSE-XYZ']),  # both empty
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -684,7 +685,8 @@ class TestEggInfo:
                               """),
             'LICENSE-ABC': "ABC license",
             'LICENSE-XYZ': "XYZ license"
-        }, [], ['LICENSE-ABC', 'LICENSE-XYZ']), # license_file is still singular
+            # license_file is still singular
+        }, [], ['LICENSE-ABC', 'LICENSE-XYZ']),
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -696,7 +698,7 @@ class TestEggInfo:
             'LICENSE-ABC': "ABC license",
             'LICENSE-PQR': "PQR license",
             'LICENSE-XYZ': "XYZ license"
-        }, ['LICENSE-ABC', 'LICENSE-PQR', 'LICENSE-XYZ'], []), # combined
+        }, ['LICENSE-ABC', 'LICENSE-PQR', 'LICENSE-XYZ'], []),  # combined
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -709,7 +711,8 @@ class TestEggInfo:
             'LICENSE-ABC': "ABC license",
             'LICENSE-PQR': "PQR license",
             'LICENSE-XYZ': "XYZ license"
-        }, ['LICENSE-ABC', 'LICENSE-PQR', 'LICENSE-XYZ'], []), # duplicate license
+            # duplicate license
+        }, ['LICENSE-ABC', 'LICENSE-PQR', 'LICENSE-XYZ'], []),
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -720,7 +723,8 @@ class TestEggInfo:
             'LICENSE-ABC': "ABC license",
             'LICENSE-PQR': "PQR license",
             'LICENSE-XYZ': "XYZ license"
-        }, ['LICENSE-ABC', 'LICENSE-XYZ'], ['LICENSE-PQR']), # combined subset
+            # combined subset
+        }, ['LICENSE-ABC', 'LICENSE-XYZ'], ['LICENSE-PQR']),
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -730,7 +734,8 @@ class TestEggInfo:
                                   LICENSE-PQR
                               """),
             'LICENSE-PQR': "Test license"
-        }, ['LICENSE-PQR'], ['LICENSE-ABC', 'LICENSE-XYZ']), # with invalid licenses
+            # with invalid licenses
+        }, ['LICENSE-PQR'], ['LICENSE-ABC', 'LICENSE-XYZ']),
         ({
             'setup.cfg': DALS("""
                               [metadata]
@@ -743,7 +748,8 @@ class TestEggInfo:
             'LICENSE-ABC': "ABC license",
             'LICENSE-PQR': "PQR license",
             'LICENSE-XYZ': "XYZ license"
-        }, ['LICENSE-XYZ'], ['LICENSE-ABC', 'LICENSE-PQR']) # manually excluded
+            # manually excluded
+        }, ['LICENSE-XYZ'], ['LICENSE-ABC', 'LICENSE-PQR'])
     ])
     def test_setup_cfg_license_file_license_files(
             self, tmpdir_cwd, env, files, incl_licenses, excl_licenses):
index 5896a69ae69d482b689768a9e5e3ee7da7b6d127..bca69c3014fcc34d9ecef20ff3548d58279f5f10 100644 (file)
@@ -108,6 +108,11 @@ class TestDepends:
         assert not req.is_present()
         assert not req.is_current()
 
+    @needs_bytecode
+    def test_require_present(self):
+        # In #1896, this test was failing for months with the only
+        # complaint coming from test runners (not end users).
+        # TODO: Evaluate if this code is needed at all.
         req = Require('Tests', None, 'tests', homepage="http://example.com")
         assert req.format is None
         assert req.attribute is None
@@ -223,10 +228,10 @@ class TestFeatures:
                                py_modules=['bar_et'], remove=['bar.ext'],
                                ),
                 'baz': Feature(
-                        "baz", optional=False, packages=['pkg.baz'],
-                        scripts=['scripts/baz_it'],
-                        libraries=[('libfoo', 'foo/foofoo.c')]
-                       ),
+                    "baz", optional=False, packages=['pkg.baz'],
+                    scripts=['scripts/baz_it'],
+                    libraries=[('libfoo', 'foo/foofoo.c')]
+                ),
                 'dwim': Feature("DWIM", available=False, remove='bazish'),
             },
             script_args=['--without-bar', 'install'],
index 6242a018c4f2ee24b4a095c465210662a644d31e..8ee70a7ec32148a3869d37b43b2e6e959dfbb56f 100644 (file)
@@ -12,7 +12,7 @@ from setuptools.command.test import test
 from setuptools.dist import Distribution
 
 from .textwrap import DALS
-from . import contexts
+
 
 SETUP_PY = DALS("""
     from setuptools import setup
index 2c35825a6b15d4e7954dd6d93f5ef107289e7392..6549a6c01ac4ffa2ffbec3c593102f4b21c0a42f 100644 (file)
@@ -8,12 +8,21 @@ from pytest_fixture_config import yield_requires_config
 
 import pytest_virtualenv
 
-from setuptools.extern import six
-
 from .textwrap import DALS
 from .test_easy_install import make_nspkg_sdist
 
 
+@pytest.fixture(autouse=True)
+def disable_requires_python(monkeypatch):
+    """
+    Disable Requires-Python on Python 2.7
+    """
+    if sys.version_info > (3,):
+        return
+
+    monkeypatch.setenv('PIP_IGNORE_REQUIRES_PYTHON', 'true')
+
+
 @pytest.fixture(autouse=True)
 def pytest_virtualenv_works(virtualenv):
     """
@@ -64,7 +73,7 @@ def _get_pip_versions():
             from urllib.request import urlopen
             from urllib.error import URLError
         except ImportError:
-            from urllib2 import urlopen, URLError # Python 2.7 compat
+            from urllib2 import urlopen, URLError  # Python 2.7 compat
 
         try:
             urlopen('https://pypi.org', timeout=1)
@@ -180,12 +189,16 @@ def _check_test_command_install_requirements(virtualenv, tmpdir):
     )).format(tmpdir=tmpdir))
     assert tmpdir.join('success').check()
 
+
 def test_test_command_install_requirements(virtualenv, tmpdir):
     # Ensure pip/wheel packages are installed.
-    virtualenv.run("python -c \"__import__('pkg_resources').require(['pip', 'wheel'])\"")
+    virtualenv.run(
+        "python -c \"__import__('pkg_resources').require(['pip', 'wheel'])\"")
     _check_test_command_install_requirements(virtualenv, tmpdir)
 
-def test_test_command_install_requirements_when_using_easy_install(bare_virtualenv, tmpdir):
+
+def test_test_command_install_requirements_when_using_easy_install(
+        bare_virtualenv, tmpdir):
     _check_test_command_install_requirements(bare_virtualenv, tmpdir)
 
 
index 55d346c67cdf310241b00e88305168414fd88bb1..f72ccbbf32e6e2e0c7f9b522c887b0a968d79192 100644 (file)
@@ -125,11 +125,12 @@ def flatten_tree(tree):
 
 
 def format_install_tree(tree):
-    return {x.format(
-        py_version=PY_MAJOR,
-        platform=get_platform(),
-        shlib_ext=get_config_var('EXT_SUFFIX') or get_config_var('SO'))
-            for x in tree}
+    return {
+        x.format(
+            py_version=PY_MAJOR,
+            platform=get_platform(),
+            shlib_ext=get_config_var('EXT_SUFFIX') or get_config_var('SO'))
+        for x in tree}
 
 
 def _check_wheel_install(filename, install_dir, install_tree_includes,
@@ -455,7 +456,8 @@ WHEEL_INSTALL_TESTS = (
         id='empty_namespace_package',
         file_defs={
             'foobar': {
-                '__init__.py': "__import__('pkg_resources').declare_namespace(__name__)",
+                '__init__.py':
+                    "__import__('pkg_resources').declare_namespace(__name__)",
             },
         },
         setup_kwargs=dict(
@@ -579,4 +581,5 @@ def test_wheel_is_compatible(monkeypatch):
         for t in parse_tag('cp36-cp36m-manylinux1_x86_64'):
             yield t
     monkeypatch.setattr('setuptools.wheel.sys_tags', sys_tags)
-    assert Wheel('onnxruntime-0.1.2-cp36-cp36m-manylinux1_x86_64.whl').is_compatible()
+    assert Wheel(
+        'onnxruntime-0.1.2-cp36-cp36m-manylinux1_x86_64.whl').is_compatible()
index 025aaa828a24cb7746e5fac9b66984d5b9794bc3..ec1106a7b28a486cd61db74778dfd486209edb05 100644 (file)
@@ -77,7 +77,8 @@ class Wheel:
 
     def is_compatible(self):
         '''Is the wheel is compatible with the current platform?'''
-        supported_tags = set((t.interpreter, t.abi, t.platform) for t in sys_tags())
+        supported_tags = set(
+            (t.interpreter, t.abi, t.platform) for t in sys_tags())
         return next((True for t in self.tags() if t in supported_tags), False)
 
     def egg_name(self):
diff --git a/tests/requirements.txt b/tests/requirements.txt
deleted file mode 100644 (file)
index 4b5e0ee..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-mock
-pytest-flake8
-virtualenv>=13.0.0
-pytest-virtualenv>=1.2.7
-pytest>=3.7
-wheel
-coverage>=4.5.1
-pytest-cov>=2.5.1
-paver; python_version>="3.6"
-futures; python_version=="2.7"
-pip>=19.1 # For proper file:// URLs support.
index 06655fe4396200b06228543ea5e97a20a30c4f1e..9fe4f905c79a4971bccfc079ae1e8f809abdb6a8 100644 (file)
@@ -1,6 +1,7 @@
 import os
 import subprocess
 import sys
+import re
 
 
 def remove_setuptools():
@@ -14,17 +15,68 @@ def remove_setuptools():
     subprocess.check_call(cmd, cwd='.tox')
 
 
-def pip(args):
-    # Honor requires-python when installing test suite dependencies
-    if any('-r' in arg for arg in args):
-        os.environ['PIP_IGNORE_REQUIRES_PYTHON'] = '0'
+def bootstrap():
+    print("Running bootstrap")
+    cmd = [sys.executable, '-m', 'bootstrap']
+    subprocess.check_call(cmd)
 
-    # When installing '.', remove setuptools
-    '.' in args and remove_setuptools()
 
-    cmd = [sys.executable, '-m', 'pip'] + args
-    subprocess.check_call(cmd)
+def is_install_self(args):
+    """
+    Do the args represent an install of .?
+    """
+    def strip_extras(arg):
+        match = re.match(r'(.*)?\[.*\]$', arg)
+        return match.group(1) if match else arg
+
+    return (
+        'install' in args
+        and any(
+            arg in ['.', os.getcwd()]
+            for arg in map(strip_extras, args)
+        )
+    )
+
+
+def pip(*args):
+    cmd = [sys.executable, '-m', 'pip'] + list(args)
+    return subprocess.check_call(cmd)
+
+
+def test_dependencies():
+    from ConfigParser import ConfigParser
+
+    def clean(dep):
+        spec, _, _ = dep.partition('#')
+        return spec.strip()
+
+    parser = ConfigParser()
+    parser.read('setup.cfg')
+    raw = parser.get('options.extras_require', 'tests').split('\n')
+    return filter(None, map(clean, raw))
+
+
+def disable_python_requires():
+    """
+    On Python 2, install the dependencies that are selective
+    on Python version while honoring REQUIRES_PYTHON, then
+    disable REQUIRES_PYTHON so that pip can install this
+    checkout of setuptools.
+    """
+    pip('install', *test_dependencies())
+    os.environ['PIP_IGNORE_REQUIRES_PYTHON'] = 'true'
+
+
+def run(args):
+    os.environ['PIP_USE_PEP517'] = 'true'
+
+    if is_install_self(args):
+        remove_setuptools()
+        bootstrap()
+        sys.version_info > (3,) or disable_python_requires()
+
+    pip(*args)
 
 
 if __name__ == '__main__':
-    pip(sys.argv[1:])
+    run(sys.argv[1:])
diff --git a/tox.ini b/tox.ini
index d458dc338cffc545c3fcd6a473cddfccede94e6d..2164599f8ea877d05c082e9a7a0e1d50a7d56ecf 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -1,8 +1,6 @@
-# Note: Run "python bootstrap.py" before running Tox, to generate metadata.
-#
 # To run Tox against all supported Python interpreters, you can set:
 #
-# export TOXENV='py27,py3{5,6,7,8},pypy,pypy3'
+# export TOXENV='py3{5,6,7,8},pypy,pypy3'
 
 [tox]
 envlist=python
@@ -15,18 +13,18 @@ requires =
 pip = python {toxinidir}/tools/tox_pip.py
 
 [testenv]
-deps=-r{toxinidir}/tests/requirements.txt
 pip_version = pip
 install_command = {[helpers]pip} install {opts} {packages}
 list_dependencies_command = {[helpers]pip} freeze --all
 setenv =
        COVERAGE_FILE={toxworkdir}/.coverage.{envname}
-       py27: PIP_IGNORE_REQUIRES_PYTHON=true
 # TODO: The passed environment variables came from copying other tox.ini files
 # These should probably be individually annotated to explain what needs them.
 passenv=APPDATA HOMEDRIVE HOMEPATH windir APPVEYOR APPVEYOR_* CI CODECOV_* TRAVIS TRAVIS_* NETWORK_REQUIRED
 commands=pytest --cov-config={toxinidir}/tox.ini --cov-report= {posargs}
 usedevelop=True
+extras =
+       tests
 
 
 [testenv:coverage]
@@ -46,12 +44,12 @@ skip_install=True
 commands=codecov -X gcov --file {toxworkdir}/coverage.xml
 
 [testenv:docs]
-deps = -r{toxinidir}/docs/requirements.txt
-skip_install=True
+extras =
+        docs
+        testing
+changedir = docs
 commands =
-    python {toxinidir}/bootstrap.py
-    sphinx-build -W -b html -d {envtmpdir}/doctrees docs docs/build/html
-    sphinx-build -W -b man -d {envtmpdir}/doctrees docs docs/build/man
+        python -m sphinx . {toxinidir}/build/html
 
 [coverage:run]
 source=