From: "pelzflorian (Florian Pelz)" <pelzflorian@pelzflorian.de>
To: Efraim Flashner <efraim@flashner.co.il>
Cc: guix-devel@gnu.org, pjotr2019@thebird.nl
Subject: Mailman packaging (was: Re: Python package naming: Dots vs hyphens)
Date: Wed, 6 Nov 2019 14:18:33 +0100 [thread overview]
Message-ID: <20191106131833.5a2p7glowry2dhpk@pelzflorian.localdomain> (raw)
In-Reply-To: <20191106071917.GJ14453@E5400>
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
next prev parent reply other threads:[~2019-11-06 13:18 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 ` pelzflorian (Florian Pelz) [this message]
2019-11-13 22:16 ` Mailman packaging (was: Re: Python package naming: Dots vs hyphens) 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)
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191106131833.5a2p7glowry2dhpk@pelzflorian.localdomain \
--to=pelzflorian@pelzflorian.de \
--cc=efraim@flashner.co.il \
--cc=guix-devel@gnu.org \
--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 external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.