guix_mirror_bot pushed a commit to branch python-team
in repository guix.
commit cd7580d6601b9378969bf42de8f966f553677a5f
Author: Nicolas Graves <[email protected]>
AuthorDate: Fri Jan 2 23:16:02 2026 +0100
gnu: python-setuptools: Bootstrap the package properly.
This commit includes changes submitted in two merge requests:
- https://codeberg.org/guix/guix/pulls/5723
- https://codeberg.org/guix/guix/pulls/5362
* gnu/packages/python-build.scm (python-setuptools)
[arguments]<#:test-flags>: Ignore failing tests.
<#:phases>: Add phases 'build-bundled-wheel-for-tests, 'cleanup,
'configure-tests, 'drop-platformdirs-requirement,
'cleanup-installed-tests.
[propagated-inputs]: Add python-jaraco-functools, python-jaraco-text,
python-more-itertools, python-packaging, python-wheel.
[native-inputs]: Add python-autocommand, python-backports-tarfile,
python-filelock-bootstrap, python-inflect, python-jaraco-collections,
python-jaraco-context, python-jaraco-envs-bootstrap,
python-jaraco-functools, python-jaraco-path, python-jaraco-test,
python-jaraco-text, python-more-itertools, python-packaging,
python-path, python-platformdirs-bootstrap, python-pip,
python-pypa-build, python-pytest-bootstrap, python-tomli,
python-typing-extensions, python-typeguard, python-wheel,
nss-certs-for-tests.
Change-Id: I2361b2626e7c0ca54fad7e9eeb0a616b2b66f6d9
Signed-off-by: Sharlatan Hellseher <[email protected]>
---
gnu/packages/python-build.scm | 141 +++++++++++++++++++++++++++++++++++++-----
1 file changed, 125 insertions(+), 16 deletions(-)
diff --git a/gnu/packages/python-build.scm b/gnu/packages/python-build.scm
index 5a3c3c99be..381ce3a660 100644
--- a/gnu/packages/python-build.scm
+++ b/gnu/packages/python-build.scm
@@ -248,7 +248,7 @@ invoked on those path objects directly.")
(arguments (list #:test-backend #~'unittest))
(native-inputs
(list python-flit-core
- python-setuptools))
+ python-setuptools-bootstrap))
(home-page "https://github.com/cpburnz/python-pathspec")
(synopsis "Utility library for gitignore style pattern matching of file
paths")
(description
@@ -295,7 +295,7 @@ platform-specific directories, e.g. the ``user data dir''.")
(base32 "1wr2vnbb7gy9wlz01yvb7rn4iqzd3mwmidk11ywk7395fq5i7k3x"))))
(build-system pyproject-build-system)
(native-inputs
- (list python-setuptools
+ (list python-setuptools-bootstrap
python-setuptools-scm
python-wheel))
(home-page "https://pypi.org/project/pluggy/")
@@ -345,7 +345,7 @@ tools for mocking system commands and recording calls to
those.")
(arguments
`(#:tests? #f)) ;no tests suite in release
(native-inputs
- (list python-setuptools))
+ (list python-setuptools-bootstrap))
(home-page "https://github.com/uiri/toml")
(synopsis "Library for TOML")
(description
@@ -501,7 +501,7 @@ and many external plugins.")
(arguments
(list #:build-backend "setuptools.build_meta"
#:tests? #f)) ;keep dependencies to a minimum
- (native-inputs (list python-setuptools python-wheel))
+ (native-inputs (list python-setuptools-bootstrap))
(home-page "https://github.com/pypa/trove-classifiers")
(synopsis "Canonical source for classifiers on PyPI")
(description "This package is the canonical source for classifiers use on
@@ -658,7 +658,7 @@ def contents() -> str:
(arguments
'(#:tests? #f)) ; there are no tests in the pypi archive.
(native-inputs
- (list python-setuptools))
+ (list python-setuptools-bootstrap))
(home-page "https://pip.pypa.io/")
(synopsis "Package manager for Python software")
(description
@@ -669,6 +669,8 @@ Python Package Index (PyPI).")
(define-public python-setuptools
(package
(name "python-setuptools")
+ ;; When updating python-setuptools, also check in the bundled sources
+ ;; the versions of some native-inputs if some new tests fail.
(version "80.9.0")
(source
(origin
@@ -678,16 +680,123 @@ Python Package Index (PyPI).")
(base32 "175iixi2h2jz8y2bpwziak360hvv43jfhipwzbdniryd5r04fszk"))
(modules '((guix build utils)))
(snippet
- ;; TODO: setuptools now bundles the following libraries:
- ;; packaging, pyparsing, six and appdirs. How to unbundle?
- ;; Remove included binaries which are used to build self-extracting
- ;; installers for Windows.
- '(for-each delete-file (find-files "setuptools"
- "^(cli|gui).*\\.exe$")))))
+ #~(begin
+ ;; Remove included binaries which are used to build self-extracting
+ ;; installers for Windows.
+ (for-each delete-file (find-files "setuptools"
+ "^(cli|gui).*\\.exe$"))))))
(build-system pyproject-build-system)
- ;; FIXME: Tests require pytest, which itself relies on setuptools.
- ;; One could bootstrap with an internal untested setuptools.
- (arguments (list #:tests? #f))
+ (arguments
+ (list
+ #:test-flags
+ #~(list
+ ;; Avoid additional dependencies
+ "--ignore=setuptools/tests/config/test_apply_pyprojecttoml.py"
+ "--ignore=setuptools/tests/config/test_pyprojecttoml.py"
+ "--ignore-glob=tools/*.py"
+ ;; These tests try to access the network.
+ "-m" "not uses_network"
+ "-k" (string-join
+ (list "not test_dist_fetch_build_egg" ; network
+ ;; Those scripts are unbundled in the snippet above.
+ "test_wheel_includes_cli_scripts"
+ ;; Despite PRE_BUILT_SETUPTOOLS_WHEEL below,
+ ;; this test uses our unbundled setuptools and fails
+ ;; to find jaraco.functools.
+ "test_no_missing_dependencies"
+ ;; XXX: We have pytest in the path, probably
+ ;; because of the setenv "PYTHONPATH" below.
+ "test_ignore_errors"
+ ;; XXX: Unclear why this one fails.
+ "test_basic")
+ " and not "))
+ #:phases
+ #~(modify-phases %standard-phases
+ ;; Build a first wheel bundled for tests.
+ (add-before 'build 'build-bundled-wheel-for-tests
+ (assoc-ref %standard-phases 'build))
+ (add-after 'build-bundled-wheel-for-tests 'cleanup
+ (lambda _
+ (let ((wheel (string-append "setuptools-" #$version
+ "-py3-none-any.whl")))
+ (for-each
+ (lambda (file)
+ (rename-file file wheel))
+ (find-files "dist" "\\.whl$")))
+ (for-each delete-file-recursively
+ '("build" "dist" "setuptools/_vendor")))) ; unbundle
+ (add-before 'check 'configure-tests
+ (lambda* (#:key outputs #:allow-other-keys)
+ (setenv "HOME" (getcwd))
+ ;; FIXME python-pytest still relies a bit on PYTHONPATH.
+ (setenv "PYTHONPATH" (getenv "GUIX_PYTHONPATH"))
+ ;; Inject our pre-built bundled wheel for tests.
+ (setenv "PRE_BUILT_SETUPTOOLS_WHEEL"
+ (string-append (getcwd) "/setuptools-"
+ #$version "-py3-none-any.whl"))))
+ ;; Platformdirs is a bit tedious to properly bootstrap and
+ ;; propagate, and is used in a single place that will be dropped
+ ;; soon, we might as well drop it now.
+ (add-before 'compile-bytecode 'drop-platformdirs-requirement
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (with-directory-excursion (site-packages inputs outputs)
+ (substitute* "pkg_resources/__init__.py"
+ (("^from platformdirs import.*")
+ "")
+ (("_user_cache_dir\\(appname='Python-Eggs'\\)")
+ "f\"{os.environ.get('XDG_CACHE_HOME')}/Python-Eggs\""))
+ (substitute* (string-append "setuptools-" #$version
+ ".dist-info/METADATA")
+ (("Requires-Dist: platformdirs.*") "")))))
+ (add-after 'check 'cleanup-installed-tests
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (let ((site (site-packages inputs outputs)))
+ (with-directory-excursion site
+ (for-each
+ delete-file-recursively
+ (find-files "."
+ (lambda (file stat)
+ (and (string= (basename file) "tests")
+ (eq? 'directory
+ (stat:type stat))))
+ #:directories? #t)))
+ (substitute* (find-files site "RECORD")
+ ((".*/tests/.*") ""))))))))
+ (propagated-inputs
+ ;; See either bundled inputs or METADATA extra == "core"
+ (list python-jaraco-functools
+ python-jaraco-text
+ python-more-itertools
+ python-packaging
+ python-wheel))
+ (native-inputs
+ (list python-autocommand
+ python-backports-tarfile
+ python-filelock-bootstrap
+ python-inflect
+ python-jaraco-collections
+ python-jaraco-context
+ python-jaraco-envs-bootstrap
+ python-jaraco-functools
+ python-jaraco-path
+ python-jaraco-test
+ python-jaraco-text
+ python-more-itertools
+ python-packaging
+ python-path
+ python-platformdirs-bootstrap
+ python-pip
+ python-pypa-build
+ python-pytest-bootstrap
+ python-tomli
+ python-typing-extensions
+ python-typeguard
+ python-wheel
+ ;; Avoid a module dependency.
+ ;; XXX: Only 4 tests depend on this and pass, maybe ignore them
+ ;; and drop it?
+ (module-ref (resolve-interface '(gnu packages nss))
+ 'nss-certs-for-test)))
(home-page "https://pypi.org/project/setuptools/")
(synopsis "Library designed to facilitate packaging Python projects")
(description "Setuptools is a fully-featured, stable library designed to
@@ -1169,7 +1278,7 @@ system, then @code{flit_core} to build the package.")
#:build-backend "setuptools.build_meta"))
(propagated-inputs
(list python-packaging-bootstrap
- python-setuptools))
+ python-setuptools-bootstrap))
(home-page "https://github.com/pypa/setuptools_scm/")
(synopsis "Manage Python package versions in SCM metadata")
(description
@@ -1218,7 +1327,7 @@ them as the version argument or in a SCM managed file.")
(build-system pyproject-build-system)
(native-inputs
(list python-pytest-bootstrap
- python-setuptools))
+ python-setuptools-bootstrap))
(home-page "https://pypi.org/project/six/")
(synopsis "Python 2 and 3 compatibility utilities")
(description