Skip to content

json.__version__ is deprecated and used in tests #5186

@hroncok

Description

@hroncok

setuptools version

main

Python version

3.15.0a6

OS

all

Additional environment information

This happens when we run tests builds of Fedora Python packages with Python 3.15 pre-releases.

Description

setuptools tests fail with:

________________________ TestDepends.testModuleExtract _________________________

self = <setuptools.tests.test_setuptools.TestDepends object at 0x7f07b8dda060>

    @needs_bytecode
    def testModuleExtract(self):
>       from json import __version__

/builddir/build/BUILD/python-setuptools-80.10.2-build/setuptools-80.10.2/setuptools/tests/test_setuptools.py:82: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
<frozen importlib._bootstrap>:1336: in _handle_fromlist
    ???
/usr/lib64/python3.15/json/__init__.py:371: in __getattr__
    _deprecated("__version__", remove=(3, 20))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

name = '__version__'
message = '{name!r} is deprecated and slated for removal in Python {remove}'

    def _deprecated(name, message=_DEPRECATED_MSG, *, remove, _version=sys.version_info):
        """Warn that *name* is deprecated or should be removed.
    
        RuntimeError is raised if *remove* specifies a major/minor tuple older than
        the current Python version or the same version but past the alpha.
    
        The *message* argument is formatted with *name* and *remove* as a Python
        version tuple (e.g. (3, 11)).
    
        """
        remove_formatted = f"{remove[0]}.{remove[1]}"
        if (_version[:2] > remove) or (_version[:2] == remove and _version[3] != "alpha"):
            msg = f"{name!r} was slated for removal after Python {remove_formatted} alpha"
            raise RuntimeError(msg)
        else:
            msg = message.format(name=name, remove=remove_formatted)
>           _wm.warn(msg, DeprecationWarning, stacklevel=3)
E           DeprecationWarning: '__version__' is deprecated and slated for removal in Python 3.20

/usr/lib64/python3.15/_py_warnings.py:889: DeprecationWarning
___________________________ TestDepends.testRequire ____________________________

self = <setuptools.tests.test_setuptools.TestDepends object at 0x7f07b8dd9f30>

    @needs_bytecode
    def testRequire(self):
        req = Require('Json', '1.0.3', 'json')
    
        assert req.name == 'Json'
        assert req.module == 'json'
        assert req.requested_version == Version('1.0.3')
        assert req.attribute == '__version__'
        assert req.full_name() == 'Json-1.0.3'
    
>       from json import __version__

/builddir/build/BUILD/python-setuptools-80.10.2-build/setuptools-80.10.2/setuptools/tests/test_setuptools.py:101: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
<frozen importlib._bootstrap>:1336: in _handle_fromlist
    ???
/usr/lib64/python3.15/json/__init__.py:371: in __getattr__
    _deprecated("__version__", remove=(3, 20))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

name = '__version__'
message = '{name!r} is deprecated and slated for removal in Python {remove}'

    def _deprecated(name, message=_DEPRECATED_MSG, *, remove, _version=sys.version_info):
        """Warn that *name* is deprecated or should be removed.
    
        RuntimeError is raised if *remove* specifies a major/minor tuple older than
        the current Python version or the same version but past the alpha.
    
        The *message* argument is formatted with *name* and *remove* as a Python
        version tuple (e.g. (3, 11)).
    
        """
        remove_formatted = f"{remove[0]}.{remove[1]}"
        if (_version[:2] > remove) or (_version[:2] == remove and _version[3] != "alpha"):
            msg = f"{name!r} was slated for removal after Python {remove_formatted} alpha"
            raise RuntimeError(msg)
        else:
            msg = message.format(name=name, remove=remove_formatted)
>           _wm.warn(msg, DeprecationWarning, stacklevel=3)
E           DeprecationWarning: '__version__' is deprecated and slated for removal in Python 3.20

/usr/lib64/python3.15/_py_warnings.py:889: DeprecationWarning
=========================== short test summary info ============================
FAILED setuptools/tests/test_setuptools.py::TestDepends::testModuleExtract - ...
FAILED setuptools/tests/test_setuptools.py::TestDepends::testRequire - Deprec...

This is coming from:

from json import __version__

from json import __version__

Using such an attribute from the Python standard library for tests won't be sustainable in the future, as they are being removed from everywhere.

python/cpython#76007
python/cpython#138675

Expected behavior

The tests should use a non-deprecated attribute for this.

How to Reproduce

$ tox -e py315 -- setuptools/tests/test_setuptools.py -k TestDepends -W 'ignore:os.path.commonprefix:DeprecationWarning'

The manual -W is to hide which covers this up pygments/pygments#3039

Output

