summary refs log tree commit diff
path: root/gnu/packages/python-xyz.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/python-xyz.scm')
-rw-r--r--gnu/packages/python-xyz.scm1124
1 files changed, 683 insertions, 441 deletions
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index a596b00bbb..a1e7f609df 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -63,7 +63,7 @@
 ;;; Copyright © 2019, 2020 Alex Griffin <a@ajgrf.com>
 ;;; Copyright © 2019, 2020, 2021 Pierre Langlois <pierre.langlois@gmx.com>
 ;;; Copyright © 2019 Jacob MacDonald <jaccarmac@gmail.com>
-;;; Copyright © 2019, 2020 Giacomo Leidi <goodoldpaul@autistici.org>
+;;; Copyright © 2019, 2020, 2021 Giacomo Leidi <goodoldpaul@autistici.org>
 ;;; Copyright © 2019 Wiktor Żelazny <wzelazny@vurv.cz>
 ;;; Copyright © 2019, 2020, 2021 Tanguy Le Carrour <tanguy@bioneland.org>
 ;;; Copyright © 2019, 2021 Mădălin Ionel Patrașcu <madalinionel.patrascu@mdc-berlin.de>
@@ -111,6 +111,7 @@
 ;;; Copyright © 2021 Felix Gruber <felgru@posteo.net>
 ;;; Copyright © 2021 Sébastien Lerique <sl@eauchat.org>
 ;;; Copyright © 2021 Raphaël Mélotte <raphael.melotte@mind.be>
+;;; Copyright © 2021 ZmnSCPxj <ZmnSCPxj@protonmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -142,6 +143,7 @@
   #:use-module (gnu packages crypto)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages dbm)
+  #:use-module (gnu packages django)
   #:use-module (gnu packages djvu)
   #:use-module (gnu packages docker)
   #:use-module (gnu packages enchant)
@@ -536,6 +538,28 @@ It indexes documents and provides a search interface for retrieving documents
 that best match text queries.")
     (license license:expat)))
 
+(define-public python-mrkd
+  (package
+    (name "python-mrkd")
+    (version "0.2.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "mrkd" version))
+        (sha256
+          (base32 "1bvaqbna1ihb4y2mv9pmvqcq3r9j6lwbbii99dani8lxx4dqqvs5"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-jinja2" ,python-jinja2)
+       ("python-mistune" ,python-mistune)
+       ("python-pygments" ,python-pygments)))
+    (home-page "https://pypi.org/project/mrkd/")
+    (synopsis "Python Markdown implementation")
+    (description
+     "@code{mrkd} writes man pages using Markdown, and convert them to Roff or
+HTML")
+    (license license:bsd-3)))
+
 (define-public python-mkdocs
   (package
     (name "python-mkdocs")
@@ -2939,6 +2963,28 @@ existing ones.")
                    ;; Tests don't work with python2.
                    #:tests? #f)))))
 
+(define-public python-polling2
+  (package
+    (name "python-polling2")
+    (version "0.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "polling2" version))
+       (sha256
+        (base32 "0hp3238fv6k1qk43gv4jwnv1mwlkmx33akbj560b9nvsry1dmdwh"))))
+    (build-system python-build-system)
+    (arguments '(#:tests? #false)) ; no tests included
+    (native-inputs
+     `(("python-mock" ,python-mock)
+       ("python-pytest" ,python-pytest)
+       ("python-pytest-runner" ,python-pytest-runner)))
+    (home-page "https://github.com/ddmee/polling2")
+    (synopsis "Polling utility with many configurable options")
+    (description "Polling2 is a utility used to wait for a function to return
+a certain expected condition.")
+    (license license:expat)))
+
 (define-public python-poyo
   (package
     (name "python-poyo")
@@ -4062,14 +4108,14 @@ logging and tracing of the execution.")
 (define-public python-daemon
   (package
     (name "python-daemon")
-    (version "2.2.3")
+    (version "2.3.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "python-daemon" version))
        (sha256
         (base32
-         "09fcjdjzk9ywmpnrj62iyxqgcygzdafsz41qlrk2dknzbagcmzmg"))))
+         "1bxfn2bq56sd4w0nm9mqy8y0905m7fc8vmhnjxlrf49vcbqr7adx"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -4084,9 +4130,11 @@ logging and tracing of the execution.")
     (propagated-inputs
      `(("python-lockfile" ,python-lockfile)))
     (native-inputs
-     `(("python-unittest2" ,python-unittest2)
+     `(("python-coverage" ,python-coverage)
+       ("python-unittest2" ,python-unittest2)
        ("python-testtools" ,python-testtools)
        ("python-testscenarios" ,python-testscenarios)
+       ("python-twine" ,python-twine)
        ("python-mock" ,python-mock)
        ("python-docutils" ,python-docutils)))
     (home-page "https://pagure.io/python-daemon/")
@@ -4829,29 +4877,32 @@ which can produce feeds in RSS 2.0, RSS 0.91, and Atom formats.")
 (define-public python2-feedgenerator
   (package-with-python2 python-feedgenerator))
 
-(define-public python-jsonrpc-server
+(define-public python-lsp-jsonrpc
   (package
-    (name "python-jsonrpc-server")
-    (version "0.4.0")
+    (name "python-lsp-jsonrpc")
+    (version "1.0.0")
     (source
      (origin
        (method url-fetch)
-       (uri (pypi-uri "python-jsonrpc-server" version))
+       (uri (pypi-uri "python-lsp-jsonrpc" version))
        (sha256
         (base32
-         "1585ybn3djvx5r5zbxkzlhz2wb1d47y4wrfwaxdyq0gi87jl7ib2"))))
+         "1gb0fsamxndhplx25v8m0b3k7aknzy454fpa0qsqsqnv6c3igv3v"))))
     (build-system python-build-system)
-    (propagated-inputs
+    (native-inputs
      `(("python-mock" ,python-mock)
-       ("python-pytest" ,python-pytest)
-       ("python-ujson" ,python-ujson)))
-    (home-page
-     "https://github.com/palantir/python-jsonrpc-server")
+       ("python-pytest" ,python-pytest)))
+    (propagated-inputs
+     `(("python-ujson" ,python-ujson)))
+    (home-page "https://github.com/python-lsp/python-lsp-jsonrpc")
     (synopsis "JSON RPC 2.0 server library")
     (description
      "This package provides a JSON RPC 2.0 server library for Python.")
     (license license:expat)))
 
+(define-public python-jsonrpc-server
+  (deprecated-package "python-jsonrpc-server" python-lsp-jsonrpc))
+
 (define-public python-pydantic
   (package
     (name "python-pydantic")
@@ -4927,29 +4978,23 @@ errors when data is invalid.")
 Server (PLS).")
     (license license:expat)))
 
-(define-public python-language-server
+(define-public python-lsp-server
   (package
-    (name "python-language-server")
-    (version "0.36.2")
+    (name "python-lsp-server")
+    (version "1.3.1")
     (source
      (origin
        (method url-fetch)
-       (uri (pypi-uri "python-language-server" version))
+       (uri (pypi-uri "python-lsp-server" version))
        (sha256
         (base32
-         "1c0pnk2aibfhfaanrs0a5gkabkvz81gj20z7r0152b7fcx5ci14r"))))
+         "15075a5irjxh55wcdf25hllz9c42byxc4770cmwgb480k1dm8scq"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'relax-deps
-           (lambda _
-             (substitute* "setup.py" (("pycodestyle>=2.6.0,<2.7.0")
-                                      "pycodestyle"))
-             (substitute* "setup.py" (("pyflakes>=2.2.0,<2.3.0") "pyflakes"))
-             #t))
          (add-before 'check 'set-HOME
-           (lambda _ (setenv "HOME" "/tmp") #t))
+           (lambda _ (setenv "HOME" "/tmp")))
          (replace 'check
            (lambda _
              ;; Disable failing test.
@@ -4962,7 +5007,7 @@ Server (PLS).")
        ("python-flake8" ,python-flake8)
        ("python-future" ,python-future)
        ("python-jedi" ,python-jedi)
-       ("python-jsonrpc-server" ,python-jsonrpc-server)
+       ("python-lsp-jsonrpc" ,python-lsp-jsonrpc)
        ("python-pluggy" ,python-pluggy)
        ("python-pycodestyle" ,python-pycodestyle)
        ("python-pyflakes" ,python-pyflakes)
@@ -4983,12 +5028,15 @@ Server (PLS).")
     (home-page "https://github.com/palantir/python-language-server")
     (synopsis "Python implementation of the Language Server Protocol")
     (description
-     "The Python Language Server (pyls) is an implementation of the Python 3
-language specification for the Language Server Protocol (LSP).  This tool is
-used in text editing environments to provide a complete and integrated
-feature-set for programming Python effectively.")
+"The Python Language Server @command{pylsp} is an implementation of the
+Python 3 language specification for the Language Server Protocol (LSP).
+This tool is used in text editing environments to provide a complete
+and integrated feature-set for programming Python effectively.")
     (license license:expat)))
 
+(define-public python-language-server
+  (deprecated-package "python-language-server" python-lsp-server))
+
 (define-public python-pathspec
   (package
     (name "python-pathspec")
@@ -5959,19 +6007,31 @@ parse and apply unified diffs.  It has features such as:
 (define-public python-numpydoc
   (package
     (name "python-numpydoc")
-    (version "0.8.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "numpydoc" version))
        (sha256
         (base32
-         "1zazxg3m8j4fksv3f7v7vpf4bj9qb1vj3r326am0vdip141vzx31"))))
+         "13j4fvy2p7lc8sn00sxvs0jb19vicaznfgx4cphv9jgxgz5xcvy3"))))
     (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? inputs outputs #:allow-other-keys)
+             (when tests?
+               (add-installed-pythonpath inputs outputs)
+               (invoke "pytest" "-v" "numpydoc/tests"
+                       ;; TODO: unclear why these fail.
+                       "-k" "not test_MyClass and not test_my_function")))))))
     (propagated-inputs
      `(("python-sphinx" ,python-sphinx)))
     (native-inputs
-     `(("python-nose" ,python-nose)))
+     `(("python-matplotlib" ,python-matplotlib)
+       ("python-pytest" ,python-pytest)
+       ("python-pytest-cov" ,python-pytest-cov)))
     (home-page "https://pypi.org/project/numpydoc/")
     (synopsis
      "Numpy's Sphinx extensions")
@@ -5984,6 +6044,15 @@ parse and apply unified diffs.  It has features such as:
   (let ((base (package-with-python2
                (strip-python2-variant python-numpydoc))))
     (package/inherit base
+      ;; This is the last version to support Python 2
+      (version "0.9.1")
+      (source
+       (origin
+         (method url-fetch)
+         (uri (pypi-uri "numpydoc" version))
+         (sha256
+          (base32
+           "09x6l1a4dcvj7001bvcmcayg1nwqwhaxlwbp6kzj9qrk57lqx3z0"))))
       (propagated-inputs
        `(("python2-jinja2" ,python2-jinja2)
          ,@(package-propagated-inputs base))))))
@@ -7498,10 +7567,21 @@ PNG, PostScript, PDF, and SVG file output.")
 for the average programmer, and to popularize decorators usage giving examples
 of useful decorators, such as memoize, tracing, redirecting_stdout, locked,
 etc.  The core of this module is a decorator factory.")
-    (license license:expat)))
+    (license license:expat)
+    (properties `((python2-variant . ,(delay python2-decorator))))))
 
+;; Version 5 does not support Python 2
 (define-public python2-decorator
-  (package-with-python2 python-decorator))
+  (package
+    (inherit (package-with-python2
+              (strip-python2-variant python-decorator)))
+    (version "4.3.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "decorator" version))
+       (sha256
+        (base32 "0308djallnh00v112y5b7nadl657ysmkp6vc8xn51d6yzc9zm7n3"))))))
 
 (define-public python-drmaa
   (package
@@ -8555,8 +8635,7 @@ callback signature using a prototype function.")
              (substitute* "IPython/sphinxext/ipython_directive.py"
                ((".*import datetime") "")
                ((".*datetime.datetime.now\\(\\)") "")
-               (("%timeit") "# %timeit"))
-             #t))
+               (("%timeit") "# %timeit"))))
          ;; Tests can only be run after the library has been installed and not
          ;; within the source directory.
          (delete 'check)
@@ -8570,8 +8649,7 @@ callback signature using a prototype function.")
                    ;; We only test the core because one of the other tests
                    ;; tries to import ipykernel.
                    (invoke "python" "IPython/testing/iptest.py"
-                           "-v" "IPython/core/tests"))
-                 #t)))
+                           "-v" "IPython/core/tests")))))
          (add-before 'check 'fix-tests
            (lambda* (#:key inputs #:allow-other-keys)
              (substitute* "./IPython/utils/_process_posix.py"
@@ -8586,8 +8664,7 @@ callback signature using a prototype function.")
              (delete-file "IPython/core/tests/test_interactiveshell.py")
              ;; AttributeError: module 'matplotlib_inline' has no
              ;; attribute 'backend_inline'
-             (delete-file "IPython/core/tests/test_pylabtools.py")
-             #t)))))
+             (delete-file "IPython/core/tests/test_pylabtools.py"))))))
     (home-page "https://ipython.org")
     (synopsis "IPython is a tool for interactive computing in Python")
     (description
@@ -8794,7 +8871,7 @@ distance between two or more sequences by many algorithms.")
 (define-public python-urwidtrees
   (package
     (name "python-urwidtrees")
-    (version "1.0.2")
+    (version "1.0.3")
     (source
       (origin
         (method git-fetch)
@@ -8806,11 +8883,10 @@ distance between two or more sequences by many algorithms.")
         (file-name (git-file-name name version))
         (sha256
           (base32
-           "1n1kpidvkdnsqyb82vlvk78gmly96kh8351lqxn2pzgwwns6fml2"))))
+           "1y1vysx7jg0vbrarlsykhf7nmr8fc6k1fva1q3i98xq2m30s6r68"))))
     (build-system python-build-system)
     (arguments
-     '(#:use-setuptools? #f
-       #:tests? #f)) ; no tests
+     '(#:tests? #f)) ; no tests
     (propagated-inputs `(("python-urwid" ,python-urwid)))
     (home-page "https://github.com/pazz/urwidtrees")
     (synopsis "Tree widgets for urwid")
