gnu: Add bst.
[jackhill/guix/guix.git] / gnu / packages / python-xyz.scm
index aca8a14..4541604 100644 (file)
@@ -29,7 +29,7 @@
 ;;; Copyright © 2016, 2017, 2018, 2019 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2016, 2017 Stefan Reichör <stefan@xsteve.at>
 ;;; Copyright © 2016 Dylan Jeffers <sapientech@sapientech@openmailbox.org>
-;;; Copyright © 2016, 2017 Alex Vong <alexvong1995@gmail.com>
+;;; Copyright © 2016, 2017, 2019 Alex Vong <alexvong1995@gmail.com>
 ;;; Copyright © 2016, 2017, 2018 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2016, 2017, 2018 Julien Lepiller <julien@lepiller.eu>
 ;;; Copyright © 2016, 2017, 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2019 Brett Gilio <brettg@posteo.net>
 ;;; Copyright © 2019 Sam <smbaines8@gmail.com>
 ;;; Copyright © 2019 Jack Hill <jackhill@jackhill.us>
+;;; Copyright © 2019 Guillaume Le Vaillant <glv@posteo.net>
+;;; Copyright © 2019 Alex Griffin <a@ajgrf.com>
+;;; Copyright © 2019 Pierre Langlois <pierre.langlois@gmx.com>
+;;; Copyright © 2019 Jacob MacDonald <jaccarmac@gmail.com>
+;;; Copyright © 2019 Giacomo Leidi <goodoldpaul@autistici.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -88,6 +93,7 @@
   #:use-module (gnu packages compression)
   #:use-module (gnu packages crypto)
   #:use-module (gnu packages databases)
+  #:use-module (gnu packages dbm)
   #:use-module (gnu packages file)
   #:use-module (gnu packages fontutils)
   #:use-module (gnu packages gcc)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-check)
+  #:use-module (gnu packages python-compression)
   #:use-module (gnu packages python-crypto)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages qt)
@@ -311,14 +318,14 @@ by @code{binstar}, @code{binstar-build} and @code{chalmers}.")
 (define-public python-babel
   (package
     (name "python-babel")
-    (version "2.6.0")
+    (version "2.7.0")
     (source
      (origin
       (method url-fetch)
       (uri (pypi-uri "Babel" version))
       (sha256
        (base32
-        "08rxmbx2s4irp0w0gmn498vns5xy0fagm0fg33xa772jiks51flc"))))
+        "0a7wawx8vsg7igvz6p3x909fskhg4b2y1910xk4f4c8y22p3aqg8"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-freezegun" ,python-freezegun)
@@ -343,6 +350,18 @@ etc. ")
 (define-public python2-babel
   (package-with-python2 python-babel))
 
+;; Sphinx < 2.0 requires this version.  Remove once no longer needed.
+(define-public python2-babel-2.6
+  (package
+    (inherit python2-babel)
+    (version "2.6.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "Babel" version))
+              (sha256
+               (base32
+                "08rxmbx2s4irp0w0gmn498vns5xy0fagm0fg33xa772jiks51flc"))))))
+
 (define-public python2-backport-ssl-match-hostname
   (package
     (name "python2-backport-ssl-match-hostname")
@@ -645,14 +664,14 @@ other machines, such as over the network.")
 (define-public python-setuptools
   (package
     (name "python-setuptools")
-    (version "40.0.0")
+    (version "41.0.1")
     (source
      (origin
       (method url-fetch)
       (uri (pypi-uri "setuptools" version ".zip"))
       (sha256
        (base32
-        "0pq116lr14gnc62v76nk0npkm6krb2mpp7p9ab369zgv4n7dnah1"))
+        "04sns22y2hhsrwfy1mha2lgslvpjsjsz8xws7h2rh5a7ylkd28m2"))
       (modules '((guix build utils)))
       (snippet
        '(begin
@@ -2063,13 +2082,13 @@ cutting and pasting that code over and over.")
 (define-public python-unidecode
   (package
     (name "python-unidecode")
-    (version "1.0.23")
+    (version "1.1.0")
     (source (origin
              (method url-fetch)
              (uri (pypi-uri "Unidecode" version))
              (sha256
               (base32
-               "1ysjbr3nqfqj97h8zyj3v9pya413vkv7a1mzml80w37xx15kb1cb"))))
+               "00pi0czzwvbf7djhkkjyvimj60wqdx0llbddzfnax650g9b8yscc"))))
     (build-system python-build-system)
     (home-page "https://pypi.python.org/pypi/Unidecode")
     (synopsis "ASCII transliterations of Unicode text")
@@ -2324,15 +2343,33 @@ e.g. filters, callbacks and errbacks can all be promises.")
 (define-public python-markupsafe
   (package
     (name "python-markupsafe")
-    (version "1.0")
+    (version "1.1.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "MarkupSafe" version))
        (sha256
         (base32
-         "0rdn1s8x9ni7ss8rfiacj7x1085lx8mh2zdwqslnw8xc3l4nkgm6"))))
+         "0sqipg4fk7xbixqd8kq6rlkxj664d157bdwbh93farcphf92x1r9"))))
     (build-system python-build-system)
+    (arguments
+     `(#:modules ((ice-9 ftw)
+                  (srfi srfi-1)
+                  (srfi srfi-26)
+                  (guix build utils)
+                  (guix build python-build-system))
+       #:phases (modify-phases %standard-phases
+                  (replace 'check
+                    (lambda _
+                      (let ((cwd (getcwd))
+                            (libdir (find (cut string-prefix? "lib." <>)
+                                          (scandir "build"))))
+                      (setenv "PYTHONPATH"
+                              (string-append cwd "/build/" libdir ":"
+                                             (getenv "PYTHONPATH")))
+                      (invoke "pytest" "-vv")))))))
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
     (home-page "https://github.com/mitsuhiko/markupsafe")
     (synopsis "XML/HTML/XHTML markup safe string implementation for Python")
     (description
@@ -2510,14 +2547,14 @@ reStructuredText.")
 (define-public python-pygments
   (package
     (name "python-pygments")
-    (version "2.4.0")
+    (version "2.4.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Pygments" version))
        (sha256
         (base32
-         "1xb5n3hvhk63kxypc03k7kfry20pny6gygi4bsl9kw1rnzzsdjri"))))
+         "15v2sqm5g12bqa0c7wikfh9ck2nl97ayizy1hpqhmws5gqalq748"))))
     (build-system python-build-system)
     (arguments
      ;; FIXME: Tests require sphinx, which depends on this.
@@ -2655,7 +2692,7 @@ ecosystem, but can naturally be used also by other projects.")
 (define-public python-robotframework
   (package
     (name "python-robotframework")
-    (version "3.1.1")
+    (version "3.1.2")
     ;; There are no tests in the PyPI archive.
     (source
      (origin
@@ -2665,8 +2702,7 @@ ecosystem, but can naturally be used also by other projects.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32
-         "1aaiamc9l35m5sf7xl2qc5q9308v7sz3p1qgzcslsjxzddphyn4v"))
+        (base32 "16gnxy0qinh8fhs0qvhff5z2xh49c3cqgm0d7bfjw120df6x7fym"))
        (patches (search-patches
                  "python-robotframework-honor-source-date-epoch.patch"))))
     (build-system python-build-system)
@@ -2948,38 +2984,44 @@ Language (TOML) configuration files.")
 Server (PLS).")
     (license license:expat)))
 
+;; XXX: We must use a non-release version since the latest release version
+;; requires python-jedi version < 0.15.
 (define-public python-language-server
-  (package
-    (name "python-language-server")
-    (version "0.26.1")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (pypi-uri "python-language-server" version))
-       (sha256
-        (base32
-         "1vs9ckfmm534n1hq3m871916wsjvi5h4gyj6wlzg13ck6506lx0s"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-pluggy" ,python-pluggy)
-       ("python-jsonrpc-server" ,python-jsonrpc-server)
-       ("python-jedi" ,python-jedi)
-       ("python-yapf" ,python-yapf)
-       ("python-pyflakes" ,python-pyflakes)
-       ("python-pydocstyle" ,python-pydocstyle)
-       ("python-pycodestyle" ,python-pycodestyle)
-       ("python-mccabe" ,python-mccabe)
-       ("python-rope" ,python-rope)
-       ("python-autopep8" ,python-autopep8)
-       ("python-pylint" ,python-pylint)))
-    (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
+  (let ((commit "c3cab77a85b1de4af1aec1bafea6a7320d6baec5")
+        (revision "1"))
+    (package
+      (name "python-language-server")
+      (version (git-version "0.28.3" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/palantir/python-language-server.git")
+               (commit commit)))
+         (sha256
+          (base32
+           "1q0xdwgln09sh58j0ryygj92hfgdhwcs57zjvqihya23jr5v0bz4"))))
+      (build-system python-build-system)
+      (propagated-inputs
+       `(("python-pluggy" ,python-pluggy)
+         ("python-jsonrpc-server" ,python-jsonrpc-server)
+         ("python-jedi" ,python-jedi)
+         ("python-yapf" ,python-yapf)
+         ("python-pyflakes" ,python-pyflakes)
+         ("python-pydocstyle" ,python-pydocstyle)
+         ("python-pycodestyle" ,python-pycodestyle)
+         ("python-mccabe" ,python-mccabe)
+         ("python-rope" ,python-rope)
+         ("python-autopep8" ,python-autopep8)
+         ("python-pylint" ,python-pylint)))
+      (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.")
-    (license license:expat)))
+      (license license:expat))))
 
 (define-public python-black
   (package
@@ -3087,20 +3129,27 @@ and is very extensible.")
 (define-public mallard-ducktype
   (package
     (name "mallard-ducktype")
-    (version "1.0.1")
+    (version "1.0.2")
     (source
      (origin
        (method git-fetch)
-       ;; git-reference because a proper source tarball is not available
-       ;; https://lists.gnu.org/archive/html/guix-devel/2019-05/msg00209.html
+       ;; git-reference because tests are not included in pypi source tarball
+       ;; https://issues.guix.gnu.org/issue/36755#2
        (uri (git-reference
              (url "https://github.com/projectmallard/mallard-ducktype.git")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0crland0kmpsyjfmnflcw7gaqy5b87b6ah17cmr9d5z1kyazf54n"))))
+         "1jk9bfz7g04ip78s03b0xak6d54rj4h9zpgadkziy1ji216g6y4c"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (with-directory-excursion "tests"
+               (invoke "sh" "runtests")))))))
     (home-page "http://projectmallard.org")
     (synopsis "Convert Ducktype to Mallard documentation markup")
     (description
@@ -3149,14 +3198,14 @@ provides additional functionality on the produced Mallard documents.")
 (define-public python-cython
   (package
     (name "python-cython")
-    (version "0.29.7")
+    (version "0.29.13")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Cython" version))
        (sha256
         (base32
-         "1s61hq2ikawxp6qvmkbfvvaxy9rqj67cddzwgcfc3dwi44b83l2m"))))
+         "13k37lrcgagwwnzr5bzririsscb793vndj234d475x1h9ad0d7f2"))))
     (build-system python-build-system)
     ;; we need the full python package and not just the python-wrapper
     ;; because we need libpython3.3m.so
