unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Python package naming: Dots vs hyphens
@ 2019-11-06  6:49 pelzflorian (Florian Pelz)
  2019-11-06  7:19 ` Efraim Flashner
  2019-11-10 10:57 ` Andreas Enge
  0 siblings, 2 replies; 15+ messages in thread
From: pelzflorian (Florian Pelz) @ 2019-11-06  6:49 UTC (permalink / raw)
  To: guix-devel

Shall I rename python-zope-* to python-zope.*?

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


However the zope ones have already been added since 2fc5f186801, but
with a hyphen instead of a dot.  Which one is correct?  Shall I rename
python-zope-* to python-zope.*?  Or shall I correct the pypi importer?
Ignore it?

Regards,
Florian

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Python package naming: Dots vs hyphens
  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)
                     ` (2 more replies)
  2019-11-10 10:57 ` Andreas Enge
  1 sibling, 3 replies; 15+ messages in thread
From: Efraim Flashner @ 2019-11-06  7:19 UTC (permalink / raw)
  To: pelzflorian (Florian Pelz); +Cc: guix-devel, pjotr2019

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

On Wed, Nov 06, 2019 at 07:49:56AM +0100, pelzflorian (Florian Pelz) wrote:
> Shall I rename python-zope-* to python-zope.*?
> 

For new packages I would use whatever upstream uses in regard to '-' vs
'.'. For existing ones, how many are there? It might be best to just
leave them as-is rather than go through the dance of deprecating the old
packages.

> 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

> 
> However the zope ones have already been added since 2fc5f186801, but
> with a hyphen instead of a dot.  Which one is correct?  Shall I rename
> python-zope-* to python-zope.*?  Or shall I correct the pypi importer?
> Ignore it?
> 

'guix package -A python-zope' lists them all as having a dash, I'd just
go ahead and make them all dashes.

-- 
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 --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Python package naming: Dots vs hyphens
  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-06 13:53   ` Python package naming: Dots vs hyphens Tobias Geerinckx-Rice
  2 siblings, 1 reply; 15+ messages in thread
From: pelzflorian (Florian Pelz) @ 2019-11-06 13:13 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: guix-devel, pjotr2019

I reply in two e-mails.

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:
> > Shall I rename python-zope-* to python-zope.*?
> > 
> 
> For new packages I would use whatever upstream uses in regard to '-' vs
> '.'. For existing ones, how many are there? It might be best to just
> leave them as-is rather than go through the dance of deprecating the old
> packages.
> 
> […]
> > 
> > However the zope ones have already been added since 2fc5f186801, but
> > with a hyphen instead of a dot.  Which one is correct?  Shall I rename
> > python-zope-* to python-zope.*?  Or shall I correct the pypi importer?
> > Ignore it?
> > 
> 
> 'guix package -A python-zope' lists them all as having a dash, I'd just
> go ahead and make them all dashes.
> 



I suppose the dance will eventually pay off.  I see you have
repackaged many zope packages and at least some existing zope packages
are out of date.


Regards,
Florian

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Mailman packaging (was: Re: Python package naming: Dots vs hyphens)
  2019-11-06  7:19 ` Efraim Flashner
  2019-11-06 13:13   ` pelzflorian (Florian Pelz)
@ 2019-11-06 13:18   ` pelzflorian (Florian Pelz)
  2019-11-13 22:16     ` pelzflorian (Florian Pelz)
  2019-11-18 10:13     ` Efraim Flashner
  2019-11-06 13:53   ` Python package naming: Dots vs hyphens Tobias Geerinckx-Rice
  2 siblings, 2 replies; 15+ messages in thread
From: pelzflorian (Florian Pelz) @ 2019-11-06 13:18 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: guix-devel, pjotr2019

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.


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:

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.


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.


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))
       #: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"
                                      "/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.


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.

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.


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.


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)



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 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>.


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.



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.

Regards,
Florian

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Python package naming: Dots vs hyphens
  2019-11-06  7:19 ` Efraim Flashner
  2019-11-06 13:13   ` pelzflorian (Florian Pelz)
  2019-11-06 13:18   ` Mailman packaging (was: Re: Python package naming: Dots vs hyphens) pelzflorian (Florian Pelz)
@ 2019-11-06 13:53   ` Tobias Geerinckx-Rice
  2 siblings, 0 replies; 15+ messages in thread
From: Tobias Geerinckx-Rice @ 2019-11-06 13:53 UTC (permalink / raw)
  To: guix-devel; +Cc: pelzflorian (Florian Pelz)

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

Florian,

Efraim Flashner 写道:
> For new packages I would use whatever upstream uses in regard to 
> '-' vs
> '.'. For existing ones, how many are there? It might be best to 
> just
> leave them as-is rather than go through the dance of deprecating 
> the old
> packages.

I agree with Efraim on both points.

Kind regards,

T G-R

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

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Python package naming: Dots vs hyphens
  2019-11-06 13:13   ` pelzflorian (Florian Pelz)