@@ -12484,37 +12560,6 @@ programmatically with command-line parsers like @code{getopt} and
 (define-public python2-docopt
   (package-with-python2 python-docopt))
 
-(define-public python-dotenv
-  (package
-    (name "python-dotenv")
-    (version "0.19.1")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (pypi-uri "python-dotenv" version))
-       (sha256
-        (base32 "1f64ni36j5khzhfn01z7f53kg5byrgflm4g6hck6d56lr1f1iy0l"))))
-    (build-system python-build-system)
-    (native-inputs
-     `(("python-ipython" ,python-ipython)
-       ("python-mock" ,python-mock)
-       ("python-pytest" ,python-pytest)
-       ("python-sh" ,python-sh)))
-    (propagated-inputs
-     `(("python-click" ,python-click)))
-    (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda* (#:key tests? #:allow-other-keys)
-             (when tests?
-               (invoke "pytest")))))))
-    (home-page "https://github.com/theskumar/python-dotenv")
-    (synopsis "Environment variables configuration tool")
-    (description "Python-dotenv reads key-value pairs from a .env file and can
-set them as environment variables.")
-    (license license:bsd-3)))
-
 (define-public python-pythondialog
   (package
     (name "python-pythondialog")
@@ -12787,13 +12832,13 @@ the construction of PyQt/PySide stylesheets.")
 (define-public python-click-threading
   (package
     (name "python-click-threading")
-    (version "0.4.4")
+    (version "0.5.0")
     (source (origin
              (method url-fetch)
              (uri (pypi-uri "click-threading" version))
              (sha256
               (base32
-               "1rsxc2fbkxlhwhlmxsdjzq3spn284l6rvjfcz9mbb17ibgdgmc5j"))))
+               "0f9lmxwcq0y9lb8w0whbni7gwy12gbv74h1igh85qn9aq0iydkxd"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-click" ,python-click)))
@@ -14440,6 +14485,53 @@ checking library.")
           ,python2-backport-ssl-match-hostname)
           ,@(package-propagated-inputs whoosh))))))
 
