[Python-checkins] [3.9] bpo-46105: Honor spec when generating requirement specs with urls and extras. (GH-30151). (GH-30157)
jaraco
webhook-mailer at python.org
Thu Dec 16 19:58:28 EST 2021
https://github.com/python/cpython/commit/864ec170e14b663f999eb415a4f1a0067ec6833a
commit: 864ec170e14b663f999eb415a4f1a0067ec6833a
branch: 3.9
author: Jason R. Coombs <jaraco at jaraco.com>
committer: jaraco <jaraco at jaraco.com>
date: 2021-12-16T19:58:19-05:00
summary:
[3.9] bpo-46105: Honor spec when generating requirement specs with urls and extras. (GH-30151). (GH-30157)
(cherry picked from commit 109d96602199a91e94eb14b8cb3720841f22ded7)
Co-authored-by: Jason R. Coombs <jaraco at jaraco.com>
files:
A Misc/NEWS.d/next/Library/2021-12-16-14-30-36.bpo-46105.pprB1K.rst
M Lib/importlib/metadata.py
M Lib/test/test_importlib/test_metadata_api.py
diff --git a/Lib/importlib/metadata.py b/Lib/importlib/metadata.py
index c6c7d31aa5d8a..594986ce23efa 100644
--- a/Lib/importlib/metadata.py
+++ b/Lib/importlib/metadata.py
@@ -344,17 +344,26 @@ def _convert_egg_info_reqs_to_simple_reqs(sections):
def make_condition(name):
return name and 'extra == "{name}"'.format(name=name)
- def parse_condition(section):
+ def quoted_marker(section):
section = section or ''
extra, sep, markers = section.partition(':')
if extra and markers:
- markers = '({markers})'.format(markers=markers)
+ markers = f'({markers})'
conditions = list(filter(None, [markers, make_condition(extra)]))
return '; ' + ' and '.join(conditions) if conditions else ''
+ def url_req_space(req):
+ """
+ PEP 508 requires a space between the url_spec and the quoted_marker.
+ Ref python/importlib_metadata#357.
+ """
+ # '@' is uniquely indicative of a url_req.
+ return ' ' * ('@' in req)
+
for section, deps in sections.items():
for dep in deps:
- yield dep + parse_condition(section)
+ space = url_req_space(dep)
+ yield dep + space + quoted_marker(section)
class DistributionFinder(MetaPathFinder):
diff --git a/Lib/test/test_importlib/test_metadata_api.py b/Lib/test/test_importlib/test_metadata_api.py
index 1d7b29ae05fd1..420fbfeb3a704 100644
--- a/Lib/test/test_importlib/test_metadata_api.py
+++ b/Lib/test/test_importlib/test_metadata_api.py
@@ -121,6 +121,7 @@ def test_more_complex_deps_requires_text(self):
[extra1]
dep4
+ dep6@ git+https://example.com/python/dep.git@v1.0.0
[extra2:python_version < "3"]
dep5
@@ -132,6 +133,7 @@ def test_more_complex_deps_requires_text(self):
'dep3; python_version < "3"',
'dep4; extra == "extra1"',
'dep5; (python_version < "3") and extra == "extra2"',
+ 'dep6@ git+https://example.com/python/dep.git@v1.0.0 ; extra == "extra1"',
]
# It's important that the environment marker expression be
# wrapped in parentheses to avoid the following 'and' binding more
diff --git a/Misc/NEWS.d/next/Library/2021-12-16-14-30-36.bpo-46105.pprB1K.rst b/Misc/NEWS.d/next/Library/2021-12-16-14-30-36.bpo-46105.pprB1K.rst
new file mode 100644
index 0000000000000..145edccb2e7a5
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-12-16-14-30-36.bpo-46105.pprB1K.rst
@@ -0,0 +1,2 @@
+Honor spec when generating requirement specs with urls and extras
+(importlib_metadata 4.8.3).
More information about the Python-checkins
mailing list