Imported Upstream version 60.0.1 upstream/60.0.1
authorJinWang An <jinwang.an@samsung.com>
Mon, 27 Mar 2023 08:02:40 +0000 (17:02 +0900)
committerJinWang An <jinwang.an@samsung.com>
Mon, 27 Mar 2023 08:02:40 +0000 (17:02 +0900)
.bumpversion.cfg
CHANGES.rst
setup.cfg
setuptools/_distutils/command/install.py
setuptools/command/easy_install.py

index b458548161bc5e188653145617dab574273ba789..0532998c3e10e1ae65e9f27d049a8bff2ab3138e 100644 (file)
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 60.0.0
+current_version = 60.0.1
 commit = True
 tag = True
 
index 3e658050500efeca7d19c5942e3d04fae148bc3c..b1119cff198cf6f6a024edc12358d134380c39e6 100644 (file)
@@ -1,3 +1,12 @@
+v60.0.1
+-------
+
+
+Misc
+^^^^
+* #2944: Add support for extended install schemes in easy_install.
+
+
 v60.0.0
 -------
 
index 6a67e79da7e42c21b7e608a07d70a2c69fd83230..378bc8bb1ac2b7d8caf4167c9f4e7d986b4f5326 100644 (file)
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,6 +1,6 @@
 [metadata]
 name = setuptools
-version = 60.0.0
+version = 60.0.1
 author = Python Packaging Authority
 author_email = distutils-sig@python.org
 description = Easily download, build, install, upgrade, and uninstall Python packages
index 80f5f8c73a125bb484458149c496302d415ecd45..40be5ba67bd6096740c014ed982e11492a07f143 100644 (file)
@@ -123,6 +123,47 @@ def _get_implementation():
         return 'Python'
 
 
+def _select_scheme(ob, name):
+    vars(ob).update(_remove_set(ob, _scheme_attrs(_resolve_scheme(name))))
+
+
+def _remove_set(ob, attrs):
+    """
+    Include only attrs that are None in ob.
+    """
+    return {
+        key: value
+        for key, value in attrs.items()
+        if getattr(ob, key) is None
+    }
+
+
+def _resolve_scheme(name):
+    os_name, sep, key = name.partition('_')
+    try:
+        resolved = sysconfig.get_preferred_scheme(key)
+    except Exception:
+        resolved = _pypy_hack(name)
+    return resolved
+
+
+def _scheme_attrs(name):
+    """Resolve install directories by applying the install schemes."""
+    scheme = _load_schemes()[name]
+    return {
+        f'install_{key}': scheme[key]
+        for key in SCHEME_KEYS
+    }
+
+
+def _pypy_hack(name):
+    PY37 = sys.version_info < (3, 8)
+    old_pypy = hasattr(sys, 'pypy_version_info') and PY37
+    prefix = not name.endswith(('_user', '_home'))
+    pypy_name = 'pypy' + '_nt' * (os.name == 'nt')
+    return pypy_name if old_pypy and prefix else name
+
+
 class install(Command):
 
     description = "install everything from build directory"
@@ -520,29 +561,7 @@ class install(Command):
                       "I don't know how to install stuff on '%s'" % os.name)
 
     def select_scheme(self, name):
-        os_name, sep, key = name.partition('_')
-        try:
-            resolved = sysconfig.get_preferred_scheme(key)
-        except Exception:
-            resolved = self._pypy_hack(name)
-        return self._select_scheme(resolved)
-
-    def _select_scheme(self, name):
-        """Sets the install directories by applying the install schemes."""
-        # it's the caller's problem if they supply a bad name!
-        scheme = _load_schemes()[name]
-        for key in SCHEME_KEYS:
-            attrname = 'install_' + key
-            if getattr(self, attrname) is None:
-                setattr(self, attrname, scheme[key])
-
-    @staticmethod
-    def _pypy_hack(name):
-        PY37 = sys.version_info < (3, 8)
-        old_pypy = hasattr(sys, 'pypy_version_info') and PY37
-        prefix = not name.endswith(('_user', '_home'))
-        pypy_name = 'pypy' + '_nt' * (os.name == 'nt')
-        return pypy_name if old_pypy and prefix else name
+        _select_scheme(self, name)
 
     def _expand_attrs(self, attrs):
         for attr in attrs:
index fc848d0d1c35390ca7f3c0b22cce92079ad19a52..e81500572549888d04a0cf7c49ef4871d9df749c 100644 (file)
@@ -17,10 +17,10 @@ from distutils.errors import (
     DistutilsArgError, DistutilsOptionError,
     DistutilsError, DistutilsPlatformError,
 )
-from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS
 from distutils import log, dir_util
 from distutils.command.build_scripts import first_line_re
 from distutils.spawn import find_executable
+from distutils.command import install
 import sys
 import os
 import zipimport
@@ -251,7 +251,14 @@ class easy_install(Command):
             'exec_prefix': exec_prefix,
             # Only python 3.2+ has abiflags
             'abiflags': getattr(sys, 'abiflags', ''),
+            'platlibdir': getattr(sys, 'platlibdir', 'lib'),
         }
+        with contextlib.suppress(AttributeError):
+            # only for distutils outside stdlib
+            self.config_vars.update({
+                'implementation_lower': install._get_implementation().lower(),
+                'implementation': install._get_implementation(),
+            })
 
         if site.ENABLE_USER_SITE:
             self.config_vars['userbase'] = self.install_userbase
@@ -711,13 +718,11 @@ class easy_install(Command):
                     return dist
 
     def select_scheme(self, name):
-        """Sets the install directories by applying the install schemes."""
-        # it's the caller's problem if they supply a bad name!
-        scheme = INSTALL_SCHEMES[name]
-        for key in SCHEME_KEYS:
-            attrname = 'install_' + key
-            if getattr(self, attrname) is None:
-                setattr(self, attrname, scheme[key])
+        try:
+            install._select_scheme(self, name)
+        except AttributeError:
+            # stdlib distutils
+            install.install.select_scheme(self, name)
 
     # FIXME: 'easy_install.process_distribution' is too complex (12)
     def process_distribution(  # noqa: C901