+(define-public python-codespell
+  (package
+    (name "python-codespell")
+    (version "2.1.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "codespell" version))
+        (sha256
+          (base32 "1r9y714cz8m894rxp7pyvicr1lw2iid24vz6fxbl5wzy8ibgxlqr"))))
+    (build-system python-build-system)
+    (inputs
+      `(("python-chardet" ,python-chardet)))
+    (native-inputs
+      `(("python-check-manifest" ,python-check-manifest)
+        ("python-flake8" ,python-flake8)
+        ("python-pytest" ,python-pytest)
+        ("python-pytest-cov" ,python-pytest-cov)
+        ("python-pytest-dependency" ,python-pytest-dependency)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key outputs tests? #:allow-other-keys)
+             (when tests?
+               ;; Make installed executable available for running the tests.
+               (setenv "PATH"
+                       (string-append (assoc-ref outputs "out") "/bin"
+                                      ":" (getenv "PATH")))
+               (invoke "pytest" "-vv")))))))
+    (home-page "https://github.com/codespell-project/codespell/")
+    (synopsis "Spellchecker for code")
+    (description "Codespell fixes common misspellings in text files.
+It's designed primarily for checking misspelled words in source code,
+but it can be used with other files as well.  It does not check for word
+membership in a complete dictionary, but instead looks for a set of
+common misspellings.  Therefore it should catch errors like \"adn\", but
+it will not catch \"adnasdfasdf\".  This also means it shouldn't
+generate false-positives when you use a niche term it doesn't know
+about.")
+    (license
+      (list
+        ; for codespell and codespell_lib
+        license:gpl2
+        ; for dictionary*.txt
+        license:cc-by-sa3.0))))
+
 (define-public python-pathlib
   (package
     (name "python-pathlib")
@@ -16255,80 +16347,47 @@ characters, mouse support, and auto suggestions.")
   (package-with-python2 python-prompt-toolkit-1))
 
 (define-public python-jedi
-  ;; The 0.18.0 release tests do not work with Python 3.9.6. Use a more
-  ;; recent commit.
-  (let ((commit "1d944943c311b2d71655432f8870d68b2cf7d44b")
-        (revision "1"))
-    (package
-      (name "python-jedi")
-      (version
-       (git-version "0.18.0" revision commit))
-      (source
-       (origin
-         (method git-fetch)
-         (uri (git-reference
-               (url "https://github.com/davidhalter/jedi")
-               (commit commit)))
-         (file-name (git-file-name name version))
-         (sha256
-          (base32
-           "052szkbv2pf9hy21any6zb4dhx3c5w1v6b9hn5grlc84zfm350vq"))))
-      (build-system python-build-system)
-      (arguments
-       `(#:phases
-         (modify-phases %standard-phases
-           (add-after 'unpack 'unpack-submodule-sources
-             (lambda* (#:key inputs #:allow-other-keys)
-               (copy-recursively (assoc-ref inputs "python-django-stubs")
-                                 "jedi/third_party/django-stubs")
-               (copy-recursively (assoc-ref inputs "python-typeshed")
-                                 "jedi/third_party/typeshed")
-               #t))
-           (replace 'check
-             (lambda* (#:key tests? #:allow-other-keys)
-               (when tests?
-                 (setenv "HOME" "/tmp")
-                 ;; Disable the pytest tests that fail with pytest 6.  See:
-                 ;; https://github.com/davidhalter/jedi/issues/1660.
-                 (invoke "pytest" "-vv" "-k"
-                         "not test_completion[pytest"))
-               #t)))))
-      (native-inputs
-       `(("python-pytest" ,python-pytest)
-         ("python-docopt" ,python-docopt)
-         ("python-django-stubs"
-          ,(origin
-             (method git-fetch)
-             (uri (git-reference
-                   (url "https://github.com/davidhalter/django-stubs")
-                   (commit "3d2534ea8d8300c4c9db8f18e300355d5fd5488b")))
-             (file-name "django-stubs-checkout")
-             (sha256
-              (base32 "1fpvn4lcqkd2q18z29rcnwakm649fccw2k6jik5d64j7p6xns08r"))))
-         ("python-typeshed"
-          ,(origin
-             (method git-fetch)
-             (uri (git-reference
-                   (url "https://github.com/davidhalter/typeshed")
-                   (commit "ae9d4f4b21bb5e1239816c301da7b1ea904b44c3")))
-             (file-name "typeshed-checkout")
-             (sha256
-              (base32 "02xdip4amj0a7z9xph2mj46x1k55bjxl8d0gkpy25575acyx1kjq"))))))
-      (propagated-inputs
-       `(("python-parso" ,python-parso)))
-      (home-page "https://github.com/davidhalter/jedi")
-      (synopsis "Autocompletion and static analysis library for Python")
-      (description
-       "Jedi is a static analysis tool for Python that can be used in Integrated
+  (package
+    (name "python-jedi")
+    (version "0.18.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/davidhalter/jedi")
+             (commit (string-append "v" version))
+             (recursive? #true)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "07drmi3ai49jw5n23ibkambcgijqcw073ihypjgxfnks5lv4yqy1"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (setenv "HOME" "/tmp")
+               (invoke "python" "-m" "pytest" "-vv"))
+             #t)))))
+    (native-inputs
+     `(("python-colorama" ,python-colorama)
+       ("python-docopt" ,python-docopt)
+       ("python-django" ,python-django-2.2)
+       ("python-pytest" ,python-pytest)))
+    (propagated-inputs
+     `(("python-parso" ,python-parso)))
+    (home-page "https://github.com/davidhalter/jedi")
+    (synopsis "Autocompletion and static analysis library for Python")
+    (description
+     "Jedi is a static analysis tool for Python that can be used in Integrated
 Development Environments (@dfn{IDE}s) and text editors.  It understands Python
 on a deeper level than many other static analysis frameworks for Python.
 
-Jedi understands docstrings and you can use Jedi autocompletion in your REPL as
-well.")
-      (license license:expat))))
-
-(define-public python2-jedi
-  (package-with-python2 python-jedi))
+Jedi understands docstrings and you can use Jedi autocompletion in your REPL
+as well.")
+    (license license:expat)))
 
 (define-public ptpython
   (package
@@ -16353,9 +16412,9 @@ well.")
     (synopsis "Python Read-Eval-Print-Loop with nice IDE-like features")
     (description
      "ptpython is a Python read-eval-print loop with IDE-like features.
-It supports syntax highlighting, multiline editing, autocompletion, mouse,
-color schemes, bracketed paste, Vi and Emacs keybindings, Chinese characters
-etc.")
+     It supports syntax highlighting, multiline editing, autocompletion, mouse,
+     color schemes, bracketed paste, Vi and Emacs keybindings, Chinese characters
+     etc.")
     (license license:bsd-3)
     (properties `((python2-variant . ,(delay ptpython-2))))))
 
@@ -16405,8 +16464,8 @@ etc.")
     (synopsis "Command-line interface for Python modules")
     (description
      "@code{entrypoint2} is an easy to use command-line interface for Python
-modules based on @code{argparse}.  It translates function signature and
-documentation to argparse configuration.")
+     modules based on @code{argparse}.  It translates function signature and
+     documentation to argparse configuration.")
     (license license:bsd-3)))
 
 (define-public python-pyvirtualdisplay
@@ -16472,8 +16531,8 @@ documentation to argparse configuration.")
      "Python controller library that allows applications to interact with Tor")
     (description
      "Stem is a Python controller library for Tor.  With it you can use Tor's
-control protocol to script against the Tor process and read descriptor data
-relays publish about themselves.")
+     control protocol to script against the Tor process and read descriptor data
+     relays publish about themselves.")
     (license license:lgpl3)))
 
 (define-public python-pyserial
@@ -16499,8 +16558,8 @@ relays publish about themselves.")
       "https://github.com/pyserial/pyserial")
     (synopsis "Python Serial Port Bindings")
     (description "@code{pyserial} provide serial port bindings for Python.  It
-supports different byte sizes, stop bits, parity and flow control with RTS/CTS
-and/or Xon/Xoff.  The port is accessed in RAW mode.")
+     supports different byte sizes, stop bits, parity and flow control with RTS/CTS
+     and/or Xon/Xoff.  The port is accessed in RAW mode.")
     (license license:bsd-3)))
 
 (define-public python2-pyserial
@@ -16521,7 +16580,7 @@ and/or Xon/Xoff.  The port is accessed in RAW mode.")
     (home-page "https://github.com/pyserial/pyserial-asyncio")
     (synopsis "Pyserial asynchronous I/O extension")
     (description "This package extends Pyserial with asynchronous I/O
-support.")
+     support.")
     (license license:bsd-3)))
 
 (define-public python-pymodbus
@@ -16576,24 +16635,24 @@ support.")
     (home-page "https://github.com/riptideio/pymodbus/")
     (synopsis "Modbus protocol stack in Python")
     (description "Pymodbus is a full Modbus protocol implementation using
-@code{asyncio}, @code{tornado} or @code{twisted} for its asynchronous
-communications core.  It includes the following @emph{client} features:
-@itemize
-@item full read/write protocol on discrete and register
-@item most of the extended protocol (diagnostic/file/pipe/setting/information)
-@item TCP, UDP, Serial ASCII, Serial RTU, and Serial Binary
-@item asynchronous and synchronous versions
-@item payload builder/decoder utilities
-@item pymodbus read eval print loop (REPL).
-@end itemize
-It also includes the following @emph{server} features:
-@itemize
-@item can function as a fully implemented Modbus server
-@item TCP, UDP, Serial ASCII, Serial RTU, and Serial Binary
-@item asynchronous and synchronous versions
-@item full server control context (device information, counters, etc)
-@item a number of backing contexts (database, redis, sqlite, a slave device).
-@end itemize")
+     @code{asyncio}, @code{tornado} or @code{twisted} for its asynchronous
+     communications core.  It includes the following @emph{client} features:
+     @itemize
+     @item full read/write protocol on discrete and register
+     @item most of the extended protocol (diagnostic/file/pipe/setting/information)
+     @item TCP, UDP, Serial ASCII, Serial RTU, and Serial Binary
+     @item asynchronous and synchronous versions
+     @item payload builder/decoder utilities
+     @item pymodbus read eval print loop (REPL).
+     @end itemize
+     It also includes the following @emph{server} features:
+     @itemize
+     @item can function as a fully implemented Modbus server
+     @item TCP, UDP, Serial ASCII, Serial RTU, and Serial Binary
+     @item asynchronous and synchronous versions
+     @item full server control context (device information, counters, etc)
+     @item a number of backing contexts (database, redis, sqlite, a slave device).
+     @end itemize")
     (license license:bsd-3)))
 
 (define-public python-kivy
@@ -16630,7 +16689,7 @@ It also includes the following @emph{server} features:
      "Multitouch application framework")
     (description
      "A software library for rapid development of
-hardware-accelerated multitouch applications.")
+     hardware-accelerated multitouch applications.")
     (license license:expat)))
 
 (define-public python2-kivy
@@ -16663,7 +16722,7 @@ hardware-accelerated multitouch applications.")
     (home-page "https://github.com/audreyr/binaryornot")
     (synopsis "Package to check if a file is binary or text")
     (description "Ultra-lightweight pure Python package to check if a file is
-binary or text.")
+     binary or text.")
     (license license:bsd-3)
     (properties `((python2-variant . ,(delay python2-binaryornot))))))
 
@@ -16700,7 +16759,7 @@ binary or text.")
     (home-page "https://github.com/ReFirmLabs/binwalk")
     (synopsis "Firmware analysis tool")
     (description "Binwalk is a tool for analyzing, reverse engineering, and
-extracting firmware images")
+     extracting firmware images")
     (license license:expat)))
 
 (define-public python-binwalk
@@ -16731,9 +16790,9 @@ extracting firmware images")
     (home-page "http://nltk.org/")
     (synopsis "Natural Language Toolkit")
     (description "It provides interfaces to over 50 corpora and lexical
-resources such as WordNet, along with a suite of text processing libraries
-for classification, tokenization, stemming, tagging, parsing, and semantic
-reasoning, wrappers for natural language processing libraries.")
+     resources such as WordNet, along with a suite of text processing libraries
+     for classification, tokenization, stemming, tagging, parsing, and semantic
+     reasoning, wrappers for natural language processing libraries.")
     (license license:asl2.0)))
 
 ;; Versions >=3.5 breaks backward-compatibility,
@@ -16795,7 +16854,7 @@ reasoning, wrappers for natural language processing libraries.")
     (synopsis "Python client for Consul")
     (description
      "Python client for @url{http://www.consul.io/,Consul}, a tool for service
-discovery, monitoring and configuration.")
+     discovery, monitoring and configuration.")
     (license license:expat)))
 
 (define-public python2-consul
@@ -16853,7 +16912,7 @@ discovery, monitoring and configuration.")
     (home-page "https://github.com/eea/odfpy")
     (synopsis "Python API and tools to manipulate OpenDocument files")
     (description "Collection of libraries and utility programs written in
-Python to manipulate OpenDocument 1.2 files.")
+     Python to manipulate OpenDocument 1.2 files.")
     (license
      ;; The software is mainly dual GPL2+ and ASL2.0, but includes a
      ;; number of files with other licenses.
@@ -16890,13 +16949,13 @@ Python to manipulate OpenDocument 1.2 files.")
     (synopsis "Natural sorting for python and shell")
     (description
      "Natsort lets you apply natural sorting on lists instead of
-lexicographical.  If you use the built-in @code{sorted} method in python
-on a list such as @code{[@code{a20}, @code{a9}, @code{a1}, @code{a4},
-@code{a10}]}, it would be returned as @code{[@code{a1}, @code{a10}, @code{a20},
-@code{a4}, @code{a9}]}.  Natsort provides a function @code{natsorted} that
-identifies numbers and sorts them separately from strings.  It can also sort
-version numbers, real numbers, mixed types and more, and comes with a shell
-command @command{natsort} that exposes this functionality in the command line.")
+     lexicographical.  If you use the built-in @code{sorted} method in python
+     on a list such as @code{[@code{a20}, @code{a9}, @code{a1}, @code{a4},
+                                   @code{a10}]}, it would be returned as @code{[@code{a1}, @code{a10}, @code{a20},
+                                   @code{a4}, @code{a9}]}.  Natsort provides a function @code{natsorted} that
+     identifies numbers and sorts them separately from strings.  It can also sort
+     version numbers, real numbers, mixed types and more, and comes with a shell
+     command @command{natsort} that exposes this functionality in the command line.")
     (license license:expat)))
 
 (define-public glances
@@ -16928,8 +16987,8 @@ command @command{natsort} that exposes this functionality in the command line.")
   (synopsis "Cross-platform curses-based monitoring tool")
   (description
     "Glances is a curses-based monitoring tool for a wide variety of platforms.
-Glances uses the PsUtil library to get information from your system.  It
-monitors CPU, load, memory, network bandwidth, disk I/O, disk use, and more.")
+     Glances uses the PsUtil library to get information from your system.  It
+     monitors CPU, load, memory, network bandwidth, disk I/O, disk use, and more.")
   (license license:lgpl3+)))
 
 (define-public python-graphql-core
@@ -16964,9 +17023,9 @@ monitors CPU, load, memory, network bandwidth, disk I/O, disk use, and more.")
     (synopsis "GraphQL implementation for Python")
     (description
      "GraphQL implementation for Python.  GraphQL is a data query language and
-runtime designed and used to request and deliver data to mobile and web apps.
-This library is a port of @url{https://github.com/graphql/graphql-js,graphql-js}
-to Python.")
+     runtime designed and used to request and deliver data to mobile and web apps.
+     This library is a port of @url{https://github.com/graphql/graphql-js,graphql-js}
+     to Python.")
     (license license:expat)))
 
 (define-public python-graphql-relay
@@ -16998,10 +17057,10 @@ to Python.")
     (synopsis "Relay implementation for Python")
     (description
      "This is a library to allow the easy creation of Relay-compliant servers
-using the GraphQL Python reference implementation of a GraphQL server.  It
-should be noted that the code is a exact port of the original
-@url{https://github.com/graphql/graphql-relay-js,graphql-relay js implementation}
-from Facebook.")
+     using the GraphQL Python reference implementation of a GraphQL server.  It
+     should be noted that the code is a exact port of the original
+     @url{https://github.com/graphql/graphql-relay-js,graphql-relay js implementation}
+     from Facebook.")
     (license license:expat)))
 
 (define-public python-graphene
@@ -17028,8 +17087,8 @@ from Facebook.")
     (synopsis "GraphQL Framework for Python")
     (description
      "Graphene is a Python library for building GraphQL schemas/types.
-A GraphQL schema describes your data model, and provides a GraphQL server
-with an associated set of resolve methods that know how to fetch data.")
+     A GraphQL schema describes your data model, and provides a GraphQL server
+     with an associated set of resolve methods that know how to fetch data.")
     (license license:expat)))
 
 (define-public python-random2
@@ -17050,13 +17109,13 @@ with an associated set of resolve methods that know how to fetch data.")
     (synopsis "Python 3 version of the Python 2 @code{random} module")
     (description
      "This package provides a Python 3 ported version of Python 2.7’s
-@code{random} module.  It has also been back-ported to work in Python 2.6.
+     @code{random} module.  It has also been back-ported to work in Python 2.6.
 
-In Python 3, the implementation of @code{randrange()} was changed, so that
-even with the same seed you get different sequences in Python 2 and 3.
+     In Python 3, the implementation of @code{randrange()} was changed, so that
+     even with the same seed you get different sequences in Python 2 and 3.
 
-This package closes that gap, allowing stable random number generation
-between the different Python versions.")
+     This package closes that gap, allowing stable random number generation
+     between the different Python versions.")
     (license license:psfl)))
 
 (define-public python2-random2
@@ -17079,8 +17138,8 @@ between the different Python versions.")
     (home-page "https://github.com/shibukawa/snowball_py")
     (synopsis "Snowball stemming library collection for Python")
     (description "This package provides 16 word stemmer algorithms generated
-from Snowball algorithms.  It includes the 15 original ones plus the Poerter
-English stemmer.")
+     from Snowball algorithms.  It includes the 15 original ones plus the Poerter
+     English stemmer.")
     (license license:bsd-3)))
 
 (define-public python2-snowballstemmer
@@ -17128,12 +17187,12 @@ English stemmer.")
     (synopsis
      "Setproctitle implementation for Python to customize the process title")
     (description "The library allows a process to change its title (as displayed
-by system tools such as ps and top).
+                                                                       by system tools such as ps and top).
 
-Changing the title is mostly useful in multi-process systems, for
-example when a master process is forked: changing the children's title
-allows identifying the task each process is busy with.  The technique
-is used by PostgreSQL and the OpenSSH Server for example.")
+     Changing the title is mostly useful in multi-process systems, for
+     example when a master process is forked: changing the children's title
+     allows identifying the task each process is busy with.  The technique
+     is used by PostgreSQL and the OpenSSH Server for example.")
     (license license:bsd-3)
     (properties `((python2-variant . ,(delay python2-setproctitle))))))
 
