summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2021-12-16 20:48:35 (GMT)
committerGitHub <noreply@github.com>2021-12-16 20:48:35 (GMT)
commit109d96602199a91e94eb14b8cb3720841f22ded7 (patch)
tree44d76b7d8a6605fe150147810e064e2f195d82ab
parentecdc0ccede5f9ac4042ff56f295d81df2f428950 (diff)
downloadcpython-109d96602199a91e94eb14b8cb3720841f22ded7.zip
cpython-109d96602199a91e94eb14b8cb3720841f22ded7.tar.gz
cpython-109d96602199a91e94eb14b8cb3720841f22ded7.tar.bz2
bpo-46105: Honor spec when generating requirement specs with urls and extras. (GH-30151)
-rw-r--r--Lib/importlib/metadata/__init__.py13
-rw-r--r--Lib/test/test_importlib/test_metadata_api.py2
-rw-r--r--Misc/NEWS.d/next/Library/2021-12-16-14-30-36.bpo-46105.pprB1K.rst2
3 files changed, 15 insertions, 2 deletions
diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py
index b3e8fb0..ec41ed3 100644
--- a/Lib/importlib/metadata/__init__.py
+++ b/Lib/importlib/metadata/__init__.py
@@ -669,7 +669,7 @@ class Distribution:
def make_condition(name):
return name and f'extra == "{name}"'
- def parse_condition(section):
+ def quoted_marker(section):
section = section or ''
extra, sep, markers = section.partition(':')
if extra and markers:
@@ -677,8 +677,17 @@ class Distribution:
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 in sections:
- yield section.value + parse_condition(section.name)
+ space = url_req_space(section.value)
+ yield section.value + space + quoted_marker(section.name)
class DistributionFinder(MetaPathFinder):
diff --git a/Lib/test/test_importlib/test_metadata_api.py b/Lib/test/test_importlib/test_metadata_api.py
index dc9c234..4a45312 100644
--- a/Lib/test/test_importlib/test_metadata_api.py
+++ b/Lib/test/test_importlib/test_metadata_api.py
@@ -235,6 +235,7 @@ class APITests(
[extra1]
dep4
+ dep6@ git+https://example.com/python/dep.git@v1.0.0
[extra2:python_version < "3"]
dep5
@@ -247,6 +248,7 @@ class APITests(
'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 0000000..145edcc
--- /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).