@ 2019-11-07  7:34     ` Efraim Flashner
  0 siblings, 0 replies; 15+ messages in thread
From: Efraim Flashner @ 2019-11-07  7:34 UTC (permalink / raw)
  To: pelzflorian (Florian Pelz); +Cc: guix-devel, pjotr2019

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

On Wed, Nov 06, 2019 at 02:13:36PM +0100, pelzflorian (Florian Pelz) wrote:
> I reply in two e-mails.
> 
> 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:
> > > Shall I rename python-zope-* to python-zope.*?
> > > 
> > 
> > For new packages I would use whatever upstream uses in regard to '-' vs
> > '.'. For existing ones, how many are there? It might be best to just
> > leave them as-is rather than go through the dance of deprecating the old
> > packages.
> > 
> > […]
> > > 
> > > However the zope ones have already been added since 2fc5f186801, but
> > > with a hyphen instead of a dot.  Which one is correct?  Shall I rename
> > > python-zope-* to python-zope.*?  Or shall I correct the pypi importer?
> > > Ignore it?
> > > 
> > 
> > 'guix package -A python-zope' lists them all as having a dash, I'd just
> > go ahead and make them all dashes.
> > 
> 
> 
> 
> I suppose the dance will eventually pay off.  I see you have
> repackaged many zope packages and at least some existing zope packages
> are out of date.
> 

Ooops, I didn't even notice that some of them were just repackaged.
python-zope-event is already at 4.4, I packaged 4.4 again as
python-zope.event. I'll have to go through and see about merging them.
In any event, an independent repackaging is at least a useful way to
see if the package could use any changes.

-- 
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 --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Python package naming: Dots vs hyphens
  2019-11-06  6:49 Python package naming: Dots vs hyphens pelzflorian (Florian Pelz)
  2019-11-06  7:19 ` Efraim Flashner
@ 2019-11-10 10:57 ` Andreas Enge
  2019-11-11  9:30   ` Efraim Flashner
  1 sibling, 1 reply; 15+ messages in thread
From: Andreas Enge @ 2019-11-10 10:57 UTC (permalink / raw)
  To: pelzflorian (Florian Pelz); +Cc: guix-devel

Hello,

On Wed, Nov 06, 2019 at 07:49:56AM +0100, pelzflorian (Florian Pelz) wrote:
> Shall I rename python-zope-* to python-zope.*?

the package naming guidelines say "replace underscores by hyphens".
I would extend this to say "replace punctuation marks by (one) hyphen".
Probably when we wrote the paragraph, the case had not presented
itself yet. Similar things are done at least in perl, where the "::"
of the module hierarchy is replaced by "-". Is this case analogous to
python?

Andreas

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Python package naming: Dots vs hyphens
  2019-11-10 10:57 ` Andreas Enge
@ 2019-11-11  9:30   ` Efraim Flashner
  2019-11-11 10:24     ` pelzflorian (Florian Pelz)
  0 siblings, 1 reply; 15+ messages in thread
From: Efraim Flashner @ 2019-11-11  9:30 UTC (permalink / raw)
  To: Andreas Enge; +Cc: guix-devel

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

On Sun, Nov 10, 2019 at 11:57:22AM +0100, Andreas Enge wrote:
> Hello,
> 
> On Wed, Nov 06, 2019 at 07:49:56AM +0100, pelzflorian (Florian Pelz) wrote:
> > Shall I rename python-zope-* to python-zope.*?
> 
> the package naming guidelines say "replace underscores by hyphens".
> I would extend this to say "replace punctuation marks by (one) hyphen".
> Probably when we wrote the paragraph, the case had not presented
> itself yet. Similar things are done at least in perl, where the "::"
> of the module hierarchy is replaced by "-". Is this case analogous to
> python?
> 

Not entirely, my understanding of Perl is that the double colon is part
of the namespacing of the language. In python the '.' is part of the
package name. I would also point out that for Go the '.' is effectively
part of the package name and we change them all to hyphens.

I think hyphens is the way to go here.


-- 
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 --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Python package naming: Dots vs hyphens
  2019-11-11  9:30   ` Efraim Flashner