@@ -17175,9 +17234,9 @@ is used by PostgreSQL and the OpenSSH Server for example.")
     (synopsis "General purpose Python data validator")
     (description "It allows validation of arbitrary Python data structures.
 
-The schema format is based on the JSON Schema
-proposal (http://json-schema.org), so combined with json the library is also
-useful as a validator for JSON data.")
+     The schema format is based on the JSON Schema
+     proposal (http://json-schema.org), so combined with json the library is also
+     useful as a validator for JSON data.")
   (license license:expat)))
 
 (define-public python2-validictory
@@ -17200,9 +17259,9 @@ useful as a validator for JSON data.")
     (synopsis
      "Analyze binary and library file information")
     (description "This Python library provides interfaces for parsing and
-analyzing two binary and library file formats; the Executable and Linking
-Format (ELF), and debugging information in the Debugging With Attributed
-Record Format (DWARF).")
+     analyzing two binary and library file formats ; the Executable and Linking
+     Format (ELF), and debugging information in the Debugging With Attributed
+     Record Format (DWARF).")
     (license license:public-domain)))
 
 (define-public python-pyev
@@ -17253,7 +17312,7 @@ Record Format (DWARF).")
     (synopsis "Gets image size of files in various formats in Python")
     (description
       "This package allows determination of image size from
-PNG, JPEG, JPEG2000 and GIF files in pure Python.")
+     PNG, JPEG, JPEG2000 and GIF files in pure Python.")
     (license license:expat)))
 
 (define-public python2-imagesize
@@ -17306,10 +17365,10 @@ PNG, JPEG, JPEG2000 and GIF files in pure Python.")
     (home-page "https://github.com/kislyuk/argcomplete")
     (synopsis "Shell tab completion for Python argparse")
     (description "argcomplete provides extensible command line tab completion
-of arguments and options for Python scripts using @code{argparse}.  It's
-particularly useful for programs with many options or sub-parsers that can
-dynamically suggest completions; for example, when browsing resources over the
-network.")
+     of arguments and options for Python scripts using @code{argparse}.  It's
+     particularly useful for programs with many options or sub-parsers that can
+     dynamically suggest completions ; for example, when browsing resources over the
+     network.")
     (license license:asl2.0)
     (properties `((python2-variant . ,(delay python2-argcomplete))))))
 
@@ -17374,7 +17433,7 @@ network.")
     (home-page "http://opensource.perlig.de/rcssmin/")
     (synopsis "CSS Minifier")
     (description "The minifier is based on the semantics of the YUI compressor,
-which itself is based on the rule list by Isaac Schlueter.")
+     which itself is based on the rule list by Isaac Schlueter.")
     (license license:asl2.0)))
 
 (define-public python-rjsmin
@@ -17409,9 +17468,9 @@ which itself is based on the rule list by Isaac Schlueter.")
     (home-page "http://opensource.perlig.de/rjsmin/")
     (synopsis "Javascript Minifier")
     (description "@code{rJSmin} is a javascript minifier written in Python.  The
-minifier is based on the semantics of jsmin.c by Douglas Crockford.  The module
-is a re-implementation aiming for speed, so it can be used at runtime (rather
-than during a preprocessing step).")
+     minifier is based on the semantics of jsmin.c by Douglas Crockford.  The module
+     is a re-implementation aiming for speed, so it can be used at runtime (rather
+                                                                            than during a preprocessing step).")
     (license license:asl2.0)))
 
 (define-public python-xopen
@@ -17431,10 +17490,10 @@ than during a preprocessing step).")
     (home-page "https://github.com/marcelm/xopen/")
     (synopsis "Open compressed files transparently")
     (description "This module provides an @code{xopen} function that works like
-Python's built-in @code{open} function, but can also deal with compressed files.
-Supported compression formats are gzip, bzip2 and, xz, and are automatically
-recognized by their file extensions.  The focus is on being as efficient as
-possible on all supported Python versions.")
+     Python's built-in @code{open} function, but can also deal with compressed files.
+     Supported compression formats are gzip, bzip2 and, xz, and are automatically
+     recognized by their file extensions.  The focus is on being as efficient as
+     possible on all supported Python versions.")
     (license license:expat)))
 
 (define-public python2-xopen
@@ -17481,29 +17540,29 @@ possible on all supported Python versions.")
     (home-page "https://cheetahtemplate.org/")
     (synopsis "Template engine")
     (description "Cheetah is a text-based template engine and Python code
-generator.
-
-Cheetah can be used as a standalone templating utility or referenced as
-a library from other Python applications.  It has many potential uses,
-but web developers looking for a viable alternative to ASP, JSP, PHP and
-PSP are expected to be its principle user group.
-
-Features:
-@enumerate
-@item Generates HTML, SGML, XML, SQL, Postscript, form email, LaTeX, or any other
-   text-based format.
-@item Cleanly separates content, graphic design, and program code.
-@item Blends the power and flexibility of Python with a simple template language
-   that non-programmers can understand.
-@item Gives template writers full access to any Python data structure, module,
-   function, object, or method in their templates.
-@item Makes code reuse easy by providing an object-orientated interface to
-   templates that is accessible from Python code or other Cheetah templates.
-   One template can subclass another and selectively reimplement sections of it.
-@item Provides a simple, yet powerful, caching mechanism that can dramatically
-   improve the performance of a dynamic website.
-@item Compiles templates into optimized, yet readable, Python code.
-@end enumerate")
+     generator.
+
+     Cheetah can be used as a standalone templating utility or referenced as
+     a library from other Python applications.  It has many potential uses,
+     but web developers looking for a viable alternative to ASP, JSP, PHP and
+     PSP are expected to be its principle user group.
+
+     Features:
+     @enumerate
+     @item Generates HTML, SGML, XML, SQL, Postscript, form email, LaTeX, or any other
+     text-based format.
+     @item Cleanly separates content, graphic design, and program code.
+     @item Blends the power and flexibility of Python with a simple template language
+     that non-programmers can understand.
+     @item Gives template writers full access to any Python data structure, module,
+     function, object, or method in their templates.
+     @item Makes code reuse easy by providing an object-orientated interface to
+     templates that is accessible from Python code or other Cheetah templates.
+     One template can subclass another and selectively reimplement sections of it.
+     @item Provides a simple, yet powerful, caching mechanism that can dramatically
+     improve the performance of a dynamic website.
+     @item Compiles templates into optimized, yet readable, Python code.
+     @end enumerate")
     (license (license:x11-style "file://LICENSE"))))
 
 (define-public python2-cheetah
@@ -17550,7 +17609,7 @@ Features:
     (home-page "https://www.dulwich.io/")
     (synopsis "Git implementation in Python")
     (description "Dulwich is an implementation of the Git file formats and
-protocols written in pure Python.")
+     protocols written in pure Python.")
     ;; Can be used with either license.
     (license (list license:asl2.0 license:gpl2+))))
 
@@ -17577,13 +17636,13 @@ protocols written in pure Python.")
     (home-page "https://www.dlitz.net/software/python-pbkdf2/")
     (synopsis "Password-based key derivation")
     (description "This module implements the password-based key derivation
-function, PBKDF2, specified in RSA PKCS#5 v2.0.
+     function, PBKDF2, specified in RSA PKCS#5 v2.0.
 
-PKCS#5 v2.0 Password-Based Key Derivation is a key derivation function which
-is part of the RSA Public Key Cryptography Standards series.  The provided
-implementation takes a password or a passphrase and a salt value (and
-optionally a iteration count, a digest module, and a MAC module) and provides
-a file-like object from which an arbitrarily-sized key can be read.")
+     PKCS#5 v2.0 Password-Based Key Derivation is a key derivation function which
+     is part of the RSA Public Key Cryptography Standards series.  The provided
+     implementation takes a password or a passphrase and a salt value (and
+                                                                       optionally a iteration count, a digest module, and a MAC module) and provides
+     a file-like object from which an arbitrarily-sized key can be read.")
     (license license:expat)))
 
 (define-public python2-pbkdf2
@@ -17610,12 +17669,12 @@ a file-like object from which an arbitrarily-sized key can be read.")
     (home-page "https://github.com/lincolnloop/python-qrcode")
     (synopsis "QR Code image generator")
     (description "This package provides a pure Python QR Code generator
-module.  It uses the Python Imaging Library (PIL) to allow for the generation
-of QR Codes.
+     module.  It uses the Python Imaging Library (PIL) to allow for the generation
+     of QR Codes.
 
-In addition this package provides a command line tool to generate QR codes and
-either write these QR codes to a file or do the output as ascii art at the
-console.")
+     In addition this package provides a command line tool to generate QR codes and
+     either write these QR codes to a file or do the output as ascii art at the
+     console.")
     (license license:bsd-3)))
 
 (define-public python2-qrcode
@@ -17639,7 +17698,7 @@ console.")
     (synopsis "Convert RST to ANSI-decorated console output")
     (description
      "Python module dedicated to rendering RST (reStructuredText) documents
-to ansi-escaped strings suitable for display in a terminal.")
+     to ansi-escaped strings suitable for display in a terminal.")
     (license license:expat)))
 
 (define-public python-ansi2html
@@ -17663,7 +17722,7 @@ to ansi-escaped strings suitable for display in a terminal.")
     (synopsis "Convert ANSI-decorated console output to HTML")
     (description
      "@command{ansi2html} is a Python library and command line utility for
-converting text with ANSI color codes to HTML or LaTeX.")
+     converting text with ANSI color codes to HTML or LaTeX.")
     (license license:gpl3+)))
 
 (define-public python2-ansi2html
@@ -17687,10 +17746,10 @@ converting text with ANSI color codes to HTML or LaTeX.")
     (synopsis "Terminal framework API")
     (description
      "Easy ANSI is a terminal framework API to give you an easy way to use
-colors, cursor control movements, and line/box drawing.  It is not meant as a
-replacement to more full-featured frameworks (such as curses or urwid), but as
-a tool to quickly create nice-looking screens in your terminal window.  You
-can even create animations with the cursor controls.")
+     colors, cursor control movements, and line/box drawing.  It is not meant as a
+     replacement to more full-featured frameworks (such as curses or urwid), but as
+     a tool to quickly create nice-looking screens in your terminal window.  You
+     can even create animations with the cursor controls.")
     (license license:expat)))
 
 (define-public python-ddt
@@ -17713,8 +17772,8 @@ can even create animations with the cursor controls.")
     (synopsis "Data-Driven Tests")
     (description
      "Data-Driven Tests (@dfn{DDT}) allow you to multiply one test case by
-running it with different test data, and make it appear as multiple test
-cases.")
+     running it with different test data, and make it appear as multiple test
+     cases.")
     (license license:expat)))
 
 (define-public python-pycountry
@@ -17733,16 +17792,16 @@ cases.")
     (synopsis "ISO databases for languages, countries, currencies, etc.")
     (description
      "@code{pycountry} provides the ISO databases for the standards:
-@enumerate
-@item 639-3 (Languages)
-@item 3166 (Countries)
-@item 3166-3 (Deleted Countries)
-@item 3166-2 (Subdivisions of countries)
-@item 4217 (Currencies)
-@item 15924 (Scripts)
-@end enumerate
-It includes a copy from Debian’s pkg-isocodes and makes the data accessible
-through a Python API.")
+     @enumerate
+     @item 639-3 (Languages)
+     @item 3166 (Countries)
+     @item 3166-3 (Deleted Countries)
+     @item 3166-2 (Subdivisions of countries)
+     @item 4217 (Currencies)
+     @item 15924 (Scripts)
+     @end enumerate
+     It includes a copy from Debian’s pkg-isocodes and makes the data accessible
+     through a Python API.")
     (license license:lgpl2.1+)))
 
 (define-public python2-pycountry
@@ -17767,9 +17826,9 @@ through a Python API.")
     (synopsis "Bindings to picosat (a SAT solver)")
     (description
      "This package provides efficient Python bindings to @code{picosat} on
-the C level.  When importing pycosat, the @code{picosat} solver becomes part
-of the Python process itself.  @code{picosat} is a @dfn{Boolean Satisfiability
-Problem} (SAT) solver.")
+     the C level.  When importing pycosat, the @code{picosat} solver becomes part
+     of the Python process itself.  @code{picosat} is a @dfn{Boolean Satisfiability
+                                                                     Problem} (SAT) solver.")
     (license license:expat)))
 
 (define-public python2-pycosat
@@ -17800,13 +17859,13 @@ Problem} (SAT) solver.")
     (synopsis "Version of dict that keeps keys in insertion order")
     (description
      "This is an implementation of an ordered dictionary with @dfn{Key
-Insertion Order} (KIO: updates of values do not affect the position of the
-key), @dfn{Key Value Insertion Order} (KVIO, an existing key's position is
-removed and put at the back).  The standard library module @code{OrderedDict},
-implemented later, implements a subset of @code{ordereddict} functionality.
-Sorted dictionaries are also provided.  Currently only with @dfn{Key Sorted
-Order} (KSO, no sorting function can be specified, but a transform can be
-specified to apply on the key before comparison (e.g. @code{string.lower})).")
+                                                                     Insertion Order} (KIO: updates of values do not affect the position of the
+                                                                     key), @dfn{Key Value Insertion Order} (KVIO, an existing key's position is
+                                                                     removed and put at the back).  The standard library module @code{OrderedDict},
+     implemented later, implements a subset of @code{ordereddict} functionality.
+     Sorted dictionaries are also provided.  Currently only with @dfn{Key Sorted
+                                                                          Order} (KSO, no sorting function can be specified, but a transform can be
+                                                                          specified to apply on the key before comparison (e.g. @code{string.lower})).")
     (license license:expat)))
 
 (define-public python-pypeg2
@@ -17828,8 +17887,8 @@ specified to apply on the key before comparison (e.g. @code{string.lower})).")
     (home-page "https://fdik.org/pyPEG/")
     (synopsis "Parsing Expression Grammars in Python")
     (description "PyPEG is an intrinsic parser interpreter framework for
-Python.  It is based on Parsing Expression Grammars, PEG.  With pyPEG you can
-parse many formal languages.")
+     Python.  It is based on Parsing Expression Grammars, PEG.  With pyPEG you can
+     parse many formal languages.")
     (license license:gpl2)))
 
 (define-public python-incremental
@@ -17847,7 +17906,7 @@ parse many formal languages.")
     (home-page "https://github.com/hawkowl/incremental")
     (synopsis "Library for versioning Python projects")
     (description "Incremental is a small library that versions your Python
-projects.")
+     projects.")
     (license license:expat)))
 
 (define-public python2-incremental
@@ -17884,9 +17943,9 @@ projects.")
     (synopsis "Pythonic task execution")
     (description
      "Invoke is a Python task execution tool and library, drawing inspiration
-from various sources to arrive at a powerful and clean feature set.  It is
-evolved from the Fabric project, but focuses on local and abstract concerns
-instead of servers and network commands.")
+     from various sources to arrive at a powerful and clean feature set.  It is
+     evolved from the Fabric project, but focuses on local and abstract concerns
+     instead of servers and network commands.")
     (license license:bsd-3)))
 
 (define-public python2-invoke
@@ -17936,8 +17995,8 @@ instead of servers and network commands.")
     (home-page "https://github.com/glyph/Automat")
     (synopsis "Self-service finite-state machines")
     (description "Automat is a library for concise, idiomatic Python
-expression of finite-state automata (particularly deterministic finite-state
-transducers).")
+     expression of finite-state automata (particularly deterministic finite-state
+                                                       transducers).")
     (license license:expat)))
 
 (define-public python2-automat
@@ -17963,7 +18022,7 @@ transducers).")
     (home-page "https://github.com/miyakogi/m2r")
     (synopsis "Markdown to reStructuredText converter")
     (description "M2R converts a markdown file including reST markups to valid
-reST format.")
+     reST format.")
     (license license:expat)))
 
 (define-public python2-m2r
@@ -17983,8 +18042,8 @@ reST format.")
     (home-page "https://github.com/twisted/constantly")
     (synopsis "Symbolic constants in Python")
     (description "Constantly is a Python library that provides symbolic
-constant support.  It includes collections and constants with text, numeric,
-and bit flag values.")
+     constant support.  It includes collections and constants with text, numeric,
+     and bit flag values.")
     (license license:expat)))
 
 (define-public python2-constantly
@@ -18016,8 +18075,8 @@ and bit flag values.")
     (home-page "https://github.com/python-attrs/attrs/")
     (synopsis "Attributes without boilerplate")
     (description "@code{attrs} is a Python package with class decorators that
-ease the chores of implementing the most common attribute-related object
-protocols.")
+     ease the chores of implementing the most common attribute-related object
+     protocols.")
     (license license:expat)))
 
 (define-public python2-attrs
@@ -18059,8 +18118,8 @@ protocols.")
     (home-page "https://liw.fi/cliapp/")
     (synopsis "Python framework for command line programs")
     (description "@code{cliapp} is a Python framework for command line
-programs.  It contains the typical stuff such programs need to do, such
-as parsing the command line for options, and iterating over input files.")
+     programs.  It contains the typical stuff such programs need to do, such
+     as parsing the command line for options, and iterating over input files.")
     (license license:gpl2+)))
 
 (define-public python2-cliapp
@@ -18095,11 +18154,11 @@ as parsing the command line for options, and iterating over input files.")
            (lambda _ (invoke "make" "check"))))))
     (home-page "https://liw.fi/ttystatus/")
     (synopsis "Python library for showing progress reporting and
-status updates on terminals")
+     status updates on terminals")
     (description "@code{ttystatus} is a Python library for showing progress
-reporting and status updates on terminals, for command line programs.
-Output is automatically adapted to the width of the terminal: truncated
-if it does not fit, and resized if the terminal size changes.")
+     reporting and status updates on terminals, for command line programs.
+     Output is automatically adapted to the width of the terminal: truncated
+     if it does not fit, and resized if the terminal size changes.")
     (license license:gpl3+)))
 
 (define-public python2-ttystatus
@@ -18124,11 +18183,11 @@ if it does not fit, and resized if the terminal size changes.")
     (home-page "https://liw.fi/tracing/")
     (synopsis "Python debug logging helper")
     (description "@code{python2-tracing} is a python library for
-logging debug messages.  It provides a way to turn debugging messages
-on and off, based on the filename they occur in.  It is much faster
-than using @code{logging.Filter} to accomplish the same thing, which
-matters when code is run in production mode.  The actual logging still
-happens using the @code{logging} library.")
+     logging debug messages.  It provides a way to turn debugging messages
+     on and off, based on the filename they occur in.  It is much faster
+     than using @code{logging.Filter} to accomplish the same thing, which
+     matters when code is run in production mode.  The actual logging still
+     happens using the @code{logging} library.")
     (license license:gpl3+)))
 
 (define-public python-astroid
@@ -18153,16 +18212,16 @@ happens using the @code{logging} library.")
        ("python-pytest-runner" ,python-pytest-runner)))
     (home-page "https://github.com/PyCQA/astroid")
     (synopsis "Common base representation of python source code for pylint and
-other projects")
+     other projects")
     (description "@code{python-astroid} provides a common base representation
-of python source code for projects such as pychecker, pyreverse, pylint, etc.
-
-It provides a compatible representation which comes from the _ast module.  It
-rebuilds the tree generated by the builtin _ast module by recursively walking
-down the AST and building an extended ast.  The new node classes have
-additional methods and attributes for different usages.  They include some
-support for static inference and local name scopes.  Furthermore, astroid
-builds partial trees by inspecting living objects.")
+     of python source code for projects such as pychecker, pyreverse, pylint, etc.
+
+     It provides a compatible representation which comes from the _ast module.  It
+     rebuilds the tree generated by the builtin _ast module by recursively walking
+     down the AST and building an extended ast.  The new node classes have
+     additional methods and attributes for different usages.  They include some
+     support for static inference and local name scopes.  Furthermore, astroid
+     builds partial trees by inspecting living objects.")
     (license license:lgpl2.1+)
     (properties `((python2-variant . ,(delay python2-astroid))))))
 
@@ -18218,9 +18277,9 @@ builds partial trees by inspecting living objects.")
     (home-page "https://github.com/xlcnd/isbnlib")
     (synopsis "Python library to work with ISBN strings")
     (description "@code{python-isbnlib} is a (pure) python library that provides
-several useful methods and functions to validate, clean, transform, hyphenate and
-get metadata for ISBN strings.  Its origin was as the core of isbntools.  This short
-version, is suitable to be include as a dependency in other projects.")
+     several useful methods and functions to validate, clean, transform, hyphenate and
+     get metadata for ISBN strings.  Its origin was as the core of isbntools.  This short
+     version, is suitable to be include as a dependency in other projects.")
     (license license:lgpl3+)))
 
 (define-public python-isort
@@ -18299,9 +18358,9 @@ version, is suitable to be include as a dependency in other projects.")
     (home-page "https://github.com/PyCQA/isort")
     (synopsis "Python utility/library to sort python imports")
     (description "@code{python-isort} is a python utility/library to sort
-imports alphabetically, and automatically separated into sections.  It
-provides a command line utility, a python library and plugins for various
-editors.")
+     imports alphabetically, and automatically separated into sections.  It
+     provides a command line utility, a python library and plugins for various
+     editors.")
     (license license:expat)
     (properties `((python2-variant . ,(delay python2-isort))))))
 
@@ -18333,7 +18392,7 @@ editors.")
     (home-page "https://github.com/jaraco/backports.functools_lru_cache")
     (synopsis "Backport of functools.lru_cache from Python 3.3")
     (description "@code{python2-backports-functools-lru-cache} is a backport
-of @code{functools.lru_cache} from python 3.3.")
+     of @code{functools.lru_cache} from python 3.3.")
     (license license:expat)))
 
 (define-public python-configparser
@@ -18353,8 +18412,8 @@ of @code{functools.lru_cache} from python 3.3.")
     (home-page "https://github.com/jaraco/configparser/")
     (synopsis "Backport of configparser from python 3.5")
     (description "@code{python-configparser} is a backport of
-@code{configparser} from Python 3.5 so that it can be used directly
-in other versions.")
+     @code{configparser} from Python 3.5 so that it can be used directly
+     in other versions.")
     (license license:expat)))
 
 (define-public python2-configparser
@@ -18375,14 +18434,14 @@ in other versions.")
     (home-page "https://github.com/RonnyPfannschmidt/iniconfig")
     (synopsis "Simple INI-file parser")
     (description "The @code{iniconfig} package provides a small and simple
-INI-file parser module having a unique set of features; @code{iniconfig}
-@itemize
-@item maintains the order of sections and entries;
-@item supports multi-line values with or without line-continuations;
-@item supports \"#\" comments everywhere;
-@item raises errors with proper line-numbers;
-@item raises an error when two sections have the same name.
-@end itemize")
+     INI-file parser module having a unique set of features ; @code{iniconfig}
+     @itemize
+     @item maintains the order of sections and entries              ;
+     @item supports multi-line values with or without line-continuations ;
+     @item supports \"#\" comments everywhere                            ;
+     @item raises errors with proper line-numbers                        ;
+     @item raises an error when two sections have the same name.
+     @end itemize")
     (license license:expat)))
 
 (define-public python-mamba
@@ -18404,7 +18463,7 @@ INI-file parser module having a unique set of features; @code{iniconfig}
     (synopsis "Test runner for Python")
     (description
      "Mamba is a Behaviour-Driven Development tool for Python developers.
-Is heavily influenced from RSpec, Mocha, Jasmine or Ginkgo.")
+     Is heavily influenced from RSpec, Mocha, Jasmine or Ginkgo.")
     (license license:expat)))
 
 (define-public python-mando
@@ -18428,7 +18487,7 @@ Is heavily influenced from RSpec, Mocha, Jasmine or Ginkgo.")
      "Wrapper around argparse, allowing creation of complete CLI applications")
     (description
      "This package is a wrapper around argparse, allowing you to write complete CLI
-applications in seconds while maintaining all the flexibility.")
+     applications in seconds while maintaining all the flexibility.")
     (license license:expat)))
 
 (define-public python2-mando
@@ -18452,7 +18511,7 @@ applications in seconds while maintaining all the flexibility.")
     (synopsis "Python command-line parsing library")
     (description
      "This package is mostly for people who want to have @code{argparse} on
-older Pythons because it was not part of the standard library back then.")
+     older Pythons because it was not part of the standard library back then.")
     (license license:psfl)))
 
 (define-public python-mwclient
@@ -18511,7 +18570,7 @@ older Pythons because it was not part of the standard library back then.")
     (synopsis "Convenient utilities not included with the standard Python install")
     (description
       "Python Utils is a collection of small Python functions and classes which
-make common patterns shorter and easier.")
+     make common patterns shorter and easier.")
     (license license:bsd-2)))
 
 (define-public python-diff-match-patch
@@ -18529,7 +18588,7 @@ make common patterns shorter and easier.")
     (home-page "https://code.google.com/p/google-diff-match-patch")
     (synopsis "Synchronize plain text")
     (description "Diff Match and Patch libraries offer robust algorithms to
-perform the operations required for synchronizing plain text.")
+     perform the operations required for synchronizing plain text.")
     (license license:asl2.0)))
 
 (define-public python2-diff-match-patch
@@ -18573,13 +18632,13 @@ perform the operations required for synchronizing plain text.")
     (synopsis "Fast computation of Levenshtein distance and string similarity")
     (description
      "The Levenshtein Python C extension module contains functions for fast computation of
-@enumerate
-@item Levenshtein (edit) distance, and edit operations
-@item string similarity
-@item approximate median strings, and generally string averaging
-@item string sequence and set similarity
-@end enumerate
-It supports both normal and Unicode strings.")
+     @enumerate
+     @item Levenshtein (edit) distance, and edit operations
+     @item string similarity
+     @item approximate median strings, and generally string averaging
+     @item string sequence and set similarity
+     @end enumerate
+     It supports both normal and Unicode strings.")
     (license license:gpl2+)))
 
 (define-public python2-levenshtein
@@ -18605,12 +18664,12 @@ It supports both normal and Unicode strings.")
     (synopsis "Directory iteration function")
     (description
      "Directory iteration function like os.listdir(), except that instead of
-returning a list of bare filenames, it yields DirEntry objects that include
-file type and stat information along with the name.  Using scandir() increases
-the speed of os.walk() by 2-20 times (depending on the platform and file
-system) by avoiding unnecessary calls to os.stat() in most cases.
+     returning a list of bare filenames, it yields DirEntry objects that include
+     file type and stat information along with the name.  Using scandir() increases
+     the speed of os.walk() by 2-20 times (depending on the platform and file
+                                                     system) by avoiding unnecessary calls to os.stat() in most cases.
 
-This package is part of the Python standard library since version 3.5.")
+     This package is part of the Python standard library since version 3.5.")
     (license license:bsd-3)))
 
 (define-public python2-scandir
@@ -18633,10 +18692,10 @@ This package is part of the Python standard library since version 3.5.")
     (synopsis "Python implementations of various stemming algorithms")
     (description
      "Python implementations of the Porter, Porter2, Paice-Husk, and Lovins
-stemming algorithms for English.  These implementations are straightforward and
-efficient, unlike some Python versions of the same algorithms available on the
-Web.  This package is an extraction of the stemming code included in the Whoosh
-search engine.")
+     stemming algorithms for English.  These implementations are straightforward and
+     efficient, unlike some Python versions of the same algorithms available on the
+     Web.  This package is an extraction of the stemming code included in the Whoosh
+     search engine.")
     (license license:public-domain)))
 
 (define-public python-factory-boy
@@ -18660,12 +18719,12 @@ search engine.")
     (description
      "Factory_boy is a fixtures replacement based on thoughtbot’s factory_girl.
 
-As a fixtures replacement tool, it aims to replace static, hard to maintain
-fixtures with easy-to-use factories for complex object.
+     As a fixtures replacement tool, it aims to replace static, hard to maintain
+     fixtures with easy-to-use factories for complex object.
 
-Instead of building an exhaustive test setup with every possible combination
-of corner cases, factory_boy allows you to use objects customized for the
-current test, while only declaring the test-specific fields")
+     Instead of building an exhaustive test setup with every possible combination
+     of corner cases, factory_boy allows you to use objects customized for the
+     current test, while only declaring the test-specific fields")
     (license license:expat)))
 
 (define-public python-translate-toolkit
@@ -18702,7 +18761,7 @@ current test, while only declaring the test-specific fields")
     (synopsis "Tools and API for translation and localization engineering")
     (description
      "Tools and API for translation and localization engineering.  It contains
-several utilities, as well as an API for building localization tools.")
+     several utilities, as well as an API for building localization tools.")
     (license license:gpl2+)))
 
 ;; Required for virtaal, newer versions do not build with python2
@@ -18737,8 +18796,8 @@ several utilities, as well as an API for building localization tools.")
     (home-page "https://github.com/pypa/packaging")
     (synopsis "Core utilities for Python packages")
     (description "Packaging is a Python module for dealing with Python packages.
-It offers an interface for working with package versions, names, and dependency
-information.")
+     It offers an interface for working with package versions, names, and dependency
+     information.")
     ;; From 'LICENSE': This software is made available under the terms of
     ;; *either* of the licenses found in LICENSE.APACHE or LICENSE.BSD.
     ;; Contributions to this software is made under the terms of *both* these
@@ -18768,8 +18827,8 @@ information.")
     (home-page "https://relatorio.tryton.org/")
     (synopsis "Templating library able to output ODT and PDF files")
     (description "Relatorio is a templating library which provides a way to
-easily output ODT, ODS, PNG, SVG and several other kinds of files.  Support
-for more filetypes can be easily added by creating plugins for them.")
+     easily output ODT, ODS, PNG, SVG and several other kinds of files.  Support
+     for more filetypes can be easily added by creating plugins for them.")
     (license license:gpl3+)))
 
 (define-public python-radon
@@ -18806,13 +18865,13 @@ for more filetypes can be easily added by creating plugins for them.")
     (home-page "https://radon.readthedocs.org/")
     (synopsis "Code Metrics in Python")
     (description "Radon is a Python tool which computes various code metrics.
-Supported metrics are:
-@itemize @bullet
-@item raw metrics: SLOC, comment lines, blank lines, &c.
-@item Cyclomatic Complexity (i.e.  McCabe’s Complexity)
-@item Halstead metrics (all of them)
-@item the Maintainability Index (a Visual Studio metric)
-@end itemize")
+     Supported metrics are:
+     @itemize @bullet
+     @item raw metrics: SLOC, comment lines, blank lines, &c.
+     @item Cyclomatic Complexity (i.e.  McCabe’s Complexity)
+     @item Halstead metrics (all of them)
+     @item the Maintainability Index (a Visual Studio metric)
+     @end itemize")
     (properties `((python2-variant . ,(delay python2-radon))))
     (license license:expat)))
 
