Skip to content

Commit

Permalink
Fix the evaluation of in/not in markers
Browse files Browse the repository at this point in the history
  • Loading branch information
sdispater committed Aug 19, 2021
1 parent 5812d6d commit f42cf38
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 1 deletion.
3 changes: 3 additions & 0 deletions poetry/core/packages/constraints/base_constraint.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@


class BaseConstraint(object):
def allows(self, other: "ConstraintTypes") -> bool:
raise NotImplementedError()

def allows_all(self, other: "ConstraintTypes") -> bool:
raise NotImplementedError()

Expand Down
3 changes: 3 additions & 0 deletions poetry/core/packages/constraints/empty_constraint.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ def matches(self, _: "ConstraintTypes") -> bool:
def is_empty(self) -> bool:
return True

def allows(self, other: "ConstraintTypes") -> bool:
return False

def allows_all(self, other: "ConstraintTypes") -> bool:
return True

Expand Down
12 changes: 11 additions & 1 deletion poetry/core/version/markers.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,17 @@ def __init__(self, name: str, constraint: Union[str, "VersionTypes"]) -> None:
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) -> str:
Expand Down
48 changes: 48 additions & 0 deletions tests/version/test_markers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"')
Expand Down Expand Up @@ -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):
Expand Down

0 comments on commit f42cf38

Please sign in to comment.