@ 2019-11-11 10:24     ` pelzflorian (Florian Pelz)
  0 siblings, 0 replies; 15+ messages in thread
From: pelzflorian (Florian Pelz) @ 2019-11-11 10:24 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: guix-devel

On Mon, Nov 11, 2019 at 11:30:21AM +0200, Efraim Flashner wrote:
> I think hyphens is the way to go here.
> 

I search for [!#%&'()*,./:;?@_{}] in the output of

florian@florianmflorian@florianmacbook ~/git/guix-artwork/website$ GUILE_LOAD_PATH=.:$GUILE_LOAD_PATH guile -c '(write (map (@ (guix packages) package-name) ((@ (apps packages data) all-packages))))'

and see a few packages with periods, including but not limited to
python packages.

Perhaps a change to importers like this would be appropriate, would it
not?

diff --git a/guix/import/utils.scm b/guix/import/utils.scm
index 4694b6e7ef..6fecf929ec 100644
--- a/guix/import/utils.scm
+++ b/guix/import/utils.scm
@@ -205,9 +205,9 @@ to in the (guix licenses) module, or #f if there is no such known license."
   (assoc-ref licenses license))
 
 (define (snake-case str)
-  "Return a downcased version of the string STR where underscores are replaced
+  "Return a downcased version of the string STR where punctuation is replaced
 with dashes."
-  (string-join (string-split (string-downcase str) #\_) "-"))
+  (string-join (string-split (string-downcase str) char-set:punctuation) "-"))
 
 (define (beautify-description description)
   "Improve the package DESCRIPTION by turning a beginning sentence fragment




(Plus documentation in doc/guix.texi.)

Regards,
Florian

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: Mailman packaging (was: Re: Python package naming: Dots vs hyphens)
  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
  1 sibling, 0 replies; 15+ messages in thread
From: pelzflorian (Florian Pelz) @ 2019-11-13 22:16 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: guix-devel, pjotr2019

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

Hello Efraim!

I need the attached patch to be able to run `mailman start`, `mailman
info` etc.  I will continue to set up mailman on a server of mine and
then report back.

Regards,
Florian

[-- Attachment #2: 0001-gn-mailman-Patch-configuration-to-refer-to-the-right.patch --]
[-- Type: text/x-diff, Size: 2418 bytes --]

From 9945d2203362851fb24a829f2a27eead0273ffdc Mon Sep 17 00:00:00 2001
From: Florian Pelz <pelzflorian@pelzflorian.de>
Date: Sun, 10 Nov 2019 11:38:16 +0100
Subject: [PATCH] gn: mailman: Patch configuration to refer to the right
 binaries.

* gn/packages/mailman.scm (mailman): Patch schema.cfg.
---
 gn/packages/mailman.scm | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/gn/packages/mailman.scm b/gn/packages/mailman.scm
index 6fd6291..359fdf6 100644
--- a/gn/packages/mailman.scm
+++ b/gn/packages/mailman.scm
@@ -16,7 +16,8 @@
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages time)
-  #:use-module (gnu packages tls))
+  #:use-module (gnu packages tls)
+  #:use-module (gnu packages web-browsers))
 
 (define-public mailman
   (package
@@ -30,6 +31,32 @@
          (base32
           "1qph9i93ndahfxi3bb2sd0kjm2c0pkh844ai6zacfmvihl1k3pvy"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-config
+           (lambda* (#:key outputs inputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out"))
+                   (lynx (assoc-ref inputs "lynx")))
+               (substitute* "src/mailman/config/schema.cfg"
+                 (("bin_dir:.*") (string-append "bin_dir: " out  "/bin\n"))
+                 (("html_to_plain_text_command:.*")
+                  (string-append "html_to_plain_text_command:" lynx "/bin/lynx"
+                                 " -dump $filename\n")))
+               #t)))
+         (add-after 'wrap 'restore-helper-progs
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (bin (string-append out "/bin")))
+               ;; Mailman calls os.execle on these, which retains
+               ;; PYTHONPATH anyway and fails with wrappers.
+               (rename-file (string-append bin "/.master-real")
+                            (string-append bin "/master"))
+               (rename-file (string-append bin "/.runner-real")
+                            (string-append bin "/runner"))
+               #t))))))
+    (inputs
+     `(("lynx" ,lynx)))
     (propagated-inputs
      `(("python-aiosmtpd" ,python-aiosmtpd)
        ("python-alembic" ,python-alembic)
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: Mailman packaging (was: Re: Python package naming: Dots vs hyphens)
  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
  2019-11-18 13:14       ` pelzflorian (Florian Pelz)
                         ` (2 more replies)
  1 sibling, 3 replies; 15+ messages in thread
From: Efraim Flashner @ 2019-11-18 10:13 UTC (permalink / raw)
  To: pelzflorian (Florian Pelz); +Cc: guix-devel, pjotr2019

[-- 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 --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Mailman packaging (was: Re: Python package naming: Dots vs hyphens)
  2019-11-18 10:13     ` Efraim Flashner
@ 2019-11-18 13:14       ` pelzflorian (Florian Pelz)
  2019-11-20 16:36       ` Pjotr Prins
  2021-09-29 16:34       ` Christine Lemmer-Webber
  2 siblings, 0 replies; 15+ messages in thread
From: pelzflorian (Florian Pelz) @ 2019-11-18 13:14 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: guix-devel, pjotr2019

Thank you for your work and for looking at projects’ mailing lists
etc. :)  I still have not set up mailman on my server, but am still
going to work on it.  I agree everywhere except the non-free emails
and a typo in a description, see below.


On Mon, Nov 18, 2019 at 12:13:51PM +0200, Efraim Flashner wrote:
> On Wed, Nov 06, 2019 at 02:18:33PM +0100, pelzflorian (Florian Pelz) wrote:
> > 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
> 

OK.  It is good for finding the main mailman package, I agree.



> > 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/
> 

AFAIU non-free e-mails as test data are not a problem for the FSDG
anyway, but I am not convinced the authors listed in that Debian
copyright file have asked the e-mails’ authors for permission.  I
cannot decide if a comment like

> >     (license (list license:asl2.0 ;except for an emails used as test data
> >                                   ;which may be non-free

is necessary though.

Further below:

> > I have:
> > 
> > (define-public python-dkimpy
> >   […]
> >     (license
> >      license:zlib)));except for an email used as test data which may be non-free
> > 
> > Yours seems much better, except the license header.
> > 
> >

This is the same as the above test data issue.

I continue:



> > 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.
> 

Good. :)  You are missing a plural s in the last sentence now though:

    (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 object support lock-breaking
and have a maximum lifetime built-in.")





> > 
> > 
> > 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.
> 

You are right.  Changing this would require changes to many files.
Your importlib_resources package looks fine.


> > I have:
> > 
> > (define-public python-py3dns
> >   ...
> >     […]
> >     ;; 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

OK, I agree, such comments are superfluous.

> I think I intended to come back for the description later :)
> 

Regards,
Florian

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Mailman packaging (was: Re: Python package naming: Dots vs hyphens)
  2019-11-18 10:13     ` Efraim Flashner
  2019-11-18 13:14       ` pelzflorian (Florian Pelz)
@ 2019-11-20 16:36       ` Pjotr Prins
  2021-09-29 16:34       ` Christine Lemmer-Webber
  2 siblings, 0 replies; 15+ messages in thread
From: Pjotr Prins @ 2019-11-20 16:36 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: guix-devel

This is great. Finally we can consider hosting our own mail servers. I
have a few google groups that need love.

Pj.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Mailman packaging (was: Re: Python package naming: Dots vs hyphens)
  2019-11-18 10:13     ` Efraim Flashner
  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)
  2 siblings, 1 reply; 15+ messages in thread