@@ -18845,7 +18904,7 @@ Supported metrics are:
     (synopsis "Automated testing library in python for python")
     (description
      "Sure is a python library that leverages a DSL for writing assertions.
-Sure is heavily inspired by @code{RSpec Expectations} and @code{should.js}.")
+     Sure is heavily inspired by @code{RSpec Expectations} and @code{should.js}.")
     (license license:gpl3+)))
 
 (define-public python2-sure
@@ -18872,7 +18931,7 @@ Sure is heavily inspired by @code{RSpec Expectations} and @code{should.js}.")
      "ANSI terminal tool for python, colored shell and other handy fancy features")
     (description
      "@code{Couleur} provides python programs a way to use the ANSI features in a unix
-terminal such as coloured output in the shell, overwriting output, indentation, etc.")
+     terminal such as coloured output in the shell, overwriting output, indentation, etc.")
     ;; README.md says ASL2.0, but all source code headers are LGPL3+.
     ;; https://github.com/gabrielfalcao/couleur/issues/11
     (license license:lgpl3+)))
@@ -18902,8 +18961,8 @@ terminal such as coloured output in the shell, overwriting output, indentation,
     (synopsis "Python binding for Hoedown")
     (description
      "@code{Misaka} is a CFFI-based binding for @code{Hoedown}, a fast markdown processing
-library written in C.  It features a fast HTML renderer and functionality to make custom
-renderers (e.g. man pages or LaTeX).")
+     library written in C.  It features a fast HTML renderer and functionality to make custom
+     renderers (e.g. man pages or LaTeX).")
     (license license:expat)))
 
 (define-public python2-misaka
@@ -18943,9 +19002,9 @@ renderers (e.g. man pages or LaTeX).")
     (synopsis "Markdown-based test runner for python")
     (description
      "@code{Steadymark} allows documentation to be written in github-flavoured
-markdown.  The documentation may contain snippets of code surrounded by python
-code blocks and @code{Steadymark} will find these snippets and run them, making
-sure that there are no old malfunctional examples in the documentation examples.")
+     markdown.  The documentation may contain snippets of code surrounded by python
+     code blocks and @code{Steadymark} will find these snippets and run them, making
+     sure that there are no old malfunctional examples in the documentation examples.")
     (license license:expat)))
 
 (define-public python-jsonpointer
@@ -18963,7 +19022,7 @@ sure that there are no old malfunctional examples in the documentation examples.
   (home-page "https://github.com/stefankoegl/python-json-pointer")
   (synopsis "Identify specific nodes in a JSON document")
   (description "@code{jsonpointer} allows you to access specific nodes
-by path in a JSON document (see RFC 6901).")
+     by path in a JSON document (see RFC 6901).")
   (license license:bsd-3)))
 
 (define-public python2-jsonpointer
@@ -18990,7 +19049,7 @@ by path in a JSON document (see RFC 6901).")
     (home-page "https://github.com/stefankoegl/python-json-patch")
     (synopsis "Applying JSON Patches in Python 2.6+ and 3.x")
     (description "@code{jsonpatch} is a library and program that allows
-applying JSON Patches according to RFC 6902.")
+     applying JSON Patches according to RFC 6902.")
     (license license:bsd-3)))
 
 (define-public python2-jsonpatch
@@ -19037,8 +19096,8 @@ applying JSON Patches according to RFC 6902.")
     (synopsis "Parse and validate URI references")
     (description
      "@code{rfc3986} is a Python implementation of RFC@tie{}3986 including
-validation and authority parsing.  This module also supports RFC@tie{}6874
-which adds support for zone identifiers to IPv6 addresses.")
+     validation and authority parsing.  This module also supports RFC@tie{}6874
+     which adds support for zone identifiers to IPv6 addresses.")
     (license license:asl2.0)))
 
 (define-public python2-rfc3986
@@ -19059,7 +19118,7 @@ which adds support for zone identifiers to IPv6 addresses.")
     (home-page "https://pypi.org/project/rfc3987/")
     (synopsis "Parsing and validation of URIs (RFC 3986) and IRIs (RFC 3987)")
     (description "@code{rfc3987} provides routines for parsing and
-validation of URIs (see RFC 3986) and IRIs (see RFC 3987).")
+     validation of URIs (see RFC 3986) and IRIs (see RFC 3987).")
     (license license:gpl3+)))
 
 (define-public python2-rfc3987
@@ -19097,8 +19156,8 @@ validation of URIs (see RFC 3986) and IRIs (see RFC 3987).")
       (synopsis "Python implementation of RFC 6555")
       (description
        "Python implementation of the Happy Eyeballs Algorithm described in RFC
-6555.  Provided with a single file and dead-simple API to allow easy vendoring
-and integration into other projects.")
+     6555.  Provided with a single file and dead-simple API to allow easy vendoring
+     and integration into other projects.")
       (license license:asl2.0))))
 
 (define-public python-bagit
@@ -19120,8 +19179,8 @@ and integration into other projects.")
     (home-page "https://libraryofcongress.github.io/bagit-python/")
     (synopsis "Create and validate BagIt packages")
     (description "Bagit is a Python library and command line utility for working
-with BagIt style packages.  BagIt is a minimalist packaging format for digital
-preservation.")
+     with BagIt style packages.  BagIt is a minimalist packaging format for digital
+     preservation.")
     (license license:cc0)))
 
 (define-public python-prov
@@ -19149,7 +19208,7 @@ preservation.")
      "W3C Provenance Data Model supporting PROV-JSON, PROV-XML and PROV-O (RDF)")
     (description
      "This package provides a library for W3C Provenance Data Model supporting
-PROV-O (RDF), PROV-XML, PROV-JSON import/export.")
+     PROV-O (RDF), PROV-XML, PROV-JSON import/export.")
     (license license:expat)))
 
 (define-public python-arcp
@@ -19171,17 +19230,17 @@ PROV-O (RDF), PROV-XML, PROV-JSON import/export.")
      "Archive and Package URI parser and generator")
     (description
      "@acronym{arcp, Archive and Package} provides functions for creating
-@code{arcp_} URIs, which can be used for identifying or parsing hypermedia files
-packaged in an archive or package, like a ZIP file.  arcp URIs can be used to
-consume or reference hypermedia resources bundled inside a file archive or an
-application package, as well as to resolve URIs for archive resources within a
-programmatic framework.  This URI scheme provides mechanisms to generate a
-unique base URI to represent the root of the archive, so that relative URI
-references in a bundled resource can be resolved within the archive without
-having to extract the archive content on the local file system.  An arcp URI can
-be used for purposes of isolation (e.g. when consuming multiple archives),
-security constraints (avoiding \"climb out\" from the archive), or for
-externally identiyfing sub-resources referenced by hypermedia formats.")
+     @code{arcp_} URIs, which can be used for identifying or parsing hypermedia files
+     packaged in an archive or package, like a ZIP file.  arcp URIs can be used to
+     consume or reference hypermedia resources bundled inside a file archive or an
+     application package, as well as to resolve URIs for archive resources within a
+     programmatic framework.  This URI scheme provides mechanisms to generate a
+     unique base URI to represent the root of the archive, so that relative URI
+     references in a bundled resource can be resolved within the archive without
+     having to extract the archive content on the local file system.  An arcp URI can
+     be used for purposes of isolation (e.g. when consuming multiple archives),
+     security constraints (avoiding \"climb out\" from the archive), or for
+     externally identiyfing sub-resources referenced by hypermedia formats.")
     (license license:asl2.0)))
 
 (define-public python-shellescape
@@ -19215,9 +19274,9 @@ externally identiyfing sub-resources referenced by hypermedia formats.")
      "Shell escape a string to safely use it as a token in a shell command")
     (description
      "The shellescape Python module defines the @code{shellescape.quote()}
-function that returns a shell-escaped version of a Python string.  This is a
-backport of the @code{shlex.quote()} function from Python 3.8 that makes it
-accessible to users of Python 3 versions < 3.3 and all Python 2.x versions.")
+     function that returns a shell-escaped version of a Python string.  This is a
+     backport of the @code{shlex.quote()} function from Python 3.8 that makes it
+     accessible to users of Python 3 versions < 3.3 and all Python 2.x versions.")
     (license license:expat)))
 
 (define-public python-validators
@@ -19247,9 +19306,9 @@ accessible to users of Python 3 versions < 3.3 and all Python 2.x versions.")
     (synopsis "Data validation library")
     (description
      "This package contains validators for different things such as email
-addresses, IP addresses, URLs, hashes and more.  It has been designed to
-be easy to use and not require defining a schema or form just to validate
-some input.")
+     addresses, IP addresses, URLs, hashes and more.  It has been designed to
+     be easy to use and not require defining a schema or form just to validate
+     some input.")
     (license license:expat)))
 
 (define-public python-validate-email
@@ -19267,7 +19326,7 @@ some input.")
     (home-page "https://github.com/syrusakbary/validate_email")
     (synopsis "Verifies if an email address is valid and really exists")
     (description "@code{validate_email} can be used to verify if an email
-address is valid and really exists.")
+     address is valid and really exists.")
     (license license:lgpl3+)))
 
 (define-public python2-validate-email
@@ -19322,9 +19381,9 @@ address is valid and really exists.")
        ("python-pytz" ,python-pytz)))
     (home-page "https://github.com/marshmallow-code/marshmallow")
     (synopsis "Convert complex datatypes to and from native
-Python datatypes")
+     Python datatypes")
     (description "@code{marshmallow} provides a library for converting
-complex datatypes to and from native Python datatypes.")
+     complex datatypes to and from native Python datatypes.")
     (license license:expat)))
 
 (define-public python-marshmallow-3.2
@@ -19364,8 +19423,8 @@ complex datatypes to and from native Python datatypes.")
     (synopsis "JSON:API 1.0 formatting with Marshmallow")
     (description
      "The marshmallow-jsonapi package provides a simple way to produce
-@uref{https://jsonapi.org, JSON:API}-compliant data in any Python Web framework.
-It includes optional utilities to integrate with Flask.")
+     @uref{https://jsonapi.org, JSON:API}-compliant data in any Python Web framework.
+     It includes optional utilities to integrate with Flask.")
     (license license:expat)))
 
 (define-public python-apispec
@@ -19397,8 +19456,8 @@ It includes optional utilities to integrate with Flask.")
     (home-page "https://github.com/marshmallow-code/apispec")
     (synopsis "Swagger/OpenAPI specification generator")
     (description "@code{python-apispec} is a pluggable API specification
-generator.  It currently supports the OpenAPI specification, formerly known
-as Swagger.")
+     generator.  It currently supports the OpenAPI specification, formerly known
+     as Swagger.")
     (license license:expat)))
 
 (define-public python-flasgger
@@ -19442,7 +19501,7 @@ as Swagger.")
     (home-page "https://github.com/rochacbruno/flasgger/")
     (synopsis "Extract Swagger specs from your Flask project")
     (description "@code{python-flasgger} allows extracting Swagger specs
-from your Flask project.  It is a fork of Flask-Swagger.")
+     from your Flask project.  It is a fork of Flask-Swagger.")
     (license license:expat)))
 
 (define-public python-swagger-spec-validator
@@ -19465,7 +19524,7 @@ from your Flask project.  It is a fork of Flask-Swagger.")
      "https://github.com/Yelp/swagger_spec_validator")
     (synopsis "Validation of Swagger specifications")
     (description "@code{swagger_spec_validator} provides a library for
-validating Swagger API specifications.")
+     validating Swagger API specifications.")
     (license license:asl2.0)))
 
 (define-public python-apache-libcloud
@@ -19494,7 +19553,7 @@ validating Swagger API specifications.")
              (substitute* "libcloud/test/compute/test_ssh_client.py"
                (("class ShellOutSSHClientTests")
                 "@unittest.skip(\"Guix container doesn't have ssh service\")
-class ShellOutSSHClientTests"))
+     class ShellOutSSHClientTests"))
              #t))
          (add-before 'check 'copy-secret
            (lambda _
@@ -19515,7 +19574,7 @@ class ShellOutSSHClientTests"))
     (home-page "https://libcloud.apache.org/")
     (synopsis "Unified Cloud API")
     (description "@code{libcloud} is a Python library for interacting with
-many of the popular cloud service providers using a unified API.")
+     many of the popular cloud service providers using a unified API.")
     (license license:asl2.0)))
 
 (define-public python-smmap
@@ -19534,7 +19593,7 @@ many of the popular cloud service providers using a unified API.")
     (home-page "https://github.com/Byron/smmap")
     (synopsis "Python sliding window memory map manager")
     (description "@code{smmap} is a pure Python implementation of a sliding
-window memory map manager.")
+     window memory map manager.")
     (license license:bsd-3)))
 
 (define-public python2-smmap
@@ -19558,13 +19617,13 @@ window memory map manager.")
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (add-installed-pythonpath inputs outputs)
              (invoke "python" "-c"
-                     "from regex.test_regex import test_main; test_main()"))))))
-    (home-page "https://bitbucket.org/mrabarnett/mrab-regex")
-    (synopsis "Alternative regular expression module")
-    (description "This regular expression implementation is backwards-
+                     "from regex.test_regex import test_main ; test_main()"))))))
+     (home-page "https://bitbucket.org/mrabarnett/mrab-regex")
+     (synopsis "Alternative regular expression module")
+     (description "This regular expression implementation is backwards-
 compatible with the standard @code{re} module, but offers additional
 functionality like full case-folding for case-insensitive matches in Unicode.")
-    (license license:psfl)))
+     (license license:psfl)))
 
 (define-public python2-regex
   (package-with-python2 python-regex))
