diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2021-12-16 21:19:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-16 21:19:14 (GMT) |
commit | 09d7319bfe0006d9aa3fc14833b69c24ccafdca6 (patch) | |
tree | 4d951b0b2227732e4e9258aa761f020484f5c213 | |
parent | 0194bbbee6a12264e93d3217c774e226f0a1737d (diff) | |
download | cpython-09d7319bfe0006d9aa3fc14833b69c24ccafdca6.zip cpython-09d7319bfe0006d9aa3fc14833b69c24ccafdca6.tar.gz cpython-09d7319bfe0006d9aa3fc14833b69c24ccafdca6.tar.bz2 |
bpo-46105: Honor spec when generating requirement specs with urls and extras. (GH-30151)
(cherry picked from commit 109d96602199a91e94eb14b8cb3720841f22ded7)
Co-authored-by: Jason R. Coombs <jaraco@jaraco.com>
-rw-r--r-- | Lib/importlib/metadata/__init__.py | 13 | ||||
-rw-r--r-- | Lib/test/test_importlib/test_metadata_api.py | 2 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2021-12-16-14-30-36.bpo-46105.pprB1K.rst | 2 |
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). |