Imported Upstream version 47.3.1 upstream/47.3.1
authorDongHun Kwak <dh0128.kwak@samsung.com>
Tue, 29 Dec 2020 22:06:30 +0000 (07:06 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Tue, 29 Dec 2020 22:06:30 +0000 (07:06 +0900)
.bumpversion.cfg
CHANGES.rst
pkg_resources/__init__.py
pkg_resources/py31compat.py [deleted file]
setup.cfg
setuptools/build_meta.py
setuptools/command/easy_install.py
setuptools/package_index.py
setuptools/sandbox.py
setuptools/tests/files.py
setuptools/tests/test_manifest.py

index ffb0f2e8133db49d6ed0f8c47fa3a1256f90ce9e..9b106cfa3f66ef5e831143c6d1a7f37e34a6d196 100644 (file)
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 47.2.0
+current_version = 47.3.1
 commit = True
 tag = True
 
index 44abab75e7f1dc618520e2618114ca6d8be9ca30..799163edd3ba4dc9f9db03d8ba6cf461eea40169 100644 (file)
@@ -1,3 +1,17 @@
+v47.3.1
+-------
+
+* #1973: Removed ``pkg_resources.py31compat.makedirs`` in favor of the stdlib. Use ``os.makedirs()`` instead.
+* #2198: Restore ``__requires__`` directive in easy-install wrapper scripts.
+
+
+v47.3.0
+-------
+
+* #2197: Console script wrapper for editable installs now has a unified template and honors importlib_metadata if present for faster script execution on older Pythons.
+* #2195: Fix broken entry points generated by easy-install (pip editable installs).
+
+
 v47.2.0
 -------
 
index 2e7d505901682cd93055a27a40303883dedc3718..2c589d5553af3891645d47ee3b611721e241e868 100644 (file)
@@ -76,7 +76,6 @@ try:
 except ImportError:
     importlib_machinery = None
 
-from . import py31compat
 from pkg_resources.extern import appdirs
 from pkg_resources.extern import packaging
 __import__('pkg_resources.extern.packaging.version')
@@ -3180,7 +3179,7 @@ def _find_adapter(registry, ob):
 def ensure_directory(path):
     """Ensure that the parent directory of `path` exists"""
     dirname = os.path.dirname(path)
-    py31compat.makedirs(dirname, exist_ok=True)
+    os.makedirs(dirname, exist_ok=True)
 
 
 def _bypass_ensure_directory(path):
diff --git a/pkg_resources/py31compat.py b/pkg_resources/py31compat.py
deleted file mode 100644 (file)
index a381c42..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-import os
-import errno
-import sys
-
-from .extern import six
-
-
-def _makedirs_31(path, exist_ok=False):
-    try:
-        os.makedirs(path)
-    except OSError as exc:
-        if not exist_ok or exc.errno != errno.EEXIST:
-            raise
-
-
-# rely on compatibility behavior until mode considerations
-#  and exists_ok considerations are disentangled.
-# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663
-needs_makedirs = (
-    six.PY2 or
-    (3, 4) <= sys.version_info < (3, 4, 1)
-)
-makedirs = _makedirs_31 if needs_makedirs else os.makedirs
index 4beae652ed8446b798b3a0e097d06c41aeae5a90..f23714b6594616b6fcf5fe648f88be7e1c8866f9 100644 (file)
--- a/setup.cfg
+++ b/setup.cfg
@@ -16,7 +16,7 @@ formats = zip
 
 [metadata]
 name = setuptools
-version = 47.2.0
+version = 47.3.1
 description = Easily download, build, install, upgrade, and uninstall Python packages
 author = Python Packaging Authority
 author_email = distutils-sig@python.org
index a1c951cf5996da6b087d1da30c0337af741c7fc1..46266814ad9cb70246426cb443bb3b0b554665c5 100644 (file)
@@ -38,7 +38,6 @@ import distutils
 from setuptools.py31compat import TemporaryDirectory
 
 from pkg_resources import parse_requirements
-from pkg_resources.py31compat import makedirs
 
 __all__ = ['get_requires_for_build_sdist',
            'get_requires_for_build_wheel',
@@ -190,7 +189,7 @@ class _BuildMetaBackend(object):
         result_directory = os.path.abspath(result_directory)
 
         # Build in a temporary directory, then copy to the target.
-        makedirs(result_directory, exist_ok=True)
+        os.makedirs(result_directory, exist_ok=True)
         with TemporaryDirectory(dir=result_directory) as tmp_dist_dir:
             sys.argv = (sys.argv[:1] + setup_command +
                         ['--dist-dir', tmp_dist_dir] +
index ab8258ca831d1070c7d6276cfe343a60d76aa31f..89be91ac2e8fc5d2108a46b5c6b7e4fe55e94531 100644 (file)
@@ -63,7 +63,7 @@ from pkg_resources import (
     Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound,
     VersionConflict, DEVELOP_DIST,
 )
-import pkg_resources.py31compat
+import pkg_resources
 
 __metaclass__ = type
 
@@ -564,7 +564,7 @@ class easy_install(Command):
             if ok_exists:
                 os.unlink(ok_file)
             dirname = os.path.dirname(ok_file)
-            pkg_resources.py31compat.makedirs(dirname, exist_ok=True)
+            os.makedirs(dirname, exist_ok=True)
             f = open(pth_file, 'w')
         except (OSError, IOError):
             self.cant_write_to_target()
@@ -2070,33 +2070,40 @@ class ScriptWriter:
     gui apps.
     """
 
-    if sys.version_info >= (3, 8):
-        template = textwrap.dedent(r"""
-            # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r
-            import re
-            import sys
+    template = textwrap.dedent(r"""
+        # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r
+        import re
+        import sys
+
+        # for compatibility with easy_install; see #2198
+        __requires__ = %(spec)r
+
+        try:
             from importlib.metadata import distribution
+        except ImportError:
+            try:
+                from importlib_metadata import distribution
+            except ImportError:
+                from pkg_resources import load_entry_point
 
-            if __name__ == '__main__':
-                sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
-                for entry_point in distribution(%(spec)r).entry_points:
-                    if entry_point.group == %(group)r and entry_point.name == %(name)r:
-                        sys.exit(entry_point.load()())
-        """).lstrip()  # noqa: E501
-    else:
-        template = textwrap.dedent(r"""
-            # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r
-            __requires__ = %(spec)r
-            import re
-            import sys
-            from pkg_resources import load_entry_point
-
-            if __name__ == '__main__':
-                sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
-                sys.exit(
-                    load_entry_point(%(spec)r, %(group)r, %(name)r)()
-                )
-        """).lstrip()  # noqa: E501
+
+        def importlib_load_entry_point(spec, group, name):
+            dist_name, _, _ = spec.partition('==')
+            matches = (
+                entry_point
+                for entry_point in distribution(dist_name).entry_points
+                if entry_point.group == group and entry_point.name == name
+            )
+            return next(matches).load()
+
+
+        globals().setdefault('load_entry_point', importlib_load_entry_point)
+
+
+        if __name__ == '__main__':
+            sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
+            sys.exit(load_entry_point(%(spec)r, %(group)r, %(name)r)())
+        """).lstrip()
 
     command_spec_class = CommandSpec
 
index 0744ea2ad12a2acb2744c103ad13dc6fc48b8599..1702c7c693d84471a5c9ca6b7370f278c8d54def 100644 (file)
@@ -53,10 +53,10 @@ user_agent = _tmpl.format(
 def parse_requirement_arg(spec):
     try:
         return Requirement.parse(spec)
-    except ValueError:
+    except ValueError as e:
         raise DistutilsError(
             "Not a URL, existing file, or requirement spec: %r" % (spec,)
-        )
+        ) from e
 
 
 def parse_bdist_wininst(name):
@@ -772,7 +772,7 @@ class PackageIndex(Environment):
             if warning:
                 self.warn(warning, msg)
             else:
-                raise DistutilsError('%s %s' % (url, msg))
+                raise DistutilsError('%s %s' % (url, msg)) from v
         except urllib.error.HTTPError as v:
             return v
         except urllib.error.URLError as v:
@@ -780,7 +780,7 @@ class PackageIndex(Environment):
                 self.warn(warning, v.reason)
             else:
                 raise DistutilsError("Download error for %s: %s"
-                                     % (url, v.reason))
+                                     % (url, v.reason)) from v
         except http_client.BadStatusLine as v:
             if warning:
                 self.warn(warning, v.line)
@@ -789,13 +789,13 @@ class PackageIndex(Environment):
                     '%s returned a bad status line. The server might be '
                     'down, %s' %
                     (url, v.line)
-                )
+                ) from v
         except (http_client.HTTPException, socket.error) as v:
             if warning:
                 self.warn(warning, v)
             else:
                 raise DistutilsError("Download error for %s: %s"
-                                     % (url, v))
+                                     % (url, v)) from v
 
     def _download_url(self, scheme, url, tmpdir):
         # Determine download filename
index e46dfc8d25e8accf6fb08c13b878da1550e4738f..93ae8eb4d94f01ce02792ac0461878f2593b36d5 100644 (file)
@@ -12,7 +12,7 @@ import textwrap
 from setuptools.extern import six
 from setuptools.extern.six.moves import builtins, map
 
-import pkg_resources.py31compat
+import pkg_resources
 from distutils.errors import DistutilsError
 from pkg_resources import working_set
 
@@ -70,7 +70,7 @@ def override_temp(replacement):
     """
     Monkey-patch tempfile.tempdir with replacement, ensuring it exists
     """
-    pkg_resources.py31compat.makedirs(replacement, exist_ok=True)
+    os.makedirs(replacement, exist_ok=True)
 
     saved = tempfile.tempdir
 
index bad2189d45ff21e84871f342dad461c18d84ea05..71194b9de039bd92f2448a5dc6ebef3f6630b897 100644 (file)
@@ -1,9 +1,6 @@
 import os
 
 
-import pkg_resources.py31compat
-
-
 def build_files(file_defs, prefix=""):
     """
     Build a set of files/directories, as described by the
@@ -30,7 +27,7 @@ def build_files(file_defs, prefix=""):
     for name, contents in file_defs.items():
         full_name = os.path.join(prefix, name)
         if isinstance(contents, dict):
-            pkg_resources.py31compat.makedirs(full_name, exist_ok=True)
+            os.makedirs(full_name, exist_ok=True)
             build_files(contents, prefix=full_name)
         else:
             if isinstance(contents, bytes):
index 2a0e9c8625147e355faeed54810882da76ff3b0b..042a8b1742cac9c6deba270a81b12e7d39db76e0 100644 (file)
@@ -10,7 +10,6 @@ import itertools
 from distutils import log
 from distutils.errors import DistutilsTemplateError
 
-import pkg_resources.py31compat
 from setuptools.command.egg_info import FileList, egg_info, translate_pattern
 from setuptools.dist import Distribution
 from setuptools.extern import six
@@ -364,7 +363,7 @@ class TestFileListTest(TempDirTestCase):
         for file in files:
             file = os.path.join(self.temp_dir, file)
             dirname, basename = os.path.split(file)
-            pkg_resources.py31compat.makedirs(dirname, exist_ok=True)
+            os.makedirs(dirname, exist_ok=True)
             open(file, 'w').close()
 
     def test_process_template_line(self):