From 0e9e9944d26d817786df6fa8acb7221ce9361855 Mon Sep 17 00:00:00 2001 From: Simone Primarosa Date: Sun, 10 May 2020 23:53:41 +0100 Subject: [PATCH] pep508: ensure whitespace prefix for quoted marker Prior to this fix, when formatting PEP 508 dependency specification for remote url references, the quoted marker was not prefixed with required whitespace. This change ensures that the format adheres to the specified grammar. Resolves: python-poetry/poetry#2326 --- poetry/packages/__init__.py | 4 ++-- poetry/utils/helpers.py | 2 +- tests/packages/test_main.py | 16 ++++++++++++++++ tests/utils/test_helpers.py | 12 ++++++++---- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/poetry/packages/__init__.py b/poetry/packages/__init__.py index e0a2203c9d3..a829858deb2 100644 --- a/poetry/packages/__init__.py +++ b/poetry/packages/__init__.py @@ -33,8 +33,8 @@ def dependency_from_pep_508(name): name = parts[0].strip() if len(parts) > 1: rest = parts[1] - if ";" in rest: - name += ";" + rest.split(";", 1)[1] + if " ;" in rest: + name += " ;" + rest.split(" ;", 1)[1] req = Requirement(name) diff --git a/poetry/utils/helpers.py b/poetry/utils/helpers.py index 3ecef0c391e..85d18a71d44 100644 --- a/poetry/utils/helpers.py +++ b/poetry/utils/helpers.py @@ -83,7 +83,7 @@ def parse_requires(requires): # type: (str) -> List[str] continue if current_marker: - line = "{}; {}".format(line, current_marker) + line = "{} ; {}".format(line, current_marker) requires_dist.append(line) diff --git a/tests/packages/test_main.py b/tests/packages/test_main.py index 586be5a31b8..5559057e4e9 100644 --- a/tests/packages/test_main.py +++ b/tests/packages/test_main.py @@ -183,6 +183,22 @@ def test_dependency_from_pep_508_with_git_url(): assert "1.2" == dep.reference +def test_dependency_from_pep_508_with_git_url_and_comment_and_extra(): + name = ( + "poetry @ git+https://github.com/python-poetry/poetry.git@b;ar;#egg=poetry" + ' ; extra == "foo;"' + ) + + dep = dependency_from_pep_508(name) + + assert "poetry" == dep.name + assert dep.is_vcs() + assert "git" == dep.vcs + assert "https://github.com/python-poetry/poetry.git" == dep.source + assert "b;ar;" == dep.reference + assert dep.in_extras == ["foo;"] + + def test_dependency_from_pep_508_with_url(): name = "django-utils @ https://example.com/django-utils-1.0.0.tar.gz" diff --git a/tests/utils/test_helpers.py b/tests/utils/test_helpers.py index d34061c88d6..eb7ce191f18 100644 --- a/tests/utils/test_helpers.py +++ b/tests/utils/test_helpers.py @@ -29,6 +29,9 @@ def test_parse_requires(): [:python_version >= "3.4.0.0" and python_version < "3.6.0.0"] zipfile36>=0.1.0.0,<0.2.0.0 + +[dev] +isort@ git+git://github.com/timothycrosley/isort.git@e63ae06ec7d70b06df9e528357650281a3d3ec22#egg=isort """ result = parse_requires(requires) expected = [ @@ -45,10 +48,11 @@ def test_parse_requires(): "msgpack-python>=0.5.0.0,<0.6.0.0", "pyparsing>=2.2.0.0,<3.0.0.0", "requests-toolbelt>=0.8.0.0,<0.9.0.0", - 'typing>=3.6.0.0,<4.0.0.0; (python_version >= "2.7.0.0" and python_version < "2.8.0.0") or (python_version >= "3.4.0.0" and python_version < "3.5.0.0")', - 'virtualenv>=15.2.0.0,<16.0.0.0; python_version >= "2.7.0.0" and python_version < "2.8.0.0"', - 'pathlib2>=2.3.0.0,<3.0.0.0; python_version >= "2.7.0.0" and python_version < "2.8.0.0"', - 'zipfile36>=0.1.0.0,<0.2.0.0; python_version >= "3.4.0.0" and python_version < "3.6.0.0"', + 'typing>=3.6.0.0,<4.0.0.0 ; (python_version >= "2.7.0.0" and python_version < "2.8.0.0") or (python_version >= "3.4.0.0" and python_version < "3.5.0.0")', + 'virtualenv>=15.2.0.0,<16.0.0.0 ; python_version >= "2.7.0.0" and python_version < "2.8.0.0"', + 'pathlib2>=2.3.0.0,<3.0.0.0 ; python_version >= "2.7.0.0" and python_version < "2.8.0.0"', + 'zipfile36>=0.1.0.0,<0.2.0.0 ; python_version >= "3.4.0.0" and python_version < "3.6.0.0"', + 'isort@ git+git://github.com/timothycrosley/isort.git@e63ae06ec7d70b06df9e528357650281a3d3ec22#egg=isort ; extra == "dev"', ] assert result == expected