* [bug#45712] [PATCHES] Improve Python package quality @ 2021-01-07 13:26 Lars-Dominik Braun 2021-01-08 11:37 ` Hartmut Goebel ` (3 more replies) 0 siblings, 4 replies; 17+ messages in thread From: Lars-Dominik Braun @ 2021-01-07 13:26 UTC (permalink / raw) To: 45712 [-- Attachment #1: Type: text/plain, Size: 619 bytes --] Hi, as announced in https://lists.gnu.org/archive/html/guix-devel/2021-01/msg00021.html I’ve been working on adding an additional phase to Python packages to check whether they actually work. I cleaned up my patch, added tests and now I’m pretty confident it works as expected. The first patch in this series adds this phase, while the other ones fix build failures caused by it. All of this should go to core-updates (or a separate wip-* branch?), since it causes a massive number of rebuilds. You can also pull my git repo at https://github.com/PromyLOPh/guix.git branch work-python-importcheck. Cheers, Lars [-- Attachment #2: 0001-build-system-python-Validate-installed-package.patch --] [-- Type: text/x-diff, Size: 9950 bytes --] From 7a9ac1ee220ec2cb3dc10da1a8455289aa5e3b99 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Sun, 3 Jan 2021 10:30:29 +0100 Subject: [PATCH 01/15] build-system/python: Validate installed package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a new phase validating usalibity of installed Python packages. * guix/build/python-build-system.scm (validate-loadable): New phase. (%standard-phases): Use it. * tests/builders.scm (python-dummy-*) Add test packages. ("python-build-system: …"): Add tests. --- guix/build/python-build-system.scm | 70 +++++++++++++ tests/builders.scm | 161 ++++++++++++++++++++++++++++- 2 files changed, 228 insertions(+), 3 deletions(-) diff --git a/guix/build/python-build-system.scm b/guix/build/python-build-system.scm index 09bd8465c8..15d4f0c54e 100644 --- a/guix/build/python-build-system.scm +++ b/guix/build/python-build-system.scm @@ -148,6 +148,75 @@ (format #t "test suite not run~%")) #t) +(define validate-script + "from __future__ import print_function # Python 2 support. +import pkg_resources, sys, importlib, traceback +try: + from importlib.machinery import PathFinder +except ImportError: + PathFinder = None +ret = 0 +# Only check site-packages installed by this package, but not dependencies +# (which pkg_resources.working_set would include). Path supplied via argv. +ws = pkg_resources.find_distributions(sys.argv[1]) +for dist in ws: + print('validating', repr(dist.project_name), dist.location) + try: + print('...checking requirements', end=': ') + req = str(dist.as_requirement()) + # dist.activate() is not enough to actually check requirements, we have to + # .require() it. + pkg_resources.require(req) + print('OK') + except Exception as e: + print('ERROR:', req, e) + ret = 1 + continue + # Try to load entry points of console scripts too, making sure they work. They + # should be removed if they don’t. Other groups may not be safe, as they can + # depend on optional packages. + for group, v in dist.get_entry_map().items(): + if group not in {'console_scripts', }: + continue + for name, ep in v.items(): + try: + print('...trying to load endpoint', group, name, end=': ') + ep.load() + print('OK') + except Exception: + print('ERROR:') + traceback.print_exc(file=sys.stdout) + ret = 1 + continue + # And finally try to load top level modules. This should not have any + # side-effects. + for name in dist.get_metadata_lines('top_level.txt'): + # Only available on Python 3. + if PathFinder and PathFinder.find_spec(name) is None: + # Ignore unavailable modules. Cannot use ModuleNotFoundError, + # because it is raised by failed imports too. + continue + try: + print('...trying to load module', name, end=': ') + importlib.import_module(name) + print('OK') + except Exception: + print('ERROR:') + traceback.print_exc(file=sys.stdout) + ret = 1 + continue +sys.exit(ret)") + +(define* (validate-loadable #:key tests? inputs outputs #:allow-other-keys) + "Ensure packages depending on this package via setuptools work properly, +their advertised endpoints work and their top level modules are importable +without errors." + (add-installed-pythonpath inputs outputs) + ;; Make sure the working directory is empty (i.e. no Python modules in it) + (with-directory-excursion "/tmp" + (invoke "python" "-c" validate-script (site-packages inputs outputs))) + #t) + (define (python-version python) (let* ((version (last (string-split python #\-))) (components (string-split version #\.)) @@ -267,6 +336,7 @@ installed with setuptools." (replace 'install install) (add-after 'install 'check check) (add-after 'install 'wrap wrap) + (add-after 'check 'validate-loadable validate-loadable) (add-before 'strip 'rename-pth-file rename-pth-file))) (define* (python-build #:key inputs (phases %standard-phases) diff --git a/tests/builders.scm b/tests/builders.scm index fdcf38ded3..8fc0c07ee0 100644 --- a/tests/builders.scm +++ b/tests/builders.scm @@ -21,15 +21,15 @@ #:use-module (guix download) #:use-module (guix build-system) #:use-module (guix build-system gnu) + #:use-module (guix build-system python) #:use-module (guix store) + #:use-module (guix monads) #:use-module (guix utils) #:use-module (guix base32) #:use-module (guix derivations) #:use-module (gcrypt hash) #:use-module (guix tests) - #:use-module ((guix packages) - #:select (package? - package-derivation package-native-search-paths)) + #:use-module (guix packages) #:use-module (gnu packages bootstrap) #:use-module (ice-9 match) #:use-module (srfi srfi-1) @@ -78,4 +78,159 @@ (test-assert "gnu-build-system" (build-system? gnu-build-system)) +\f +(define python-dummy-ok + (package + (name "python-dummy-ok") + (version "0.1") + (source #f) ; source is generated in 'unpack + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'unpack + (lambda _ + (mkdir-p "src") + (chdir "src") + (mkdir-p "dummy") + (invoke "touch" "dummy/__init__.py") + (with-output-to-file "setup.py" + (lambda _ + (display "from setuptools import setup +setup( + name='dummy-ok', + version='0.1', + packages=['dummy'], + ) +"))) + #t))))) + (home-page #f) + (synopsis #f) + (description #f) + (license #f))) + +(define python2-dummy-ok + (package-with-python2 python-dummy-ok)) + +(define python-dummy-fail-requirements + (package + (name "python-dummy-fail-requirements") + (version "0.1") + (source #f) ; source is generated in 'unpack + (build-system python-build-system) + (arguments + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (replace 'unpack + (lambda _ + (mkdir-p "src") + (chdir "src") + (mkdir-p "dummy") + (invoke "touch" "dummy/__init__.py") + (with-output-to-file "setup.py" + (lambda _ + (display "from setuptools import setup +setup( + name='dummy-fail-requirements', + version='0.1', + packages=['dummy'], + install_requires=['nonexistent'], + ) +"))) + #t))))) + (home-page #f) + (synopsis #f) + (description #f) + (license #f))) + +(define-public python2-dummy-fail-requirements + (package-with-python2 python-dummy-fail-requirements)) + +(define-public python-dummy-fail-import + (package + (name "python-dummy-fail-import") + (version "0.1") + (source #f) ; source is generated in 'unpack + (build-system python-build-system) + (arguments + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (replace 'unpack + (lambda _ + (mkdir-p "src") + (chdir "src") + (mkdir-p "dummy") + (with-output-to-file "dummy/__init__.py" + (lambda _ + (display "import nonexistent"))) + (with-output-to-file "setup.py" + (lambda _ + (display "from setuptools import setup +setup( + name='dummy-fail-import', + version='0.1', + packages=['dummy'], + ) +"))) + #t))))) + (home-page #f) + (synopsis #f) + (description #f) + (license #f))) + +(define-public python2-dummy-fail-import + (package-with-python2 python-dummy-fail-import)) + +(define-public python-dummy-fail-console-script + (package + (name "python-dummy-fail-console-script") + (version "0.1") + (source #f) ; source is generated in 'unpack + (build-system python-build-system) + (arguments + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (replace 'unpack + (lambda _ + (mkdir-p "src") + (chdir "src") + (mkdir-p "dummy") + (invoke "touch" "dummy/__init__.py") + (with-output-to-file "setup.py" + (lambda _ + (display "from setuptools import setup +setup( + name='dummy-fail-console-script', + version='0.1', + packages=['dummy'], + entry_points={'console_scripts': ['broken = dummy:nonexistent']}, + ) +"))) + #t))))) + (home-page #f) + (synopsis #f) + (description #f) + (license #f))) + +(define-public python2-dummy-fail-console-script + (package-with-python2 python-dummy-fail-console-script)) + +(with-external-store store + (unless store (test-skip 1)) + (test-assert "python-build-system: dummy-ok" + (let* ((drv (package-derivation store python-dummy-ok))) + (build-derivations store (list drv)))) + (unless store (test-skip 1)) + (test-assert "python-build-system: dummy-fail-requirements" + (not (false-if-exception (package-derivation store python-dummy-fail-requirements)))) + (unless store (test-skip 1)) + (test-assert "python-build-system: dummy-fail-import" + (not (false-if-exception (package-derivation store python-dummy-fail-import)))) + (unless store (test-skip 1)) + (test-assert "python-build-system: dummy-fail-console-script" + (not (false-if-exception (package-derivation store python-dummy-fail-console-script))))) + (test-end "builders") -- 2.26.2 [-- Attachment #3: 0002-gnu-pytest-6-Add-missing-propagated-input.patch --] [-- Type: text/x-diff, Size: 1372 bytes --] From cf9ae80b59e86a60c27734c8cc27637757490d70 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:25:56 +0100 Subject: [PATCH 02/15] gnu: pytest@6: Add missing propagated-input. * gnu/packages/check.scm (python-pytest-6) [native-inputs]: Remove python-iniconfig. [propagated-inputs]: Move it here. --- gnu/packages/check.scm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm index 1300f9e1a6..9d1e0b8173 100644 --- a/gnu/packages/check.scm +++ b/gnu/packages/check.scm @@ -964,13 +964,13 @@ and many external plugins.") (propagated-inputs (append (alist-delete "python-py" (package-propagated-inputs python-pytest)) - `(("python-py" ,python-py-next)))) + `(("python-py" ,python-py-next) + ("python-iniconfig" ,python-iniconfig)))) (native-inputs (append (alist-delete "python-pytest" (package-native-inputs python-pytest)) `(("python-pytest" ,python-pytest-6-bootstrap) - ("python-toml" ,python-toml) - ("python-iniconfig" ,python-iniconfig)))))) + ("python-toml" ,python-toml)))))) ;; Pytest 4.x are the last versions that support Python 2. (define-public python2-pytest -- 2.26.2 [-- Attachment #4: 0003-gnu-python-pytest-xdist-Add-missing-input-relax-pyte.patch --] [-- Type: text/x-diff, Size: 2111 bytes --] From 9bc53a8e9706440668ec70d88db1ebc7d5e2c71d Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:27:55 +0100 Subject: [PATCH 03/15] gnu: python-pytest-xdist: Add missing input, relax pytest requirement. * gnu/packages/check.scm: (python-pytest-xdist) [arguments]: Relax pytest version requirements. [propagated-inputs]: Add python-pytest-forked. --- gnu/packages/check.scm | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm index 9d1e0b8173..32a1a2d6a3 100644 --- a/gnu/packages/check.scm +++ b/gnu/packages/check.scm @@ -1216,20 +1216,27 @@ same arguments.") #t)))) (build-system python-build-system) (arguments - '(#:tests? #f)) ;FIXME: Some tests are failing. - ;; #:phases - ;; (modify-phases %standard-phases - ;; (delete 'check) - ;; (add-after 'install 'check - ;; (lambda* (#:key inputs outputs #:allow-other-keys) - ;; (add-installed-pythonpath inputs outputs) - ;; (zero? (system* "py.test" "-v"))))) + '(#:tests? #f ; Lots of tests fail. + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch + (lambda* (#:key inputs #:allow-other-keys) + ;; Relax pytest requirement. + (substitute* "setup.py" + (("pytest>=6\\.0\\.0") "pytest")) + #t)) + (replace 'check + (lambda* (#:key tests? inputs outputs #:allow-other-keys) + (when tests? + (add-installed-pythonpath inputs outputs) + (invoke "py.test" "-v"))))))) (native-inputs `(("python-setuptools-scm" ,python-setuptools-scm))) (propagated-inputs `(("python-execnet" ,python-execnet) ("python-pytest" ,python-pytest) - ("python-py" ,python-py))) + ("python-py" ,python-py) + ("python-pytest-forked" ,python-pytest-forked))) (home-page "https://github.com/pytest-dev/pytest-xdist") (synopsis -- 2.26.2 [-- Attachment #5: 0004-gnu-python-fixtures-bootstrap-Do-not-apply-loadable-.patch --] [-- Type: text/x-diff, Size: 1109 bytes --] From 0974fc1c98ae1554ddd37a1ca40127bd5df95179 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:29:59 +0100 Subject: [PATCH 04/15] gnu: python-fixtures-bootstrap: Do not apply loadable check. * gnu/packages/check.scm (python-fixtures-bootstrap) [arguments]: Delete 'validate-loadable. --- gnu/packages/check.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm index 32a1a2d6a3..fba408d88f 100644 --- a/gnu/packages/check.scm +++ b/gnu/packages/check.scm @@ -1541,7 +1541,12 @@ protocol."))) (base32 "1vxj29bzz3rd4pcy51d05wng9q9dh4jq6wx92yklsm7i6h1ddw7w")))) (build-system python-build-system) - (arguments `(#:tests? #f)) + (arguments + `(#:tests? #f + #:phases + (modify-phases %standard-phases + ;; Package is not loadable on its own at this stage. + (delete 'validate-loadable)))) (propagated-inputs `(("python-pbr-minimal" ,python-pbr-minimal) ("python-six" ,python-six))) -- 2.26.2 [-- Attachment #6: 0005-gnu-python-pytest-pep8-Fix-package.patch --] [-- Type: text/x-diff, Size: 1515 bytes --] From d2272e00c42e3ddde1b0532a4b1ad187816dc98f Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:35:11 +0100 Subject: [PATCH 05/15] gnu: python-pytest-pep8: Fix package. * gnu/packages/check.scm (python-pytest-pep8) [arguments]: Remove dependency on pytest-cache and add proper 'check phase. --- gnu/packages/check.scm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm index fba408d88f..796635e012 100644 --- a/gnu/packages/check.scm +++ b/gnu/packages/check.scm @@ -2043,7 +2043,19 @@ failures.") "06032agzhw1i9d9qlhfblnl3dw5hcyxhagn7b120zhrszbjzfbh3")))) (build-system python-build-system) (arguments - `(#:tests? #f)) ; Fails with recent pytest and pep8. See upstream issues #8 and #12. + `(#:tests? #t ; Fails with recent pytest and pep8. See upstream issues #8 and #12. + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'fix-dependencies + (lambda _ + (substitute* "setup.py" + (("'pytest-cache', ") "")) ; Included in recent pytest + #t)) + (replace 'check + (lambda* (#:key tests? inputs outputs #:allow-other-keys) + (when tests? + (add-installed-pythonpath inputs outputs) + (invoke "pytest" "-v"))))))) (native-inputs `(("python-pytest" ,python-pytest))) (propagated-inputs -- 2.26.2 [-- Attachment #7: 0006-gnu-python-pyfakefs-Disable-unreliable-test.patch --] [-- Type: text/x-diff, Size: 1413 bytes --] From a252a9d180804a6cb0d2829acd99a1010b4e1984 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:42:40 +0100 Subject: [PATCH 06/15] gnu: python-pyfakefs: Disable unreliable test. * gnu/packages/check.scm (python-pyfakefs) [arguments]: Disable test. --- gnu/packages/check.scm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm index 796635e012..0535a1b2c4 100644 --- a/gnu/packages/check.scm +++ b/gnu/packages/check.scm @@ -2858,13 +2858,14 @@ grew out of the @dfn{Vc} project.") (arguments `(#:phases (modify-phases %standard-phases - ;; The default test suite does not run these extra tests. - (add-after 'check 'check-pytest-plugin + (replace 'check (lambda _ - (invoke - "python" "-m" "pytest" - "pyfakefs/pytest_tests/pytest_plugin_test.py") - #t))))) + (invoke "pytest" + "pyfakefs/tests" + ;; The default test suite does not run these extra tests. + ;"pyfakefs/pytest_tests/pytest_plugin_test.py" + ;; atime difference is larger than expected. + "-k" "not test_copy_real_file")))))) (native-inputs `(("python-pytest" ,python-pytest))) (build-system python-build-system) -- 2.26.2 [-- Attachment #8: 0007-gnu-python-slugify-Add-missing-input.patch --] [-- Type: text/x-diff, Size: 960 bytes --] From ced04daa680ef5f261b6f23e0500aca60032d323 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:48:36 +0100 Subject: [PATCH 07/15] gnu: python-slugify: Add missing input. * gnu/packages/python-web.scm (python-slugify) [propagated-inputs]: Add python-text-unidecode. --- gnu/packages/python-web.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm index 622f5fc6e2..e3cf25a687 100644 --- a/gnu/packages/python-web.scm +++ b/gnu/packages/python-web.scm @@ -4398,7 +4398,8 @@ Python.") (sha256 (base32 "0w22fapghmzk3xdasc4dn7h8sl58l08d1h5zbf72dh80drv1g9b9")))) (propagated-inputs - `(("python-unidecode" ,python-unidecode))) + `(("python-unidecode" ,python-unidecode) + ("python-text-unidecode" ,python-text-unidecode))) (arguments `(#:phases (modify-phases %standard-phases -- 2.26.2 [-- Attachment #9: 0008-gnu-python-websockets-Fix-Python-package-name.patch --] [-- Type: text/x-diff, Size: 1439 bytes --] From 4412f706693caa7fd888a637ea66b65afd34a15b Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:49:01 +0100 Subject: [PATCH 08/15] gnu: python-websockets: Fix Python package name. * gnu/packages/python-web.scm (python-websockets) [arguments]: Add new phase to fix package name. --- gnu/packages/python-web.scm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm index e3cf25a687..e3318a18ce 100644 --- a/gnu/packages/python-web.scm +++ b/gnu/packages/python-web.scm @@ -5086,7 +5086,16 @@ Plus all the standard features of requests: (base32 "03s3ml6sbki24aajllf8aily0xzrn929zxi84p50zkkbikdd4raw")))) (build-system python-build-system) - (arguments '(#:tests? #f)) ; Tests not included in release tarball. + (arguments + '(#:tests? #f ; Tests not included in release tarball. + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch + (lambda* (#:key inputs #:allow-other-keys) + ;; Python package names use dot as separator. + (substitute* "setup.py" + (("websockets/extensions") "websockets.extensions")) + #t))))) (home-page "https://github.com/aaugustin/websockets") (synopsis "Python implementation of the WebSocket Protocol (RFC 6455 & 7692)") -- 2.26.2 [-- Attachment #10: 0009-gnu-python-black-Remove-blackd.patch --] [-- Type: text/x-diff, Size: 1297 bytes --] From f1b8ada28652fa85fa62075afb462a0611a50a50 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:50:18 +0100 Subject: [PATCH 09/15] gnu: python-black: Remove blackd. * gnu/packages/python-xyz.scm (python-black) [arguments]: Add new phase to prevent installation of blackd. --- gnu/packages/python-xyz.scm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index 818a244378..a02960f1c6 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -4277,7 +4277,14 @@ matching of file paths.") (substitute* "tests/test_black.py" (("( *)def test_python38" match indent) (string-append indent "@unittest.skip(\"guix\")\n" match))) - #t))))) + #t)) + ;; Remove blackd, because it depends on python-aiohttp and + ;; python-aiohttp-cors. + (add-after 'unpack 'remove-entrypoint + (lambda _ + (substitute* "setup.py" + (("\\s*\"blackd=blackd:patched_main \\[d\\]\",\n") "") + (("\"blackd\", ") ""))))))) (propagated-inputs `(("python-click" ,python-click) ("python-attrs" ,python-attrs) -- 2.26.2 [-- Attachment #11: 0010-gnu-python-traitlets-Add-missing-input.patch --] [-- Type: text/x-diff, Size: 1075 bytes --] From df86a15fef25655c78faed179b25cd3c06e6b396 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:53:25 +0100 Subject: [PATCH 10/15] gnu: python-traitlets: Add missing input. * gnu/packages/python-xyz.scm (python-traitlets) [propagated-inputs]: Add python-six. --- gnu/packages/python-xyz.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index a02960f1c6..4b7fff5750 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -6973,7 +6973,8 @@ cluster down and deletes the throwaway profile.") (replace 'check (lambda _ (invoke "pytest" "-vv" "traitlets")))))) (propagated-inputs `(("python-ipython-genutils" ,python-ipython-genutils) - ("python-decorator" ,python-decorator))) + ("python-decorator" ,python-decorator) + ("python-six" ,python-six))) (native-inputs `(("python-pytest" ,python-pytest))) (properties `((python2-variant . ,(delay python2-traitlets)))) -- 2.26.2 [-- Attachment #12: 0011-gnu-python-idna-ssl-Add-missing-input.patch --] [-- Type: text/x-diff, Size: 996 bytes --] From f41d09b6acf31fc36b37f8fb895fb9ded52fe825 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 14:12:56 +0100 Subject: [PATCH 11/15] gnu: python-idna-ssl: Add missing input. * gnu/packages/python-xyz.scm (python-idna-ssl) [propagated-inputs]: Add python-idna. --- gnu/packages/python-xyz.scm | 1 + 1 file changed, 1 insertion(+) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index 4b7fff5750..58ad3b6e55 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -9517,6 +9517,7 @@ is binding LibSass.") (build-system python-build-system) (arguments `(#:tests? #f)) ;circular dependency with python-aiohttp + (propagated-inputs `(("python-idna" ,python-idna))) (home-page "https://github.com/aio-libs/idna-ssl") (synopsis "Patch @code{ssl.match_hostname} for Unicode(idna) domains support") (description "Patch @code{ssl.match_hostname} for Unicode(idna) -- 2.26.2 [-- Attachment #13: 0012-gnu-python-twisted-Remove-broken-console-scripts.patch --] [-- Type: text/x-diff, Size: 1327 bytes --] From fe272f9e3a35a9a3b6b9994f3b6881fbe8facb7b Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 14:13:53 +0100 Subject: [PATCH 12/15] gnu: python-twisted: Remove broken console scripts. * gnu/packages/python-xyz.scm (python-twisted) [arguments]: Patch setup.py. --- gnu/packages/python-xyz.scm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index 58ad3b6e55..d8b61cd1d2 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -12716,7 +12716,14 @@ format.") "17d3hnxv9qndagzz63mdpyk99xj63p9gq586vjn0rxk8cl197nym")))) (build-system python-build-system) (arguments - '(#:tests? #f)) ; FIXME: some tests fail + '(#:tests? #f ; FIXME: some tests fail + #:phases + (modify-phases %standard-phases + ;; Remove scripts, because they depend on [conch] + (add-after 'unpack 'remove-entrypoint + (lambda _ + (substitute* "src/twisted/python/_setup.py" + (("\".+ = twisted\\.conch\\.scripts\\..+\",") ""))))))) (propagated-inputs `(("python-zope-interface" ,python-zope-interface) ("python-pyhamcrest" ,python-pyhamcrest) -- 2.26.2 [-- Attachment #14: 0013-gnu-python-automat-Remove-broken-console-script.patch --] [-- Type: text/x-diff, Size: 1329 bytes --] From fef86cb5fc9dede96cc458c3801818f7cd6912cd Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 14:15:12 +0100 Subject: [PATCH 13/15] gnu: python-automat: Remove broken console script. * gnu/packages/python-xyz.scm (python-automat) [arguments]: Patch setup.py. --- gnu/packages/python-xyz.scm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index d8b61cd1d2..acd674878a 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -15151,7 +15151,15 @@ instead of servers and network commands.") ;; python-twisted depends on python-automat. Twisted is optional, but the ;; tests fail if it is not available. Also see ;; <https://github.com/glyph/automat/issues/71>. - (arguments '(#:tests? #f)) + (arguments + `(#:tests? #f + #:phases + (modify-phases %standard-phases + ;; Remove script, because it depends on python-twisted. + (add-after 'unpack 'remove-entrypoint + (lambda _ + (substitute* "setup.py" + (("\"automat-visualize = automat._visualize:tool\"") ""))))))) (native-inputs `(("python-m2r" ,python-m2r) ("python-setuptools-scm" ,python-setuptools-scm) -- 2.26.2 [-- Attachment #15: 0014-gnu-python-packaging-bootstrap-Remove-dependency.patch --] [-- Type: text/x-diff, Size: 1411 bytes --] From 9c0eb0a2ede51bc234cd5c4d7a1347fa3f83e843 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 14:16:05 +0100 Subject: [PATCH 14/15] gnu: python-packaging-bootstrap: Remove dependency. * gnu/packages/python-xyz.scm (python-packaging-bootstrap) [arguments]: Remove dependency from setup.py, which we do not provide for this variant. --- gnu/packages/python-xyz.scm | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index acd674878a..e78016221f 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -16049,10 +16049,18 @@ information.") (package/inherit python-packaging (name "python-packaging-bootstrap") + (arguments + (substitute-keyword-arguments (package-arguments python-packaging) + ((#:phases phases) + `(modify-phases ,phases + (add-after 'unpack 'fix-dependencies + (lambda* (#:key tests? #:allow-other-keys) + (substitute* "setup.py" (("\"six\"") "")) + #t)))) + ((#:tests? _ #f) #f))) (native-inputs '()) (propagated-inputs - `(("python-pyparsing" ,python-pyparsing))) - (arguments '(#:tests? #f))))) + `(("python-pyparsing" ,python-pyparsing)))))) (define-public python2-packaging-bootstrap (hidden-package -- 2.26.2 [-- Attachment #16: 0015-gnu-python-traceback2-Add-missing-dependency.patch --] [-- Type: text/x-diff, Size: 996 bytes --] From ecc8eebadbeb8c75ac5025d7bce581423d4d1894 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 14:17:20 +0100 Subject: [PATCH 15/15] gnu: python-traceback2: Add missing dependency. * gnu/packages/python-xyz.scm (python-traceback2) [propagated-inputs]: Add python-six. --- gnu/packages/python-xyz.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index e78016221f..1df9807626 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -17266,7 +17266,8 @@ lines are read from a single file.") (native-inputs `(("python-pbr" ,python-pbr-minimal))) (propagated-inputs - `(("python-linecache2" ,python-linecache2))) + `(("python-linecache2" ,python-linecache2) + ("python-six" ,python-six))) (home-page "https://github.com/testing-cabal/traceback2") (synopsis "Backports of the traceback module") -- 2.26.2 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-07 13:26 [bug#45712] [PATCHES] Improve Python package quality Lars-Dominik Braun @ 2021-01-08 11:37 ` Hartmut Goebel 2021-01-08 12:19 ` Ricardo Wurmus 2021-01-12 9:37 ` Lars-Dominik Braun 2021-01-25 14:43 ` Maxim Cournoyer ` (2 subsequent siblings) 3 siblings, 2 replies; 17+ messages in thread From: Hartmut Goebel @ 2021-01-08 11:37 UTC (permalink / raw) To: Lars-Dominik Braun; +Cc: 45712 Hi Lars, thanks for the patch set. Please please find some comments. (I did not check all changes to the packages, assuming you did it right :-) > +(define validate-script > + "from __future__ import print_function # Python 2 support. Please but this int a new line - makeing it easier to copy & paste. (Leading emptry lines doe nor effect "from __future__ import"). > +import pkg_resources, sys, importlib, traceback > +try: > + from importlib.machinery import PathFinder > +except ImportError: > + PathFinder = None > +ws = pkg_resources.find_distributions(sys.argv[1]) > +for dist in ws: > + print('validating', repr(dist.project_name), dist.location) > + try: > + print('...checking requirements', end=': ') This looks very uncommon (and make my mind hooking on it). Please use this, which is more common and less mindbogling ;-) print('...checking requirements: ', end='') > + req = str(dist.as_requirement()) > + # dist.activate() is not enough to actually check requirements, we have to > + # .require() it. > + pkg_resources.require(req) Any reason for converting the req into a string first? IC, "`requirements` must be a string". So I'd move the "str()" to the function call: req = dist.as_requirement() # dist.activate() is not enough to actually check requirements, # we have to .require() it. pkg_resources.require(str(req)) > + print('OK') > + except Exception as e: > + print('ERROR:', req, e) > + ret = 1 > + continue > + # Try to load entry points of console scripts too, making sure they work. They > + # should be removed if they don’t. Other groups may not be safe, as they can > + # depend on optional packages. > + for group, v in dist.get_entry_map().items(): > + if group not in {'console_scripts', }: if group not in {'console_scripts', 'gui_scripts'}: Why not gui-scripts? If not adding gui-scripts, just use "if group != 'concolse_scrips':" > + continue > + for name, ep in v.items(): > + try: > + print('...trying to load endpoint', group, name, end=': ') Here it is fine ;-) > + # And finally try to load top level modules. This should not have any > + # side-effects. Does it make sence to try loading the top-level modules *after* the the entry-point? Chances are very high that the entry-points implicitly test the top-level modules already. IMHO it would make more sense to first try the top-level modules, and even stop processing if this fails. > + for name in dist.get_metadata_lines('top_level.txt'): > + # Only available on Python 3. > + if PathFinder and PathFinder.find_spec(name) is None: > + # Ignore unavailable modules. Cannot use Please add a short explanation why there can be unavailable top-level modules. > + (add-after 'check 'validate-loadable validate-loadable) While not having antoher idea, I'm not happy with this name. "loadable" is not easy to get. (See also below, where this term is used in commit message.) top-level-modules-are-importable? > +(define python-dummy-ok AFAIKS the packages only differ by some requirements. So I suggest using a function to return the packages. This makes it easier to spot the actull differences. > + (replace 'unpack > + (lambda _ > + (mkdir-p "src") > + (chdir "src") > + (mkdir-p "dummy") (mkdir-p "src/dummy") (chdir "src") > +setup( > + name='dummy-fail-import', > + version='0.1', > + packages=['dummy'], > + ) I would strip this down (version is not required AFAIK) and put it one line (her assuming you use (format) for creating the code within a function: setup(name='~a', packages=~a, install_requires=~a) > Subject: [PATCH 03/15] gnu: python-pytest-xdist: Add missing input, relax > pytest requirement. > + (add-after 'unpack 'patch > + (lambda* (#:key inputs #:allow-other-keys) Arguments are not used? > + ;; Relax pytest requirement. > + (substitute* "setup.py" > + (("pytest>=6\\.0\\.0") "pytest")) > + #t)) Any reason for relaxing this? Why not use python-pytest-6 as input? > Subject: [PATCH 04/15] gnu: python-fixtures-bootstrap: Do not apply loadable > check. Please rephrase into something like Do not validate loadability Do not validate whetehr packag is loadable … > Subject: [PATCH 05/15] gnu: python-pytest-pep8: Fix package. > - `(#:tests? #f)) ; Fails with recent pytest and pep8. See upstream issues #8 and #12. > + `(#:tests? #t ; Fails with recent pytest and pep8. See upstream issues #8 and #12. Dosn't this change fix the checks? So this comment would be obsoltes and "#:tests #t" can be removed. > Subject: [PATCH 06/15] gnu: python-pyfakefs: Disable unreliable test. > - (add-after 'check 'check-pytest-plugin > + (replace 'check > (lambda _ > - (invoke > - "python" "-m" "pytest" > - "pyfakefs/pytest_tests/pytest_plugin_test.py") > - #t))))) > + (invoke "pytest" > + "pyfakefs/tests" > + ;; The default test suite does not run these extra tests. > + ;"pyfakefs/pytest_tests/pytest_plugin_test.py" > + ;; atime difference is larger than expected. > + "-k" "not test_copy_real_file")))))) I suggest keeping the old way, as this is will automatically update to upstream changes. ^ permalink raw reply [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-08 11:37 ` Hartmut Goebel @ 2021-01-08 12:19 ` Ricardo Wurmus 2021-01-12 9:37 ` Lars-Dominik Braun 1 sibling, 0 replies; 17+ messages in thread From: Ricardo Wurmus @ 2021-01-08 12:19 UTC (permalink / raw) To: Hartmut Goebel; +Cc: 45712 Hartmut Goebel <hartmut@goebel-consult.de> writes: > Hi Lars, > > thanks for the patch set. Please please find some comments. (I did not > check all changes to the packages, assuming you did it right :-) > > >> +(define validate-script >> + "from __future__ import print_function # Python 2 support. > > Please but this int a new line - makeing it easier to copy & paste. > (Leading emptry lines doe nor effect "from __future__ import"). You can also escape the line break: --8<---------------cut here---------------start------------->8--- (define validate-script "\ from __future__ import print_function # Python 2 support. …") --8<---------------cut here---------------end--------------->8--- -- Ricardo ^ permalink raw reply [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-08 11:37 ` Hartmut Goebel 2021-01-08 12:19 ` Ricardo Wurmus @ 2021-01-12 9:37 ` Lars-Dominik Braun 2021-01-25 19:29 ` Maxim Cournoyer 1 sibling, 1 reply; 17+ messages in thread From: Lars-Dominik Braun @ 2021-01-12 9:37 UTC (permalink / raw) To: Hartmut Goebel, Ricardo Wurmus; +Cc: 45712 [-- Attachment #1: Type: text/plain, Size: 3439 bytes --] Hi Hartmut, > Please but this int a new line - makeing it easier to copy & paste. > (Leading emptry lines doe nor effect "from __future__ import"). adopted Ricardo’s suggestion here. > This looks very uncommon (and make my mind hooking on it). Please use > this, which is more common and less mindbogling ;-) Done. > Any reason for converting the req into a string first? IC, > "`requirements` must be a string". So I'd move the "str()" to the > function call: Yes, the string is used in the error message. > if group not in {'console_scripts', 'gui_scripts'}: > Why not gui-scripts? > If not adding gui-scripts, just use "if group != 'concolse_scrips':" I wasn’t aware this exists. Added, thanks! > Does it make sence to try loading the top-level modules *after* the the > entry-point? Chances are very high that the entry-points implicitly test > the top-level modules already. > IMHO it would make more sense to first try the top-level modules, and > even stop processing if this fails. True, I reversed the order. Still, I think continuing with the entry points might be worth, if it points out more (different) errors. For small packages this might not be the case, but larger ones often only re-export specific names in the top-level module, thus testing might reveal more issues. > Please add a short explanation why there can be unavailable top-level > modules. Done. > While not having antoher idea, I'm not happy with this name. "loadable" > is not easy to get. (See also below, where this term is used in commit message.) > top-level-modules-are-importable? I’m also not happy with the name, but can’t think of a better one right now. Anyone? > AFAIKS the packages only differ by some requirements. So I suggest > using a function to return the packages. This makes it easier to spot > the actull differences. > […] > (mkdir-p "src/dummy") > (chdir "src") Done. > I would strip this down (version is not required AFAIK) and put it one > line (her assuming you use (format) for creating the code within a function: Not sure whether it’s optional or not, [1] does not say it is. No harm in keeping it? [1] https://setuptools.readthedocs.io/en/latest/references/keywords.html?highlight=version#keywords > Arguments are not used? Fixed. > Any reason for relaxing this? Why not use python-pytest-6 as input? Yes, our pytest@6 package reports its version as 0.0.0, so this patch is required with either package. Or we figure out how to fix pytest@6 (works fine with PEP 517 compliant build system). > Please rephrase into something like > Do not validate loadability Done. > Dosn't this change fix the checks? So this comment would be obsoltes and > "#:tests #t" can be removed. Should’ve been #f, sorry, fixed. > I suggest keeping the old way, as this is will automatically update to > upstream changes. Okay, I’ve added another phase that disables the test manually, because it fails for me every time. See attached patchset (v2) or git repository for updated patches. I’ve also rebuilt all 2284 packages depending on python-build-system. Currently 426 of them fail to build for any reason (not necessarily caused by this patchset; I’ve seen some unrelated issues). Due to the large number of packages failing I suggest moving forward with applying this first batch and then fixing everything else incrementally, unless some major package is broken (see attached list). WDYT? Cheers, Lars [-- Attachment #2: 0001-build-system-python-Validate-installed-package.patch --] [-- Type: text/x-diff, Size: 9127 bytes --] From 69bd0e11b9a054837e1733858490f0aec3830eca Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Sun, 3 Jan 2021 10:30:29 +0100 Subject: [PATCH v2 01/16] build-system/python: Validate installed package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a new phase validating usalibity of installed Python packages. * guix/build/python-build-system.scm (validate-script): Add script. (validate-loadable): New phase. (%standard-phases): Use it. * tests/builders.scm (make-python-dummy): Add test package generator. (check-build-{success,failure}): Add build helper functions. (python-dummy-*): Add test packages. ("python-build-system: …"): Add tests. --- guix/build/python-build-system.scm | 80 +++++++++++++++++++++ tests/builders.scm | 108 ++++++++++++++++++++++++++++- 2 files changed, 185 insertions(+), 3 deletions(-) diff --git a/guix/build/python-build-system.scm b/guix/build/python-build-system.scm index 09bd8465c8..3c29efea8b 100644 --- a/guix/build/python-build-system.scm +++ b/guix/build/python-build-system.scm @@ -148,6 +148,85 @@ (format #t "test suite not run~%")) #t) +(define validate-script + "\ +from __future__ import print_function # Python 2 support. +import pkg_resources, sys, importlib, traceback +try: + from importlib.machinery import PathFinder +except ImportError: + PathFinder = None +ret = 0 +# Only check site-packages installed by this package, but not dependencies +# (which pkg_resources.working_set would include). Path supplied via argv. +ws = pkg_resources.find_distributions(sys.argv[1]) +for dist in ws: + print('validating', repr(dist.project_name), dist.location) + try: + print('...checking requirements: ', end='') + req = str(dist.as_requirement()) + # dist.activate() is not enough to actually check requirements, we have to + # .require() it. + pkg_resources.require(req) + print('OK') + except Exception as e: + print('ERROR:', req, e) + ret = 1 + continue + + # Try to load top level modules. This should not have any side-effects. + try: + metalines = dist.get_metadata_lines('top_level.txt') + except KeyError: + # distutils (i.e. #:use-setuptools? #f) will not install any metadata. + print('WARNING: cannot determine top-level modules') + continue + for name in metalines: + # Only available on Python 3. + if PathFinder and PathFinder.find_spec(name) is None: + # Ignore unavailable modules, often C modules, which were not + # installed at the top-level. Cannot use ModuleNotFoundError, + # because it is raised by failed imports too. + continue + try: + print('...trying to load module', name, end=': ') + importlib.import_module(name) + print('OK') + except Exception: + print('ERROR:') + traceback.print_exc(file=sys.stdout) + ret = 1 + continue + + # Try to load entry points of console scripts too, making sure they work. They + # should be removed if they don’t. Other groups may not be safe, as they can + # depend on optional packages. + for group, v in dist.get_entry_map().items(): + if group not in {'console_scripts', 'gui_scripts'}: + continue + for name, ep in v.items(): + try: + print('...trying to load endpoint', group, name, end=': ') + ep.load() + print('OK') + except Exception: + print('ERROR:') + traceback.print_exc(file=sys.stdout) + ret = 1 + continue + +sys.exit(ret)") + +(define* (validate-loadable #:key tests? inputs outputs #:allow-other-keys) + "Ensure packages depending on this package via setuptools work properly, +their advertised endpoints work and their top level modules are importable +without errors." + (add-installed-pythonpath inputs outputs) + ;; Make sure the working directory is empty (i.e. no Python modules in it) + (with-directory-excursion "/tmp" + (invoke "python" "-c" validate-script (site-packages inputs outputs))) + #t) + (define (python-version python) (let* ((version (last (string-split python #\-))) (components (string-split version #\.)) @@ -267,6 +346,7 @@ installed with setuptools." (replace 'install install) (add-after 'install 'check check) (add-after 'install 'wrap wrap) + (add-after 'check 'validate-loadable validate-loadable) (add-before 'strip 'rename-pth-file rename-pth-file))) (define* (python-build #:key inputs (phases %standard-phases) diff --git a/tests/builders.scm b/tests/builders.scm index fdcf38ded3..929d1a906e 100644 --- a/tests/builders.scm +++ b/tests/builders.scm @@ -21,15 +21,15 @@ #:use-module (guix download) #:use-module (guix build-system) #:use-module (guix build-system gnu) + #:use-module (guix build-system python) #:use-module (guix store) + #:use-module (guix monads) #:use-module (guix utils) #:use-module (guix base32) #:use-module (guix derivations) #:use-module (gcrypt hash) #:use-module (guix tests) - #:use-module ((guix packages) - #:select (package? - package-derivation package-native-search-paths)) + #:use-module (guix packages) #:use-module (gnu packages bootstrap) #:use-module (ice-9 match) #:use-module (srfi srfi-1) @@ -78,4 +78,106 @@ (test-assert "gnu-build-system" (build-system? gnu-build-system)) +\f +(define* (make-python-dummy name #:key (setup-py-extra "") (init-py "") (use-setuptools? #t)) + (package + (name (string-append "python-dummy-" name)) + (version "0.1") + (source #f) ; source is generated in 'unpack + (build-system python-build-system) + (arguments + `(#:tests? #f + #:use-setuptools? ,use-setuptools? + #:phases + (modify-phases %standard-phases + (replace 'unpack + (lambda _ + (mkdir-p "src/dummy") + (chdir "src") + (with-output-to-file "dummy/__init__.py" + (lambda _ + (display ,init-py))) + (with-output-to-file "setup.py" + (lambda _ + (format #t "\ +~a +setup( + name='dummy-~a', + version='0.1', + packages=['dummy'], + ~a + )" + (if ,use-setuptools? + "from setuptools import setup" + "from distutils.core import setup") + ,name ,setup-py-extra))) + #t))))) + (home-page #f) + (synopsis #f) + (description #f) + (license #f))) + +(define python-dummy-ok + (make-python-dummy "ok")) + +(define python2-dummy-ok + (package-with-python2 python-dummy-ok)) + +;; distutil won’t install any metadata, so make sure our script does not fail +;; on a otherwise fine package. +(define python-dummy-no-setuptools + (make-python-dummy + "no-setuptools" #:use-setuptools? #f)) + +(define python2-dummy-no-setuptools + (package-with-python2 python-dummy-no-setuptools)) + +(define python-dummy-fail-requirements + (make-python-dummy "fail-requirements" + #:setup-py-extra "install_requires=['nonexistent'],")) + +(define python2-dummy-fail-requirements + (package-with-python2 python-dummy-fail-requirements)) + +(define python-dummy-fail-import + (make-python-dummy "fail-import" #:init-py "import nonexistent")) + +(define python2-dummy-fail-import + (package-with-python2 python-dummy-fail-import)) + +(define python-dummy-fail-console-script + (make-python-dummy "fail-console-script" + #:setup-py-extra (string-append "entry_points={'console_scripts': " + "['broken = dummy:nonexistent']},"))) + +(define python2-dummy-fail-console-script + (package-with-python2 python-dummy-fail-console-script)) + +(define (check-build-success store p) + (unless store (test-skip 1)) + (test-assert (string-append "python-build-system: " (package-name p)) + (let* ((drv (package-derivation store p))) + (build-derivations store (list drv))))) + +(define (check-build-failure store p) + (unless store (test-skip 1)) + (test-assert (string-append "python-build-system: " (package-name p)) + (not (false-if-exception (package-derivation store python-dummy-fail-requirements))))) + +(with-external-store store + (for-each (lambda (p) (check-build-success store p)) + (list + python-dummy-ok + python-dummy-no-setuptools + python2-dummy-ok + python2-dummy-no-setuptools)) + (for-each (lambda (p) (check-build-failure store p)) + (list + python-dummy-fail-requirements + python-dummy-fail-import + python-dummy-fail-console-script + python2-dummy-fail-requirements + python2-dummy-fail-import + python2-dummy-fail-console-script))) + (test-end "builders") -- 2.26.2 [-- Attachment #3: 0002-gnu-pytest-6-Add-missing-propagated-input.patch --] [-- Type: text/x-diff, Size: 1375 bytes --] From e99707fb4cea9db88721192e84044dbdf1b1ca9b Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:25:56 +0100 Subject: [PATCH v2 02/16] gnu: pytest@6: Add missing propagated-input. * gnu/packages/check.scm (python-pytest-6) [native-inputs]: Remove python-iniconfig. [propagated-inputs]: Move it here. --- gnu/packages/check.scm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm index 1300f9e1a6..9d1e0b8173 100644 --- a/gnu/packages/check.scm +++ b/gnu/packages/check.scm @@ -964,13 +964,13 @@ and many external plugins.") (propagated-inputs (append (alist-delete "python-py" (package-propagated-inputs python-pytest)) - `(("python-py" ,python-py-next)))) + `(("python-py" ,python-py-next) + ("python-iniconfig" ,python-iniconfig)))) (native-inputs (append (alist-delete "python-pytest" (package-native-inputs python-pytest)) `(("python-pytest" ,python-pytest-6-bootstrap) - ("python-toml" ,python-toml) - ("python-iniconfig" ,python-iniconfig)))))) + ("python-toml" ,python-toml)))))) ;; Pytest 4.x are the last versions that support Python 2. (define-public python2-pytest -- 2.26.2 [-- Attachment #4: 0003-gnu-python-pytest-xdist-Add-missing-input-relax-pyte.patch --] [-- Type: text/x-diff, Size: 2090 bytes --] From 23077674975a0194f38ed70d0a912ab52c4af3fe Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:27:55 +0100 Subject: [PATCH v2 03/16] gnu: python-pytest-xdist: Add missing input, relax pytest requirement. * gnu/packages/check.scm: (python-pytest-xdist) [arguments]: Relax pytest version requirements. [propagated-inputs]: Add python-pytest-forked. --- gnu/packages/check.scm | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm index 9d1e0b8173..2136b8fc4f 100644 --- a/gnu/packages/check.scm +++ b/gnu/packages/check.scm @@ -1216,20 +1216,27 @@ same arguments.") #t)))) (build-system python-build-system) (arguments - '(#:tests? #f)) ;FIXME: Some tests are failing. - ;; #:phases - ;; (modify-phases %standard-phases - ;; (delete 'check) - ;; (add-after 'install 'check - ;; (lambda* (#:key inputs outputs #:allow-other-keys) - ;; (add-installed-pythonpath inputs outputs) - ;; (zero? (system* "py.test" "-v"))))) + '(#:tests? #f ; Lots of tests fail. + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-setup-py + (lambda _ + ;; Relax pytest requirement. + (substitute* "setup.py" + (("pytest>=6\\.0\\.0") "pytest")) + #t)) + (replace 'check + (lambda* (#:key tests? inputs outputs #:allow-other-keys) + (when tests? + (add-installed-pythonpath inputs outputs) + (invoke "py.test" "-v"))))))) (native-inputs `(("python-setuptools-scm" ,python-setuptools-scm))) (propagated-inputs `(("python-execnet" ,python-execnet) ("python-pytest" ,python-pytest) - ("python-py" ,python-py))) + ("python-py" ,python-py) + ("python-pytest-forked" ,python-pytest-forked))) (home-page "https://github.com/pytest-dev/pytest-xdist") (synopsis -- 2.26.2 [-- Attachment #5: 0004-gnu-python-fixtures-bootstrap-Do-not-validate-loadab.patch --] [-- Type: text/x-diff, Size: 1111 bytes --] From 478a266a4299a05835bbfc19099a1f0afc318d8a Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:29:59 +0100 Subject: [PATCH v2 04/16] gnu: python-fixtures-bootstrap: Do not validate loadability * gnu/packages/check.scm (python-fixtures-bootstrap) [arguments]: Delete 'validate-loadable. --- gnu/packages/check.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm index 2136b8fc4f..e4761eb66a 100644 --- a/gnu/packages/check.scm +++ b/gnu/packages/check.scm @@ -1541,7 +1541,12 @@ protocol."))) (base32 "1vxj29bzz3rd4pcy51d05wng9q9dh4jq6wx92yklsm7i6h1ddw7w")))) (build-system python-build-system) - (arguments `(#:tests? #f)) + (arguments + `(#:tests? #f + #:phases + (modify-phases %standard-phases + ;; Package is not loadable on its own at this stage. + (delete 'validate-loadable)))) (propagated-inputs `(("python-pbr-minimal" ,python-pbr-minimal) ("python-six" ,python-six))) -- 2.26.2 [-- Attachment #6: 0005-gnu-python-pytest-pep8-Fix-package.patch --] [-- Type: text/x-diff, Size: 1518 bytes --] From ac7d664c3748afb9059ed3d147c13a9033fff45b Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:35:11 +0100 Subject: [PATCH v2 05/16] gnu: python-pytest-pep8: Fix package. * gnu/packages/check.scm (python-pytest-pep8) [arguments]: Remove dependency on pytest-cache and add proper 'check phase. --- gnu/packages/check.scm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm index e4761eb66a..c12cb98a6c 100644 --- a/gnu/packages/check.scm +++ b/gnu/packages/check.scm @@ -2043,7 +2043,19 @@ failures.") "06032agzhw1i9d9qlhfblnl3dw5hcyxhagn7b120zhrszbjzfbh3")))) (build-system python-build-system) (arguments - `(#:tests? #f)) ; Fails with recent pytest and pep8. See upstream issues #8 and #12. + `(#:tests? #f ; Fails with recent pytest and pep8. See upstream issues #8 and #12. + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'fix-dependencies + (lambda _ + (substitute* "setup.py" + (("'pytest-cache', ") "")) ; Included in recent pytest + #t)) + (replace 'check + (lambda* (#:key tests? inputs outputs #:allow-other-keys) + (when tests? + (add-installed-pythonpath inputs outputs) + (invoke "pytest" "-v"))))))) (native-inputs `(("python-pytest" ,python-pytest))) (propagated-inputs -- 2.26.2 [-- Attachment #7: 0006-gnu-python-pyfakefs-Disable-unreliable-test.patch --] [-- Type: text/x-diff, Size: 1256 bytes --] From e76db5088bafd7a3788a80a834d4983e0eed0e6a Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Mon, 11 Jan 2021 14:44:02 +0100 Subject: [PATCH v2 06/16] gnu: python-pyfakefs: Disable unreliable test * gnu/packages/check.scm (python-pyfakefs) [arguments]: Add new phase to skip single test. --- gnu/packages/check.scm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm index c12cb98a6c..9ddf656324 100644 --- a/gnu/packages/check.scm +++ b/gnu/packages/check.scm @@ -2858,6 +2858,16 @@ grew out of the @dfn{Vc} project.") (arguments `(#:phases (modify-phases %standard-phases + (add-after 'unpack 'patch-testsuite + (lambda _ + ;; Time difference is larger than expected. + (substitute* "pyfakefs/tests/fake_filesystem_unittest_test.py" + (("(\\s+)def test_copy_real_file" all indent) + (string-append + indent + "@unittest.skip('disabled by guix')\n" + all))) + #t)) ;; The default test suite does not run these extra tests. (add-after 'check 'check-pytest-plugin (lambda _ -- 2.26.2 [-- Attachment #8: 0007-gnu-python-slugify-Add-missing-input.patch --] [-- Type: text/x-diff, Size: 963 bytes --] From 203cd356f44081a753b1f67ec14ab00ec1bd8520 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:48:36 +0100 Subject: [PATCH v2 07/16] gnu: python-slugify: Add missing input. * gnu/packages/python-web.scm (python-slugify) [propagated-inputs]: Add python-text-unidecode. --- gnu/packages/python-web.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm index 622f5fc6e2..e3cf25a687 100644 --- a/gnu/packages/python-web.scm +++ b/gnu/packages/python-web.scm @@ -4398,7 +4398,8 @@ Python.") (sha256 (base32 "0w22fapghmzk3xdasc4dn7h8sl58l08d1h5zbf72dh80drv1g9b9")))) (propagated-inputs - `(("python-unidecode" ,python-unidecode))) + `(("python-unidecode" ,python-unidecode) + ("python-text-unidecode" ,python-text-unidecode))) (arguments `(#:phases (modify-phases %standard-phases -- 2.26.2 [-- Attachment #9: 0008-gnu-python-websockets-Fix-Python-package-name.patch --] [-- Type: text/x-diff, Size: 1442 bytes --] From fe3ec027ce3fe198a2cdfe3e1329094f2525fa42 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:49:01 +0100 Subject: [PATCH v2 08/16] gnu: python-websockets: Fix Python package name. * gnu/packages/python-web.scm (python-websockets) [arguments]: Add new phase to fix package name. --- gnu/packages/python-web.scm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm index e3cf25a687..e3318a18ce 100644 --- a/gnu/packages/python-web.scm +++ b/gnu/packages/python-web.scm @@ -5086,7 +5086,16 @@ Plus all the standard features of requests: (base32 "03s3ml6sbki24aajllf8aily0xzrn929zxi84p50zkkbikdd4raw")))) (build-system python-build-system) - (arguments '(#:tests? #f)) ; Tests not included in release tarball. + (arguments + '(#:tests? #f ; Tests not included in release tarball. + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch + (lambda* (#:key inputs #:allow-other-keys) + ;; Python package names use dot as separator. + (substitute* "setup.py" + (("websockets/extensions") "websockets.extensions")) + #t))))) (home-page "https://github.com/aaugustin/websockets") (synopsis "Python implementation of the WebSocket Protocol (RFC 6455 & 7692)") -- 2.26.2 [-- Attachment #10: 0009-gnu-python-black-Remove-blackd.patch --] [-- Type: text/x-diff, Size: 1300 bytes --] From d8199ab0353aa215d193ca511a63d4eea355b6c6 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:50:18 +0100 Subject: [PATCH v2 09/16] gnu: python-black: Remove blackd. * gnu/packages/python-xyz.scm (python-black) [arguments]: Add new phase to prevent installation of blackd. --- gnu/packages/python-xyz.scm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index 818a244378..a02960f1c6 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -4277,7 +4277,14 @@ matching of file paths.") (substitute* "tests/test_black.py" (("( *)def test_python38" match indent) (string-append indent "@unittest.skip(\"guix\")\n" match))) - #t))))) + #t)) + ;; Remove blackd, because it depends on python-aiohttp and + ;; python-aiohttp-cors. + (add-after 'unpack 'remove-entrypoint + (lambda _ + (substitute* "setup.py" + (("\\s*\"blackd=blackd:patched_main \\[d\\]\",\n") "") + (("\"blackd\", ") ""))))))) (propagated-inputs `(("python-click" ,python-click) ("python-attrs" ,python-attrs) -- 2.26.2 [-- Attachment #11: 0010-gnu-python-traitlets-Add-missing-input.patch --] [-- Type: text/x-diff, Size: 1078 bytes --] From b7ec4d0705bab46fa682a79de530336e2ff46775 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 13:53:25 +0100 Subject: [PATCH v2 10/16] gnu: python-traitlets: Add missing input. * gnu/packages/python-xyz.scm (python-traitlets) [propagated-inputs]: Add python-six. --- gnu/packages/python-xyz.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index a02960f1c6..4b7fff5750 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -6973,7 +6973,8 @@ cluster down and deletes the throwaway profile.") (replace 'check (lambda _ (invoke "pytest" "-vv" "traitlets")))))) (propagated-inputs `(("python-ipython-genutils" ,python-ipython-genutils) - ("python-decorator" ,python-decorator))) + ("python-decorator" ,python-decorator) + ("python-six" ,python-six))) (native-inputs `(("python-pytest" ,python-pytest))) (properties `((python2-variant . ,(delay python2-traitlets)))) -- 2.26.2 [-- Attachment #12: 0011-gnu-python-idna-ssl-Add-missing-input.patch --] [-- Type: text/x-diff, Size: 999 bytes --] From e17eb838b9d77588200ac6db652e87bcd73e3f87 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 14:12:56 +0100 Subject: [PATCH v2 11/16] gnu: python-idna-ssl: Add missing input. * gnu/packages/python-xyz.scm (python-idna-ssl) [propagated-inputs]: Add python-idna. --- gnu/packages/python-xyz.scm | 1 + 1 file changed, 1 insertion(+) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index 4b7fff5750..58ad3b6e55 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -9517,6 +9517,7 @@ is binding LibSass.") (build-system python-build-system) (arguments `(#:tests? #f)) ;circular dependency with python-aiohttp + (propagated-inputs `(("python-idna" ,python-idna))) (home-page "https://github.com/aio-libs/idna-ssl") (synopsis "Patch @code{ssl.match_hostname} for Unicode(idna) domains support") (description "Patch @code{ssl.match_hostname} for Unicode(idna) -- 2.26.2 [-- Attachment #13: 0012-gnu-python-twisted-Remove-broken-console-scripts.patch --] [-- Type: text/x-diff, Size: 1330 bytes --] From 3372011b15cd28b203590981f5e1c561f977e31f Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 14:13:53 +0100 Subject: [PATCH v2 12/16] gnu: python-twisted: Remove broken console scripts. * gnu/packages/python-xyz.scm (python-twisted) [arguments]: Patch setup.py. --- gnu/packages/python-xyz.scm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index 58ad3b6e55..d8b61cd1d2 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -12716,7 +12716,14 @@ format.") "17d3hnxv9qndagzz63mdpyk99xj63p9gq586vjn0rxk8cl197nym")))) (build-system python-build-system) (arguments - '(#:tests? #f)) ; FIXME: some tests fail + '(#:tests? #f ; FIXME: some tests fail + #:phases + (modify-phases %standard-phases + ;; Remove scripts, because they depend on [conch] + (add-after 'unpack 'remove-entrypoint + (lambda _ + (substitute* "src/twisted/python/_setup.py" + (("\".+ = twisted\\.conch\\.scripts\\..+\",") ""))))))) (propagated-inputs `(("python-zope-interface" ,python-zope-interface) ("python-pyhamcrest" ,python-pyhamcrest) -- 2.26.2 [-- Attachment #14: 0013-gnu-python-automat-Remove-broken-console-script.patch --] [-- Type: text/x-diff, Size: 1332 bytes --] From 7f644bb845249c32a2504fad0625dd75a6c01ce1 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 14:15:12 +0100 Subject: [PATCH v2 13/16] gnu: python-automat: Remove broken console script. * gnu/packages/python-xyz.scm (python-automat) [arguments]: Patch setup.py. --- gnu/packages/python-xyz.scm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index d8b61cd1d2..acd674878a 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -15151,7 +15151,15 @@ instead of servers and network commands.") ;; python-twisted depends on python-automat. Twisted is optional, but the ;; tests fail if it is not available. Also see ;; <https://github.com/glyph/automat/issues/71>. - (arguments '(#:tests? #f)) + (arguments + `(#:tests? #f + #:phases + (modify-phases %standard-phases + ;; Remove script, because it depends on python-twisted. + (add-after 'unpack 'remove-entrypoint + (lambda _ + (substitute* "setup.py" + (("\"automat-visualize = automat._visualize:tool\"") ""))))))) (native-inputs `(("python-m2r" ,python-m2r) ("python-setuptools-scm" ,python-setuptools-scm) -- 2.26.2 [-- Attachment #15: 0014-gnu-python-packaging-bootstrap-Remove-dependency.patch --] [-- Type: text/x-diff, Size: 1414 bytes --] From ff4f539c9c4cd18e7f5c9bea4f87eec42ee81394 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 14:16:05 +0100 Subject: [PATCH v2 14/16] gnu: python-packaging-bootstrap: Remove dependency. * gnu/packages/python-xyz.scm (python-packaging-bootstrap) [arguments]: Remove dependency from setup.py, which we do not provide for this variant. --- gnu/packages/python-xyz.scm | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index acd674878a..e78016221f 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -16049,10 +16049,18 @@ information.") (package/inherit python-packaging (name "python-packaging-bootstrap") + (arguments + (substitute-keyword-arguments (package-arguments python-packaging) + ((#:phases phases) + `(modify-phases ,phases + (add-after 'unpack 'fix-dependencies + (lambda* (#:key tests? #:allow-other-keys) + (substitute* "setup.py" (("\"six\"") "")) + #t)))) + ((#:tests? _ #f) #f))) (native-inputs '()) (propagated-inputs - `(("python-pyparsing" ,python-pyparsing))) - (arguments '(#:tests? #f))))) + `(("python-pyparsing" ,python-pyparsing)))))) (define-public python2-packaging-bootstrap (hidden-package -- 2.26.2 [-- Attachment #16: 0015-gnu-python-traceback2-Add-missing-dependency.patch --] [-- Type: text/x-diff, Size: 999 bytes --] From 65d2ab65d4dd73e1bdb0248cc41848c55859f98d Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Thu, 7 Jan 2021 14:17:20 +0100 Subject: [PATCH v2 15/16] gnu: python-traceback2: Add missing dependency. * gnu/packages/python-xyz.scm (python-traceback2) [propagated-inputs]: Add python-six. --- gnu/packages/python-xyz.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index e78016221f..1df9807626 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -17266,7 +17266,8 @@ lines are read from a single file.") (native-inputs `(("python-pbr" ,python-pbr-minimal))) (propagated-inputs - `(("python-linecache2" ,python-linecache2))) + `(("python-linecache2" ,python-linecache2) + ("python-six" ,python-six))) (home-page "https://github.com/testing-cabal/traceback2") (synopsis "Backports of the traceback module") -- 2.26.2 [-- Attachment #17: 0016-gnu-python2-packaging-bootstrap-Add-missing-dependen.patch --] [-- Type: text/x-diff, Size: 984 bytes --] From 55aab0eba972c6672be9d8de5e0ec9340b10c243 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Mon, 11 Jan 2021 15:19:01 +0100 Subject: [PATCH v2 16/16] gnu: python2-packaging-bootstrap: Add missing dependency * gnu/packages/python-xyz.scm (python2-packaging-bootstrap) [propagated-inputs]: Add python2-six-bootstrap. --- gnu/packages/python-xyz.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm index 1df9807626..434946acfd 100644 --- a/gnu/packages/python-xyz.scm +++ b/gnu/packages/python-xyz.scm @@ -16069,7 +16069,8 @@ information.") (name "python2-packaging-bootstrap") (native-inputs '()) (propagated-inputs - `(("python-pyparsing" ,python2-pyparsing))) + `(("python-pyparsing" ,python2-pyparsing) + ("python-six" ,python2-six-bootstrap))) (arguments `(#:tests? #f ,@(package-arguments python2-packaging)))))) -- 2.26.2 [-- Attachment #18: failing-packages.txt --] [-- Type: text/plain, Size: 7445 bytes --] awscli b4 beets beets-bandcamp behave bpython buku calibre certbot curseradio dbxfs debops diffoscope docker-compose electron-cash electrum enjarify fabric fdroidserver fenics frescobaldi gandi.cli gaupol gitless gpodder grit grocsvs instantmusic jrnl jupyter keepkey-agent khmer ledger-agent letsencrypt linkchecker mailman miso mps-youtube nmoldyn nototools offlate onionshare openshot pagekite patchwork pbtranscript-tofu pepr picard poetry poretools postorius pre-commit presentty protonvpn-cli ptpython2 pulseaudio-dlna pybitmessage pyicoteo python2-anaconda-client python2-apache-libcloud python2-argcomplete python2-arrow python2-autograd python2-axolotl python2-bcrypt python2-behave-web-api python2-betamax python2-betamax-matchers python2-bigfloat python2-biom-format python2-booleanoperations python2-botocore python2-cachecontrol python2-cairocffi python2-celery python2-checkm-genome python2-clf python2-cloudpickle python2-consul python2-cryptography python2-cvxopt python2-cypari2 python2-discogs-client python2-dns-lexicon python2-drmaa python2-dulwich python2-ecpy python2-elasticsearch python2-email-validator python2-empy python2-entrypoints python2-factory-boy python2-faker python2-fakeredis python2-falcon python2-falcon-cors python2-fastlmm python2-fido2 python2-flake8 python2-flake8-polyfill python2-flask python2-flask-babel python2-flask-htmlmin python2-flask-login python2-flask-multistatic python2-flask-wtf python2-flex python2-furl python2-future python2-git-review python2-google-api-client python2-graphql-core python2-gridmap python2-guzzle-sphinx-theme python2-hdf4 python2-html5-parser python2-htseq python2-httpbin python2-ipykernel python2-ipyparallel python2-ipython python2-ipython-cluster-helper python2-ipywidgets python2-josepy python2-jupyter-client python2-jupyter-console python2-kivy python2-kombu python2-ledgerblue python2-libadalang python2-lzstring python2-mapnik python2-matplotlib python2-matplotlib-documentation python2-mechanicalsoup python2-mutagen python2-mwclient python2-nbconvert python2-nbxmpp python2-ndg-httpsclient python2-nose2 python2-notebook python2-notify2 python2-numpydoc python2-numpy-documentation python2-oauthlib python2-openid-cla python2-openid-teams python2-openpyxl python2-orator python2-os-client-config python2-os-testr python2-pandas python2-paramiko python2-parsedatetime python2-partd python2-pathpy python2-patsy python2-pendulum python2-pep517 python2-pgpdump python2-pika python2-plastid python2-plotly python2-py2neo python2-pybedtools python2-pyclipper python2-pyfakefs python2-pylibmc python2-pymysql python2-pynacl python2-pynamecheap python2-pyopenssl python2-pysnptools python2-pytest-xdist python2-radon python2-rauth python2-renpy python2-requests python2-requests-file python2-requests-mock python2-requests-oauthlib python2-requests-toolbelt python2-responses python2-roca-detect python2-rpython python2-rq python2-rst.linker python2-ruamel.yaml python2-s3transfer python2-scikit-learn python2-scipy python2-scripttest python2-seaborn python2-service-identity python2-setuptools-scm-git-archive python2-sh python2-shapely python2-sockjs-tornado python2-sphinx-cloud-sptheme python2-sphinxcontrib-programoutput python2-sphinx-repoze-autointerface python2-statsmodels python2-stem python2-stevedore python2-tables python2-terminado python2-tldextract python2-tornado python2-translate-toolkit python2-trollius-redis python2-twine python2-urlgrabber python2-urllib3 python2-utils python2-validators python2-warpedlmm python2-widgetsnbextension python2-wsgiproxy2 python2-xenon python2-yubikey-manager python2-zope-component python2-zope-configuration python2-zope-exceptions python2-zope-i18nmessageid python2-zope-location python2-zope-proxy python2-zope-schema python2-zope-security python2-zope-testrunner python-args python-aws-xray-sdk python-bbknn python-behave-web-api python-bigfloat python-btrees python-cachy python-clint python-codacy-coverage python-cypari2 python-daemux python-dendropy python-django-auth-ldap python-django-bulk-update python-django-classy-tags python-django-compressor python-django-contact-form python-django-debug-toolbar python-django-debug-toolbar-alchemy python-django-extensions python-django-filter python-django-haystack python-django-jinja python-django-logging-json python-django-mailman3 python-django-netfields python-django-redis python-djangorestframework python-django-rq python-django-sekizai python-django-statici18n python-django-url-filter python-docker python-drmaa python-duniterpy python-eliot python-enum34 python-eventlet python-faiss python-fakeredis python-flasgger python-flask-restplus python-flask-session python-flit python-funcparserlib python-graphene python-gridmap python-gyp python-hacking python-hdf4 python-html5-parser python-hy python-hyperkitty python-internetarchive python-ipykernel python-ipyparallel python-ipython-cluster-helper python-ipython-documentation python-ipywidgets python-jaraco-packaging python-jose python-jsonpickle python-jupyter-client python-jupyter-console python-jupyter-kernel-mgmt python-jupyter-kernel-test python-jupyter-protocol python-keyring python-keyrings.alt python-keystoneclient python-kivy python-ldap python-lfdfiles python-libsass python-logwrap python-mailman-hyperkitty python-mamba python-matplotlib-documentation python-matrix-synapse-ldap3 python-miniboa python-moto python-nautilus python-nbval python-ndg-httpsclient python-notebook python-numpy-documentation python-onnx python-ont-fast5-api python-openid-cla python-openid-teams python-orator python-os-client-config python-oslo.config python-oslo.context python-oslo.i18n python-oslo.log python-oslo.serialization python-oslosphinx python-oslo.utils python-os-testr python-owslib python-pafy python-parallel python-pari-jupyter python-pathpy python-pendulum python-persistent python-petsc4py python-pifpaf python-plotly python-py3dns python-pyacoustid python-pyclipper python-pydub python-pykafka python-pykka python-pylibmc python-pyramid python-pytest-arraydiff python-pytest-checkdocs python-pytest-django python-pytest-mpl python-pytest-shutil python-pytest-virtualenv python-pytidylib python-pyxb python-qdarkstyle python-qtconsole python-qtpy python-radon python-scripttest python-setools python-setuptools-scm-git-archive python-slepc4py python-socksipychain python-sphinx-copybutton python-stestr python-swiftclient python-symengine python-tempest-lib python-tortoise-orm python-translate-toolkit python-translation-finder python-trollius-redis python-trytond-account python-trytond-account-invoice python-trytond-account-invoice-stock python-trytond-account-product python-trytond-analytic-account python-trytond-company python-trytond-country python-trytond-currency python-trytond-party python-trytond-product python-trytond-purchase python-trytond-purchase-request python-trytond-stock python-trytond-stock-lot python-trytond-stock-supply python-txacme python-typing python-widgetsnbextension python-xattr python-xenon python-zope-component python-zope-configuration python-zope-copy python-zope-deferredimport python-zope-exceptions python-zope-i18nmessageid python-zope-location python-zope-proxy python-zope-schema python-zope-security python-zope-testrunner qutebrowser rapid-photo-downloader renpy reprotest ribodiff rtv silkaj solaar synapse syncthing-gtk tadbit taxtastic tbsp trezor-agent tuir unknown-horizons virtaal xpra you-get youtube-dl youtube-dl-gui ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-12 9:37 ` Lars-Dominik Braun @ 2021-01-25 19:29 ` Maxim Cournoyer 2021-01-26 8:39 ` Lars-Dominik Braun 2021-02-07 16:59 ` [bug#45712] " Hartmut Goebel 0 siblings, 2 replies; 17+ messages in thread From: Maxim Cournoyer @ 2021-01-25 19:29 UTC (permalink / raw) To: Lars-Dominik Braun; +Cc: Hartmut Goebel, 45712 [-- Attachment #1: Type: text/plain, Size: 733 bytes --] Hi Lars-Dominik, Lars-Dominik Braun <lars@6xq.net> writes: > Adds a new phase validating usalibity of installed Python packages. > > * guix/build/python-build-system.scm (validate-script): Add script. > (validate-loadable): New phase. > (%standard-phases): Use it. > * tests/builders.scm (make-python-dummy): Add test package generator. > (check-build-{success,failure}): Add build helper functions. > (python-dummy-*): Add test packages. > ("python-build-system: &"): Add tests. Attached is a small rework of your original patch. I've made the Python script standalone, which should make it easier to maintain. I've also refactored the tests somewhat and added your copyright information. Is this OK with you? Thanks! Maxim [-- Attachment #2: 0001-build-system-python-Add-a-sanity-check-phase.patch --] [-- Type: text/x-patch, Size: 16346 bytes --] From 2df41c3fb476822efac1aa8dac8368e91a0e360a Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun <lars@6xq.net> Date: Sun, 3 Jan 2021 10:30:29 +0100 Subject: [PATCH] build-system/python: Add a sanity check phase. Add a new phase validating the usability of installed Python packages. * gnu/packages/aux-files/python/sanity-check.py: New file. * Makefile.am (AUX_FILES): Register it. * guix/build-system/python.scm (sanity-check.py): New variable. (lower): Add the script as an implicit input. * guix/build/python-build-system.scm: Remove trailing #t. (sanity-check): New phase. (%standard-phases): Use it. * tests/builders.scm (test-build-package): New syntax. ("python-build-system: dummy-ok") ("python-build-system: dummy-fail-requirements") ("python-build-system: dummy-fail-import") ("python-build-system: dummy-fail-console-script"): Add tests. --- Makefile.am | 1 + gnu/packages/aux-files/python/sanity-check.py | 85 ++++++++++++++ guix/build-system/python.scm | 8 ++ guix/build/python-build-system.scm | 26 +++-- tests/builders.scm | 106 +++++++++++++++++- 5 files changed, 212 insertions(+), 14 deletions(-) create mode 100644 gnu/packages/aux-files/python/sanity-check.py diff --git a/Makefile.am b/Makefile.am index dc5cf9babc..dddae69ff1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -380,6 +380,7 @@ AUX_FILES = \ gnu/packages/aux-files/linux-libre/4.4-i686.conf \ gnu/packages/aux-files/linux-libre/4.4-x86_64.conf \ gnu/packages/aux-files/pack-audit.c \ + gnu/packages/aux-files/python/sanity-check.py \ gnu/packages/aux-files/run-in-namespace.c # Templates, examples. diff --git a/gnu/packages/aux-files/python/sanity-check.py b/gnu/packages/aux-files/python/sanity-check.py new file mode 100644 index 0000000000..1ba912a931 --- /dev/null +++ b/gnu/packages/aux-files/python/sanity-check.py @@ -0,0 +1,85 @@ +# GNU Guix --- Functional package management for GNU +# Copyright © 2021 Lars-Dominik Braun <lars@6xq.net> +# +# This file is part of GNU Guix. +# +# GNU Guix is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or (at +# your option) any later version. +# +# GNU Guix is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +from __future__ import print_function # Python 2 support. +import importlib +import pkg_resources +import sys +import traceback + +try: + from importlib.machinery import PathFinder +except ImportError: + PathFinder = None + +ret = 0 + +# Only check site-packages installed by this package, but not dependencies +# (which pkg_resources.working_set would include). Path supplied via argv. +ws = pkg_resources.find_distributions(sys.argv[1]) + +for dist in ws: + print('validating', repr(dist.project_name), dist.location) + try: + print('...checking requirements', end=': ') + req = str(dist.as_requirement()) + # dist.activate() is not enough to actually check requirements, we + # have to .require() it. + pkg_resources.require(req) + print('OK') + except Exception as e: + print('ERROR:', req, e) + ret = 1 + continue + + # Try to load entry points of console scripts too, making sure they + # work. They should be removed if they don't. Other groups may not be + # safe, as they can depend on optional packages. + for group, v in dist.get_entry_map().items(): + if group not in {'console_scripts', }: + continue + for name, ep in v.items(): + try: + print('...trying to load endpoint', group, name, end=': ') + ep.load() + print('OK') + except Exception: + print('ERROR:') + traceback.print_exc(file=sys.stdout) + ret = 1 + continue + + # And finally try to load top level modules. This should not have any + # side-effects. + for name in dist.get_metadata_lines('top_level.txt'): + # Only available on Python 3. + if PathFinder and PathFinder.find_spec(name) is None: + # Ignore unavailable modules. Cannot use ModuleNotFoundError, + # because it is raised by failed imports too. + continue + try: + print('...trying to load module', name, end=': ') + importlib.import_module(name) + print('OK') + except Exception: + print('ERROR:') + traceback.print_exc(file=sys.stdout) + ret = 1 + continue + +sys.exit(ret) diff --git a/guix/build-system/python.scm b/guix/build-system/python.scm index e39c06528e..2bb6fa87ca 100644 --- a/guix/build-system/python.scm +++ b/guix/build-system/python.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org> +;;; Copyright © 2021 Lars-Dominik Braun <lars@6xq.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -19,6 +20,8 @@ ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. (define-module (guix build-system python) + #:use-module ((gnu packages) #:select (search-auxiliary-file)) + #:use-module (guix gexp) #:use-module (guix store) #:use-module (guix utils) #:use-module (guix memoization) @@ -70,6 +73,10 @@ extension, such as '.tar.gz'." (let ((python (resolve-interface '(gnu packages python)))) (module-ref python 'python-2))) +(define sanity-check.py + ;; The script used to validate the installation of a Python package. + (search-auxiliary-file "python/sanity-check.py")) + (define* (package-with-explicit-python python old-prefix new-prefix #:key variant-property) "Return a procedure of one argument, P. The procedure creates a package with @@ -156,6 +163,7 @@ pre-defined variants." ;; Keep the standard inputs of 'gnu-build-system'. ,@(standard-packages))) (build-inputs `(("python" ,python) + ("sanity-check.py" ,(local-file sanity-check.py)) ,@native-inputs)) (outputs outputs) (build python-build) diff --git a/guix/build/python-build-system.scm b/guix/build/python-build-system.scm index 7fef0b2278..1f11dd2b0a 100644 --- a/guix/build/python-build-system.scm +++ b/guix/build/python-build-system.scm @@ -9,6 +9,7 @@ ;;; Copyright © 2019, 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net> ;;; Copyright © 2020 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2021 Lars-Dominik Braun <lars@6xq.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -134,6 +135,15 @@ (apply invoke "python" "./setup.py" command params))) (error "no setup.py found"))) +(define* (sanity-check #:key tests? inputs outputs #:allow-other-keys) + "Ensure packages depending on this package via setuptools work properly, +their advertised endpoints work and their top level modules are importable +without errors." + (let ((sanity-check.py (assoc-ref inputs "sanity-check.py"))) + ;; Make sure the working directory is empty (i.e. no Python modules in it) + (with-directory-excursion "/tmp" + (invoke "python" sanity-check.py (site-packages inputs outputs))))) + (define* (build #:key use-setuptools? #:allow-other-keys) "Build a given Python package." (call-setuppy "build" '() use-setuptools?) @@ -225,8 +235,7 @@ useful when running checks after installing the package." ;; '--invalidation-mode' option, do not generate any. (unless <3.7? (invoke "python" "-m" "compileall" "--invalidation-mode=unchecked-hash" - out)) - #t)) + out)))) (define* (wrap #:key inputs outputs #:allow-other-keys) (let ((pythonpath (guix-pythonpath inputs))) @@ -262,8 +271,7 @@ installed with setuptools." (easy-install-pth (string-append site-packages "/easy-install.pth")) (new-pth (string-append site-packages "/" name ".pth"))) (when (file-exists? easy-install-pth) - (rename-file easy-install-pth new-pth)) - #t)) + (rename-file easy-install-pth new-pth)))) (define* (ensure-no-mtimes-pre-1980 #:rest _) "Ensure that there are no mtimes before 1980-01-02 in the source tree." @@ -275,8 +283,7 @@ installed with setuptools." (ftw "." (lambda (file stat flag) (unless (<= early-1980 (stat:mtime stat)) (utime file early-1980 early-1980)) - #t)) - #t)) + #t)))) (define* (enable-bytecode-determinism #:rest _) "Improve determinism of pyc files." @@ -284,8 +291,7 @@ installed with setuptools." (setenv "PYTHONHASHSEED" "0") ;; Prevent Python from creating .pyc files when loading modules (such as ;; when running a test suite). - (setenv "PYTHONDONTWRITEBYTECODE" "1") - #t) + (setenv "PYTHONDONTWRITEBYTECODE" "1")) (define* (ensure-no-cythonized-files #:rest _) "Check the source code for @code{.c} files which may have been pre-generated @@ -296,8 +302,7 @@ by Cython." (string-append (string-drop-right file 3) "c"))) (when (file-exists? generated-file) (format #t "Possible Cythonized file found: ~a~%" generated-file)))) - (find-files "." "\\.pyx$")) - #t) + (find-files "." "\\.pyx$"))) (define %standard-phases ;; The build phase only builds C extensions and copies the Python sources, @@ -319,6 +324,7 @@ by Cython." (add-after 'install 'wrap wrap) (add-before 'check 'add-install-to-pythonpath add-install-to-pythonpath) (add-before 'check 'add-install-to-path add-install-to-path) + (add-after 'check 'sanity-check sanity-check) (add-before 'strip 'rename-pth-file rename-pth-file))) (define* (python-build #:key inputs (phases %standard-phases) diff --git a/tests/builders.scm b/tests/builders.scm index fdcf38ded3..c5528b2593 100644 --- a/tests/builders.scm +++ b/tests/builders.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013, 2014, 2015, 2019 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2021 Lars-Dominik Braun <lars@6xq.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -17,19 +18,19 @@ ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. -(define-module (test-builders) +(define-module (tests builders) #:use-module (guix download) #:use-module (guix build-system) #:use-module (guix build-system gnu) + #:use-module (guix build-system python) #:use-module (guix store) + #:use-module (guix monads) #:use-module (guix utils) #:use-module (guix base32) #:use-module (guix derivations) #:use-module (gcrypt hash) #:use-module (guix tests) - #:use-module ((guix packages) - #:select (package? - package-derivation package-native-search-paths)) + #:use-module (guix packages) #:use-module (gnu packages bootstrap) #:use-module (ice-9 match) #:use-module (srfi srfi-1) @@ -78,4 +79,101 @@ (test-assert "gnu-build-system" (build-system? gnu-build-system)) +\f +;;; +;;; Test the sanity-check phase of the Python build system. +;;; + +(define-syntax-rule (test-build-package name expect-failure? package) + "Return a test named NAME, building PACKAGE in the external store." + (with-external-store store + (unless store (test-skip 1)) + (let ((build (lambda (p) + (build-derivations + store (list (package-derivation store p)))))) + (if expect-failure? + (test-error name + (store-protocol-error?) + (build package)) + (test-assert name (build package)))))) + +(test-build-package "python-build-system: dummy-ok" #f + (dummy-package "python-dummy-ok" + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'unpack + (lambda _ + (mkdir-p "dummy") + (invoke "touch" "dummy/__init__.py") + (with-output-to-file "setup.py" + (lambda _ + (display "\ +from setuptools import setup +setup(name='dummy-ok', + version='0', + packages=['dummy'])")))))))))) + +(test-build-package "python-build-system: dummy-fail-requirements" #t + (dummy-package "python-dummy-fail-requirements" + (build-system python-build-system) + (arguments + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (replace 'unpack + (lambda _ + (mkdir-p "dummy") + (invoke "touch" "dummy/__init__.py") + (with-output-to-file "setup.py" + (lambda _ + (display "\ +from setuptools import setup +setup(name='dummy-fail-requirements', + version='0', + packages=['dummy'], + install_requires=['nonexistent'])")))))))))) + +(test-build-package "python-build-system: dummy-fail-import" #t + (dummy-package "python-dummy-fail-import" + (build-system python-build-system) + (arguments + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (replace 'unpack + (lambda _ + (mkdir-p "dummy") + (with-output-to-file "dummy/__init__.py" + (lambda _ + (display "import nonexistent"))) + (with-output-to-file "setup.py" + (lambda _ + (display "\ +from setuptools import setup +setup(name='dummy-fail-import', + version='0', + packages=['dummy'])")))))))))) + +(test-build-package "python-build-system: dummy-fail-console-script" #f + (dummy-package "python-dummy-fail-console-script" + (build-system python-build-system) + (arguments + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (replace 'unpack + (lambda _ + (mkdir-p "dummy") + (invoke "touch" "dummy/__init__.py") + (with-output-to-file "setup.py" + (lambda _ + (display "\ +from setuptools import setup +setup(name='dummy-fail-console-script', + version='0', + packages=['dummy'], + entry_points={'console_scripts': ['broken = dummy:nonexistent']})")))))))))) + (test-end "builders") -- 2.30.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-25 19:29 ` Maxim Cournoyer @ 2021-01-26 8:39 ` Lars-Dominik Braun 2021-01-28 15:40 ` Maxim Cournoyer 2021-02-07 16:59 ` [bug#45712] " Hartmut Goebel 1 sibling, 1 reply; 17+ messages in thread From: Lars-Dominik Braun @ 2021-01-26 8:39 UTC (permalink / raw) To: Maxim Cournoyer; +Cc: 45712 Hi Maxim, > Attached is a small rework of your original patch. I've made the Python > script standalone, which should make it easier to maintain. I've also > refactored the tests somewhat and added your copyright information. > Is this OK with you? sure, no problem with the refactoring in gerenal, but I think you used an old patchset. I sent a v2 to this issue, which had some changes to the scripts and tests. I can’t test your patch properly unfortunately, because `make check` does not work on core-updates and trying to build any Python package on core-updates triggers the requirements checker immediately: validating 'attrs' /gnu/store/hdjip92izsf9anfhd6ijgc9glvbi4dzv-python-attrs-bootstrap-19.3.0/lib/python3.9/site-packages ...checking requirements: ERROR: attrs==19.3.0 The 'attrs==19.3.0' distribution was not found and is required by the application”) Maybe that’s an issue with Python 3.9? Cheers, Lars ^ permalink raw reply [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-26 8:39 ` Lars-Dominik Braun @ 2021-01-28 15:40 ` Maxim Cournoyer 2021-01-28 16:18 ` Lars-Dominik Braun 0 siblings, 1 reply; 17+ messages in thread From: Maxim Cournoyer @ 2021-01-28 15:40 UTC (permalink / raw) To: Lars-Dominik Braun; +Cc: 45712 Hi Lars, Lars-Dominik Braun <lars@6xq.net> writes: > Hi Maxim, > >> Attached is a small rework of your original patch. I've made the Python >> script standalone, which should make it easier to maintain. I've also >> refactored the tests somewhat and added your copyright information. >> Is this OK with you? > sure, no problem with the refactoring in gerenal, but I think you used > an old patchset. I sent a v2 to this issue, which had some changes to > the scripts and tests. > > I can’t test your patch properly unfortunately, because `make check` > does not work on core-updates and trying to build any Python package on > core-updates triggers the requirements checker immediately: > > validating 'attrs' > /gnu/store/hdjip92izsf9anfhd6ijgc9glvbi4dzv-python-attrs-bootstrap-19.3.0/lib/python3.9/site-packages > ...checking requirements: ERROR: attrs==19.3.0 The 'attrs==19.3.0' > distribution was not found and is required by the application”) > > Maybe that’s an issue with Python 3.9? > > Cheers, > Lars Doesn't that mean that the attrs requirement should be lifted from the bootstrap version? As its purpose is exactly this: breaking the cyclic dependency with itself. Maxim ^ permalink raw reply [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-28 15:40 ` Maxim Cournoyer @ 2021-01-28 16:18 ` Lars-Dominik Braun 2021-01-29 14:26 ` Maxim Cournoyer 0 siblings, 1 reply; 17+ messages in thread From: Lars-Dominik Braun @ 2021-01-28 16:18 UTC (permalink / raw) To: Maxim Cournoyer; +Cc: 45712 Hi Maxim, > Doesn't that mean that the attrs requirement should be lifted from the > bootstrap version? As its purpose is exactly this: breaking the cyclic > dependency with itself. ah, now I see the problem, there’s a (add-installed-pythonpath inputs outputs) missing and so it can’t find the installed packages. Maybe we’re working on different branches? I applied your patch directly to core-updates. Cheers, Lars ^ permalink raw reply [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-28 16:18 ` Lars-Dominik Braun @ 2021-01-29 14:26 ` Maxim Cournoyer 2021-02-01 7:20 ` Lars-Dominik Braun 0 siblings, 1 reply; 17+ messages in thread From: Maxim Cournoyer @ 2021-01-29 14:26 UTC (permalink / raw) To: Lars-Dominik Braun; +Cc: 45712 Hi Lars, Lars-Dominik Braun <lars@6xq.net> writes: > Hi Maxim, > >> Doesn't that mean that the attrs requirement should be lifted from the >> bootstrap version? As its purpose is exactly this: breaking the cyclic >> dependency with itself. > ah, now I see the problem, there’s a (add-installed-pythonpath inputs > outputs) missing and so it can’t find the installed packages. Maybe > we’re working on different branches? I applied your patch directly to > core-updates. > > Cheers, > Lars Oh yes, sorry I had failed to mention it, this is on the cu/farewell-to-pythonpath branch, which is the integration of GUIX_PYTHONPATH and this work of yours. I've included your v2 patches, with light editing: fixed the script indentation (spot via flake8), I removed the python2 tests as Python 2 is obsolete, and removed the space between the (procedure)[area/conditional] part of the GNU changelog commit messages. Another note to help with review; when sending v2 patches, make sure the title of your mail reply mentions [PATCH v2]; this helps to spot the later versions in email threads. The branch is shaping up nicely; I encourage you to try it. If no major problem is found with it, I'll merge it in core-updates soon. Thank you, Maxim ^ permalink raw reply [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-29 14:26 ` Maxim Cournoyer @ 2021-02-01 7:20 ` Lars-Dominik Braun 2021-02-01 17:02 ` bug#45712: " Maxim Cournoyer 0 siblings, 1 reply; 17+ messages in thread From: Lars-Dominik Braun @ 2021-02-01 7:20 UTC (permalink / raw) To: Maxim Cournoyer; +Cc: 45712 Hi Maxim, > Oh yes, sorry I had failed to mention it, this is on the > cu/farewell-to-pythonpath branch, which is the integration of > GUIX_PYTHONPATH and this work of yours. I've included your v2 patches, > with light editing: fixed the script indentation (spot via flake8), I > removed the python2 tests as Python 2 is obsolete, and removed the space > between the (procedure)[area/conditional] part of the GNU changelog > commit messages. thanks! > Another note to help with review; when sending v2 patches, make sure the > title of your mail reply mentions [PATCH v2]; this helps to spot the > later versions in email threads. Sorry about that, will do next time. > The branch is shaping up nicely; I encourage you to try it. If no major > problem is found with it, I'll merge it in core-updates soon. I’ve been rebuilding packages on my list that use python-build-system using this branch and quite a few fail, but in a random sample I found none that fails due to this patch and also I imagine some issues are already fixed on core-updates? Is there anything else I can do? Cheers, Lars ^ permalink raw reply [flat|nested] 17+ messages in thread
* bug#45712: [PATCHES] Improve Python package quality 2021-02-01 7:20 ` Lars-Dominik Braun @ 2021-02-01 17:02 ` Maxim Cournoyer 0 siblings, 0 replies; 17+ messages in thread From: Maxim Cournoyer @ 2021-02-01 17:02 UTC (permalink / raw) To: Lars-Dominik Braun; +Cc: 45712-done Hi Lars, Lars-Dominik Braun <lars@6xq.net> writes: > Hi Maxim, > >> Oh yes, sorry I had failed to mention it, this is on the >> cu/farewell-to-pythonpath branch, which is the integration of >> GUIX_PYTHONPATH and this work of yours. I've included your v2 patches, >> with light editing: fixed the script indentation (spot via flake8), I >> removed the python2 tests as Python 2 is obsolete, and removed the space >> between the (procedure)[area/conditional] part of the GNU changelog >> commit messages. > thanks! > >> Another note to help with review; when sending v2 patches, make sure the >> title of your mail reply mentions [PATCH v2]; this helps to spot the >> later versions in email threads. > Sorry about that, will do next time. > >> The branch is shaping up nicely; I encourage you to try it. If no major >> problem is found with it, I'll merge it in core-updates soon. > I’ve been rebuilding packages on my list that use python-build-system > using this branch and quite a few fail, but in a random sample I found > none that fails due to this patch and also I imagine some issues are > already fixed on core-updates? Is there anything else I can do? I guess we can be bold and merge the branch to core-updates, and fix any breakage that may occur there! I've done so, the last commit of the series is 1b9186828867e77af1f2ee6741063424f8256398. Let's make Python on Guix great again! Thank you :-) Closing, Maxim ^ permalink raw reply [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-25 19:29 ` Maxim Cournoyer 2021-01-26 8:39 ` Lars-Dominik Braun @ 2021-02-07 16:59 ` Hartmut Goebel 2021-02-08 8:02 ` Lars-Dominik Braun 1 sibling, 1 reply; 17+ messages in thread From: Hartmut Goebel @ 2021-02-07 16:59 UTC (permalink / raw) To: Maxim Cournoyer, Lars-Dominik Braun; +Cc: Ricardo Wurmus, 45712 [-- Attachment #1: Type: text/plain, Size: 817 bytes --] Hi Maxim, > > Attached is a small rework of your original patch. I've made the Python > script standalone, which should make it easier to maintain. I've also > refactored the tests somewhat and added your copyright information. > > Is this OK with you? I had discussed some change to his original patch with Lars. Can't remember all point, just these: + if group not in {'console_scripts', }: "gui_scripts"m are missing. Using a set there is uncommon, since it is a constant value anyway. + # And finally try to load top level modules. This should not have any + # side-effects. I'd try loading the top level module first. As this is a pre-condition for loading the entry-points. -- +++hartmut | Hartmut Goebel | | | hartmut@goebel-consult.de | www.goebel-consult.de | [-- Attachment #2: Type: text/html, Size: 2484 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-02-07 16:59 ` [bug#45712] " Hartmut Goebel @ 2021-02-08 8:02 ` Lars-Dominik Braun 0 siblings, 0 replies; 17+ messages in thread From: Lars-Dominik Braun @ 2021-02-08 8:02 UTC (permalink / raw) To: Hartmut Goebel; +Cc: 45712, Maxim Cournoyer Hi Hartmut, > I had discussed some change to his original patch with Lars. Can't > remember all point, just these: these points were addressed, before Maxim merged the change into core-updates. Cheers, Lars ^ permalink raw reply [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-07 13:26 [bug#45712] [PATCHES] Improve Python package quality Lars-Dominik Braun 2021-01-08 11:37 ` Hartmut Goebel @ 2021-01-25 14:43 ` Maxim Cournoyer 2021-01-25 19:42 ` Lars-Dominik Braun 2021-01-25 14:48 ` Maxim Cournoyer 2021-01-29 14:14 ` Maxim Cournoyer 3 siblings, 1 reply; 17+ messages in thread From: Maxim Cournoyer @ 2021-01-25 14:43 UTC (permalink / raw) To: Lars-Dominik Braun; +Cc: 45712 Hi! Lars-Dominik Braun <lars@6xq.net> writes: > Hi, > > as announced in > https://lists.gnu.org/archive/html/guix-devel/2021-01/msg00021.html Ive > been working on adding an additional phase to Python packages to check > whether they actually work. I cleaned up my patch, added tests and now > Im pretty confident it works as expected. The first patch in this > series adds this phase, while the other ones fix build failures caused > by it. All of this should go to core-updates (or a separate wip-* > branch?), since it causes a massive number of rebuilds. > > You can also pull my git repo at https://github.com/PromyLOPh/guix.git > branch work-python-importcheck. Thanks for the initiative! It looks good, on first sight. One question I have is this: does it rely on the Python package having been built with setuptools/distutils? The Python world is moving toward a plurality of PEP 517 compliant build systems; any idea if the checker will continue working for these new packages? We have currently only one such package in our collection, on core-updates. It's python-isort, added with commit 812a2931de553d12c01b0a4d53d03613b09adaaf on the core-updates branch. Thank you, Maxim ^ permalink raw reply [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-25 14:43 ` Maxim Cournoyer @ 2021-01-25 19:42 ` Lars-Dominik Braun 0 siblings, 0 replies; 17+ messages in thread From: Lars-Dominik Braun @ 2021-01-25 19:42 UTC (permalink / raw) To: Maxim Cournoyer; +Cc: 45712 Hi Maxim, > Thanks for the initiative! It looks good, on first sight. One question > I have is this: does it rely on the Python package having been built > with setuptools/distutils? The Python world is moving toward a > plurality of PEP 517 compliant build systems; any idea if the checker > will continue working for these new packages? yes and no. pkg_resources is part of setuptools, so my patch depends on setuptools. But I think dependencies are specified in a standardized format[1], which any tool can (and should?) write. top_level.txt seems to be part of python eggs, which are deprecated[2]. I guess we could just scan for top-level directories under site-packages, which have a __init__.py and try to load them. I can’t find any standard for the entry points, so I’m guessing they’re setuptools-specific too. My assumption is that if no metadata is found the checks are just skipped and nothing bad happens, but we may have to verify this. As for PEP 517, I’m working on updating python-build-system, see https://lists.gnu.org/archive/html/guix-devel/2021-01/msg00294.html I’ll send an updated patch to guix-patches@ as soon as I have the 'check phase working. Cheers, Lars [1] https://packaging.python.org/specifications/core-metadata/#requires-dist-multiple-use [2] https://setuptools.readthedocs.io/en/latest/deprecated/python_eggs.html#top-level-txt-conflict-management-metadata ^ permalink raw reply [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-07 13:26 [bug#45712] [PATCHES] Improve Python package quality Lars-Dominik Braun 2021-01-08 11:37 ` Hartmut Goebel 2021-01-25 14:43 ` Maxim Cournoyer @ 2021-01-25 14:48 ` Maxim Cournoyer 2021-01-29 14:14 ` Maxim Cournoyer 3 siblings, 0 replies; 17+ messages in thread From: Maxim Cournoyer @ 2021-01-25 14:48 UTC (permalink / raw) To: Lars-Dominik Braun; +Cc: 45712 Hi again, [...] >>From cf9ae80b59e86a60c27734c8cc27637757490d70 Mon Sep 17 00:00:00 2001 > From: Lars-Dominik Braun <lars@6xq.net> > Date: Thu, 7 Jan 2021 13:25:56 +0100 > Subject: [PATCH 02/15] gnu: pytest@6: Add missing propagated-input. > > * gnu/packages/check.scm (python-pytest-6) [native-inputs]: Remove > python-iniconfig. > [propagated-inputs]: Move it here. > --- > gnu/packages/check.scm | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm > index 1300f9e1a6..9d1e0b8173 100644 > --- a/gnu/packages/check.scm > +++ b/gnu/packages/check.scm > @@ -964,13 +964,13 @@ and many external plugins.") > (propagated-inputs > (append (alist-delete "python-py" > (package-propagated-inputs python-pytest)) > - `(("python-py" ,python-py-next)))) > + `(("python-py" ,python-py-next) > + ("python-iniconfig" ,python-iniconfig)))) > (native-inputs > (append (alist-delete "python-pytest" > (package-native-inputs python-pytest)) > `(("python-pytest" ,python-pytest-6-bootstrap) > - ("python-toml" ,python-toml) > - ("python-iniconfig" ,python-iniconfig)))))) > + ("python-toml" ,python-toml)))))) > > ;; Pytest 4.x are the last versions that support Python 2. > (define-public python2-pytest I hadn't seen this patch but I fixed that problem on core-updates with be7061cea30b59676fc473d6bd4a56a0f2fbd7cf on the 14 of January. Note that python-pytest-6 became just 'python-pytest' there. ^ permalink raw reply [flat|nested] 17+ messages in thread
* [bug#45712] [PATCHES] Improve Python package quality 2021-01-07 13:26 [bug#45712] [PATCHES] Improve Python package quality Lars-Dominik Braun ` (2 preceding siblings ...) 2021-01-25 14:48 ` Maxim Cournoyer @ 2021-01-29 14:14 ` Maxim Cournoyer 3 siblings, 0 replies; 17+ messages in thread From: Maxim Cournoyer @ 2021-01-29 14:14 UTC (permalink / raw) To: Lars-Dominik Braun; +Cc: 45712 Lars-Dominik Braun <lars@6xq.net> writes: [...] >>From 9bc53a8e9706440668ec70d88db1ebc7d5e2c71d Mon Sep 17 00:00:00 2001 > From: Lars-Dominik Braun <lars@6xq.net> > Date: Thu, 7 Jan 2021 13:27:55 +0100 > Subject: [PATCH 03/15] gnu: python-pytest-xdist: Add missing input, relax > pytest requirement. > > * gnu/packages/check.scm: (python-pytest-xdist) > [arguments]: Relax pytest version requirements. > [propagated-inputs]: Add python-pytest-forked. > --- > gnu/packages/check.scm | 25 ++++++++++++++++--------- > 1 file changed, 16 insertions(+), 9 deletions(-) > > diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm > index 9d1e0b8173..32a1a2d6a3 100644 > --- a/gnu/packages/check.scm > +++ b/gnu/packages/check.scm > @@ -1216,20 +1216,27 @@ same arguments.") > #t)))) > (build-system python-build-system) > (arguments > - '(#:tests? #f)) ;FIXME: Some tests are failing. > - ;; #:phases > - ;; (modify-phases %standard-phases > - ;; (delete 'check) > - ;; (add-after 'install 'check > - ;; (lambda* (#:key inputs outputs #:allow-other-keys) > - ;; (add-installed-pythonpath inputs outputs) > - ;; (zero? (system* "py.test" "-v"))))) > + '(#:tests? #f ; Lots of tests fail. > + #:phases > + (modify-phases %standard-phases > + (add-after 'unpack 'patch > + (lambda* (#:key inputs #:allow-other-keys) > + ;; Relax pytest requirement. > + (substitute* "setup.py" > + (("pytest>=6\\.0\\.0") "pytest")) I'm not sure what the above was caused by, but its' been fixed on core-updates (the version of pytest as per its metadata is reported correctly there). ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2021-02-08 15:31 UTC | newest] Thread overview: 17+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-01-07 13:26 [bug#45712] [PATCHES] Improve Python package quality Lars-Dominik Braun 2021-01-08 11:37 ` Hartmut Goebel 2021-01-08 12:19 ` Ricardo Wurmus 2021-01-12 9:37 ` Lars-Dominik Braun 2021-01-25 19:29 ` Maxim Cournoyer 2021-01-26 8:39 ` Lars-Dominik Braun 2021-01-28 15:40 ` Maxim Cournoyer 2021-01-28 16:18 ` Lars-Dominik Braun 2021-01-29 14:26 ` Maxim Cournoyer 2021-02-01 7:20 ` Lars-Dominik Braun 2021-02-01 17:02 ` bug#45712: " Maxim Cournoyer 2021-02-07 16:59 ` [bug#45712] " Hartmut Goebel 2021-02-08 8:02 ` Lars-Dominik Braun 2021-01-25 14:43 ` Maxim Cournoyer 2021-01-25 19:42 ` Lars-Dominik Braun 2021-01-25 14:48 ` Maxim Cournoyer 2021-01-29 14:14 ` Maxim Cournoyer
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/guix.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).