diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 27ca81553..0736c0212 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,7 +23,7 @@ jobs: - name: Install and set up Poetry run: | curl -fsS -o get-poetry.py https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py - python get-poetry.py --preview -y + python get-poetry.py -y - name: Build distributions run: | source $HOME/.poetry/env diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e80838a5e..e1ca9947b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -41,7 +41,7 @@ jobs: shell: bash run: | curl -fsS -o get-poetry.py https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py - python get-poetry.py --preview -y + python get-poetry.py -y echo "$HOME/.poetry/bin" >> $GITHUB_PATH - name: Configure poetry diff --git a/poetry/core/packages/constraints/base_constraint.py b/poetry/core/packages/constraints/base_constraint.py index 8cb95c138..0db9aff42 100644 --- a/poetry/core/packages/constraints/base_constraint.py +++ b/poetry/core/packages/constraints/base_constraint.py @@ -6,6 +6,9 @@ class BaseConstraint(object): + def allows(self, other): # type: ("ConstraintTypes") -> bool + raise NotImplementedError + def allows_all(self, other): # type: ("ConstraintTypes") -> bool raise NotImplementedError() diff --git a/poetry/core/packages/constraints/empty_constraint.py b/poetry/core/packages/constraints/empty_constraint.py index eb29e4ad3..4db043def 100644 --- a/poetry/core/packages/constraints/empty_constraint.py +++ b/poetry/core/packages/constraints/empty_constraint.py @@ -17,6 +17,9 @@ def matches(self, _): # type: ("ConstraintTypes") -> bool def is_empty(self): # type: () -> bool return True + def allows(self, other): # type: ("ConstraintTypes") -> bool + return False + def allows_all(self, other): # type: ("ConstraintTypes") -> bool return True diff --git a/poetry/core/version/markers.py b/poetry/core/version/markers.py index 894e1dc17..ac6c2b60f 100644 --- a/poetry/core/version/markers.py +++ b/poetry/core/version/markers.py @@ -225,7 +225,17 @@ def __init__( else: self._constraint = self._parser(self._constraint_string) else: - self._constraint = self._parser(self._constraint_string) + # if we have a in/not in operator we split the constraint + # into a union/multi-constraint of single constraint + constraint_string = self._constraint_string + if self._operator in {"in", "not in"}: + op, glue = ("==", " || ") if self._operator == "in" else ("!=", ", ") + values = re.split("[ ,]+", self._value) + constraint_string = glue.join( + ("{} {}".format(op, value) for value in values) + ) + + self._constraint = self._parser(constraint_string) @property def name(self): # type: () -> str diff --git a/tests/version/test_markers.py b/tests/version/test_markers.py index f31bd4442..389d25c13 100644 --- a/tests/version/test_markers.py +++ b/tests/version/test_markers.py @@ -36,6 +36,34 @@ def test_single_marker(): assert m.constraint_string == "not in 2.7, 3.0, 3.1" assert str(m.constraint) == "<2.7.0 || >=2.8.0,<3.0.0 || >=3.2.0" + m = parse_marker( + "platform_machine in 'x86_64 X86_64 aarch64 AARCH64 ppc64le PPC64LE amd64 AMD64 win32 WIN32'" + ) + + assert isinstance(m, SingleMarker) + assert m.name == "platform_machine" + assert ( + m.constraint_string + == "in x86_64 X86_64 aarch64 AARCH64 ppc64le PPC64LE amd64 AMD64 win32 WIN32" + ) + assert str(m.constraint) == ( + "x86_64 || X86_64 || aarch64 || AARCH64 || ppc64le || PPC64LE || amd64 || AMD64 || win32 || WIN32" + ) + + m = parse_marker( + "platform_machine not in 'x86_64 X86_64 aarch64 AARCH64 ppc64le PPC64LE amd64 AMD64 win32 WIN32'" + ) + + assert isinstance(m, SingleMarker) + assert m.name == "platform_machine" + assert ( + m.constraint_string + == "not in x86_64 X86_64 aarch64 AARCH64 ppc64le PPC64LE amd64 AMD64 win32 WIN32" + ) + assert str(m.constraint) == ( + "!=x86_64, !=X86_64, !=aarch64, !=AARCH64, !=ppc64le, !=PPC64LE, !=amd64, !=AMD64, !=win32, !=WIN32" + ) + def test_single_marker_intersect(): m = parse_marker('sys_platform == "darwin"') @@ -476,6 +504,26 @@ def test_multi_marker_removes_duplicates(): {"python_version": "2.7"}, False, ), + ( + "platform_machine in 'x86_64 X86_64 aarch64 AARCH64 ppc64le PPC64LE amd64 AMD64 win32 WIN32'", + {"platform_machine": "foo"}, + False, + ), + ( + "platform_machine in 'x86_64 X86_64 aarch64 AARCH64 ppc64le PPC64LE amd64 AMD64 win32 WIN32'", + {"platform_machine": "x86_64"}, + True, + ), + ( + "platform_machine not in 'x86_64 X86_64 aarch64 AARCH64 ppc64le PPC64LE amd64 AMD64 win32 WIN32'", + {"platform_machine": "foo"}, + True, + ), + ( + "platform_machine not in 'x86_64 X86_64 aarch64 AARCH64 ppc64le PPC64LE amd64 AMD64 win32 WIN32'", + {"platform_machine": "x86_64"}, + False, + ), ], ) def test_validate(marker_string, environment, expected):