diff options
| author | Alex Grönholm <alex.gronholm@nextday.fi> | 2018-07-18 13:13:55 +0300 |
|---|---|---|
| committer | Alex Grönholm <alex.gronholm@nextday.fi> | 2018-07-18 13:13:55 +0300 |
| commit | f3855494f20724f1ae844631d08e34367e977661 (patch) | |
| tree | a85ca366b43f683707b6721bdae846f670b20e24 | |
| parent | 79a7e431e88f80f55fd1998d3093d5feb98200b4 (diff) | |
| download | wheel-git-f3855494f20724f1ae844631d08e34367e977661.tar.gz | |
Added a "real proper" fix for duplicate metadata lines
| -rw-r--r-- | tests/test_metadata.py | 74 | ||||
| -rw-r--r-- | wheel/metadata.py | 15 |
2 files changed, 42 insertions, 47 deletions
diff --git a/tests/test_metadata.py b/tests/test_metadata.py index b365142..3421430 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -1,48 +1,46 @@ -from wheel.metadata import generate_requirements +from wheel.metadata import pkginfo_to_metadata -def test_generate_requirements(): - extras_require = { - 'test': ['ipykernel', 'ipython', 'mock'], - 'test:python_version == "3.3"': ['pytest<3.3.0'], - 'test:python_version >= "3.4" or python_version == "2.7"': ['pytest'], - } +def test_pkginfo_to_metadata(tmpdir): expected_metadata = [ - ('Provides-Extra', - 'test'), - ('Requires-Dist', - "ipykernel; extra == 'test'"), - ('Requires-Dist', - "ipython; extra == 'test'"), - ('Requires-Dist', - "mock; extra == 'test'"), - ('Requires-Dist', - 'pytest (<3.3.0); (python_version == "3.3") and extra == \'test\''), - ('Requires-Dist', - 'pytest; (python_version >= "3.4" or python_version == "2.7") and extra == \'test\''), - ] - generated_metadata = sorted(generate_requirements(extras_require)) - assert generated_metadata == expected_metadata - - -def test_generate_requirements_no_duplicate_extras(): - extras_require = { - 'signatures': ['keyring', 'keyrings.alt'], - 'signatures:sys_platform!="win32"': ['pyxdg'], - 'faster-signatures': ['ed25519ll'], - 'test': ['pytest >= 3.0.0', 'pytest-cov'] - } - expected_metadata = [ - ('Provides-Extra', 'faster-signatures'), - ('Provides-Extra', 'signatures'), + ('Metadata-Version', '2.1'), + ('Name', 'spam'), + ('Version', '0.1'), ('Provides-Extra', 'test'), + ('Provides-Extra', 'signatures'), + ('Provides-Extra', 'faster-signatures'), ('Requires-Dist', "ed25519ll; extra == 'faster-signatures'"), ('Requires-Dist', "keyring; extra == 'signatures'"), ('Requires-Dist', "keyrings.alt; extra == 'signatures'"), + ('Requires-Dist', 'pyxdg; (sys_platform!="win32") and extra == \'signatures\''), ('Requires-Dist', "pytest (>=3.0.0); extra == 'test'"), ('Requires-Dist', "pytest-cov; extra == 'test'"), - ('Requires-Dist', - 'pyxdg; (sys_platform!="win32") and extra == \'signatures\''), ] - generated_metadata = sorted(generate_requirements(extras_require)) - assert generated_metadata == expected_metadata + + pkg_info = tmpdir.join('PKG-INFO') + pkg_info.write("""\ +Metadata-Version: 0.0 +Name: spam +Version: 0.1 +Provides-Extra: test +Provides-Extra: signatures +Provides-Extra: faster-signatures""") + + egg_info_dir = tmpdir.ensure_dir('test.egg-info') + egg_info_dir.join('requires.txt').write("""\ +[faster-signatures] +ed25519ll + +[signatures] +keyring +keyrings.alt + +[signatures:sys_platform!="win32"] +pyxdg + +[test] +pytest>=3.0.0 +pytest-cov""") + + message = pkginfo_to_metadata(egg_info_path=str(egg_info_dir), pkginfo_path=str(pkg_info)) + assert message.items() == expected_metadata diff --git a/wheel/metadata.py b/wheel/metadata.py index b3cf1b4..4fa17cd 100644 --- a/wheel/metadata.py +++ b/wheel/metadata.py @@ -44,7 +44,6 @@ def generate_requirements(extras_require): extras_require is a dictionary of {extra: [requirements]} as passed to setup(), using the empty extra {'': [requirements]} to hold install_requires. """ - requirements = set() for extra, depends in extras_require.items(): condition = '' if extra and ':' in extra: # setuptools extra:condition syntax @@ -52,7 +51,7 @@ def generate_requirements(extras_require): extra = pkg_resources.safe_extra(extra) if extra: - requirements.add(('Provides-Extra', extra)) + yield 'Provides-Extra', extra if condition: condition = "(" + condition + ") and " condition += "extra == '%s'" % extra @@ -61,9 +60,7 @@ def generate_requirements(extras_require): condition = '; ' + condition for new_req in convert_requirements(depends): - requirements.add(('Requires-Dist', new_req + condition)) - - return requirements + yield 'Requires-Dist', new_req + condition def pkginfo_to_metadata(egg_info_path, pkginfo_path): @@ -79,10 +76,10 @@ def pkginfo_to_metadata(egg_info_path, pkginfo_path): parsed_requirements = sorted(pkg_resources.split_sections(requires), key=lambda x: x[0] or '') - requirements = {(header, value) for extra, reqs in parsed_requirements - for header, value in generate_requirements({extra: reqs})} - for key, value in requirements: - pkg_info[key] = value + for extra, reqs in parsed_requirements: + for key, value in generate_requirements({extra: reqs}): + if (key, value) not in pkg_info.items(): + pkg_info[key] = value description = pkg_info['Description'] if description: |
