Skip to content

Commit 9167919

Browse files
Lazily evaluate markers to mitigate non-PEP 440 version errors
1 parent cf2cbe2 commit 9167919

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

src/packaging/markers.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from __future__ import annotations
66

7+
import functools
78
import operator
89
import os
910
import platform
@@ -202,13 +203,14 @@ def _normalize(*values: str, key: str) -> tuple[str, ...]:
202203

203204

204205
def _evaluate_markers(markers: MarkerList, environment: dict[str, str]) -> bool:
205-
groups: list[list[bool]] = [[]]
206+
# Lazy evaluation to mitigate https://github.com/pypa/packaging/issues/774
207+
groups: list[list[Callable[[], bool]]] = [[]]
206208

207209
for marker in markers:
208210
assert isinstance(marker, (list, tuple, str))
209211

210212
if isinstance(marker, list):
211-
groups[-1].append(_evaluate_markers(marker, environment))
213+
groups[-1].append(functools.partial(_evaluate_markers, marker, environment))
212214
elif isinstance(marker, tuple):
213215
lhs, op, rhs = marker
214216

@@ -222,13 +224,13 @@ def _evaluate_markers(markers: MarkerList, environment: dict[str, str]) -> bool:
222224
rhs_value = environment[environment_key]
223225

224226
lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key)
225-
groups[-1].append(_eval_op(lhs_value, op, rhs_value))
227+
groups[-1].append(functools.partial(_eval_op, lhs_value, op, rhs_value))
226228
else:
227229
assert marker in ["and", "or"]
228230
if marker == "or":
229231
groups.append([])
230232

231-
return any(all(item) for item in groups)
233+
return any(all(expr() for expr in group) for group in groups)
232234

233235

234236
def format_full_version(info: sys._version_info) -> str:

tests/test_markers.py

+5
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,11 @@ def test_environment_with_extra_none(self):
317317
{"extra": "different__punctuation_is_EQUAL"},
318318
True,
319319
),
320+
(
321+
"sys_platform == 'foo_os' and platform_release >= '4.5.6'",
322+
{"sys_platform": "bar_os", "platform_release": "1.2.3-invalid"},
323+
False,
324+
)
320325
],
321326
)
322327
def test_evaluates(self, marker_string, environment, expected):

0 commit comments

Comments
 (0)