@@ -3188,7 +3237,12 @@ provides additional functionality on the produced Mallard documents.")
 
          (replace 'check
            (lambda _
-             (invoke "python" "runtests.py" "-vv"))))))
+             ;; Disable compiler optimizations to greatly reduce the running
+             ;; time of the test suite.
+             (setenv "CFLAGS" "-O0")
+
+             (invoke "python" "runtests.py" "-vv"
+                     "-j" (number->string (parallel-job-count))))))))
     (home-page "https://cython.org/")
     (synopsis "C extensions for Python")
     (description "Cython is an optimising static compiler for both the Python
@@ -3453,12 +3507,11 @@ color scales, and color space conversion easy.  It has support for:
        ("pkg-config" ,pkg-config)
        ("python-sphinx" ,python-sphinx)
        ("python-numpydoc" ,python-numpydoc)
-       ("texlive" ,(texlive-union (list texlive-fonts-amsfonts
-                                        texlive-fonts-cm-super
+       ("texlive" ,(texlive-union (list texlive-fonts-cm-super
                                         texlive-fonts-ec
                                         texlive-generic-ifxetex
                                         texlive-generic-pdftex
-                                        texlive-latex-amsfonts
+                                        texlive-amsfonts
                                         texlive-latex-capt-of
                                         texlive-latex-cmap
                                         texlive-latex-environ
@@ -3561,13 +3614,13 @@ color scales, and color space conversion easy.  It has support for:
 (define-public python-pygit2
   (package
     (name "python-pygit2")
-    (version "0.28.0")
+    (version "0.28.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "pygit2" version))
        (sha256
-        (base32 "0lngsaz029d4fjcwhl17pr59nh9gwl6hwfin36nph60fgsmfdg3d"))))
+        (base32 "11kzj5mjkspvplnpdb6bj8dcj6rgmkk986k8hjcklyg5yaxkz32d"))))
     (build-system python-build-system)
     (arguments
      '(#:tests? #f))            ; tests don't run correctly in our environment
@@ -3753,14 +3806,14 @@ convert between colorspaces like sRGB, XYZ, CIEL*a*b*, CIECAM02, CAM02-UCS, etc.
 (define-public python-matplotlib
   (package
     (name "python-matplotlib")
-    (version "2.2.3")
+    (version "3.1.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "matplotlib" version))
        (sha256
         (base32
-         "1rcc7x9ig3hpchkc4cwdvym3y451w74275fxr455zkfagrsvymbk"))))
+         "14qc109dibp32xfd9lah54djc0rc76fhbsj9cwyb328lzqmd5sqz"))))
     (build-system python-build-system)
     (propagated-inputs ; the following packages are all needed at run time
      `(("python-cycler" ,python-cycler)
@@ -3774,22 +3827,11 @@ convert between colorspaces like sRGB, XYZ, CIEL*a*b*, CIECAM02, CAM02-UCS, etc.
        ("python-pillow" ,python-pillow)
        ("python-pytz" ,python-pytz)
        ("python-six" ,python-six)
-       ;; The 'gtk+' package (and 'gdk-pixbuf', 'atk' and 'pango' propagated
-       ;; from 'gtk+') provides the required 'typelib' files used by
-       ;; 'gobject-introspection'. The location of these files is set with the
-       ;; help of the environment variable GI_TYPELIB_PATH. At build time this
-       ;; is done automatically by a 'native-search-path' procedure. However,
-       ;; at run-time the user must set this variable as follows:
-       ;;
-       ;; export GI_TYPELIB_PATH=~/.guix-profile/lib/girepository-1.0
-       ("gtk+" ,gtk+)
        ;; From version 1.4.0 'matplotlib' makes use of 'cairocffi' instead of
        ;; 'pycairo'. However, 'pygobject' makes use of a 'pycairo' 'context'
        ;; object. For this reason we need to import both libraries.
-       ;; https://pythonhosted.org/cairocffi/cffi_api.html#converting-pycairo
+       ;; https://cairocffi.readthedocs.io/en/stable/cffi_api.html#converting-pycairo-wrappers-to-cairocffi
        ("python-pycairo" ,python-pycairo)
-       ;; XXX: qtwebkit cannot be built reliably.
-       ("python-pyqt" ,python-pyqt-without-qtwebkit)
        ("python-cairocffi" ,python-cairocffi)))
     (inputs
      `(("libpng" ,libpng)
@@ -3803,26 +3845,72 @@ convert between colorspaces like sRGB, XYZ, CIEL*a*b*, CIECAM02, CAM02-UCS, etc.
        ("tk" ,tk)))
     (native-inputs
      `(("pkg-config" ,pkg-config)
-       ("python-nose" ,python-nose)
-       ("python-mock" ,python-mock)))
+       ("python-pytest" ,python-pytest)
+       ("python-mock" ,python-mock)
+       ("unzip" ,unzip)
+       ("jquery-ui"
+        ,(origin
+           (method url-fetch)
+           (uri "https://jqueryui.com/resources/download/jquery-ui-1.12.1.zip")
+           (sha256
+            (base32
+             "0kb21xf38diqgxcdi1z3s9ssq36pldvyqxy56hn6pcva6rs3c8zq"))))))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
+         ;; XXX We disable all image comparison tests because we're using a
+         ;; newer version of FreeType than matplotlib expects.  This leads to
+         ;; minor differences throughout the tests.
+         (add-after 'unpack 'fix-and-disable-failing-tests
+           (lambda _
+             (substitute* (append (find-files "lib/matplotlib/tests/"
+                                              "test_.*\\.py$")
+                                  (find-files "lib/mpl_toolkits/tests"
+                                              "test_.*\\.py$"))
+               (("^from matplotlib" match)
+                (string-append "import pytest\n" match))
+               (("( *)@image_comparison" match indent)
+                (string-append indent
+                               "@pytest.mark.skip(reason=\"unknown minor image differences\")\n"
+                               match)))
+             (substitute* "lib/matplotlib/tests/test_animation.py"
+               (("/bin/sh") (which "sh")))
+             (for-each delete-file
+                       ;; test_normal_axes, test_get_tightbbox_polar
+                       '("lib/matplotlib/tests/test_axes.py"
+                         ;; test_outward_ticks
+                         "lib/matplotlib/tests/test_tightlayout.py"
+                         ;; Fontconfig returns no fonts.
+                         "lib/matplotlib/tests/test_font_manager.py"))
+             #t))
+         (add-before 'install 'install-jquery-ui
+           (lambda* (#:key outputs inputs #:allow-other-keys)
+             (let ((dir (string-append (assoc-ref outputs "out")
+                                       "/lib/python3.7/site-packages/matplotlib/backends/web_backend/")))
+               (mkdir-p dir)
+               (invoke "unzip"
+                       (assoc-ref inputs "jquery-ui")
+                       "-d" dir))
+             #t))
+         (delete 'check)
+         (add-after 'install 'check
+           (lambda* (#:key outputs inputs #:allow-other-keys)
+             (add-installed-pythonpath inputs outputs)
+             (invoke "python" "tests.py" "-v"
+                     "-m" "not network")))
          (add-before 'build 'configure-environment
            (lambda* (#:key outputs inputs #:allow-other-keys)
-             (let ((cairo (assoc-ref inputs "cairo"))
-                   (gtk+ (assoc-ref inputs "gtk+")))
-               ;; Setting these directories in the 'basedirlist' of 'setup.cfg'
+             (let ((cairo (assoc-ref inputs "cairo")))
+               ;; Setting this directory in the 'basedirlist' of 'setup.cfg'
                ;; has not effect.
-               (setenv "LD_LIBRARY_PATH"
-                       (string-append cairo "/lib:" gtk+ "/lib"))
+               (setenv "LD_LIBRARY_PATH" (string-append cairo "/lib"))
                (setenv "HOME" (getcwd))
                (call-with-output-file "setup.cfg"
                  (lambda (port)
                    (format port "[directories]~%
 basedirlist = ~a,~a~%
- [rc_options]~%
-backend = TkAgg~%"
+[packages]~%
+tests = True~%"
                         (assoc-ref inputs "tcl")
                         (assoc-ref inputs "tk")))))
              #t)))))
@@ -3841,6 +3929,14 @@ toolkits.")
   (let ((matplotlib (package-with-python2
                      (strip-python2-variant python-matplotlib))))
     (package (inherit matplotlib)
+      (version "2.2.3")
+      (source
+       (origin
+         (method url-fetch)
+         (uri (pypi-uri "matplotlib" version))
+         (sha256
+          (base32
+           "1rcc7x9ig3hpchkc4cwdvym3y451w74275fxr455zkfagrsvymbk"))))
       ;; Make sure to use special packages for Python 2 instead
       ;; of those automatically rewritten by package-with-python2.
       (propagated-inputs
@@ -3864,13 +3960,14 @@ toolkits.")
      `(("python-matplotlib" ,python-matplotlib)
        ("python-colorspacious" ,python-colorspacious)
        ("python-sphinx" ,python-sphinx)
+       ("python-sphinx-copybutton" ,python-sphinx-copybutton)
        ("python-sphinx-gallery" ,python-sphinx-gallery)
        ("python-numpydoc" ,python-numpydoc)
        ("python-ipython" ,python-ipython)
        ("python-ipykernel" ,python-ipykernel)
        ("python-mock" ,python-mock)
        ("graphviz" ,graphviz)
-       ("texlive" ,(texlive-union (list texlive-latex-amsfonts
+       ("texlive" ,(texlive-union (list texlive-amsfonts
                                         texlive-latex-amsmath
                                         texlive-latex-enumitem
                                         texlive-latex-expdlist
@@ -3881,7 +3978,6 @@ toolkits.")
 
                                         texlive-generic-pdftex
 
-                                        texlive-fonts-amsfonts
                                         texlive-fonts-ec
                                         texlive-fonts-adobe-times
                                         texlive-fonts-txfonts)))
@@ -3891,6 +3987,9 @@ toolkits.")
      `(#:tests? #f ; we're only generating documentation
        #:phases
        (modify-phases %standard-phases
+         ;; The tests in python-matplotlib are run after the install phase, so
+         ;; we need to delete the extra phase here.
+         (delete 'check)
          (replace 'build
            (lambda _
              (chdir "doc")
@@ -3939,7 +4038,38 @@ toolkits.")
     (license (package-license python-matplotlib))))
 
 (define-public python2-matplotlib-documentation
-  (package-with-python2 python-matplotlib-documentation))
+  (let ((parent (package-with-python2 python-matplotlib-documentation)))
+    (package
+      (inherit parent)
+      (native-inputs
+       (alist-delete "python-sphinx-copybutton"
+                     (package-native-inputs parent))))))
+
+(define-public python-matplotlib-venn
+  (package
+    (name "python-matplotlib-venn")
+    (version "0.11.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "matplotlib-venn" version ".zip"))
+       (sha256
+        (base32
+         "13w3i1wih0mij08hrgppzg0g9z50y54rc28l6gdi1r5w45l7l0dy"))))
+    (build-system python-build-system)
+    (arguments '(#:tests? #f)) ; tests are not included
+    (propagated-inputs
+     `(("python-matplotlib" ,python-matplotlib)
+       ("python-numpy" ,python-numpy)
+       ("python-scipy" ,python-scipy)))
+    (native-inputs
+     `(("unzip" ,unzip)))
+    (home-page "https://github.com/konstantint/matplotlib-venn")
+    (synopsis "Plot area-proportional Venn diagrams")
+    (description
+     "This package provides tools for plotting area-proportional two- and
+three-way Venn diagrams in @code{matplotlib}.")
+    (license license:expat)))
 
 (define-public python2-pysnptools
   (package
@@ -3974,14 +4104,14 @@ operators such as union, intersection, and difference.")
 (define-public python-scipy
   (package
     (name "python-scipy")
-    (version "1.2.2")
+    (version "1.3.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "scipy" version))
        (sha256
         (base32
-         "1cgvgin8fvckv96hjh3ikmwkra5rif51bdb75ifzf7xbil5iwcx4"))))
+         "1df113c9i6vazsn6y3n9wc22jh737z1g7dmx3mypkdwpdnscyhr6"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-numpy" ,python-numpy)
@@ -4077,9 +4207,19 @@ routines such as routines for numerical integration and optimization.")
     (properties `((python2-variant . ,(delay python2-scipy))))
     (license license:bsd-3)))
 
+;; Version 1.2.2 is the last version to support Python 2
 (define-public python2-scipy
-  (package-with-python2
-   (strip-python2-variant python-scipy)))
+  (package
+    (inherit (package-with-python2
+              (strip-python2-variant python-scipy)))
+    (version "1.2.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "scipy" version))
+       (sha256
+        (base32
+         "1cgvgin8fvckv96hjh3ikmwkra5rif51bdb75ifzf7xbil5iwcx4"))))))
 
 (define-public python-socksipy-branch
   (package
@@ -4273,19 +4413,18 @@ services for your Python modules and applications.")
 (define-public python-olefile
   (package
     (name "python-olefile")
-    (version "0.45.1")
+    (version "0.46")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://github.com/decalage2/olefile/archive/v"
-                           version ".tar.gz"))
+       (uri (string-append "https://github.com/decalage2/olefile/releases/"
+                           "download/v" version "/olefile-" version ".tar.gz"))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "18ai19zwagm6nli14k8bii31ipbab2rp7plrvsm6gmfql551a8ai"))))
+         "1kjxh4gr651hpqkjfv89cfzr40hyvf3vjlda7mifiail83j7j07m"))))
     (build-system python-build-system)
