diff --git a/CHANGES.txt b/CHANGES.txt index 27211ac8d8e59998d19ce6af23749453a72ae73b..a48fbc0f06e5296f2ee9b56b4ad61e11dcde8c67 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -54,6 +54,9 @@ * Fixed :issue:`1101`. Properly handle an index or --find-links target which has a without a href attribute. (:pull:`1869`) +* Fixed :issue:`1885`. Will properly handle extras when a project is installed + via Wheel. (:pull:`1896`) + **1.5.7** diff --git a/pip/req/req_install.py b/pip/req/req_install.py index 820d57e882783da5fad1063a279f6afcb90f30c9..a087f4c17bc11170e825b87c66d2baa12b98e68c 100644 --- a/pip/req/req_install.py +++ b/pip/req/req_install.py @@ -451,6 +451,10 @@ exec(compile( _requirements_section_re = re.compile(r'\[(.*?)\]') def requirements(self, extras=()): + if self.satisfied_by: + for r in self.satisfied_by.requires(extras): + yield str(r) + return in_extra = None for line in self.egg_info_lines('requires.txt'): match = self._requirements_section_re.match(line.lower()) diff --git a/tests/data/packages/README.txt b/tests/data/packages/README.txt index d1de9854349276108b646149590c7685e429e1fa..23ee4b130f9ed759e69acd6708c6ea54e89e77c0 100644 --- a/tests/data/packages/README.txt +++ b/tests/data/packages/README.txt @@ -84,6 +84,8 @@ meta-1.0-py2.py3-none-any.whl -------------------------------------------------- Is an empty package which install_requires the simple and simple2 packages. - +requires_simple_extra-0.1-py2.py3-none-any.whl +---------------------------------------------- +requires_simple_extra[extra] requires simple==1.0 diff --git a/tests/data/packages/requires_simple_extra-0.1-py2.py3-none-any.whl b/tests/data/packages/requires_simple_extra-0.1-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..c618eaa06d8fb2b57c0a5b0729a701840a295953 Binary files /dev/null and b/tests/data/packages/requires_simple_extra-0.1-py2.py3-none-any.whl differ diff --git a/tests/data/src/requires_simple_extra/requires_simple_extra.py b/tests/data/src/requires_simple_extra/requires_simple_extra.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/data/src/requires_simple_extra/setup.cfg b/tests/data/src/requires_simple_extra/setup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..7c964b49e2db4d6983a3d8d56509162de9110035 --- /dev/null +++ b/tests/data/src/requires_simple_extra/setup.cfg @@ -0,0 +1,2 @@ +[wheel] +universal=1 diff --git a/tests/data/src/requires_simple_extra/setup.py b/tests/data/src/requires_simple_extra/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..b4f8042214e23e8120afc2131a21fdd1552bf3cd --- /dev/null +++ b/tests/data/src/requires_simple_extra/setup.py @@ -0,0 +1,9 @@ +from setuptools import setup + +setup(name='requires_simple_extra', + version='0.1', + py_modules = ['requires_simple_extra'], + extras_require = { + 'extra' : ['simple==1.0'] + } +) \ No newline at end of file diff --git a/tests/functional/test_install_extras.py b/tests/functional/test_install_extras.py index 9ca8bb9c84eb9c80d4501b4554b93563808f741c..b272277aaeafdef87e975f41dfa5b5e4b9a57315 100644 --- a/tests/functional/test_install_extras.py +++ b/tests/functional/test_install_extras.py @@ -12,6 +12,25 @@ def test_simple_extras_install_from_pypi(script): assert initools_folder in result.files_created, result.files_created +def test_extras_after_wheel(script, data): + """ + Test installing a package with extras after installing from a wheel. + """ + simple = script.site_packages / 'simple' + + no_extra = script.pip( + 'install', '--no-index', '-f', data.find_links, + 'requires_simple_extra', expect_stderr=True, + ) + assert simple not in no_extra.files_created, no_extra.files_created + + extra = script.pip( + 'install', '--no-index', '-f', data.find_links, + 'requires_simple_extra[extra]', expect_stderr=True, + ) + assert simple in extra.files_created, extra.files_created + + def test_no_extras_uninstall(script): """ No extras dependency gets uninstalled when the root package is uninstalled