Setuptools 74+
Summary
Update to a new upstream release of python-setuptools
that is not completely compatible with previous releases. Most notably, version 72.0.0 removed support for the setup.py test
command (deprecated for 5 years). This is a breaking change and Fedora packages that use the setup.py test
command during the build need to be adapted to use a different test runner, such as unittest, pytest, etc.
There might be other breaking changes. We estimate 142 to 196 Fedora Rawhide packages to fail to build due to this upgrade (as of Sep 2024).
Owner
- Name: Miro Hrončok
- Email: mhroncok@redhat.com
Current status
- Targeted release: Fedora Linux 42
- Last updated: 2024-09-24
- Announced
- Discussion thread
- FESCo issue: <will be assigned by the Wrangler>
- Tracker bug: <will be assigned by the Wrangler>
- Release notes tracker: <will be assigned by the Wrangler>
Detailed Description
Setuptools is a package development process library designed to facilitate packaging Python projects by enhancing the former Python standard library distutils (distribution utilities). It changes fast and it often introduces breaking changes such as the removal of the setup.py test
command in version 72.0.0 which was deprecated since 2019.
If your Fedora package still uses the setup.py test
command (deprecated for 5 years), please update to %pytest
, %tox
, %{python3} -m unittest
, etc.
List of packages that will likely fail to build, because they use the removed setup.py test
command in the specfile:
$ rg '^[^-#].+(\b|_)setup(\.py|\})\s+test\b' -l | sed -E 's|^rpm-specs/(.+)\.spec$|\1|' | sort adapt ansible-inventory-grapher binwalk btrfs-sxbackup calibre cepces classification-banner ddiskit fprettify fros grammalecte gtts gtts-token hddfancontrol hgsvn ioc-writer isrcsubmit kitty lazygal libvirt-test-API mopidy mopidy-mpd nototools past-time petsc pycairo PyGreSQL pyjokes pyowm python3-lxc python3-mallard-ducktype python-aioresponses python-apsw python-auth-credential python-autopage python-binaryornot python-booleanoperations python-bracex python-can python-case python-casttube python-cccolutils python-chai python-cliff python-collada python-colorclass python-CommonMark python-cpuinfo python-cwcwidth python-cx-oracle python-decorator python-dfdatetime python-dictdiffer python-digitalocean python-dirq python-distroinfo python-django-contrib-comments python-django-prometheus python-dkimpy python-enlighten python-epub python-events python-fedmsg-meta-fedora-infrastructure python-flask-wtf-decorators python-flask-xml-rpc python-flufl-i18n python-fontMath python-freeipa python-gammu python-genshi python-genty python-geojson python-gerritlib python-glyphsLib python-gmqtt python-hgapi python-html5-parser python-httpsig-cffi python-hypothesis-fspaths python-imagehash python-ipgetter2 python-iptools python-jack-client python-jcconv python-jinja2_pluralize python-jinja2-time python-journal-brief python-json-minify python-jsonpath-ng python-jsonpath-rw python-klusta python-launchpadlib python-lazr-uri python-libusb1 python-lupa python-markups python-messaging python-moksha-hub python-murano-pkg-check python-mutatormath python-mwclient python-neurosynth python-num2words python-oletools python-openidc-client python-oslo-context python-oslo-metrics python-os-service-types python-ouimeaux python-pdfkit python-phonenumbers python-poyo python-pyasn1 python-pyclipper python-pycryptodomex python-pydispatcher python-pyfim python-pymediainfo python-pyramid_sawing python-pyramid-tm python-pysignals python-pysocks python-pystray python-pyte python-pytest-fixture-config python-pytest-flakes python-pytest-runner python-pytimeparse python-repoze-lru python-rmtest python-rsd-lib python-scripttest python-serpy python-shodan python-simplegeneric python-simplevisor python-singledispatch python-slacker python-smartypants python-sphinxcontrib-autoprogram python-sphinxcontrib-trio python-sql python-ssdeep python-statsd python-svg-path python-testscenarios python-textile python-textparser python-tgscheduler python-tidy python-timeout-decorator python-tosca-parser python-translationstring python-tree-format python-typing-inspect python-volatile python-wadllib python-whoosh python-wsgi_intercept python-www-authenticate python-xmp-toolkit python-xunitparser python-yapsy python-yaql python-zc-customdoctests python-zc-lockfile python-zope-deprecation python-zope-testing python-zstd sepolicy_analysis tpm2-pkcs11 transifex-client
List of packages that actually failed in our testing copr but did not fail in a control copr:
ansible-inventory-grapher btrfs-sxbackup cepces classification-banner ddiskit flent fprettify fros gpgme grammalecte grpc hddfancontrol ioc-writer lazygal mopidy mopidy-mpd mozjs102 past-time PyGreSQL pyproject-rpm-macros python3-lxc python3-mallard-ducktype python-aioresponses python-binaryornot python-bracex python-case python-cccolutils python-chai python-cliff python-collada python-colorclass python-cpuinfo python-cwcwidth python-daemon python-decorator python-dfdatetime python-digitalocean python-distroinfo python-django-contrib-comments python-django-prometheus python-epub python-events python-flake8-class-newline python-flask-wtf-decorators python-flask-xml-rpc python-flufl-i18n python-fontMath python-freeipa python-genshi python-genty python-geojson python-hypothesis-fspaths python-imagehash python-iptools python-jack-client python-jcconv python-jinja2_pluralize python-jinja2-time python-json-minify python-jsonpath-ng python-jsonpath-rw python-jupyter-packaging python-klusta python-launchpadlib python-lazr-uri python-libusb1 python-lupa python-markups python-moksha-hub python-mutatormath python-mwclient python-nose python-oletools python-openidc-client python-oslo-context python-oslo-metrics python-ouimeaux python-parsel python-pdfkit python-phonenumbers python-poyo python-pyasn1 python-pycdio python-pyclipper python-pydispatcher python-pyemd python-pygmtools python-pymediainfo python-pyproject-api python-pyproject-hooks python-pyramid_sawing python-pyramid-tm python-pysignals python-pysrt python-pytaglib python-pyte python-pytest-fixture-config python-pytest-flakes python-pytest-runner python-pytimeparse python-pyvmomi python-repoze-lru python-rmtest python-robot-detection python-scikit-build python-scripttest python-serpy python-simplegeneric python-singledispatch python-slacker python-sphinxcontrib-autoprogram python-sphinxcontrib-trio python-sql python-ssdeep python-statsd python-svg-path python-testscenarios python-textparser python-tgscheduler python-timeout-decorator python-translationstring python-tree-format python-trml2pdf python-typing-inspect python-virtualenv python-volatile python-wadllib python-whoosh python-wsgi_intercept python-www-authenticate python-xmp-toolkit python-xunitparser python-yaql python-zc-customdoctests python-zc-lockfile python-zope-deprecation python-zope-testing python-zope-testrunner python-zstd sentencepiece tpm2-pkcs11 transifex-client
Both lists together, by maintainers:
abbra python-whoosh abompard python-flufl-i18n python-jinja2_pluralize python-pyramid_sawing python-pysocks python-translationstring python-zope-deprecation python-zope-testing python-zope-testrunner adamwill python-mwclient adrian flent aekoroglu python-django-prometheus python-pytaglib python-repoze-lru python-serpy python-xunitparser ajax binwalk alexl pycairo amigadave isrcsubmit python3-mallard-ducktype amoralej python-rsd-lib python-yaql ankursinha python-klusta python-num2words python-pyemd python-pyfim apevec python-oslo-context python-testscenarios python-wsgi_intercept asn cepces athoscr python-booleanoperations python-epub python-fontMath python-glyphsLib python-mutatormath python-pyclipper atim kitty aviso python-enlighten besser82 python-jcconv caolanm pycairo carlwgeorge python-pyproject-hooks chandankumar python-oslo-context python-tosca-parser python-wsgi_intercept chedi python-jinja2-time python-poyo python-pytest-flakes python-tree-format chkr calibre churchyard pyproject-rpm-macros python-genty python-launchpadlib python-lazr-uri python-nose python-scripttest python-simplegeneric python-virtualenv python-wadllib cicku python-apsw ckalina ddiskit cottsay python-flake8-class-newline cqi python-django-contrib-comments cstratak python-virtualenv dcallagh python-phonenumbers python-www-authenticate dcavalca tpm2-pkcs11 dchen cepces defolos grpc dfateyev python-apsw dherrera python-pytest-runner dminer python-zstd dshea python-jinja2_pluralize echevemaster python-pydispatcher transifex-client eeickmeyer python-jack-client esyr ddiskit fab ioc-writer past-time python-cx-oracle python-dfdatetime python-geojson python-gmqtt python-imagehash python-ipgetter2 python-jsonpath-ng python-jsonpath-rw python-shodan python-slacker python-textparser python-zc-customdoctests fale python-decorator python-pyvmomi fed500 python-pygmtools fedepell python-jinja2-time filiperosset hddfancontrol fjanus PyGreSQL frantisekz mozjs102 frostyx python-flask-wtf-decorators fschwarz python-digitalocean python-genshi girst mopidy mopidy-mpd gsauthof python-aioresponses gui1ty python-moksha-hub hhorak PyGreSQL hiwkby python-oslo-metrics hobbes1069 python-collada hvad python-events ignatenkobrain python-pytest-flakes python-simplegeneric jamatos python-markups python-smartypants jcapitao python-cliff python-distroinfo python-timeout-decorator jcaratzas python-repoze-lru python-simplegeneric python-singledispatch python-sphinxcontrib-trio python-zc-lockfile jjelen tpm2-pkcs11 jkucera gpgme jmontleon python-dictdiffer jonathanspw kitty python-freeipa python-parsel python-pystray python-pytest-runner python-zstd jonny python-libusb1 jorti python-pysrt jpena python-murano-pkg-check python-tosca-parser jruzicka python-tosca-parser jujens python-CommonMark python-hgapi jussilehtola fprettify kalev pycairo kevin calibre python-chai python-decorator python-html5-parser python-pycdio python-pyramid-tm python-pysocks python-pytest-fixture-config python-svg-path python-tgscheduler kni python-ouimeaux python-pysignals ktdreyer python-testscenarios kushal python-daemon laxathom python-gammu lbalhar python-jupyter-packaging python-pyproject-api python-pyproject-hooks python-virtualenv lbazan python-neurosynth transifex-client lberk python-rmtest lbrabec python-xunitparser lcons python-auth-credential python-dirq python-messaging python-simplevisor lecris python-scikit-build limb python-typing-inspect lnie libvirt-test-API lyessaadi python-yapsy maha python-sphinxcontrib-autoprogram melmorabity grammalecte python-pycryptodomex mfabian nototools mhayden python-virtualenv mhlavink gpgme mohanboddu python-openidc-client mrc0mmand gpgme mrunge python-pytimeparse python-singledispatch python-testscenarios python-virtualenv nathans python-rmtest nb python-digitalocean neil grpc python-gerritlib ngompa python-case python-dkimpy python-freeipa python-pystray python-robot-detection python-zstd opohorel python-launchpadlib python-lazr-uri python-wadllib orion python-virtualenv python-zope-testing orphan python-case python-fedmsg-meta-fedora-infrastructure python-hypothesis-fspaths python-iptools osloup PyGreSQL pbrobinson adapt gtts gtts-token pyjokes python-can python-casttube tpm2-pkcs11 peter python-libusb1 pingou python-binaryornot python-case python-chai python-flask-xml-rpc pkubat PyGreSQL pnemade ansible-inventory-grapher python-bracex python-cpuinfo poros ddiskit praiskup PyGreSQL puiterwijk python-cccolutils pwhalen pyjokes pyowm pwu nototools qulogic python-json-minify python-xmp-toolkit radez python-zc-lockfile python-zope-testing raphgro python-pdfkit python-pyvmomi rathann lazygal rcallicotte python-pyvmomi rcritten cepces python-pyasn1 rdieter gpgme python-mwclient rebus python-colorclass python-oletools rhughes pycairo robert python-oletools rstrode pycairo sagitter petsc salimma kitty python-lupa python-pytest-runner python-robot-detection python-volatile python-zope-testrunner python-zstd sergiomb python-gammu sgallagh python-whoosh sharkcz python-sql shoracek tpm2-pkcs11 slinabery python-jsonpath-rw solopasha kitty spichugi python-pyasn1 suve python-ssdeep swt2c binwalk tdecacqu python-statsd terjeros hgsvn python-cwcwidth python-httpsig-cffi python-pyte python-tidy tflink python-xunitparser thebeanogamer classification-banner thm python-sphinxcontrib-trio python-textile python3-lxc thofmann btrfs-sxbackup thrnciar python-scikit-build tieugene python-trml2pdf tohojo flent tomspur python-daemon python-simplegeneric topazus sentencepiece trawets fros ttorling python-pysocks twaugh python-journal-brief vascom python-pymediainfo vmojzis sepolicy_analysis vtrefny python-pytimeparse xavierb python-daemon ykarel python-os-service-types zaneb python-autopage zawertun kitty zbyszek calibre zsun ddiskit
We will be slowly crushing the failures and opening bugzillas before we actually update setuptools.
Feedback
python-devel thread from August 2024: https://lists.fedoraproject.org/archives/list/python-devel@lists.fedoraproject.org/thread/YOC5527SRKNY2XG6CMS3KNGJ54O7SMXI/
Listed ~200 packages, ~30 were fixed in a month. Thank you, maintainers!
Benefit to Fedora
Fedora offers cutting-edge technologies for Python and setuptools is one of the most important Python packages. By doing this update we bring users the latest features that setuptools offers and also we enable Fedora 42+ to receive future updates as well.
Scope
- Proposal owners: update python-setuptools to 74.x.x or newer, open bugzillas, provide help
- Other developers: report problems to the upstream and backport patches to the affected packages. The impact can be tested using copr repository where setuptools 74+ has been built.
- Release engineering: #12323
- Policies and guidelines: N/A (not needed for this Change)
- Trademark approval: N/A (not needed for this Change)
- Alignment with the Fedora Strategy: First?
Upgrade/compatibility impact
There is a clean upgrade path from current version to python-setuptools 69.x.x. Fedora users using RPM-packaged setuptools will use setuptools 74+ by default.
Early Testing (Optional)
Do you require 'QA Blueprint' support? N
How To Test
- Find the package you want to update in the copr repository and check the build logs to determine the fail cause.
- Work with the upstream to resolve the issue or drop the need for
setup.py test
during the build of the package. - When updating the package, you can test it using the same copr repository where the latest version of setuptools has been built.
- Let us know if something doesn't work as it should.
User Experience
Regular distro users shouldn't notice any change in setuptools behavior, except for upstream-intended changes.
Dependencies
Contingency Plan
- Contingency mechanism: (What to do? Who will do it?) Provide a compat package with setuptools 69
- Contingency deadline: mass rebuild
- Blocks release? No
Documentation
This page is the documentation.