diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 214326e2..23b85d19 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,7 +4,9 @@ Changelog *unreleased* ~~~~~~~~~~~~ -No unreleased changes. +* ``Marker.evaluate`` will now assume evaluation environment with empty ``extra``. + Evaluating markers like ``"extra == 'xyz'"`` without passing any extra in the + ``environment`` will no longer raise an exception. 21.3 - 2021-11-17 ~~~~~~~~~~~~~~~~~ diff --git a/docs/markers.rst b/docs/markers.rst index 478b76e4..2ca012ec 100644 --- a/docs/markers.rst +++ b/docs/markers.rst @@ -34,17 +34,6 @@ Usage >>> # Markers can be also used with extras, to pull in dependencies if >>> # a certain extra is being installed >>> extra = Marker('extra == "bar"') - >>> # Evaluating an extra marker with no environment is an error - >>> try: - ... extra.evaluate() - ... except UndefinedEnvironmentName: - ... pass - >>> extra_environment = {'extra': ''} - >>> extra.evaluate(environment=extra_environment) - False - >>> extra_environment['extra'] = 'bar' - >>> extra.evaluate(environment=extra_environment) - True >>> # You can do simple comparisons between marker objects: >>> Marker("python_version > '3.6'") == Marker("python_version > '3.6'") True diff --git a/packaging/markers.py b/packaging/markers.py index 03d8cdef..f97b0154 100644 --- a/packaging/markers.py +++ b/packaging/markers.py @@ -274,6 +274,7 @@ def default_environment() -> Dict[str, str]: iver = format_full_version(sys.implementation.version) implementation_name = sys.implementation.name return { + "extra": "", "implementation_name": implementation_name, "implementation_version": iver, "os_name": os.name, diff --git a/tests/test_markers.py b/tests/test_markers.py index b1ccf63c..28762f10 100644 --- a/tests/test_markers.py +++ b/tests/test_markers.py @@ -15,7 +15,6 @@ Marker, Node, UndefinedComparison, - UndefinedEnvironmentName, default_environment, format_full_version, ) @@ -110,6 +109,7 @@ def test_matches_expected(self): ) assert environment == { + "extra": "", "implementation_name": sys.implementation.name, "implementation_version": iver, "os_name": os.name, @@ -253,11 +253,8 @@ def test_compare_markers_to_other_objects(self): # Markers should not be comparable to other kinds of objects. assert Marker("os_name == 'nt'") != "os_name == 'nt'" - def test_extra_with_no_extra_in_environment(self): - # We can't evaluate an extra if no extra is passed into the environment - m = Marker("extra == 'security'") - with pytest.raises(UndefinedEnvironmentName): - m.evaluate() + def test_environment_assumes_empty_extra(self): + assert Marker('extra == "im_valid"').evaluate() is False @pytest.mark.parametrize( ("marker_string", "environment", "expected"),