From 54a0eed13ab2a7e7c1d886a0f87044c1178e915b Mon Sep 17 00:00:00 2001 From: Tom Rochette Date: Sun, 6 Sep 2020 16:30:30 -0400 Subject: [PATCH] Fix version union constraint not properly generated When we have a union of constraints, those were not properly generated. For example, ^1.2.3,!=1.3.5 would be converted to ^1.2.3,!=1.3.5 (same string) under PEP508, which is not valid. --- poetry/core/packages/dependency.py | 5 ++- tests/masonry/builders/test_sdist.py | 4 +++ tests/packages/test_dependency.py | 46 ++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/poetry/core/packages/dependency.py b/poetry/core/packages/dependency.py index 9a530f9ac..97083b63f 100644 --- a/poetry/core/packages/dependency.py +++ b/poetry/core/packages/dependency.py @@ -159,7 +159,10 @@ def base_pep_508_name(self): # type: () -> str if self.constraint.excludes_single_version(): requirement += " ({})".format(str(self.constraint)) else: - requirement += " ({})".format(self.pretty_constraint) + constraints = self.pretty_constraint.split(",") + constraints = [parse_constraint(c) for c in constraints] + constraints = [str(c) for c in constraints] + requirement += " ({})".format(",".join(constraints)) elif isinstance(self.constraint, Version): requirement += " (=={})".format(self.constraint.text) elif not self.constraint.is_any(): diff --git a/tests/masonry/builders/test_sdist.py b/tests/masonry/builders/test_sdist.py index 51bc50444..02f0a65ca 100644 --- a/tests/masonry/builders/test_sdist.py +++ b/tests/masonry/builders/test_sdist.py @@ -49,6 +49,8 @@ def test_convert_dependencies(): Dependency("B", "~1.0"), Dependency("C", "1.2.3"), VCSDependency("D", "git", "https://github.com/sdispater/d.git"), + Dependency("E", "^1.0"), + Dependency("F", "^1.0,!=1.3"), ], ) main = [ @@ -56,6 +58,8 @@ def test_convert_dependencies(): "B>=1.0,<1.1", "C==1.2.3", "D @ git+https://github.com/sdispater/d.git@master", + "E>=1.0,<2.0", + "F>=1.0,<2.0,!=1.3", ] extras = {} diff --git a/tests/packages/test_dependency.py b/tests/packages/test_dependency.py index 10ea294a4..05ecac122 100644 --- a/tests/packages/test_dependency.py +++ b/tests/packages/test_dependency.py @@ -130,3 +130,49 @@ def test_to_pep_508_with_patch_python_version(python_versions, marker): assert expected == dependency.to_pep_508() assert marker == str(dependency.marker) + + +def test_to_pep_508_tilde(): + dependency = Dependency("foo", "~1.2.3") + + assert "foo (>=1.2.3,<1.3.0)" == dependency.to_pep_508() + + dependency = Dependency("foo", "~1.2") + + assert "foo (>=1.2,<1.3)" == dependency.to_pep_508() + + dependency = Dependency("foo", "~0.2.3") + + assert "foo (>=0.2.3,<0.3.0)" == dependency.to_pep_508() + + dependency = Dependency("foo", "~0.2") + + assert "foo (>=0.2,<0.3)" == dependency.to_pep_508() + + +def test_to_pep_508_caret(): + dependency = Dependency("foo", "^1.2.3") + + assert "foo (>=1.2.3,<2.0.0)" == dependency.to_pep_508() + + dependency = Dependency("foo", "^1.2") + + assert "foo (>=1.2,<2.0)" == dependency.to_pep_508() + + dependency = Dependency("foo", "^0.2.3") + + assert "foo (>=0.2.3,<0.3.0)" == dependency.to_pep_508() + + dependency = Dependency("foo", "^0.2") + + assert "foo (>=0.2,<0.3)" == dependency.to_pep_508() + + +def test_to_pep_508_combination(): + dependency = Dependency("foo", "^1.2,!=1.3.5") + + assert "foo (>=1.2,<2.0,!=1.3.5)" == dependency.to_pep_508() + + dependency = Dependency("foo", "~1.2,!=1.2.5") + + assert "foo (>=1.2,<1.3,!=1.2.5)" == dependency.to_pep_508()