diff --git a/CHANGELOG.rst b/CHANGELOG.rst index cf4db410925..1c35e0fc2fc 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -10,6 +10,10 @@ Next release - Improve copyright detection for statements with parens or trailing "authors" +- Fix ``python_version`` environment markers using ``>``, ``!=`` or ``~=`` being + silently dropped from the dependency ``extra_data``. + https://github.com/aboutcode-org/scancode-toolkit/issues/5309 + v33.0.0rc1 - 2026-05-14 ------------------------ diff --git a/src/packagedcode/pypi.py b/src/packagedcode/pypi.py index dcfd237590e..8eca597382d 100644 --- a/src/packagedcode/pypi.py +++ b/src/packagedcode/pypi.py @@ -2278,7 +2278,10 @@ def get_python_version_os(marker): requirement Marker or None. """ platform_data = {} - python_version_operators = ['<', '>=', '==', '<=', '<'] + # all comparison operators allowed for a marker in PEP 508 + python_version_operators = [ + '<', '<=', '!=', '==', '>=', '>', '~=', '===', + ] if not marker or not isinstance(marker, markers.Marker): return platform_data diff --git a/tests/packagedcode/test_pypi.py b/tests/packagedcode/test_pypi.py index 20afae813db..297b8771858 100644 --- a/tests/packagedcode/test_pypi.py +++ b/tests/packagedcode/test_pypi.py @@ -806,3 +806,21 @@ def test_parse_setup_py(test_loc): def test_parse_more_setup_py(test_loc): check_setup_py_parsing(test_loc) + +@pytest.mark.parametrize( + ('requirement', 'expected'), + [ + ('requests; python_version < "3.8"', {'python_version': '< 3.8'}), + ('requests; python_version <= "3.8"', {'python_version': '<= 3.8'}), + ('requests; python_version != "3.8"', {'python_version': '!= 3.8'}), + ('requests; python_version == "3.8"', {'python_version': '== 3.8'}), + ('requests; python_version >= "3.8"', {'python_version': '>= 3.8'}), + ('requests; python_version > "3.8"', {'python_version': '> 3.8'}), + ('requests; python_version ~= "3.8"', {'python_version': '~= 3.8'}), + ], +) +def test_get_python_version_os_handles_all_comparison_operators(requirement, expected): + from packvers.requirements import Requirement + + marker = Requirement(requirement).marker + assert pypi.get_python_version_os(marker) == expected