unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Efraim Flashner <efraim@flashner.co.il>
To: "pelzflorian (Florian Pelz)" <pelzflorian@pelzflorian.de>
Cc: guix-devel@gnu.org, pjotr2019@thebird.nl
Subject: Re: Mailman packaging (was: Re: Python package naming: Dots vs hyphens)
Date: Mon, 18 Nov 2019 12:13:51 +0200	[thread overview]
Message-ID: <20191118101351.GH15074@E5400> (raw)
In-Reply-To: <20191106131833.5a2p7glowry2dhpk@pelzflorian.localdomain>

[-- Attachment #1: Type: text/plain, Size: 31661 bytes --]

On Wed, Nov 06, 2019 at 02:18:33PM +0100, pelzflorian (Florian Pelz) wrote:
> Long e-mail / review follows.  Feel free to disagree.
> 
> On Wed, Nov 06, 2019 at 09:19:17AM +0200, Efraim Flashner wrote:
> > On Wed, Nov 06, 2019 at 07:49:56AM +0100, pelzflorian (Florian Pelz) wrote:
> > > I am in the process of packaging mailman 3 which according to the pypi
> > > importer needs packages like
> > > 
> > > python-flufl.bounce
> > > python-flufl.i18n
> > > python-flufl.lock
> > > python-lazr.config
> > > python-lazr.delegates
> > > python-zope.component
> > > python-zope.configuration
> > > python-zope.configuration
> > > python-zope.event
> > > python-zope.interface
> > > 
> > 
> > I've actually last week started working on that. I've only done the
> > python part, haven't searched for any javascript or font-awesome which
> > I'm pretty sure I saw. I've also started working on a service for it
> > which I haven't committed yet, but it looks like it's going to be
> > complex.
> > 
> > https://gitlab.com/genenetwork/guix-bioinformatics/blob/master/gn/packages/mailman.scm
> > 
> 
> Wow.  That is good.  You have the better setup and have packaged more
> of the Mailman Suite so please continue with yours.  I too started
> last week.  I have only looked at the python part of mailman core
> myself.  Let me compare and complain about some of what I have done
> differently.  Some things are clearly better your way. ;)  You have
> come further.  I will watch your repo now and try and test other
> mailman things tomorrow.
> 
> 
> You have:
> 
> (define-public mailman
>   (package
>     ...
>     (description
>      "GNU Mailman is software for managing email discussion and mailing
> lists.  Both users and administrators generally perform their actions in a
> web interface, although email and command-line interfaces are also provided.
> The system features built-in archiving, automatic bounce processing, content
> filtering, digest delivery, and more.")
> 
> I have:
> 
>     (description "This is the core engine for the GNU Mailing List manager. It
> is part of the full GNU Mailman 3 suite.  Mailman is the GNU Mailing List
> Manager, a program that manages electronic mail discussion groups.")
> 
> Maybe your mailman description is more appropriate later for a service
> in doc/guix.texi instead of this package?  Feel free to disagree.
> 

I kept mine for now

> 
> You have:
> 
> (define-public python-aiosmtpd
>   ...
>     (arguments
>      '(#:phases
>        (modify-phases %standard-phases
>          (add-after 'unpack 'delete-failing-test
>            (lambda _
>              (delete-file "aiosmtpd/tests/test_smtps.py")
>              #t))
>          (replace 'check
>            (lambda _
>              (invoke "python" "-m" "nose2" "-v"))))))
> 
> I have:
> 
>     (arguments
>      `(#:phases
>        (modify-phases %standard-phases
>          (add-before 'check 'disable-failing-tests
>            (lambda _
>              (delete-file "aiosmtpd/tests/test_smtps.py")
>              #t))
>          (replace 'check
>            (lambda _
>              (invoke "python" "-m" "unittest" "discover" "-v")
>              #t)))))
> 
> I had not used nose2 nor flufl.testing for 'check, but I think it may
> be better to use them like you did because nose is in their
> documentation.  Mine “Ran 181 tests in 3.026s”, except one test sometimes fails nondeterministically:

Yeah, I got nose from them. Plus the tests ran without problems :)

> 
> ERROR: test_debug_0 (aiosmtpd.tests.test_main.TestMain)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
>   File "/tmp/guix-build-python-aiosmtpd-1.2.drv-0/aiosmtpd-1.2/aiosmtpd/tests/test_main.py", line 122, in test_debug_0
>     main(('-n',))
>   File "/tmp/guix-build-python-aiosmtpd-1.2.drv-0/aiosmtpd-1.2/aiosmtpd/main.py", line 140, in main
>     loop.create_server(factory, host=args.host, port=args.port))
>   File "/gnu/store/78w7y0lxar70j512iqw8x3nimzj10yga-python-3.7.4/lib/python3.7/asyncio/base_events.py", line 577, in run_until_complete
>     raise RuntimeError('Event loop stopped before Future completed.')
> RuntimeError: Event loop stopped before Future completed.
> 
> 
> But sometimes it succeeds.  I had not packaged flufl.testing.  Your
> package for flufl.testing looks good, including the license.
> 
> 
> You have:
> 
> (define-public python-aiosmtpd
>   ...
>   (license license:asl2.0)))
> 
> I have:
> 
>     (license (list license:asl2.0
>                    license:lgpl3)))) ;only for setup_helpers.py
> 
> 
> You have:
> 
> (define-public python-atpublic
>   ...
>     (arguments
>      '(#:phases
>        (modify-phases %standard-phases
>          (replace 'check
>            (lambda _
>              (invoke "python" "-m" "nose2" "-v"))))))
>     (native-inputs
>      `(("python-nose2" ,python-nose2)))
> 
> I have:
> 
>     (arguments
>      `(#:phases
>        (modify-phases %standard-phases
>          ;; Use faster C implementation instead of Python implementation.
>          (add-before 'build 'enable-c-implementation
>            (lambda _
>              (setenv "ATPUBLIC_BUILD_EXTENSION" "yes")
>              #t))x
>          (replace 'check
>            (lambda _
>              (invoke "python" "-m" "unittest" "discover" "-v")
>              #t)))))
> 
> I would prefer using ATPUBLIC_BUILD_EXTENSION.  I do not know about
> nose.
> 

ATPUBLIC_BUILD_EXTENSION added

> 
> You have:
> 
> (define-public python-atpublic
>   ...
>     (synopsis "Python library for populating __all__")
>     (description
>      "This is a very simple decorator and function which populates a modules
> @code{__all__} and optionally the module globals.  This provides both a
> pure-Python implementation and an optional C implementation.")
>     (license license:asl2.0)))
> 
> I have:
> 
>     (synopsis
>      "@code{@@public} decorator for populating @code{__all__}")
>     (description
>      "This Python module adds a @code{@@public} decorator and function which
> populates a module's @code{__all__} and optionally the module globals.  With
> it, the declaration of a name's public export semantics are not separated from
> the implementation of that name.")
>     (license (list license:asl2.0
>                    license:lgpl3)))) ;only for setup_helpers.py
> 
> I prefer mine.

same

> 
> 
> You have:
> 
> (define-public python-authheaders
>   (package
>     (name "python-authheaders")
>     (version "0.12.0")
>     (source
>       (origin
>         (method url-fetch)
>         (uri (pypi-uri "authheaders" version))
>         (sha256
>          (base32
>           "1ljcp8vk2n4xwk8p758b6q5sgdicyj4gxxpkmh33mx21jscn6q4i"))))
>     (build-system python-build-system)
>     (propagated-inputs
>      `(("python-authres" ,python-authres)
>        ("python-dkimpy" ,python-dkimpy)
>        ("python-dnspython" ,python-dnspython)
>        ("python-publicsuffix" ,python-publicsuffix)))
>     (home-page "https://github.com/ValiMail/authentication-headers")
>     (synopsis "Library wrapping email authentication header verification and generation")
>     (description
>      "A library wrapping email authentication header verification and generation.")
>     (license license:expat)))
> 
> I have:
> 
> (define-public python-authheaders
>   (package
>     (name "python-authheaders")
>     (version "0.12.0")
>     (source
>      (origin
>        (method url-fetch)
>        (uri (pypi-uri "authheaders" version))
>        (sha256
>         (base32
>          "1ljcp8vk2n4xwk8p758b6q5sgdicyj4gxxpkmh33mx21jscn6q4i"))
>        (snippet
>         '(begin
>            ;; Remove bundled public suffix list and its license.
>            (delete-file "authheaders/public_suffix_list.txt")
>            (delete-file "MPL-2.0")
>            #t))))
>     (build-system python-build-system)
>     (arguments
>      `(#:modules ((guix build python-build-system)
>                   (guix build utils)
>                   (ice-9 textual-ports))

These modules don't seem to be needed

>        #:phases
>        (modify-phases %standard-phases
>          (add-before 'build 'configure-public-suffix-list
>            ;; Use public suffix list from Guix package.
>            (lambda* (#:key inputs #:allow-other-keys)
>              (let ((publicsuffix (assoc-ref inputs "python-publicsuffix")))
>                (invoke "python" "setup.py" "psllocal"
>                        (string-append "--path=" publicsuffix "/lib/python3.7"

I replaced the '3.7' with '(python-version (assoc-ref inputs "python"))'

>                                       "/site-packages/publicsuffix"
>                                       "/public_suffix_list.dat"))
>                #t)))
>          (replace 'check
>            (lambda _
>              ;; Make it find the only test file.
>              (invoke "python" "-m" "unittest" "-v" "test"
>                      "authheaders/test/test_authentication.py")
>              #t)))))
>     (propagated-inputs
>      `(("python-authres" ,python-authres)
>        ("python-dkimpy" ,python-dkimpy)
>        ("python-dnspython" ,python-dnspython)
>        ("python-publicsuffix" ,python-publicsuffix)))
>     (home-page
>      "https://github.com/ValiMail/authentication-headers")
>     (synopsis
>      "Library wrapping email authentication header verification and generation")
>     (description
>      "This is a Python library for the generation of email authentication
> headers.  The library can perform DKIM, SPF, and DMARC validation, and the
> results are packaged into the Authentication-Results header.  The library can
> DKIM and ARC sign messages and output the corresponding signature headers.")
>     ;; The package's metadata claims it were MIT licensed, but the source file
>     ;; headers disagree.
>     (license (list license:zpl2.1 license:zlib))))
> 
> I mostly prefer my package.  I do not know if tests run for yours.  I
> like having a short description like you have, but I would prefer
> mentioning DKIM, SPF etc.
> 

I do like yours. Mine does "run the tests", but it doesn't actually find
any of the tests. I've taken your description and license

> 
> You have:
> 
> (define-public python-authres
>   ...
>     (synopsis "Authentication Results Header Module")
>     (description
>      "This package provides RFC 5451/7001/7601 Authentication-Results Headers
> generation and parsing for Python.")
>     (license license:asl2.0)))
> 
> I have:
> 
>     (arguments
>      `(#:phases
>        (modify-phases %standard-phases
>          (replace 'check
>            (lambda _
>              ;; Run doctests as described in README.
>              (invoke "python" "-m" "authres" "-v")
>              #t)))))
>     (home-page
>      "https://launchpad.net/authentication-results-python")
>     (synopsis
>      "Email Authentication Results Headers generation and parsing")
>     (description
>      "This module can be used to generate and parse RFC 5451/7001/7601 Authentication-Results headers.
> 
> It also supports Authentication Results extensions:
> 
> @itemize
> @item RFC 5617 DKIM/ADSP
> @item RFC 6008 DKIM signature identification (header.b)
> @item RFC 6212 Vouch By Reference (VBR)
> @item RFC 6577 Sender Policy Framework (SPF)
> @item RFC 7281 Authentication-Results Registration for S/MIME
> @item RFC 7293 The Require-Recipient-Valid-Since Header Field
> @item RFC 7489 Domain-based Message Authentication, Reporting, and Conformance (DMARC)
> @item Authenticated Recieved Chain (ARC) (draft-ietf-dmarc-arc-protocol-08)
> @end itemize
> 
> Note: RFC 7601 obsoletes RFC 5451, 6577, 7001, and 7410.  Authres supports the
> current standard.  No backward compatibility issues have been noted.")
>     (license license:asl2.0)))
> 
> I do not know if tests run for your package.  I prefer your
> description though.

I took your test suite and description.

> 
> You have:
> 
> (define-public python-flufl.bounce
>   ...
>   (description "The @code{flufl.bounce} library provides a set of heuristics
> and an API for detecting the original bouncing email addresses from a bounce
> message.  Many formats found in the wild are supported, as are VERP and
> RFC 3464.")
>     (license license:asl2.0)))
> 
> 
> I have the same package inputs etc., except:
> 
>     (synopsis "Email bounce detectors")
>     (description "The @dfn{flufl.bounce} library provides a set of heuristics
> and an API for detecting the original bouncing email addresses from a bounce
> message.  Many formats found in the wild are supported, as are VERP and RFC
> 3464 (DSN).")
>     (license (list license:asl2.0 ;except for an emails used as test data
>                                   ;which may be non-free
>                    license:lgpl3)))) ;only for setup_helpers.py
> 
> I prefer your description without DSN at the end, but I prefer my
> license list.
> 

According to Debian the test emails are OK
https://sources.debian.org/src/flufl.bounce/3.0-1/debian/copyright/

> 
> Our python-flufl.i18n are identical.
> 
> 
> You have:
> 
> (define-public python-flufl.lock
>   ...
>     (synopsis "NFS-safe file locking with timeouts for POSIX systems")
>     (description
>      "This package provides NFS-safe file locking with timeouts for POSIX systems.")
>     (license license:asl2.0)))
> 
> I have:
> 
>     (synopsis
>      "NFS-safe file locking with timeouts for POSIX systems.")
>     (description
>      "The @dfn{flufl.lock} package provides NFS-safe file locking with
> timeouts for POSIX systems.  It is similar to the @code{O_EXCL} option of the
> @code{open} system call but uses a lockfile.  Lock objects support
> lock-breaking so that you can’t wedge a process forever.  Locks have a
> lifetime, which is the maximum length of time the process expects to retain
> the lock.")
>     (license (list license:asl2.0
>                    license:lgpl3)))) ;only for setup_helpers.py
> 
> I think my description is too long and yours is too short.  I prefer
> my license list.

I took the first two sentences of yours and then combined the last two.

> 
> 
> You have:
> 
> (define-public python-gunicorn
>   ...
>     (arguments
>      '(#:phases
>        (modify-phases %standard-phases
>          (add-after 'unpack 'loosen-verion-restrictions
>            (lambda _
>              (substitute* "requirements_test.txt"
>                (("coverage.*") "coverage\n")
>                (("pytest.*") "pytest\n")
>                (("pytest-cov.*") "pytest-cov\n"))
>              #t)))))
>     (native-inputs
>      `(("python-coverage" ,python-coverage)
>        ("python-pytest" ,python-pytest)
>        ("python-pytest-cov" ,python-pytest-cov)))
>     (home-page "https://gunicorn.org")
>     (synopsis "WSGI HTTP Server for UNIX")
>     (description "Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for
> UNIX.  It's a pre-fork worker model ported from Ruby's Unicorn project.  The
> Gunicorn server is broadly compatible with various web frameworks, simply
> implemented, light on server resource usage, and fairly speedy.")
>     (license license:expat)))
> 
> I have:
> 
> (define-public python-gunicorn
>   ...
>     (arguments
>      `(#:phases
>        (modify-phases %standard-phases
>          (add-before 'check 'disable-failing-tests
>            (lambda _
>              ;; The test for deprecated gaiohttp fails, cf.
>              ;; https://github.com/benoitc/gunicorn/commit/97a45805f85830d1f80bf769f5787704daa635d3
>              (delete-file "tests/test_gaiohttp.py")
>              #t))
>          (replace 'check
>            (lambda _
>              (invoke "python" "-m" "unittest" "discover" "-v" "-s" "tests")
>              #t)))))
>     (native-inputs
>      `(("python-pytest" ,python-pytest)))
>     (home-page "http://gunicorn.org")
>     (synopsis "WSGI HTTP Server")
>     (description "Gunicorn @dfn{Green Unicorn} is a Python WSGI HTTP Server
> for UNIX.  It's a pre-fork worker model.  The Gunicorn server is broadly
> compatible with various web frameworks, simply implemented, light on server
> resources, and fairly speedy.")
>     (license
>      (list license:expat
>            ;; Some files have different licenses, cf. the NOTICE file in the
>            ;; sources.  These licenses are:
>            license:bsd-3
>            ;; License variants are the PSF and CWI License Agreements for
>            ;; Python:
>            license:psfl))))
> 
> The psfl license variants may not matter.  I wonder if your tests run
> correctly.  My package prints:
> 
> > starting phase `check'
> > test_close (test_selectors.DefaultSelectorTestCase) ... ok
> > test_context_manager (test_selectors.DefaultSelectorTestCase) ... ok
> > test_fileno (test_selectors.DefaultSelectorTestCase) ... ok
> > test_get_key (test_selectors.DefaultSelectorTestCase) ... ok
> > test_get_map (test_selectors.DefaultSelectorTestCase) ... ok
> > test_modify (test_selectors.DefaultSelectorTestCase) ... ok
> > test_register (test_selectors.DefaultSelectorTestCase) ... ok
> > test_select (test_selectors.DefaultSelectorTestCase) ... ok
> > test_select_interrupt (test_selectors.DefaultSelectorTestCase) ... ok
> > test_selector (test_selectors.DefaultSelectorTestCase) ... ok
> > test_timeout (test_selectors.DefaultSelectorTestCase) ... ok
> > test_unregister (test_selectors.DefaultSelectorTestCase) ... ok
> > test_unregister_after_fd_close (test_selectors.DefaultSelectorTestCase) ... ok
> > test_unregister_after_socket_close (test_selectors.DefaultSelectorTestCase) ... ok
> > test_above_fd_setsize (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_close (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_context_manager (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_fileno (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_get_key (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_get_map (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_modify (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_register (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_select (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_select_interrupt (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_selector (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_timeout (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_unregister (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_unregister_after_fd_close (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_unregister_after_socket_close (test_selectors.DevpollSelectorTestCase) ... skipped 'Test needs selectors.DevpollSelector'
> > test_above_fd_setsize (test_selectors.EpollSelectorTestCase) ... ok
> > test_close (test_selectors.EpollSelectorTestCase) ... ok
> > test_context_manager (test_selectors.EpollSelectorTestCase) ... ok
> > test_fileno (test_selectors.EpollSelectorTestCase) ... ok
> > test_get_key (test_selectors.EpollSelectorTestCase) ... ok
> > test_get_map (test_selectors.EpollSelectorTestCase) ... ok
> > test_modify (test_selectors.EpollSelectorTestCase) ... ok
> > test_register (test_selectors.EpollSelectorTestCase) ... ok
> > test_select (test_selectors.EpollSelectorTestCase) ... ok
> > test_select_interrupt (test_selectors.EpollSelectorTestCase) ... ok
> > test_selector (test_selectors.EpollSelectorTestCase) ... ok
> > test_timeout (test_selectors.EpollSelectorTestCase) ... ok
> > test_unregister (test_selectors.EpollSelectorTestCase) ... ok
> > test_unregister_after_fd_close (test_selectors.EpollSelectorTestCase) ... ok
> > test_unregister_after_socket_close (test_selectors.EpollSelectorTestCase) ... ok
> > test_above_fd_setsize (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_close (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_context_manager (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_fileno (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_get_key (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_get_map (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_modify (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_register (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_select (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_select_interrupt (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_selector (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_timeout (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_unregister (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_unregister_after_fd_close (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_unregister_after_socket_close (test_selectors.KqueueSelectorTestCase) ... skipped 'Test needs selectors.KqueueSelector)'
> > test_above_fd_setsize (test_selectors.PollSelectorTestCase) ... ok
> > test_close (test_selectors.PollSelectorTestCase) ... ok
> > test_context_manager (test_selectors.PollSelectorTestCase) ... ok
> > test_fileno (test_selectors.PollSelectorTestCase) ... ok
> > test_get_key (test_selectors.PollSelectorTestCase) ... ok
> > test_get_map (test_selectors.PollSelectorTestCase) ... ok
> > test_modify (test_selectors.PollSelectorTestCase) ... ok
> > test_register (test_selectors.PollSelectorTestCase) ... ok
> > test_select (test_selectors.PollSelectorTestCase) ... ok
> > test_select_interrupt (test_selectors.PollSelectorTestCase) ... ok
> > test_selector (test_selectors.PollSelectorTestCase) ... ok
> > test_timeout (test_selectors.PollSelectorTestCase) ... ok
> > test_unregister (test_selectors.PollSelectorTestCase) ... ok
> > test_unregister_after_fd_close (test_selectors.PollSelectorTestCase) ... ok
> > test_unregister_after_socket_close (test_selectors.PollSelectorTestCase) ... ok
> > test_close (test_selectors.SelectSelectorTestCase) ... ok
> > test_context_manager (test_selectors.SelectSelectorTestCase) ... ok
> > test_fileno (test_selectors.SelectSelectorTestCase) ... ok
> > test_get_key (test_selectors.SelectSelectorTestCase) ... ok
> > test_get_map (test_selectors.SelectSelectorTestCase) ... ok
> > test_modify (test_selectors.SelectSelectorTestCase) ... ok
> > test_register (test_selectors.SelectSelectorTestCase) ... ok
> > test_select (test_selectors.SelectSelectorTestCase) ... ok
> > test_select_interrupt (test_selectors.SelectSelectorTestCase) ... ok
> > test_selector (test_selectors.SelectSelectorTestCase) ... ok
> > test_timeout (test_selectors.SelectSelectorTestCase) ... ok
> > test_unregister (test_selectors.SelectSelectorTestCase) ... ok
> > test_unregister_after_fd_close (test_selectors.SelectSelectorTestCase) ... ok
> > test_unregister_after_socket_close (test_selectors.SelectSelectorTestCase) ... ok
> > 
> > ----------------------------------------------------------------------
> > Ran 88 tests in 12.463s
> > 
> > OK (skipped=30)

Mine seems to run more tests. Then gain there is a patch on the mailing
list now for gunicorn so it may be moot anyway.

> 
> 
> You have:
> 
> (define-public python-importlib-resources
>   ...
> 
> I have no such package because it is no longer needed, I think.  I
> have not packaged all dependencies yet so I cannot try building
> mailman.  You made a comment in your mailman package that
> importlib-resources is no longer needed.
> 

I tried to build mailman without it but it complained that it was
missing.

> 
> I have not yet written a lazr.config package that successfully runs
> its tests.  I do not know if tests run for you.  If not, I tried
> 
>     (arguments
>      `(#:phases
>        (modify-phases %standard-phases
>          (replace 'check
>            (lambda _
>              (invoke "python" "-m" "unittest" "discover" "-v" "-s" "src")
>              #t)))))
> 
> but apparently "-s" is wrong; I find <https://bugs.python.org/issue24247>.

I found the test command here:
https://sources.debian.org/src/lazr.config/2.2-2/tox.ini/#L7

> 
> 
> You have python-zope.component.  I don’t have own python-zope.*
> packages, but there is an outdated python-zope-component with a hyphen
> in python-web.scm.  I have not looked at your other python-zope-*
> packages.
> 
> 
> You have:
> 
> (define-public python-dkimpy
>   ...
>     (arguments
>      '(#:phases
>        (modify-phases %standard-phases
>          (add-after 'patch-source-shebangs 'patch-more-source
>            (lambda* (#:key inputs #:allow-other-keys)
>              (let ((openssl (assoc-ref inputs "openssl")))
>                (substitute* "dkim/dknewkey.py"
>                  (("/usr/bin/openssl") (string-append openssl "/bin/openssl"))))
>              #t))
>          (replace 'check
>            (lambda _
>              (invoke "python" "test.py"))))))
>     (propagated-inputs
>      `(("python-dnspython" ,python-dnspython)))
>     (native-inputs
>      `(("python-authres" ,python-authres)
>        ("python-pynacl" ,python-pynacl)))
>     (inputs
>      `(("openssl" ,openssl)))
>     (home-page "https://launchpad.net/dkimpy")
>     (synopsis "DKIM (DomainKeys Identified Mail)")
>     (description "Python module that implements @dfn{DKIM} (DomainKeys
> Identified Mail) email signing and verification (RFC6376).  It also provides
> helper scripts for command line signing and verification.  It supports DKIM
> signing/verifying of ed25519-sha256 signatures (RFC 8463).  It also supports
> the RFC 8617 Authenticated Received Chain (ARC) protocol.")
>     (license license:bsd-3)))
> 
> I have:
> 
> (define-public python-dkimpy
>   ...
>     (arguments
>      `(;; Tests would need /etc/resolv.conf.
>        #:tests? #f
>        #:phases
>        (modify-phases %standard-phases
>          (add-after 'unpack 'fix-setup-py
>            (lambda _
>              ;; We cannot import DNS because it would need /etc/resolv.conf.
>              (substitute* "setup.py"
>                (("import DNS") ""))
>              #t)))))
>     (propagated-inputs
>      `(("python-py3dns" ,python-py3dns)))
>     (native-inputs
>      `(("python-authres" ,python-authres)
>        ("python-pynacl" ,python-pynacl)))
>     (home-page "https://launchpad.net/dkimpy")
>     (synopsis "Implementation of DKIM (DomainKeys Identified Mail)")
>     (description "Python module that implements DKIM (@dfn{DomainKeys
> Identified Mail}) email signing and verification (RFC 6376).  It also provides
> helper scripts for command line signing and verification.  It supports DKIM
> signing/verifying of ed25519-sha256 signatures (RFC 8463).  It also supports
> the RFC 8617 Authenticated Received Chain (ARC) protocol.")
>     (license
>      license:zlib)));except for an email used as test data which may be non-free
> 
> Yours seems much better, except the license header.
> 
> 
> Your python-lazr.delegates is clearly better at running tests and mine
> has no advantages.
> 
> 
> You have:
> 
> (define-public python-py3dns
>   ...
>     (build-system python-build-system)
>     ;; This package wants to read /etc/resolv.conf. We can't patch it without
>     ;; removing functionality so we copy from Nix and "just don't build it".
>     (arguments
>      `(#:phases
>        (modify-phases %standard-phases
>          (add-after 'unpack 'patch-source
>            (lambda _
>              (substitute* "setup.py"
>                (("import DNS") "")
>                (("DNS.__version__") (string-append "\"" ,version "\"")))
>              #t)))
>        #:tests? #f)) ; Also skip the tests.
>     (home-page "https://launchpad.net/py3dns")
>     (synopsis "Python 3 DNS library")
>     (description "Python 3 DNS library")
>     (license license:psfl)))
> 
> I have:
> 
> (define-public python-py3dns
>   ...
>     (arguments
>      `(;; Tests would need /etc/resolv.conf.
>        #:tests? #f
>        #:phases
>        (modify-phases %standard-phases
>          (add-after 'unpack 'fix-setup-py
>            (lambda _
>              ;; We cannot import DNS because it would need /etc/resolv.conf.
>              (substitute* "setup.py"
>                (("import DNS") ""))
>              (substitute* "setup.py"
>                (("DNS.__version__") ,(string-append "'" version "'")))
>              #t))
>          (add-after 'install 'install-license
>            (lambda* (#:key outputs #:allow-other-keys)
>              (let* ((out (assoc-ref outputs "out"))
>                     (doc-dir (string-append out "/share/doc/python-py3dns")))
>                (mkdir-p doc-dir)
>                (copy-file "LICENSE"
>                           (string-append doc-dir "/LICENSE"))
>                #t))))))
>     (home-page "https://launchpad.net/py3dns")
>     (synopsis "Python 3 DNS library")
>     (description "This Python 3 module provides a DNS API for looking up DNS
> entries from within Python 3 modules and applications.  This module is a
> simple, lightweight implementation.")
>     ;; license variant is the CNRI License Agreement for Python:
>     (license license:psfl)))
> 
> Yours is better except the description and possibly license.

The license is already installed to %out/share/doc/name-version/LICENSE
I think I intended to come back for the description later :)

> 
> 
> Lastly, I have put the HTTP and DNS packages in the python-web.scm
> module and the rest in python-xyz.scm, except mailman itself which I
> put in mail.scm.  I do not know if that is right but I suppose you
> plan to do that too.
> 

I hadn't decided yet, I just put them all in the one file for now and I
figured I'd put them where they belong later.

> Regards,
> Florian

Thanks!

-- 
Efraim Flashner   <efraim@flashner.co.il>   אפרים פלשנר
GPG key = A28B F40C 3E55 1372 662D  14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  parent reply	other threads:[~2019-11-18 10:14 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-06  6:49 Python package naming: Dots vs hyphens pelzflorian (Florian Pelz)
2019-11-06  7:19 ` Efraim Flashner
2019-11-06 13:13   ` pelzflorian (Florian Pelz)
2019-11-07  7:34     ` Efraim Flashner
2019-11-06 13:18   ` Mailman packaging (was: Re: Python package naming: Dots vs hyphens) pelzflorian (Florian Pelz)
2019-11-13 22:16     ` pelzflorian (Florian Pelz)
2019-11-18 10:13     ` Efraim Flashner [this message]
2019-11-18 13:14       ` pelzflorian (Florian Pelz)
2019-11-20 16:36       ` Pjotr Prins
2021-09-29 16:34       ` Christine Lemmer-Webber
2021-09-30  7:54         ` pelzflorian (Florian Pelz)
2019-11-06 13:53   ` Python package naming: Dots vs hyphens Tobias Geerinckx-Rice
2019-11-10 10:57 ` Andreas Enge
2019-11-11  9:30   ` Efraim Flashner
2019-11-11 10:24     ` pelzflorian (Florian Pelz)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191118101351.GH15074@E5400 \
    --to=efraim@flashner.co.il \
    --cc=guix-devel@gnu.org \
    --cc=pelzflorian@pelzflorian.de \
    --cc=pjotr2019@thebird.nl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).