@@ -25480,13 +25539,13 @@ dictionaries.")
 (define-public pyzo
   (package
     (name "pyzo")
-    (version "4.11.2")
+    (version "4.11.4")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "pyzo" version))
        (sha256
-        (base32 "1jk5f79lj09vnsdk9h01w21p9h49z2hhf8xhkx8471pjbg9vrlzr"))))
+        (base32 "18djnzx9wwlhxk0v2gcpmwnn3iw572n7gkdyh7ghh92yxck6qqkl"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -25494,8 +25553,7 @@ dictionaries.")
          (add-before 'check 'fix-home-directory
            (lambda _
              ;; Tests fail with "Permission denied: '/homeless-shelter'".
-             (setenv "HOME" "/tmp")
-             #t)))
+             (setenv "HOME" "/tmp"))))
        ;; Tests fail with "Uncaught Python exception: python: undefined
        ;; symbol: objc_getClass".
        #:tests? #f))
@@ -27566,6 +27624,53 @@ cons cells in Python.")
 systems in Python.")
     (license license:bsd-3)))
 
+(define-public python-dotenv
+  (package
+    (name "python-dotenv")
+    (version "0.19.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "python-dotenv" version))
+       (sha256
+        (base32 "0pv5ygpr6syc6zkw21in4ysqs3k7qaxk9m1g5pzlafwm3silkpm5"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? inputs outputs #:allow-other-keys)
+             (when tests?
+               (add-installed-pythonpath inputs outputs)
+               (setenv "PATH" (string-append (getenv "PATH") ":"
+                                             (assoc-ref outputs "out") "/bin"))
+               ;; Skip the ipython tests.
+               (delete-file "tests/test_ipython.py")
+               (invoke "python" "-m" "pytest")))))))
+    (propagated-inputs
+     `(("python-click" ,python-click)))
+    (native-inputs
+     `(("python-mock" ,python-mock)
+       ("python-pytest" ,python-pytest)
+       ("python-sh" ,python-sh)))
+    (home-page "https://github.com/theskumar/python-dotenv")
+    (synopsis "Setup environment variables according to .env files")
+    (description
+     "This package provides the @code{python-dotenv} Python module to read
+key-value pairs from a @code{.env} file and set them as environment variables.")
+    (license license:bsd-3)))
+
+(define-public python-dotenv-0.13.0
+  (package (inherit python-dotenv)
+    (name "python-dotenv")
+    (version "0.13.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "python-dotenv" version))
+       (sha256
+        (base32
+         "0x5dagmfn31phrbxlwacw3s4w5vibv8fxqc62nqcdvdhjsy0k69v"))))))
 
 (define-public date2name
   (let ((commit "6c8f37277e8ec82aa50f90b8921422be30c4e798")
@@ -28021,6 +28126,143 @@ simple mock/record and a complete capture/replay framework.")
 interfaces.")
     (license license:bsd-3)))
 
+(define-public python-orgparse
+  (package
+    (name "python-orgparse")
+    (version "0.3.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "orgparse" version))
+       (sha256
+        (base32 "14iv4pg3rma9560plg0w943x04mr2cmrssda43y2d1x9acrd2n71"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (invoke "pytest" "-vv" "orgparse/tests")))))))
+    (native-inputs
+     `(("python-pytest" ,python-pytest)
+       ("python-setuptools-scm" ,python-setuptools-scm)))
+    (home-page "https://github.com/karlicoss/orgparse")
+    (synopsis "Emacs Org mode parser in Python")
+    (description
+     "This package is a Python module for reading Emacs Org mode files.")
+    (license license:bsd-3)))
+
+(define-public dynaconf
+  (package
+    (name "dynaconf")
+    (version "3.1.7")
+    (source
+     (origin
+       (method git-fetch)
+       (uri
+        (git-reference
+         (url "https://github.com/rochacbruno/dynaconf")
+         (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0pjyjsdzairpn5vq8nzddhxwxmr18grn272nj31wcy2ipwdl3c3h"))
+       (patches (search-patches "dynaconf-unvendor-deps.patch"))
+       (modules '((guix build utils)))
+       (snippet '(begin
+                   ;; Remove vendored dependencies
+                   (let ((unvendor '("click" "dotenv" "ruamel" "toml")))
+                     (with-directory-excursion "dynaconf/vendor"
+                       (for-each delete-file-recursively unvendor))
+                     (with-directory-excursion "dynaconf/vendor_src"
+                       (for-each delete-file-recursively unvendor)))))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? outputs #:allow-other-keys)
+             (when tests?
+               (setenv "PATH"
+                       (string-append (assoc-ref outputs "out") "/bin:"
+                                      (getenv "PATH")))
+               ;; These tests depend on hvac and a live Vault process.
+               (delete-file "tests/test_vault.py")
+               (invoke "make" "test_only")))))))
+    (propagated-inputs
+     `(("python-click" ,python-click)
+       ("python-configobj" ,python-configobj)
+       ("python-dotenv" ,python-dotenv-0.13.0)
+       ("python-ruamel.yaml" ,python-ruamel.yaml)
+       ("python-toml" ,python-toml)))
+    (native-inputs
+     `(("python-django" ,python-django)
+       ("python-flask" ,python-flask)
+       ("python-pytest" ,python-pytest-6)
+       ("python-pytest-cov" ,python-pytest-cov)
+       ("python-pytest-mock" ,python-pytest-mock)))
+    (home-page "https://www.dynaconf.com/")
+    (synopsis "The dynamic configurator for your Python project")
+    (description
+     "This package provides @code{dynaconf} the dynamic configurator manager for
+your Python project.  It provides features such as:
+
+@itemize
+@item Inspired by the @url{https://12factor.net/config, 12-factor application guide};
+@item Settings management (default values, validation, parsing, templating);
+@item Protection of sensitive information (passwords/tokens);
+@item Multiple file formats @code{toml|yaml|json|ini|py} and also customizable
+loaders;
+@item Full support for environment variables to override existing settings
+(dotenv support included);
+@item Optional layered system for multiple environments @code{[default,
+development, testing, production]};
+@item Built-in support for Hashicorp Vault and Redis as settings and secrets storage;
+@item Built-in extensions for Django and Flask web frameworks;
+@item CLI for common operations such as @code{init, list, write, validate, export}.
+@end itemize")
+    (license license:expat)))
+
+(define-public pudb
+  (package
+    (name "pudb")
+    (version "2021.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "pudb" version))
+       (sha256
+        (base32 "0p16pvzfa3w02ybg3n0iy5rs23z4rz4a42lb8wh3mcq62y9ik2w7"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'fix-read-only-home
+           (lambda _
+             (setenv "HOME" "/tmp")))
+         (replace 'check
+           (lambda* (#:key inputs outputs tests? #:allow-other-keys)
+             (when tests?
+               (add-installed-pythonpath inputs outputs)
+               (invoke "pytest")))))))
+    (native-inputs
+     `(("python-numpy" ,python-numpy)
+       ("python-pytest" ,python-pytest)
+       ("python-pytest-mock" ,python-pytest-mock)))
+    (propagated-inputs
+     `(("python-jedi" ,python-jedi)
+       ("python-pygments" ,python-pygments)
+       ("python-urwid" ,python-urwid)
+       ("python-urwid-readline" ,python-urwid-readline)))
+    (home-page "https://documen.tician.de/pudb/")
+    (synopsis "Console-based Python debugger")
+    (description
+     "@command{pudb} is a full-screen, console-based Python debugger providing
+all the niceties of modern GUI-based debuggers in a more lightweight and
+keyboard-friendly package.")
+    (license license:expat)))
+
 (define-public python-iwlib
   (package
     (name "python-iwlib")