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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions