diff --git a/poetry/version/markers.py b/poetry/version/markers.py index 28b0bb74861..f8437348c05 100644 --- a/poetry/version/markers.py +++ b/poetry/version/markers.py @@ -628,7 +628,15 @@ def __hash__(self): return h def __str__(self): - return " or ".join(str(m) for m in self._markers) + return " or ".join( + str(m) for m in self._markers if not m.is_any() and not m.is_empty() + ) + + def is_any(self): + return all(m.is_any() for m in self._markers) + + def is_empty(self): + return all(m.is_empty() for m in self._markers) def parse_marker(marker): diff --git a/tests/version/test_markers.py b/tests/version/test_markers.py index 382890e2e06..edd6e174f9d 100644 --- a/tests/version/test_markers.py +++ b/tests/version/test_markers.py @@ -354,6 +354,46 @@ def test_marker_union_union_duplicates(): ) +def test_marker_union_all_any(): + union = MarkerUnion(parse_marker(""), parse_marker("")) + + assert union.is_any() + + +def test_marker_union_not_all_any(): + union = MarkerUnion(parse_marker(""), parse_marker(""), parse_marker("")) + + assert not union.is_any() + + +def test_marker_union_all_empty(): + union = MarkerUnion(parse_marker(""), parse_marker("")) + + assert union.is_empty() + + +def test_marker_union_not_all_empty(): + union = MarkerUnion( + parse_marker(""), parse_marker(""), parse_marker("") + ) + + assert not union.is_empty() + + +def test_marker_str_conversion_skips_empty_and_any(): + union = MarkerUnion( + parse_marker(""), + parse_marker( + 'sys_platform == "darwin" or python_version <= "3.6" or os_name == "Windows"' + ), + parse_marker(""), + ) + + assert str(union) == ( + 'sys_platform == "darwin" or python_version <= "3.6" or os_name == "Windows"' + ) + + def test_intersect_compacts_constraints(): m = parse_marker('python_version < "4.0"')