-    (home-page
-     "https://www.decalage.info/python/olefileio")
+    (home-page "https://www.decalage.info/python/olefileio")
     (synopsis "Read and write Microsoft OLE2 files.")
     (description
      "@code{olefile} can parse, read and write Microsoft OLE2 files (Structured
@@ -4299,14 +4438,14 @@ the OleFileIO module from PIL, the Python Image Library.")
 (define-public python-pillow
   (package
     (name "python-pillow")
-    (version "5.4.1")
+    (version "6.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Pillow" version))
        (sha256
         (base32
-         "17waygkhhzjd75kajlfw9v57mbb41lcpg6cvkdijqd7smm76ccsj"))))
+         "1pnrsz0f0n0c819v1pdr8j6rm8xvhc9f3kh1fv9xpdp9n5ygf108"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-pytest" ,python-pytest)))
@@ -4355,14 +4494,14 @@ a general image processing tool.")
 (define-public python-pycparser
   (package
     (name "python-pycparser")
-    (version "2.18")
+    (version "2.19")
     (source
      (origin
       (method url-fetch)
       (uri (pypi-uri "pycparser" version))
       (sha256
        (base32
-        "09mjyw82ibqzl449g7swy8bfxnfpmas0815d2rkdjlcqw81wma4r"))))
+        "1cr5dcj9628lkz1qlwq3fv97c25363qppkmcayqvd05dpy573259"))))
     (outputs '("out" "doc"))
     (build-system python-build-system)
     (native-inputs
@@ -4385,7 +4524,8 @@ a general image processing tool.")
                            (copy-file (string-append "." file)
                                       (string-append doc file)))
                          '("/README.rst" "/CHANGES" "/LICENSE"))
-               (copy-recursively "examples" examples)))))))
+               (copy-recursively "examples" examples)
+               #t))))))
     (home-page "https://github.com/eliben/pycparser")
     (synopsis "C parser in Python")
     (description
@@ -4800,45 +4940,135 @@ them as the version argument or in a SCM managed file.")
 (define-public python2-setuptools-scm
   (package-with-python2 python-setuptools-scm))
 
+(define-public python-pathlib2
+  (package
+    (name "python-pathlib2")
+    (version "2.3.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "pathlib2" version))
+       (sha256
+        (base32
+         "0hpp92vqqgcd8h92msm9slv161b1q160igjwnkf2ag6cx0c96695"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-scandir" ,python-scandir)
+       ("python-six" ,python-six)))
+    (home-page "https://pypi.python.org/pypi/pathlib2/")
+    (synopsis "Object-oriented file system paths")
+    (description "The goal of pathlib2 is to provide a backport of the
+standard @code{pathlib} module which tracks the standard library module, so
+all the newest features of the standard @code{pathlib} can be used also on
+older Python versions.")
+    (license license:expat)))
+
+(define-public python-importlib-metadata
+  (package
+    (name "python-importlib-metadata")
+    (version "0.18")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "importlib_metadata" version))
+       (sha256
+        (base32
+         "1nqj6vj2z4byi8flzf2lbldhqgicsz9mkpv4k69kjd8p8qxy4vnb"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-configparser" ,python-configparser)
+       ("python-contextlib2" ,python-contextlib2)
+       ("python-docutils" ,python-docutils)
+       ("python-pathlib2" ,python-pathlib2)
+       ("python-rst.linker" ,python-rst.linker)
+       ("python-zipp" ,python-zipp)))
+    (native-inputs
+     `(("python-setuptools-scm" ,python-setuptools-scm)
+       ("python-sphinx" ,python-sphinx)))
+    (home-page "https://importlib-metadata.readthedocs.io/")
+    (synopsis "Read metadata from Python packages")
+    (description
+     "@code{importlib_metadata} is a library which provides an API for
+accessing an installed Python package's metadata, such as its entry points or
+its top-level name.  This functionality intends to replace most uses of
+@code{pkg_resources} entry point API and metadata API.  Along with
+@code{importlib.resources} in Python 3.7 and newer, this can eliminate the
+need to use the older and less efficient @code{pkg_resources} package.")
+    (license license:asl2.0)))
+
+(define-public python-jaraco-packaging
+  (package
+    (name "python-jaraco-packaging")
+    (version "6.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "jaraco.packaging" version))
+        (sha256
+          (base32
+            "0zimrnkh33b9g8ffw11mjh6kvs54cy5gcjw1h5cl1r7dc833dmkm"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-pytest" ,python-pytest)
+       ("python-pytest-checkdocs" ,python-pytest-checkdocs)
+       ("python-pytest-flake8" ,python-pytest-flake8)
+       ("python-rst.linker" ,python-rst.linker)
+       ("python-setuptools" ,python-setuptools)
+       ("python-setuptools-scm" ,python-setuptools-scm)
+       ("python-six" ,python-six)
+       ("python-sphinx" ,python-sphinx)))
+    (home-page "https://github.com/jaraco/jaraco.packaging")
+    (synopsis "Tools to supplement packaging Python releases")
+    (description
+     "This package provides various tools to supplement packaging Python
+releases.")
+    (license license:expat)))
+
 (define-public python-pathpy
   (package
     (name "python-pathpy")
-    (version "11.0.1")
+    (version "11.5.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "path.py" version))
        (sha256
-        (base32 "07x15v8c7ry9bvycw294c9yq6ky9v2b0dalvgi6rn38ilh69vsz7"))))
-    ;; (outputs '("out" "doc"))
+        (base32 "1jxkf91syzxlpiwgm83fjfz1m5xh3jrvv4iyl5wjsnkk599pls5n"))))
+    (outputs '("out" "doc"))
     (build-system python-build-system)
     (propagated-inputs
-     `(("python-appdirs" ,python-appdirs)))
+     `(("python-appdirs" ,python-appdirs)
+       ("python-importlib-metadata" ,python-importlib-metadata)))
     (native-inputs
      `(("python-setuptools-scm" ,python-setuptools-scm)
        ("python-sphinx" ,python-sphinx)
        ("python-rst.linker" ,python-rst.linker)
        ("python-pytest" ,python-pytest)
-       ("python-pytest-runner" ,python-pytest-runner)))
+       ("python-pytest-runner" ,python-pytest-runner)
+       ("python-jaraco-packaging" ,python-jaraco-packaging)))
     (arguments
-     ;; FIXME: Documentation and tests require "jaraco.packaging".
-     `(#:tests? #f))
-    ;;    #:phases
-    ;;    (modify-phases %standard-phases
-    ;;      (add-after 'build 'build-doc
-    ;;        (lambda _
-    ;;          (setenv "LANG" "en_US.UTF-8")
-    ;;          (zero? (system* "python" "setup.py" "build_sphinx"))))
-    ;;      (add-after 'install 'install-doc
-    ;;        (lambda* (#:key outputs #:allow-other-keys)
-    ;;          (let* ((data (string-append (assoc-ref outputs "doc") "/share"))
-    ;;                 (doc (string-append data "/doc/" ,name "-" ,version))
-    ;;                 (html (string-append doc "/html")))
-    ;;            (mkdir-p html)
-    ;;            (for-each (lambda (file)
-    ;;                        (copy-file file (string-append doc "/" file)))
-    ;;                      '("README.rst" "CHANGES.rst"))
-    ;;            (copy-recursively "build/sphinx/html" html)))))))
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'build 'build-doc
+           (lambda _
+             (setenv "LANG" "en_US.UTF-8")
+             (invoke "python" "setup.py" "build_sphinx")))
+         (add-after 'install 'install-doc
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((data (string-append (assoc-ref outputs "doc") "/share"))
+                    (doc (string-append data "/doc/" ,name "-" ,version))
+                    (html (string-append doc "/html")))
+               (mkdir-p html)
+               (for-each (lambda (file)
+                           (copy-file file (string-append doc "/" file)))
+                         '("README.rst" "CHANGES.rst"))
+               (copy-recursively "build/sphinx/html" html)
+               #t)))
+         (replace 'check
+           (lambda _
+             ;; The import time test aborts if an import takes longer than
+             ;; 100ms.  It may very well take a little longer than that.
+             (invoke "pytest" "-v" "-k" "not test_import_time"))))))
     (home-page "https://github.com/jaraco/path.py")
     (synopsis "Python module wrapper for built-in os.path")
     (description
@@ -4985,7 +5215,19 @@ without using the configuration machinery.")
     ;; Tests fail because of missing native python kernel which I assume is
     ;; provided by the ipython package, which we cannot use because it would
     ;; cause a dependency cycle.
-    (arguments `(#:tests? #f))
+    (arguments
+     `(#:tests? #f
+
+       #:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'set-tool-file-names
+                    (lambda* (#:key inputs #:allow-other-keys)
+                      (let ((iproute (assoc-ref inputs "iproute")))
+                        (substitute* "jupyter_client/localinterfaces.py"
+                          (("'ip'")
+                           (string-append "'" iproute "/sbin/ip'")))
+                        #t))))))
+    (inputs
+     `(("iproute" ,iproute)))
     (propagated-inputs
      `(("python-pyzmq" ,python-pyzmq)
        ("python-traitlets" ,python-traitlets)
@@ -5020,7 +5262,17 @@ installing @code{kernelspec}s for use with Jupyter frontends.")
            (lambda _
              (setenv "HOME" "/tmp")
              (invoke "pytest" "-v")
-             #t)))))
+             #t))
+         (add-after 'install 'set-python-file-name
+           (lambda* (#:key outputs #:allow-other-keys)
+             ;; Record the absolute file name of the 'python' executable in
+             ;; 'kernel.json'.
+             (let ((out (assoc-ref outputs "out")))
+               (substitute* (string-append out "/share/jupyter"
+                                           "/kernels/python3/kernel.json")
+                 (("\"python\"")
+                  (string-append "\"" (which "python") "\"")))
+               #t))))))
     (propagated-inputs
      `(("python-ipython" ,python-ipython)
        ;; imported at runtime during connect
@@ -5219,6 +5471,13 @@ computing.")
     (arguments
      `(#:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'make-docs-reproducible
+           (lambda _
+             (substitute* "IPython/sphinxext/ipython_directive.py"
+               ((".*import datetime") "")
+               ((".*datetime.datetime.now\\(\\)") "")
+               (("%timeit") "# %timeit"))
+             #t))
          ;; Tests can only be run after the library has been installed and not
          ;; within the source directory.
          (delete 'check)
@@ -5301,11 +5560,10 @@ computing.")
      `(("python-sphinx" ,python-sphinx)
        ("python-sphinx-rtd-theme" ,python-sphinx-rtd-theme)
        ;; FIXME: It's possible that a smaller union would work just as well.
-       ("texlive" ,(texlive-union (list texlive-fonts-amsfonts
+       ("texlive" ,(texlive-union (list texlive-amsfonts
                                         texlive-fonts-ec
                                         texlive-generic-ifxetex
                                         texlive-generic-pdftex
-                                        texlive-latex-amsfonts
                                         texlive-latex-capt-of
                                         texlive-latex-cmap
                                         texlive-latex-environ
@@ -5484,6 +5742,33 @@ implementation of D-Bus.")
     ;; "ValueError: unichr() arg not in range(0x10000) (narrow Python build)"
     (arguments `(#:tests? #f))))
 
+(define-public python-notify2
+  (package
+    (name "python-notify2")
+    (version "0.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "notify2" version))
+       (sha256
+        (base32
+         "0z8rrv9rsg1r2qgh2dxj3dfj5xnki98kgi3w839kqby4a26i1yik"))))
+    (build-system python-build-system)
+    (arguments `(#:tests? #f))                    ; tests depend on system state
+    (native-inputs
+     `(("python-dbus" ,python-dbus)))
+    (home-page "https://bitbucket.org/takluyver/pynotify2")
+    (synopsis "Python interface to D-Bus notifications")
+    (description
+     "Pynotify2 provides a Python interface for sending D-Bus notifications.
+It is a reimplementation of pynotify in pure Python, and an alternative to
+the GObject Introspection bindings to libnotify for non-GTK applications.")
+    (license (list license:bsd-2
+                   license:lgpl2.1+))))
+
+(define-public python2-notify2
+  (package-with-python2 python-notify2))
+
 (define-public python-lxml
   (package
     (name "python-lxml")
@@ -5558,14 +5843,14 @@ converts incoming documents to Unicode and outgoing documents to UTF-8.")
 (define-public python-soupsieve
   (package
     (name "python-soupsieve")
-    (version "1.9.1")
+    (version "1.9.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "soupsieve" version))
        (sha256
         (base32
-         "1jnzkiwmjl6yvqckc9mf689g87b6yz07sv868hap2aa5arggy3mj"))))
+         "0in9rc9q3h8w5b4qf7kvl3qxcvw6vrz35ckblchgf70hm6pg3dbj"))))
     (build-system python-build-system)
     (arguments `(#:tests? #f))
     ;;XXX: 2 tests fail currently despite claming they were to be
@@ -6756,17 +7041,52 @@ and MAC network addresses.")
 (define-public python2-netaddr
   (package-with-python2 python-netaddr))
 
+(define-public python2-pyroute2
+  (package
+    (name "python2-pyroute2")
+    (version "0.5.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "pyroute2" version))
+       (sha256
+        (base32
+         "1gmz4r1w0yzj6fjjypnalmfyy0lnfznydyn62gi3wk50j5hhxbny"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:python ,python-2))                       ;Python 3.x is not supported
+    (home-page "https://github.com/svinota/pyroute2")
+    (synopsis "Python netlink library")
+    (description
+     "Pyroute2 is a pure Python netlink library with minimal dependencies.
+Supported netlink families and protocols include:
+@itemize
+@item rtnl, network settings - addresses, routes, traffic controls
+@item nfnetlink - netfilter API: ipset, nftables, ...
+@item ipq - simplest userspace packet filtering, iptables QUEUE target
+@item devlink - manage and monitor devlink-enabled hardware
+@item generic - generic netlink families
+  @itemize
+  @item nl80211 - wireless functions API (basic support)
+  @item taskstats - extended process statistics
+  @item acpi_events - ACPI events monitoring
+  @item thermal_events - thermal events monitoring
+  @item VFS_DQUOT - disk quota events monitoring
+  @end itemize
+@end itemize")
+    (license license:gpl2+)))
+
 (define-public python-wrapt
   (package
     (name "python-wrapt")
-    (version "1.11.1")
+    (version "1.11.2")
     (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "wrapt" version))
-        (sha256
-          (base32
-            "0cqmysny1pz01jw26q48q5zasvns6507rwhgm6wcw743f0r01sja"))))
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "wrapt" version))
+       (sha256
+        (base32
+         "1q81762dgsgrd12f8qc39zk8s5wll3m5xc32jdmlf6cls4gh4njn"))))
     (build-system python-build-system)
     (arguments
      ;; Tests are not included in the tarball, they are only available in the
@@ -6775,7 +7095,7 @@ and MAC network addresses.")
     (home-page "https://github.com/GrahamDumpleton/wrapt")
     (synopsis "Module for decorators, wrappers and monkey patching")
     (description
-      "The aim of the wrapt module is to provide a transparent object proxy for
+     "The aim of the wrapt module is to provide a transparent object proxy for
   Python, which can be used as the basis for the construction of function
   wrappers and decorator functions.")
     (license license:bsd-2)))
@@ -7021,6 +7341,17 @@ the Python standard library but currently only supports the older 2003
 specification.")
     (license license:bsd-4)))
 
+(define-public python-idna-2.7
+  (package (inherit python-idna)
+           (version "2.7")
+           (source (origin
+                     (method url-fetch)
+                     (uri (pypi-uri "idna" version))
+                     (sha256
+                      (base32
+                       "05jam7d31767dr12x0rbvvs8lxnpb1mhdb2zdlfxgh83z6k3hjk8"))))))
+
+
 (define-public python2-idna
   (package-with-python2 python-idna))
 
@@ -7071,14 +7402,14 @@ responses, rather than doing any computation.")
 (define-public python-pip
   (package
     (name "python-pip")
-    (version "18.1")
+    (version "19.2.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "pip" version))
        (sha256
         (base32
-         "188fclay154s520n43s7cxxlhdaiysvxf19zk8vr1xbyjyyr58n0"))))
+         "100sd12ss4mbdj5lf3wawad29cm573b27765mq098x6xhcj71395"))))
     (build-system python-build-system)
     (arguments
      '(#:tests? #f))          ; there are no tests in the pypi archive.
@@ -7238,17 +7569,31 @@ serve the same purpose: provide Python bindings for libmagic.")))
   (package
     (name "python-debian")
     (home-page "https://salsa.debian.org/python-debian-team/python-debian")
-    (version "0.1.28")
+    (version "0.1.36")
     (source
      (origin
-       (method url-fetch)
-       (uri (pypi-uri name version))
+       ;; Use git-fetch, as pypi doesn't include test suite.
+       (method git-fetch)
+       (uri (git-reference
+             (url home-page)
+             (commit version)))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0i15f0xzx679sd0ldq2sls9pnnps9fv6vhqvnv9dzf4qhma42i0y"))))
+         "0qy6x28bj6yfikhjww932v5xq4mf5bm1iczl7acy4c7zm6mwhqfa"))))
     (build-system python-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'remove-debian-specific-tests
+                    ;; python-apt, apt and dpkg are not yet available in guix,
+                    ;; and these tests heavily depend on them.
+                    (lambda _
+                      (delete-file "lib/debian/tests/test_deb822.py")
+                      (delete-file "lib/debian/tests/test_debfile.py")
+                      #t)))))
     (propagated-inputs
-     `(("python-six" ,python-six)))
+     `(("python-six" ,python-six)
+       ("python-chardet" ,python-chardet)))
     (synopsis "Debian package related modules")
     (description
      ;; XXX: Use @enumerate instead of @itemize to work around
@@ -7541,21 +7886,19 @@ in the data.")
 (define-public python-jupyter-console
   (package
     (name "python-jupyter-console")
-    (version "5.2.0")
+    (version "6.0.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "jupyter_console" version))
        (sha256
         (base32
-         "1kam1qzgwr7srhm5r6aj90di5sws4bq0jmiw15452ddamb9yspal"))))
+         "1xdjw11cppf1fxvwkw2bk13ckkwas3bdah8baingn9296mvfi31h"))))
     (build-system python-build-system)
-    ;; Tests only run in an TTY.
-    (arguments `(#:tests? #f))
     (propagated-inputs
      `(("python-ipykernel" ,python-ipykernel)
        ("python-jupyter-client" ,python-jupyter-client)
-       ("python-prompt-toolkit" ,python-prompt-toolkit-1)
+       ("python-prompt-toolkit" ,python-prompt-toolkit)
        ("python-pygments" ,python-pygments)))
     (native-inputs
      `(("python-nose" ,python-nose)))
@@ -7567,7 +7910,32 @@ Jupyter kernels such as IJulia and IRKernel.")
     (license license:bsd-3)))
 
 (define-public python2-jupyter-console
-  (package-with-python2 python-jupyter-console))
+  (package
+    (name "python2-jupyter-console")
+    (version "5.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "jupyter_console" version))
+       (sha256
+        (base32
+         "1kam1qzgwr7srhm5r6aj90di5sws4bq0jmiw15452ddamb9yspal"))))
+    (build-system python-build-system)
+    ;; Tests only run in an TTY.
+    (arguments `(#:tests? #f))
+    (propagated-inputs
+     `(("python2-ipykernel" ,python2-ipykernel)
+       ("python2-jupyter-client" ,python2-jupyter-client)
+       ("python2-prompt-toolkit" ,python2-prompt-toolkit-1)
+       ("python2-pygments" ,python2-pygments)))
+    (native-inputs
+     `(("python2-nose" ,python2-nose)))
+    (home-page "https://jupyter.org")
+    (synopsis "Jupyter terminal console")
+    (description "This package provides a terminal-based console frontend for
+Jupyter kernels.  It also allows for console-based interaction with non-Python
+Jupyter kernels such as IJulia and IRKernel.")
+    (license license:bsd-3)))
 
 ;; The python-ipython and python-jupyter-console require each other. To get
 ;; the functionality in both packages working, strip down the
@@ -7839,17 +8207,38 @@ be set via config files and/or environment variables.")
     (source
      (origin
        (method url-fetch)
-       (uri (pypi-uri "argparse-manpage" version))
+       (uri (pypi-uri "argparse-manpage" version))
+       (sha256
+        (base32
+         "0blh31zns68anina9lba5wh81d1414s97p60zw5l0d0shhh0wj5p"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/praiskup/argparse-manpage")
+    (synopsis "Build manual page from Python's ArgumentParser object")
+    (description
+     "This package provides tools to build manual pages from Python's
+@code{ArgumentParser} object.")
+    (license license:asl2.0)))
+
+(define-public python-contextlib2
+  (package
+    (name "python-contextlib2")
+    (version "0.5.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "contextlib2" version))
        (sha256
         (base32
-         "0blh31zns68anina9lba5wh81d1414s97p60zw5l0d0shhh0wj5p"))))
+         "0j6ad6lwwyc9kv71skj098v5l7x5biyj2hs4lc5x1kcixqcr97sh"))))
     (build-system python-build-system)
-    (home-page "https://github.com/praiskup/argparse-manpage")
-    (synopsis "Build manual page from Python's ArgumentParser object")
-    (description
-     "This package provides tools to build manual pages from Python's
-@code{ArgumentParser} object.")
-    (license license:asl2.0)))
+    (home-page "http://contextlib2.readthedocs.org/")
+    (synopsis "Tools for decorators and context managers")
+    (description "This module is primarily a backport of the Python
+3.2 contextlib to earlier Python versions.  Like contextlib, it
+provides utilities for common tasks involving decorators and context
+managers.  It also contains additional features that are not part of
+the standard library.")
+    (license license:psfl)))
 
 (define-public python2-contextlib2
   (package
@@ -7883,14 +8272,14 @@ the standard library.")
 (define-public python-texttable
   (package
     (name "python-texttable")
-    (version "0.8.7")
+    (version "0.9.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "texttable" version))
        (sha256
         (base32
-         "1liiiydgkg37i46a418aw19fyf6z3ds51wdwwpyjbs12x0phhf4a"))))
+         "0yawv64c0zbawwv6zz84whb32fnb2n9jylwjcfsrcdgh7xvl340i"))))
     (build-system python-build-system)
     (arguments '(#:tests? #f)) ; no tests
     (home-page "https://github.com/foutaise/texttable/")
@@ -8271,6 +8660,28 @@ concurrent.futures package from Python 3.2")
          ("python2-pytest" ,python2-pytest)
          ,@(package-native-inputs promise))))))
 
+(define-public python-progressbar33
+  (package
+    (name "python-progressbar33")
+    (version "2.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "progressbar33" version))
+       (sha256
+        (base32
+         "1zvf6zs5hzrc03p9nfs4p16vhilqikycvv1yk0pxn8s07fdhvzji"))))
+    (build-system python-build-system)
+    (home-page "http://github.com/germangh/python-progressbar")
+    (synopsis "Text progress bar library for Python")
+    (description
+     "This package provides a text progress bar library for Python.  This
+version only differs from the original @code{progressbar} package in that it
+uses relative package imports instead of absolute imports, which is necessary
+for the module to work under Python 3.3.")
+    ;; Either or both of these licenses may be selected.
+    (license (list license:lgpl2.1+ license:bsd-3))))
+
 (define-public python-colorama
   (package
    (name "python-colorama")
@@ -8402,34 +8813,35 @@ document.")
 
 (define-public python-botocore
   (package
-   (name "python-botocore")
-   (version "1.8.43")
-   (source
-    (origin
-     (method url-fetch)
-     (uri (pypi-uri "botocore" version))
-     (sha256
-      (base32
-       "12cqpbnz3vfv41mp9admvciw7bc7hz57sjpqs2bxaw9wnfmbw5lg"))))
-   (build-system python-build-system)
-   (arguments
-    ;; FIXME: Many tests are failing.
-    '(#:tests? #f))
-   (propagated-inputs
-    `(("python-dateutil" ,python-dateutil)
-      ("python-docutils" ,python-docutils)
-      ("python-jmespath" ,python-jmespath)))
-   (native-inputs
-    `(("python-mock" ,python-mock)
-      ("python-nose" ,python-nose)
-      ("behave" ,behave)
-      ("python-tox" ,python-tox)
-      ("python-wheel" ,python-wheel)))
-   (home-page "https://github.com/boto/botocore")
-   (synopsis "Low-level interface to AWS")
-   (description "Botocore is a Python library that provides a low-level
+    (name "python-botocore")
+    (version "1.12.149")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "botocore" version))
+       (sha256
+        (base32
+         "12597f74khp3ngwr282cb949w0gcqj20rkfc3x275dijavyy5cmf"))))
+    (build-system python-build-system)
+    (arguments
+     ;; FIXME: Many tests are failing.
+     '(#:tests? #f))
+    (propagated-inputs
+     `(("python-dateutil" ,python-dateutil)
+       ("python-docutils" ,python-docutils)
+       ("python-jmespath" ,python-jmespath)))
+    (native-inputs
+     `(("python-mock" ,python-mock)
+       ("python-nose" ,python-nose)
+       ("behave" ,behave)
+       ("python-tox" ,python-tox)
+       ("python-urllib3" ,python-urllib3)
+       ("python-wheel" ,python-wheel)))
+    (home-page "https://github.com/boto/botocore")
+    (synopsis "Low-level interface to AWS")
+    (description "Botocore is a Python library that provides a low-level
 interface to the Amazon Web Services (AWS) API.")
-   (license license:asl2.0)))
+    (license license:asl2.0)))
 
 (define-public python2-botocore
   (package-with-python2 python-botocore))
@@ -8479,20 +8891,24 @@ python-xdo for newer bindings.)")
 (define-public python-mako
   (package
     (name "python-mako")
-    (version "1.0.10")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Mako" version))
        (sha256
         (base32
-         "0r9rysn19fmrxnzfcn7sg20kjhcrx9qri0my9n5vdzp1g2g92rbi"))))
+         "0jqa3qfpykyn4fmkn0kh6043sfls7br8i2bsdbccazcvk9cijsd3"))))
     (build-system python-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (replace 'check
+                    (lambda _
+                      (invoke "pytest" "-vv"))))))
     (propagated-inputs
      `(("python-markupsafe" ,python-markupsafe)))
     (native-inputs
      `(("python-mock" ,python-mock)
-       ("python-nose" ,python-nose)
        ("python-pytest" ,python-pytest)))
     (home-page "https://www.makotemplates.org/")
     (synopsis "Templating language for Python")
