Skip to content

Commit bd5044c

Browse files
committed
merging python_version and python_full_version markers
1 parent 4c17193 commit bd5044c

2 files changed

Lines changed: 29 additions & 20 deletions

File tree

src/poetry/core/version/markers.py

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class UndefinedEnvironmentName(ValueError):
4949
"python_implementation": "platform_python_implementation",
5050
}
5151

52+
PYTHON_VERSION_MARKERS = ["python_version", "python_full_version"]
5253

5354
# Parser: PEP 508 Environment Markers
5455
_parser = Parser(GRAMMAR_PEP_508_MARKERS, "lalr")
@@ -259,22 +260,6 @@ def value(self) -> str:
259260

260261
def intersect(self, other: MarkerTypes) -> MarkerTypes:
261262
if isinstance(other, SingleMarker):
262-
if other.name != self.name:
263-
return MultiMarker(self, other)
264-
265-
if self == other:
266-
return self
267-
268-
if self._operator in {"in", "not in"} or other.operator in {"in", "not in"}:
269-
return MultiMarker.of(self, other)
270-
271-
new_constraint = self._constraint.intersect(other.constraint)
272-
if new_constraint.is_empty():
273-
return EmptyMarker()
274-
275-
if new_constraint == self._constraint or new_constraint == other.constraint:
276-
return SingleMarker(self._name, new_constraint)
277-
278263
return MultiMarker.of(self, other)
279264

280265
return other.intersect(self)
@@ -416,7 +401,13 @@ def of(cls, *markers: MarkerTypes) -> MarkerTypes:
416401
if isinstance(marker, SingleMarker):
417402
intersected = False
418403
for i, mark in enumerate(new_markers):
419-
if isinstance(mark, SingleMarker) and mark.name == marker.name:
404+
if isinstance(mark, SingleMarker) and (
405+
mark.name == marker.name
406+
or (
407+
mark.name in PYTHON_VERSION_MARKERS
408+
and marker.name in PYTHON_VERSION_MARKERS
409+
)
410+
):
420411
intersection = mark.constraint.intersect(marker.constraint)
421412
if intersection == mark.constraint:
422413
intersected = True
@@ -560,13 +551,15 @@ def of(cls, *markers: BaseMarker) -> MarkerTypes:
560551
if marker in markers:
561552
continue
562553

563-
if isinstance(marker, SingleMarker) and marker.name == "python_version":
554+
if (
555+
isinstance(marker, SingleMarker)
556+
and marker.name in PYTHON_VERSION_MARKERS
557+
):
564558
included = False
565559
for i, mark in enumerate(markers):
566560
if (
567561
not isinstance(mark, SingleMarker)
568-
or isinstance(mark, SingleMarker)
569-
and mark.name != marker.name
562+
or mark.name not in PYTHON_VERSION_MARKERS
570563
):
571564
continue
572565

tests/version/test_markers.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,14 @@ def test_single_marker_not_in_python_intersection():
159159
assert str(intersection) == 'python_version not in "2.7, 3.0, 3.1, 3.2"'
160160

161161

162+
def test_marker_intersection_of_python_version_and_python_full_version():
163+
m = parse_marker('python_version >= "3.6"')
164+
m2 = parse_marker('python_full_version >= "3.0.0"')
165+
intersection = m.intersect(m2)
166+
167+
assert str(intersection) == 'python_version >= "3.6"'
168+
169+
162170
def test_single_marker_union():
163171
m = parse_marker('sys_platform == "darwin"')
164172

@@ -369,6 +377,14 @@ def test_marker_union_deduplicate():
369377
assert str(m) == 'sys_platform == "darwin" or implementation_name == "cpython"'
370378

371379

380+
def test_marker_union_of_python_version_and_python_full_version():
381+
m = parse_marker('python_version >= "3.6"')
382+
m2 = parse_marker('python_full_version >= "3.0.0"')
383+
union = m.union(m2)
384+
385+
assert str(union) == 'python_full_version >= "3.0.0"'
386+
387+
372388
def test_marker_union_intersect_single_marker():
373389
m = parse_marker('sys_platform == "darwin" or python_version < "3.4"')
374390

0 commit comments

Comments
 (0)