diff --git a/pipenv/patched/notpip/index.py b/pipenv/patched/notpip/index.py index bf1cba9c7f..f452c8c46b 100644 --- a/pipenv/patched/notpip/index.py +++ b/pipenv/patched/notpip/index.py @@ -206,30 +206,26 @@ def add_dependency_links(self, links): ) self.dependency_links.extend(links) - def get_extras_links(self, links): + @staticmethod + def get_extras_links(links): requires = [] extras = {} - current_section = None + current_list = requires for link in links: if not link: - current_section = None - - if not current_section: - if not (link.startswith('[')): - requires.append(link) - else: - current_section = link[1:-1] - extras[current_section] = [] + current_list = requires + if link.startswith('['): + current_list = [] + extras[link[1:-1]] = current_list else: - extras[current_section].append(link) + current_list.append(link) return extras - @staticmethod def _sort_locations(locations, expand_dir=False): """ diff --git a/tasks/vendoring/patches/patched/pip.patch b/tasks/vendoring/patches/patched/pip.patch index b8555c5b40..8e06880677 100644 --- a/tasks/vendoring/patches/patched/pip.patch +++ b/tasks/vendoring/patches/patched/pip.patch @@ -1362,29 +1362,29 @@ index f653f6e..48aaa35 100644 ) self.dependency_links.extend(links) -+ def get_extras_links(self, links): ++ @classmethod ++ def get_extras_links(links): + requires = [] + extras = {} + -+ current_section = None ++ current_list = requires + + for link in links: + if not link: -+ current_section = None -+ -+ if not current_section: -+ if not (link.startswith('[')): -+ requires.append(link) -+ else: -+ current_section = link[1:-1] -+ extras[current_section] = [] ++ current_list = requires ++ if link.startswith('['): ++ current_list = [] ++ extras[link[1:-1]] = current_list + else: -+ extras[current_section].append(link) ++ current_list.append(link) + + return extras + + + ++ ++ ++ + @staticmethod def _sort_locations(locations, expand_dir=False): diff --git a/tests/unit/test_patched.py b/tests/unit/test_patched.py new file mode 100644 index 0000000000..8d396539fb --- /dev/null +++ b/tests/unit/test_patched.py @@ -0,0 +1,131 @@ +from __future__ import absolute_import + +import pytest + +from notpip.index import PackageFinder + + +get_extras_links_scenarios = { + 'windows and not windows': ( + [ + 'chardet', + '[:platform_system != "windows"]', + 'twisted', + '[:platform_system == "windows"]', + 'twisted[windows_platform]', + ], + { + ':platform_system != "windows"': [ + 'twisted', + ], + ':platform_system == "windows"': [ + 'twisted[windows_platform]', + ], + }, + ), + 'requests': ( + [ + 'chardet<3.1.0,>=3.0.2', + 'idna<2.7,>=2.5', + 'urllib3<1.23,>=1.21.1', + 'certifi>=2017.4.17', + '[security]', + 'pyOpenSSL>=0.14', + 'cryptography>=1.3.4', + 'idna>=2.0.0', + '[socks]', + 'PySocks!=1.5.7,>=1.5.6', + ( + '[socks:sys_platform == "win32"' + ' and (python_version == "2.7" or python_version == "2.6")]' + ), + 'win_inet_pton', + ], + { + 'security': [ + 'pyOpenSSL>=0.14', + 'cryptography>=1.3.4', + 'idna>=2.0.0', + ], + 'socks': [ + 'PySocks!=1.5.7,>=1.5.6', + ], + 'socks:sys_platform == "win32" ' + 'and (python_version == "2.7" or python_version == "2.6")': [ + 'win_inet_pton', + ], + } + ), + 'attrs': ( + [ + '[dev]', + 'coverage', + 'hypothesis', + 'pympler', + 'pytest', + 'six', + 'zope.interface', + 'sphinx', + 'zope.interface', + '[docs]', + 'sphinx', + 'zope.interface', + '[tests]', + 'coverage', + 'hypothesis', + 'pympler', + 'pytest', + 'six', + 'zope.interface', + ], + { + 'dev': [ + 'coverage', + 'hypothesis', + 'pympler', + 'pytest', + 'six', + 'zope.interface', + 'sphinx', + 'zope.interface', + ], + 'docs': [ + 'sphinx', + 'zope.interface', + ], + 'tests': [ + 'coverage', + 'hypothesis', + 'pympler', + 'pytest', + 'six', + 'zope.interface', + ], + }, + ), + 'misc': ( + [ + 'chardet', + '[:platform_system != "windows"]', + 'attrs', + '[:platform_system == "windows"]', + 'pytz', + ], + { + ':platform_system != "windows"': [ + 'attrs', + ], + ':platform_system == "windows"': [ + 'pytz', + ], + }, + ), +} + +@pytest.mark.parametrize( + 'scenarios,expected', + list(get_extras_links_scenarios.values()), + ids=list(get_extras_links_scenarios.keys()), +) +def test_get_extras_links(scenarios, expected): + assert PackageFinder.get_extras_links(scenarios) == expected