@@ -9666,16 +10082,16 @@ format.")
 (define-public python-twisted
   (package
     (name "python-twisted")
-    (version "19.2.0")
+    (version "19.7.0")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "Twisted" version ".tar.bz2"))
               (sha256
                (base32
-                "1gmb8d57s13d8znvqnxi47vqzqz141z443dbxg9wjkp8ia9f220p"))))
+                "17d3hnxv9qndagzz63mdpyk99xj63p9gq586vjn0rxk8cl197nym"))))
     (build-system python-build-system)
     (arguments
-     '(#:tests? #f)) ; FIXME: Some tests are failing.
+     '(#:tests? #f))                    ; FIXME: some tests fail
     (propagated-inputs
      `(("python-zope-interface" ,python-zope-interface)
        ("python-pyhamcrest" ,python-pyhamcrest)
@@ -10219,25 +10635,29 @@ characters, mouse support, and auto suggestions.")
 (define-public python-jedi
   (package
     (name "python-jedi")
-    (version "0.13.3")
+    (version "0.15.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "jedi" version))
        (sha256
         (base32
-         "0nsrjlb57njqppxmi8wjsb1dkad7qa7svx67jbkhixq66lz61c1b"))))
+         "0bp4pxhsynaarbvzblsn5x32lzp29svy3sxfy8i6m5iwz9s9r1ds"))))
     (build-system python-build-system)
     (arguments
-     `( ;; Many tests are failing with Python 3.7.x as of version 0.13.3 (see:
-        ;; https://github.com/davidhalter/jedi/issues/1263)
-       #:tests? #f
-       #:phases
+     `(#:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'disable-file-completion-test
+           ;; A single parameterized test currently fail (see:
+           ;; https://github.com/davidhalter/jedi/issues/1395).  Remove it.
+           (lambda _
+             (substitute* "test/test_api/test_completion.py"
+               ((".*'example.py', 'rb\"' \\+ join\\('\\.\\.'.*") ""))
+             #t))
          (replace 'check
-           (lambda* (#:key tests? #:allow-other-keys)
-             (when tests?
-               (invoke "py.test" "-vv")))))))
+           (lambda _
+             (setenv "HOME" "/tmp")
+             (invoke "python" "-m" "pytest"))))))
     (native-inputs
      `(("python-pytest" ,python-pytest)
        ("python-docopt" ,python-docopt)))
@@ -10255,11 +10675,7 @@ well.")
     (license license:expat)))
 
 (define-public python2-jedi
-  (let ((base (package-with-python2 (strip-python2-variant python-jedi))))
-    (package
-      (inherit base)
-      (arguments (substitute-keyword-arguments (package-arguments base)
-                   ((#:tests? _) #t))))))
+  (package-with-python2 python-jedi))
 
 (define-public ptpython
   (package
@@ -10298,14 +10714,14 @@ etc.")
 (define-public python-stem
   (package
     (name "python-stem")
-    (version "1.7.0")
+    (version "1.7.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "stem" version))
        (sha256
         (base32
-         "1awiglfiajnx2hva9aqpj3fmdvdb4qg7cwnlfyih827m68y3cq8v"))))
+         "18lc95pmc7i089nlsb06dsxyjl5wbhxfqgdxbjcia35ndh8z7sn9"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -10639,25 +11055,36 @@ command @command{natsort} that exposes this functionality in the command line.")
 (define-public python-glances
   (package
   (name "python-glances")
-  (version "3.0.2")
+  (version "3.1.1")
   (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "Glances" version))
       (sha256
         (base32
-          "09fxysfp1n16csqvzvawy74qm6a94nvwjf3vcf5gkqp4i6k4vjjy"))))
+          "07j1ggzsqiskyz1i4mrnyr9i95v0dqi0i0hibnv1l188km8shmi8"))
+      (modules '((guix build utils)))
+      (snippet
+       '(begin
+          ;; Glances phones PyPI for weekly update checks by default.
+          ;; Disable these.  The user can re-enable them if desired.
+          (substitute* "glances/outdated.py"
+            (("^(.*)self\\.load_config\\(config\\)\n" line indentation)
+             (string-append indentation
+                            "self.args.disable_check_update = True\n"
+                            line)))
+          #t))))
   (build-system python-build-system)
   (propagated-inputs
-   `(("python-psutil" ,python-psutil)))
+   `(("python-future" ,python-future)
+     ("python-psutil" ,python-psutil)))
   (home-page
     "https://github.com/nicolargo/glances")
-  (synopsis
-    "A cross-platform curses-based monitoring tool")
+  (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 python2-glances
@@ -12844,17 +13271,18 @@ from your Flask project.  It is a fork of Flask-Swagger.")
 (define-public python-swagger-spec-validator
   (package
     (name "python-swagger-spec-validator")
-    (version "2.1.0")
+    (version "2.4.3")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "swagger-spec-validator" version))
        (sha256
         (base32
-         "13hkpn2lycwr0468yqhjb3kwszqf7hjwlq61w7vdxq1caz31k4nw"))))
+         "11g627icrsqwazsncwi0sdvprcj6hwaayw5xk3xsj8d97bmrzqjp"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-jsonschema" ,python-jsonschema)
+       ("python-pyyaml" ,python-pyyaml)
        ("python-six" ,python-six)))
     (home-page
      "https://github.com/Yelp/swagger_spec_validator")
@@ -13384,6 +13812,37 @@ belong to tagged versions.")
 (define-public python2-setuptools-scm-git-archive
   (package-with-python2 python-setuptools-scm-git-archive))
 
+(define-public python-setuptools-git
+  (package
+    (name "python-setuptools-git")
+    (version "1.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "setuptools-git" version))
+       (sha256
+        (base32
+         "0i84qjwp5m0l9qagdjww2frdh63r37km1c48mrvbmaqsl1ni6r7z"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         ;; This is needed for tests.
+         (add-after 'unpack 'configure-git
+           (lambda _
+             (setenv "HOME" "/tmp")
+             (invoke "git" "config" "--global" "user.email" "guix")
+             (invoke "git" "config" "--global" "user.name" "guix")
+             #t)))))
+    (native-inputs
+     `(("git" ,git-minimal)))
+    (home-page "https://github.com/msabramo/setuptools-git")
+    (synopsis "Setuptools revision control system plugin for Git")
+    (description
+     "This package provides a plugin for Setuptools for revision control with
+Git.")
+    (license license:bsd-3)))
+
 (define-public python-pyclipper
   (package
     (name "python-pyclipper")
@@ -13987,6 +14446,51 @@ source bytes using the UTF-8 encoding and then rewrites Python 3.6 style
 @code{f} strings.")
     (license license:expat)))
 
+(define-public python-typed-ast
+  (package
+    (name "python-typed-ast")
+    (version "1.3.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "typed-ast" version))
+       (sha256
+        (base32
+         "1m7pr6qpana3cvqwiw7mlvrgvmw27ch5mx1592572xhlki8g85ak"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:modules ((guix build utils)
+                  (guix build python-build-system)
+                  (ice-9 ftw)
+                  (srfi srfi-1)
+                  (srfi srfi-26))
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (let ((cwd (getcwd)))
+               (setenv "PYTHONPATH"
+                       (string-append cwd "/build/"
+                                      (find (cut string-prefix? "lib" <>)
+                                            (scandir (string-append cwd "/build")))
+                                      ":"
+                                      (getenv "PYTHONPATH"))))
+             (invoke "pytest")
+             #t)))))
+    (native-inputs `(("python-pytest" ,python-pytest)))
+    (home-page "https://github.com/python/typed_ast")
+    (synopsis "Fork of Python @code{ast} modules with type comment support")
+    (description "This package provides a parser similar to the standard
+@code{ast} library.  Unlike @code{ast}, the parsers in @code{typed_ast}
+include PEP 484 type comments and are independent of the version of Python
+under which they are run.  The @code{typed_ast} parsers produce the standard
+Python AST (plus type comments), and are both fast and correct, as they are
+based on the CPython 2.7 and 3.7 parsers.")
+    ;; See the file "LICENSE" for the details.
+    (license (list license:psfl
+                   license:asl2.0
+                   license:expat))))    ;ast27/Parser/spark.py
+
 (define-public python-typing
   (package
     (name "python-typing")
@@ -14276,14 +14780,13 @@ working with iterables.")
 (define-public python-pybtex
   (package
     (name "python-pybtex")
-    (version "0.21")
+    (version "0.22.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "pybtex" version))
        (sha256
-        (base32
-         "00300j8dn5pxq4ndxmfmbmycg2znawkqs49val2x6jlmfiy6r2mg"))))
+        (base32 "070wfcmxrd7xg1si421mi9150gmx2qwx431nwf69sq3hhmgnx080"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-nose" ,python-nose)))
@@ -14320,17 +14823,21 @@ time-based (TOTP) passwords.")
 (define-public python-parso
   (package
     (name "python-parso")
-    (version "0.3.1")
+    (version "0.5.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "parso" version))
        (sha256
         (base32
-         "18p89iwcm8mnf380f92g9w0bhx5km8wxp392vvjcq4y1ld1llw1m"))))
+         "171a9ivhxwsd52h1cgsz40zgzpgzscn7yqb7sdjhy8m1lzj0wsv6"))))
     (native-inputs
      `(("python-pytest" ,python-pytest)))
     (build-system python-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (replace 'check
+                    (lambda _ (invoke "pytest" "-vv"))))))
     (home-page "https://github.com/davidhalter/parso")
     (synopsis "Python Parser")
     (description "Parso is a Python parser that supports error recovery and
@@ -15075,14 +15582,13 @@ append on old values.  Partd excels at shuffling operations.")
 (define-public python-dask
   (package
     (name "python-dask")
-    (version "1.2.0")
+    (version "1.2.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "dask" version))
        (sha256
-        (base32
-         "1y0dqcp72ixwblgway0jpvfirlxfcmwrjiivdq96firj1hw127sd"))))
+        (base32 "0b29gvf96gmp20wicly3v3mhyc93zbm3mdv935fka6x0wax7cy2y"))))
     (build-system python-build-system)
     ;; A single test out of 5000+ fails.  This test is marked as xfail when
     ;; pytest-xdist is used.
@@ -15293,16 +15799,15 @@ with the HTTP/2-based RPC framework gRPC.")
 (define-public python-astunparse
   (package
     (name "python-astunparse")
-    (version "1.6.1")
+    (version "1.6.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "astunparse" version))
        (sha256
-        (base32
-         "1jhidwyrqn17avqh9xnnm3wd7q7aahaq009cba67g86y6gxicyyj"))))
+        (base32 "0rzbc44xcvzjhhiy7wac96mgal5mcjz1mfq8rmvgswskf4kf9cys"))))
     (build-system python-build-system)
-    (arguments '(#:tests? #f)) ; there are none
+    (arguments '(#:tests? #f))          ; there are none
     (propagated-inputs
      `(("python-six" ,python-six)
        ("python-wheel" ,python-wheel)))
@@ -15530,3 +16035,233 @@ by Igor Pavlov.")
 
 (define-public python2-pylzma
   (package-with-python2 python-pylzma))
+
+(define-public python2-zeroconf
+  (package
+    (name "python2-zeroconf")
+
+    ;; This is the last version that supports Python 2.x.
+    (version "0.19.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "zeroconf" version))
+       (sha256
+        (base32
+         "0ykzg730n915qbrq9bn5pn06bv6rb5zawal4sqjyfnjjm66snkj3"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:python ,python-2
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-requires
+           (lambda* (#:key inputs #:allow-other-keys)
+             (substitute* "setup.py"
+               (("enum-compat")
+                "enum34"))
+             #t)))))
+    (native-inputs
+     `(("python2-six" ,python2-six)
+       ("python2-enum32" ,python2-enum34)
+       ("python2-netifaces" ,python2-netifaces)
+       ("python2-typing" ,python2-typing)))
+    (home-page "https://github.com/jstasiak/python-zeroconf")
+    (synopsis "Pure Python mDNS service discovery")
+    (description
+     "Pure Python multicast DNS (mDNS) service discovery library (Bonjour/Avahi
+compatible).")
+    (license license:lgpl2.1+)))
+
+(define-public python-bsddb3
+  (package
+    (name "python-bsddb3")
+    (version "6.2.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "bsddb3" version))
+       (sha256
+        (base32
+         "019db2y6bfmiqbrgg9x9f6h72qjmqh05czdn2v5sy9bl0gs23mj2"))))
+    (build-system python-build-system)
+    (inputs
+     `(("bdb" ,bdb)))
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'configure-locations
+           (lambda* (#:key inputs #:allow-other-keys)
+             (setenv "BERKELEYDB_DIR" (assoc-ref inputs "bdb"))
+             (setenv "YES_I_HAVE_THE_RIGHT_TO_USE_THIS_BERKELEY_DB_VERSION" "1")
+             #t))
+         (replace 'check
+           (lambda _
+             (invoke "python3" "test3.py" "-v"))))))
+    (home-page "https://www.jcea.es/programacion/pybsddb.htm")
+    (synopsis "Python bindings for Oracle Berkeley DB")
+    (description
+     "This module provides a nearly complete wrapping of the Oracle/Sleepycat
+C API for the Database Environment, Database, Cursor, Log Cursor, Sequence and
+Transaction objects, and each of these is exposed as a Python type in the
+bsddb3.db module.  The database objects can use various access methods: btree,
+hash, recno, and queue.  Complete support of Berkeley DB distributed
+transactions.  Complete support for Berkeley DB Replication Manager.
+Complete support for Berkeley DB Base Replication.  Support for RPC.")
+    (license license:bsd-3)))
+
+(define-public python-dbfread
+  (package
+    (name "python-dbfread")
+    (version "2.0.7")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "dbfread" version))
+              (sha256
+               (base32
+                "0gdpwdzf1fngsi6jrdyj4qdf6cr7gnnr3zp80dpkzbgz0spskj07"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
+    (home-page "https://dbfread.readthedocs.io")
+    (synopsis "Read DBF Files with Python")
+    (description
+     "This library reads DBF files and returns the data as native Python data
+types for further processing.  It is primarily intended for batch jobs and
+one-off scripts.")
+    (license license:expat)))
+
+(define-public python-cached-property
+  (package
+    (name "python-cached-property")
+    (version "1.5.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "cached-property" version))
+       (sha256
+        (base32
+         "010m1bl380l2r3vwq24r5v14l6gwvgm9v0mqqjkjss552jgsa5wj"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         ;; https://github.com/pydanny/cached-property/issues/131
+         ;; recent versions of freezegun break one test
+         (add-after 'unpack 'disable-broken-test
+           (lambda _
+             (substitute* "tests/test_cached_property.py"
+               (("def test_threads_ttl_expiry\\(self\\)" m)
+                (string-append "@unittest.skip(\"Disabled by Guix\")\n"
+                               "    " m)))
+             #t)))))
+    (native-inputs
+     `(("python-freezegun" ,python-freezegun)))
+    (home-page
+     "https://github.com/pydanny/cached-property")
+    (synopsis
+     "Decorator for caching properties in classes")
+    (description
+     "This package provides a decorator which makes caching
+time-or-computationally-expensive properties quick and easy and works in Python
+2 or 3.")
+    (license license:bsd-3)))
+
+(define-public python-folium
+  (package
+    (name "python-folium")
+    (version "0.10.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "folium" version))
+       (sha256
+        (base32
+         "18fzxijsgrb95r0a8anc9ba5ijyw3nlnv3rpavfbkqa5v878x84f"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-branca" ,python-branca)
+       ("python-jinja2" ,python-jinja2)
+       ("python-numpy" ,python-numpy)
+       ("python-requests" ,python-requests)))
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
+    (home-page "https://github.com/python-visualization/folium")
+    (synopsis "Make beautiful maps with Leaflet.js & Python")
+    (description "@code{folium} makes it easy to visualize data that’s been
+manipulated in Python on an interactive leaflet map.  It enables both the
+binding of data to a map for @code{choropleth} visualizations as well as
+passing rich vector/raster/HTML visualizations as markers on the map.
+
+The library has a number of built-in tilesets from OpenStreetMap, Mapbox, and
+Stamen, and supports custom tilesets with Mapbox or Cloudmade API keys.  It
+supports Image, Video, GeoJSON and TopoJSON overlays.")
+    (license license:expat)))
+
+(define-public jube
+  (package
+    ;; This is a command-line tool, so no "python-" prefix.
+    (name "jube")
+    (version "2.2.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "http://apps.fz-juelich.de/jsc/jube/jube2/download.php?version="
+                    version))
+              (sha256
+               (base32
+                "0xq4k1q63s1p6swgyp61vahlrd1fqmgbm0gm5kpj8ikwy0yc0nqk"))
+              (file-name (string-append "jube-" version ".tar.gz"))))
+    (build-system python-build-system)
+    (home-page "https://apps.fz-juelich.de/jsc/jube/jube2/docu/index.html")
+    (synopsis "Benchmarking environment")
+    (description
+     "JUBE helps perform and analyze benchmarks in a systematic way.  For each
+benchmarked application, benchmark data is stored in a format that allows JUBE
+to deduct the desired information.  This data can be parsed by automatic pre-
+and post-processing scripts that draw information and store it more densely
+for manual interpretation.")
+    (license license:gpl3+)))
+
+(define-public python-pyroutelib3
+  (package
+    (name "python-pyroutelib3")
+    (version "1.3.post1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "pyroutelib3" version))
+       (sha256
+        (base32
+         "1hpbydpn2alyswiajfbvhzq4c7f36vdmvxy91hgv8l1lb2g2vfrj"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-dateutil" ,python-dateutil)))
+    (home-page "https://github.com/MKuranowski/pyroutelib3")
+    (synopsis "Library for simple routing on OSM data")
+    (description "Library for simple routing on OSM data")
+    (license license:gpl3+)))
+
+(define-public python-elementpath
+  (package
+    (name "python-elementpath")
+    (version "1.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "elementpath" version))
+       (sha256
+        (base32
+         "1syn2z543brab23dskh3fjd9pqvz6npqbcicrs2d88dbg26xl08p"))))
+    (build-system python-build-system)
+    (home-page
+     "https://github.com/sissaschool/elementpath")
+    (synopsis
+     "XPath 1.0/2.0 parsers and selectors for ElementTree and lxml")
+    (description
+     "The proposal of this package is to provide XPath 1.0 and 2.0 selectors
+for Python's ElementTree XML data structures, both for the standard
+ElementTree library and for the @uref{http://lxml.de, lxml.etree} library.
+
+For lxml.etree this package can be useful for providing XPath 2.0 selectors,
+because lxml.etree already has it's own implementation of XPath 1.0.")
+    (license license:expat)))