.pkg-cpython315: _optional_hooks> python /usr/lib/python3.14/site-packages/pyproject_api/_backend.py True setuptools.build_meta
.pkg-cpython315: get_requires_for_build_editable> python /usr/lib/python3.14/site-packages/pyproject_api/_backend.py True setuptools.build_meta
.pkg-cpython315: build_editable> python /usr/lib/python3.14/site-packages/pyproject_api/_backend.py True setuptools.build_meta
py315: install_package> /usr/bin/uv pip install --reinstall --no-deps setuptools@.../pypa/setuptools/.tox/.tmp/package/36/setuptools-82.0.0-0.editable-py3-none-any.whl
py315: commands[0]> pytest setuptools/tests/test_setuptools.py -k TestDepends -W ignore:os.path.commonprefix:DeprecationWarning
============================= test session starts ==============================
platform linux -- Python 3.15.0a6, pytest-9.0.2, pluggy-1.6.0
cachedir: .tox/py315/.pytest_cache
rootdir: .../pypa/setuptools
configfile: pytest.ini
plugins: perf-0.15.0, enabler-3.4.0, mypy-1.0.1, jaraco.mongodb-12.4.0, typeguard-4.5.0, xdist-3.8.0, jaraco.test-5.6.0, checkdocs-2.14.0, cov-7.0.0, subprocess-1.5.3, home-0.6.0, jaraco.vcs-2.4.1, ruff-0.5, timeout-2.4.0
created: 12/12 workers
12 workers [5 items]

...FF                                                                    [100%]
=================================== FAILURES ===================================
___________________________ TestDepends.testRequire ____________________________
[gw1] linux -- Python 3.15.0 .../pypa/setuptools/.tox/py315/bin/python3

self = <setuptools.tests.test_setuptools.TestDepends object at 0x7f2682f363f0>

    @needs_bytecode
    def testRequire(self):
        req = Require('Json', '1.0.3', 'json')
    
        assert req.name == 'Json'
        assert req.module == 'json'
        assert req.requested_version == Version('1.0.3')
        assert req.attribute == '__version__'
        assert req.full_name() == 'Json-1.0.3'
    
>       from json import __version__

.../pypa/setuptools/setuptools/tests/test_setuptools.py:101: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
<frozen importlib._bootstrap>:1336: in _handle_fromlist
    ???
/usr/lib64/python3.15/json/__init__.py:371: in __getattr__
    _deprecated("__version__", remove=(3, 20))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

name = '__version__'
message = '{name!r} is deprecated and slated for removal in Python {remove}'

    def _deprecated(name, message=_DEPRECATED_MSG, *, remove, _version=sys.version_info):
        """Warn that *name* is deprecated or should be removed.
    
        RuntimeError is raised if *remove* specifies a major/minor tuple older than
        the current Python version or the same version but past the alpha.
    
        The *message* argument is formatted with *name* and *remove* as a Python
        version tuple (e.g. (3, 11)).
    
        """
        remove_formatted = f"{remove[0]}.{remove[1]}"
        if (_version[:2] > remove) or (_version[:2] == remove and _version[3] != "alpha"):
            msg = f"{name!r} was slated for removal after Python {remove_formatted} alpha"
            raise RuntimeError(msg)
        else:
            msg = message.format(name=name, remove=remove_formatted)
>           _wm.warn(msg, DeprecationWarning, stacklevel=3)
E           DeprecationWarning: '__version__' is deprecated and slated for removal in Python 3.20

/usr/lib64/python3.15/_py_warnings.py:889: DeprecationWarning
________________________ TestDepends.testModuleExtract _________________________
[gw4] linux -- Python 3.15.0 .../pypa/setuptools/.tox/py315/bin/python3

self = <setuptools.tests.test_setuptools.TestDepends object at 0x7f853cc16060>

    @needs_bytecode
    def testModuleExtract(self):
>       from json import __version__

.../pypa/setuptools/setuptools/tests/test_setuptools.py:82: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
<frozen importlib._bootstrap>:1336: in _handle_fromlist
    ???
/usr/lib64/python3.15/json/__init__.py:371: in __getattr__
    _deprecated("__version__", remove=(3, 20))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

name = '__version__'
message = '{name!r} is deprecated and slated for removal in Python {remove}'

    def _deprecated(name, message=_DEPRECATED_MSG, *, remove, _version=sys.version_info):
        """Warn that *name* is deprecated or should be removed.
    
        RuntimeError is raised if *remove* specifies a major/minor tuple older than
        the current Python version or the same version but past the alpha.
    
        The *message* argument is formatted with *name* and *remove* as a Python
        version tuple (e.g. (3, 11)).
    
        """
        remove_formatted = f"{remove[0]}.{remove[1]}"
        if (_version[:2] > remove) or (_version[:2] == remove and _version[3] != "alpha"):
            msg = f"{name!r} was slated for removal after Python {remove_formatted} alpha"
            raise RuntimeError(msg)
        else:
            msg = message.format(name=name, remove=remove_formatted)
>           _wm.warn(msg, DeprecationWarning, stacklevel=3)
E           DeprecationWarning: '__version__' is deprecated and slated for removal in Python 3.20

/usr/lib64/python3.15/_py_warnings.py:889: DeprecationWarning
================================ tests coverage ================================
...
=========================== short test summary info ============================
FAILED setuptools/tests/test_setuptools.py::TestDepends::testRequire - Deprec...
FAILED setuptools/tests/test_setuptools.py::TestDepends::testModuleExtract - ...
========================= 2 failed, 3 passed in 2.27s ==========================
py315: exit 1 (2.97 seconds) .../pypa/setuptools> pytest setuptools/tests/test_setuptools.py -k TestDepends -W ignore:os.path.commonprefix:DeprecationWarning pid=293760
  py315: FAIL code 1 (4.86=setup[1.88]+cmd[2.97] seconds)
  evaluation failed :( (4.90 seconds)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Needs TriageIssues that need to be evaluated for severity and status.bug

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions