Imported Upstream version 36.2.2 upstream/36.2.2
authorDongHun Kwak <dh0128.kwak@samsung.com>
Mon, 14 Jan 2019 01:33:33 +0000 (10:33 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Mon, 14 Jan 2019 01:33:33 +0000 (10:33 +0900)
.travis.yml
CHANGES.rst
setup.cfg
setup.py
setuptools/dist.py
setuptools/tests/test_egg_info.py
tests/requirements.txt

index b207a8d2f3bf911d761af378a251b66e93927143..dbbe3ea91b73dffce96407b9a8497029942c3681 100644 (file)
@@ -15,7 +15,7 @@ jobs:
     env: LANG=C
   - python: *latest_py2
     env: LANG=C
-  - stage: deploy (does actual deploy to PYPI only for tagged commits)
+  - stage: deploy (to PyPI for tagged commits)
     python: *latest_py3
     install: skip
     script: skip
index 36b2fca542c6cc1a586f0edf4b130360bd26ff33..9a16816c3c38ad3768a20e939c72f255b1d44daa 100644 (file)
@@ -1,3 +1,9 @@
+v36.2.2
+-------
+
+* #1099: Revert commit a3ec721, restoring intended purpose of
+  extras as part of a requirement declaration.
+
 v36.2.1
 -------
 
index 203b9312e35ba747501a4d4565fc9a1e5e79a473..33024f514191c2ae6ebf38ac2968d2669bbce36a 100755 (executable)
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 36.2.1
+current_version = 36.2.2
 commit = True
 tag = True
 
index 854aee387897f95993296d5b96165b437c940a9f..5c48f7407ddaf33e0d96d196e3402b38a04b06df 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -89,7 +89,7 @@ def pypi_link(pkg_filename):
 
 setup_params = dict(
     name="setuptools",
-    version="36.2.1",
+    version="36.2.2",
     description="Easily download, build, install, upgrade, and uninstall "
         "Python packages",
     author="Python Packaging Authority",
index 9a034db553b8bf1d9bc3d1efe73b7e3e73e398c7..0787261e44424e5376c9f1a3f83b574eae37635f 100644 (file)
@@ -16,7 +16,7 @@ from distutils.errors import (
 from distutils.util import rfc822_escape
 
 from setuptools.extern import six
-from setuptools.extern.six.moves import map
+from setuptools.extern.six.moves import map, filter, filterfalse
 from pkg_resources.extern import packaging
 
 from setuptools.depends import Require
@@ -356,45 +356,63 @@ class Distribution(Distribution_parse_config_files, _Distribution):
     def _finalize_requires(self):
         """
         Fix environment markers in `install_requires` and `extras_require`.
+        """
+        self._convert_extras_requirements()
+        self._move_install_requirements_markers()
 
-        - move requirements in `install_requires` that are using environment
-          markers or extras to `extras_require`.
-        - convert requirements in `extras_require` of the form
-          `"extra": ["barbazquux; {marker}"]` to
-          `"extra:{marker}": ["barbazquux"]`.
+    def _convert_extras_requirements(self):
+        """
+        Convert requirements in `extras_require` of the form
+        `"extra": ["barbazquux; {marker}"]` to
+        `"extra:{marker}": ["barbazquux"]`.
         """
-        extras_require = defaultdict(list)
-        for k, v in (
-            getattr(self, 'extras_require', None) or {}
-        ).items():
+        spec_ext_reqs = getattr(self, 'extras_require', None) or {}
+        self._tmp_extras_require = defaultdict(list)
+        for section, v in spec_ext_reqs.items():
             for r in pkg_resources.parse_requirements(v):
-                marker = r.marker
-                if marker:
-                    r.marker = None
-                    extras_require[k + ':' + str(marker)].append(r)
-                else:
-                    extras_require[k].append(r)
-        install_requires = []
-        for r in pkg_resources.parse_requirements(
-            getattr(self, 'install_requires', None) or ()
-        ):
-            marker = r.marker
-            extras = r.extras
-            if not marker and not extras:
-                install_requires.append(r)
-                continue
-            r.extras = ()
-            r.marker = None
-            for e in extras or ('',):
-                section = e
-                if marker:
-                    section += ':' + str(marker)
-                extras_require[section].append(r)
+                suffix = self._suffix_for(r)
+                self._tmp_extras_require[section + suffix].append(r)
+
+    @staticmethod
+    def _suffix_for(req):
+        """
+        For a requirement, return the 'extras_require' suffix for
+        that requirement.
+        """
+        return ':' + str(req.marker) if req.marker else ''
+
+    def _move_install_requirements_markers(self):
+        """
+        Move requirements in `install_requires` that are using environment
+        markers `extras_require`.
+        """
+
+        # divide the install_requires into two sets, simple ones still
+        # handled by install_requires and more complex ones handled
+        # by extras_require.
+
+        def is_simple_req(req):
+            return not req.marker
+
+        spec_inst_reqs = getattr(self, 'install_requires', None) or ()
+        inst_reqs = list(pkg_resources.parse_requirements(spec_inst_reqs))
+        simple_reqs = filter(is_simple_req, inst_reqs)
+        complex_reqs = filterfalse(is_simple_req, inst_reqs)
+        self.install_requires = list(map(str, simple_reqs))
+
+        for r in complex_reqs:
+            self._tmp_extras_require[':' + str(r.marker)].append(r)
         self.extras_require = dict(
-            (k, [str(r) for r in v])
-            for k, v in extras_require.items()
+            (k, [str(r) for r in map(self._clean_req, v)])
+            for k, v in self._tmp_extras_require.items()
         )
-        self.install_requires = [str(r) for r in install_requires]
+
+    def _clean_req(self, req):
+        """
+        Given a Requirement, remove environment markers and return it.
+        """
+        req.marker = None
+        return req
 
     def parse_config_files(self, filenames=None):
         """Parses configuration files from various levels
index 5ea55d6188f8f4f381d14449984a81d2f5831e2e..d9d4ec3b3a84286740d6300c3ca96260b4faa1df 100644 (file)
@@ -207,14 +207,13 @@ class TestEggInfo(object):
     def test_install_requires_with_extra(self, tmpdir_cwd, env):
         req = 'install_requires=["barbazquux [test]"],'
         self._setup_script_with_requires(req)
-        self._run_install_command(tmpdir_cwd, env)
-        egg_info_dir = self._find_egg_info_files(env.paths['lib']).base
+        self._run_install_command(tmpdir_cwd, env, cmd=['egg_info'])
+        egg_info_dir = os.path.join('.', 'foo.egg-info')
         requires_txt = os.path.join(egg_info_dir, 'requires.txt')
         with open(requires_txt) as fp:
             install_requires = fp.read()
         expected_requires = DALS('''
-             [test]
-             barbazquux
+             barbazquux[test]
              ''')
         assert install_requires.lstrip() == expected_requires
         assert glob.glob(os.path.join(env.paths['lib'], 'barbazquux*')) == []
@@ -229,8 +228,8 @@ class TestEggInfo(object):
         with open(requires_txt) as fp:
             install_requires = fp.read()
         expected_requires = DALS('''
-             [test:{marker}]
-             barbazquux
+             [:{marker}]
+             barbazquux[test]
              ''').format(marker=self.mismatch_marker_alternate)
         assert install_requires.lstrip() == expected_requires
         assert glob.glob(os.path.join(env.paths['lib'], 'barbazquux*')) == []
@@ -250,6 +249,37 @@ class TestEggInfo(object):
             tmpdir_cwd, env, cmd=['test'], output="Ran 0 tests in")
         assert glob.glob(os.path.join(env.paths['lib'], 'barbazquux*')) == []
 
+    def test_extras_require_with_extra(self, tmpdir_cwd, env):
+        req = 'extras_require={"extra": ["barbazquux [test]"]},'
+        self._setup_script_with_requires(req)
+        self._run_install_command(tmpdir_cwd, env, cmd=['egg_info'])
+        egg_info_dir = os.path.join('.', 'foo.egg-info')
+        requires_txt = os.path.join(egg_info_dir, 'requires.txt')
+        with open(requires_txt) as fp:
+            install_requires = fp.read()
+        expected_requires = DALS('''
+             [extra]
+             barbazquux[test]
+             ''')
+        assert install_requires.lstrip() == expected_requires
+        assert glob.glob(os.path.join(env.paths['lib'], 'barbazquux*')) == []
+
+    def test_extras_require_with_extra_and_marker_in_req(self, tmpdir_cwd, env):
+        tmpl = 'extras_require={{"extra": ["barbazquux [test]; {marker}"]}},'
+        req = tmpl.format(marker=self.mismatch_marker)
+        self._setup_script_with_requires(req)
+        self._run_install_command(tmpdir_cwd, env)
+        egg_info_dir = self._find_egg_info_files(env.paths['lib']).base
+        requires_txt = os.path.join(egg_info_dir, 'requires.txt')
+        with open(requires_txt) as fp:
+            install_requires = fp.read()
+        expected_requires = DALS('''
+             [extra:{marker}]
+             barbazquux[test]
+             ''').format(marker=self.mismatch_marker_alternate)
+        assert install_requires.lstrip() == expected_requires
+        assert glob.glob(os.path.join(env.paths['lib'], 'barbazquux*')) == []
+
     def test_extras_require_with_marker(self, tmpdir_cwd, env):
         tmpl = 'extras_require={{":{marker}": ["barbazquux"]}},'
         req = tmpl.format(marker=self.mismatch_marker)
index 0c4df8ef8f6c048abd1cb9d049bd1065f0594994..44e76edba4fab592b68227ed114adae018ca159c 100644 (file)
@@ -3,4 +3,3 @@ mock
 pytest-flake8
 pytest-virtualenv>=1.2.7
 pytest>=3.0.2
-virtualenv