From: Christine Lemmer-Webber @ 2021-09-29 16:34 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: guix-devel, pjotr2019

Efraim Flashner <efraim@flashner.co.il> writes:

> [[PGP Signed Part:Undecided]]
> 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.

(A couple of years later...)

Has anyone worked on this or used it in recent times?  The above link no
longer works.  However I see:

  https://gitlab.com/genenetwork/guix-bioinformatics/-/tree/wip-mailman

... which hasn't seen activity for about a year, but seems promising?


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Mailman packaging (was: Re: Python package naming: Dots vs hyphens)
  2021-09-29 16:34       ` Christine Lemmer-Webber
@ 2021-09-30  7:54         ` pelzflorian (Florian Pelz)
  0 siblings, 0 replies; 15+ messages in thread
From: pelzflorian (Florian Pelz) @ 2021-09-30  7:54 UTC (permalink / raw)
  To: Christine Lemmer-Webber; +Cc: guix-devel, pjotr2019

Hello Christine,

On Wed, Sep 29, 2021 at 12:34:06PM -0400, Christine Lemmer-Webber wrote:
> Has anyone worked on this or used it in recent times?

Sorry no, it was too much for me.

> The above link no
> longer works.  However I see:
> 
>   https://gitlab.com/genenetwork/guix-bioinformatics/-/tree/wip-mailman
> 
> ... which hasn't seen activity for about a year, but seems promising?

Note that Mailman-core is not enough, you will need hyperkitty and an
MTA and such things.

There are other Django services in Guix by now (Patchwork); perhaps it
will be similar, I have not tried.

Regards,
Florian


^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2021-09-30  7:55 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
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)

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).