summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Grönholm <alex.gronholm@nextday.fi>2018-07-18 13:13:55 +0300
committerAlex Grönholm <alex.gronholm@nextday.fi>2018-07-18 13:13:55 +0300
commitf3855494f20724f1ae844631d08e34367e977661 (patch)
treea85ca366b43f683707b6721bdae846f670b20e24
parent79a7e431e88f80f55fd1998d3093d5feb98200b4 (diff)
downloadwheel-git-f3855494f20724f1ae844631d08e34367e977661.tar.gz
Added a "real proper" fix for duplicate metadata lines
-rw-r--r--tests/test_metadata.py74
-rw-r--r--wheel/metadata.py15
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: