gnu: whois: Update to 5.5.3.
[jackhill/guix/guix.git] / gnu / packages / python-xyz.scm
index 1a4c804..7343366 100644 (file)
@@ -19,7 +19,7 @@
 ;;; Copyright © 2015, 2016 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2016 Danny Milosavljevic <dannym+a@scratchpost.org>
 ;;; Copyright © 2016 Lukas Gradl <lgradl@openmailbox.org>
-;;; Copyright © 2016, 2018 Hartmut Goebel <h.goebel@crazy-compilers.com>
+;;; Copyright © 2016, 2018-2019 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2016 Daniel Pimentel <d4n1@d4n1.org>
 ;;; Copyright © 2016 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2016, 2017 Troy Sankey <sankeytms@gmail.com>
@@ -38,7 +38,7 @@
 ;;; Copyright © 2017 Frederick M. Muriithi <fredmanglis@gmail.com>
 ;;; Copyright © 2017, 2018 Adriano Peluso <catonano@gmail.com>
 ;;; Copyright © 2017 Ben Sturmfels <ben@sturm.com.au>
-;;; Copyright © 2017, 2018 Mathieu Othacehe <m.othacehe@gmail.com>
+;;; Copyright © 2017, 2018, 2019 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2017 José Miguel Sánchez García <jmi2k@openmailbox.org>
 ;;; Copyright © 2017 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2017, 2018 Kei Kebreau <kkebreau@posteo.net>
@@ -53,7 +53,7 @@
 ;;; Copyright © 2016, 2018 Tomáš Čech <sleep_walker@gnu.org>
 ;;; Copyright © 2018, 2019 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com>
-;;; Copyright © 2018 Clément Lassieur <clement@lassieur.org>
+;;; Copyright © 2018, 2019 Clément Lassieur <clement@lassieur.org>
 ;;; Copyright © 2018, 2019 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2018 Luther Thompson <lutheroto@gmail.com>
 ;;; Copyright © 2018 Vagrant Cascadian <vagrant@debian.org>
@@ -65,6 +65,8 @@
 ;;; Copyright © 2019 Pierre Langlois <pierre.langlois@gmx.com>
 ;;; Copyright © 2019 Jacob MacDonald <jaccarmac@gmail.com>
 ;;; Copyright © 2019 Giacomo Leidi <goodoldpaul@autistici.org>
+;;; Copyright © 2019 Wiktor Żelazny <wzelazny@vurv.cz>
+;;; Copyright © 2019 Tanguy Le Carrour <tanguy@bioneland.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
 (define-public python-psutil
   (package
     (name "python-psutil")
-    (version "5.6.2")
+    (version "5.6.5")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "psutil" version))
        (sha256
-        (base32
-         "1v95vb5385qscfdvphv8l2w22bmir3d7yhpi02n58v3mlqy1r3l2"))))
+        (base32 "0isil5jxwwd8awz54qk28rpgjg43i5l6yl70g40vxwa4r4m56lfh"))))
     (build-system python-build-system)
     (arguments
      ;; FIXME: some tests does not return and times out.
@@ -335,7 +336,14 @@ by @code{binstar}, @code{binstar-build} and @code{chalmers}.")
     (arguments
      `(#:phases (modify-phases %standard-phases
                   (replace 'check
-                    (lambda _ (invoke "pytest" "-vv"))))))
+                    (lambda _
+                      (invoke "pytest" "-vv" "-k"
+                              (string-append
+                               ;; XXX: These tests fail when using Pytest 4.x and
+                               ;; Babel 2.6.0.  Try removing this for later versions.
+                               "not test_no_inherit_metazone_marker_never_in_output"
+                               " and not test_smoke_dates"
+                               " and not test_smoke_numbers")))))))
     (home-page "http://babel.pocoo.org/")
     (synopsis
      "Tools for internationalizing Python applications")
@@ -386,6 +394,32 @@ certificate returned by the server to which a connection has been established,
 and verifies that it matches the intended target hostname.")
     (license license:psfl)))
 
+(define-public python-boolean.py
+  (package
+    (name "python-boolean.py")
+    (version "3.6")
+    (source
+     (origin
+       ;; There's no source tarball on PyPI.
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/bastikr/boolean.py")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1wc89y73va58cj7dsx6c199zpxsy9q53dsffsdj6zmc90inqz6qs"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/bastikr/boolean.py")
+    (synopsis "Boolean algebra in one Python module")
+    (description
+     "This is a small Python library that implements boolean algebra.
+It defines two base elements, @code{TRUE} and @code{FALSE}, and a
+@code{Symbol} class that can take on one of these two values.  Calculations
+are done only in terms of @code{AND}, @code{OR}, and @code{NOT}---other
+compositions like @code{XOR} and @code{NAND} are emulated on top of them.
+Expressions are constructed from parsed strings or directly in Python.")
+    (license license:bsd-2)))
+
 (define-public python-hdf4
   (package
    (name "python-hdf4")
@@ -514,14 +548,13 @@ concepts.")
 (define-public python-cftime
   (package
     (name "python-cftime")
-    (version "1.0.3.4")
+    (version "1.0.4.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "cftime" version))
        (sha256
-        (base32
-         "0362dhxbzk593walyjz30dll6y2y79wialik647cbwdsf3ad0x6x"))))
+        (base32 "0w0gi6jnch38hiygl62j4xkcirv4y3dcwrvxl9p7bsk6j27lzihs"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-numpy" ,python-numpy)))
@@ -582,6 +615,29 @@ to users of that module.")
 (define-public python2-netcdf4
   (package-with-python2 python-netcdf4))
 
+(define-public python-license-expression
+  (package
+    (name "python-license-expression")
+    (version "0.999")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "license-expression" version))
+       (sha256
+        (base32 "08ppb0bxbrsxazy88sgpl9yffvdsabw6dkk1nc332wcz2mphwwyf"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-boolean.py" ,python-boolean.py)))
+    (home-page "https://github.com/nexB/license-expression")
+    (synopsis "Apply boolean logic to license expressions")
+    (description
+     "This Python module defines a tiny language to evaluate and compare
+license expressions using boolean logic.  Logical combinations of licenses can
+be tested for equality, containment, and equivalence.  They can be normalised
+and simplified.  It supports SPDX license expressions as well as other naming
+conventions and aliases in the same expression.")
+    (license license:gpl2+)))
+
 (define-public python-lockfile
   (package
     (name "python-lockfile")
@@ -707,6 +763,19 @@ Python 3 support.")
 (define-public python2-setuptools
   (package-with-python2 python-setuptools))
 
+;; The setuptools provided by Python 3.7.4 is too new for Tensorflow.
+(define-public python-setuptools-for-tensorflow
+  (hidden-package
+   (package
+     (inherit python-setuptools)
+     (version "39.1.0")
+     (source (origin
+               (inherit (package-source python-setuptools))
+               (uri (pypi-uri "setuptools" version ".zip"))
+               (sha256
+                (base32
+                 "1mzdhvfhnv4lggxa8rjl0dzqxvfx377gg5sqs57v89wrp09lwj65")))))))
+
 (define-public python-uniseg
   (package
     (name "python-uniseg")
@@ -839,10 +908,18 @@ some helpful Python 2 compatibility convenience methods.")
         (base32
          "09z4d1jiasn7k1hs5af2ckmnrd0i1d1m04bhfjhv7z6svzfdwgg3"))))
     (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             ;; Do not run pylint plugin test, as astroid is an old
+             ;; unsupported version.
+             (invoke "pytest" "-v" "-k" "not test_pylint_plugin"
+                     "verboselogs/tests.py"))))))
     (native-inputs
      `(("python-mock" ,python-mock)
-       ("python-astroid" ,python-astroid)
-       ("python-pylint" ,python-pylint)))
+       ("python-pytest" ,python-pytest)))
     (home-page "https://verboselogs.readthedocs.io")
     (synopsis "Verbose logging level for Python's logging module")
     (description
@@ -856,14 +933,14 @@ add the log levels NOTICE, SPAM, SUCCESS and VERBOSE.")
 (define-public python-coloredlogs
   (package
     (name "python-coloredlogs")
-    (version "7.3")
+    (version "10.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "coloredlogs" version))
        (sha256
         (base32
-         "1blcann6dyg5dhps9pg12rn0q0rjrlajpmmil0gy0j4cbvnl2il9"))))
+         "0dkw6xp0r1dwgz4s2f58npx5nxfq51wf4l6qkm5ib27slgfs4sdq"))))
     (build-system python-build-system)
     (arguments
      `(;Tests require some updated modules
@@ -882,6 +959,27 @@ messages in color.")
 (define-public python2-coloredlogs
   (package-with-python2 python-coloredlogs))
 
+(define-public python-editorconfig
+  (package
+    (name "python-editorconfig")
+    (version "0.12.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "EditorConfig" version))
+       (sha256
+        (base32
+         "0v55z351p9qkyp3bbspwywwn28sbcknhirngjbj779n3z52z63hv"))))
+    (build-system python-build-system)
+    (home-page "https://editorconfig.org/")
+    (synopsis "EditorConfig bindings for python")
+    (description "The EditorConfig project consists of a file format for
+defining coding styles and a collection of text editor plugins that enable
+editors to read the file format and adhere to defined styles.  EditorConfig
+files are easily readable and they work nicely with version control systems.")
+    ;; "fnmatch.py" and "ini.py" are licensed under psfl, the rest is bsd-2.
+    (license (list license:bsd-2 license:psfl))))
+
 (define-public python-et-xmlfile
   (package
     (name "python-et-xmlfile")
@@ -988,14 +1086,14 @@ from the Python interpreter, or as a small part of a larger application.")
 (define-public python-six
   (package
     (name "python-six")
-    (version "1.11.0")
+    (version "1.12.0")
     (source
      (origin
       (method url-fetch)
       (uri (pypi-uri "six" version))
       (sha256
        (base32
-        "1scqzwc51c875z23phj48gircqjgnn3af8zy2izjwmnlxrxsgs3h"))))
+        "0wxs1q74v07ssjywbbm7x6h5v9qx209ld2yfsif4060sxi0h2sni"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -1059,13 +1157,13 @@ human-friendly syntax.")
 (define-public python-pandas
   (package
     (name "python-pandas")
-    (version "0.24.2")
+    (version "0.25.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "pandas" version))
        (sha256
-        (base32 "18imlm8xbhcbwy4wa957a1fkamrcb0z988z006jpfda3ki09z4ag"))))
+        (base32 "1gp2pvzdiakvgjmykdzdlzrsfbg4vjm49jjdl9s0ha0a3yfs34fa"))))
     (build-system python-build-system)
     (arguments
      `(#:modules ((guix build utils)
@@ -1128,10 +1226,22 @@ structures designed to make working with structured (tabular,
 multidimensional, potentially heterogeneous) and time series data both easy
 and intuitive.  It aims to be the fundamental high-level building block for
 doing practical, real world data analysis in Python.")
+    (properties `((python2-variant . ,(delay python2-pandas))))
     (license license:bsd-3)))
 
+;; Pandas 0.24.x are the last versions that support Python 2.
 (define-public python2-pandas
-  (package-with-python2 python-pandas))
+  (let ((pandas (package-with-python2
+                 (strip-python2-variant python-pandas))))
+    (package/inherit
+     pandas
+     (version "0.24.2")
+     (source (origin
+               (method url-fetch)
+               (uri (pypi-uri "pandas" version))
+               (sha256
+                (base32
+                 "18imlm8xbhcbwy4wa957a1fkamrcb0z988z006jpfda3ki09z4ag")))))))
 
 (define-public python2-mechanize
   (package
@@ -1201,14 +1311,14 @@ Python 3.3+.")
 (define-public python-pyicu
   (package
     (name "python-pyicu")
-    (version "2.2")
+    (version "2.3.1")
     (source
      (origin
       (method url-fetch)
       (uri (pypi-uri "PyICU" version))
       (sha256
        (base32
-        "0wq9y5fi1ighgf5aws9nr87vi1w44p7q1k83rx2y3qj5d2xyhspa"))))
+        "1x4w8m7ifki9z2a187pgjr33z6z0rp2fii9b73djak1vhm9v9cnx"))))
     (build-system python-build-system)
     (inputs
      `(("icu4c" ,icu4c)))
@@ -1480,6 +1590,27 @@ existing ones.")
                    ;; Tests don't work with python2.
                    #:tests? #f)))))
 
+(define-public python-poyo
+  (package
+    (name "python-poyo")
+    (version "0.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "poyo" version))
+       (sha256
+        (base32
+         "1pflivs6j22frz0v3dqxnvc8yb8fb52g11lqr88z0i8cg2m5csg2"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/hackebrot/poyo")
+    (synopsis "Lightweight YAML Parser for Python")
+    (description
+     "This package provides a lightweight YAML Parser for Python.  It supports
+only a chosen subset of the YAML format that is required to parse cookiecutter
+user configuration files.  It does not have support for serializing into YAML
+and is not compatible with JSON.")
+    (license license:expat)))
+
 (define-public scons
   (package
     (name "scons")
@@ -1657,14 +1788,14 @@ server.")
 (define-public python-py
   (package
     (name "python-py")
-    (version "1.5.4")
+    (version "1.8.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "py" version))
        (sha256
         (base32
-         "1xxvwfn82457djf55f5n2c94699rfqnk43br8fif2r2q8gvrmm9z"))))
+         "0lsy1gajva083pzc7csj1cvbmminb7b4l6a0prdzyb3fd829nqyw"))))
     (build-system python-build-system)
     (arguments
      ;; FIXME: "ImportError: 'test' module incorrectly imported from
@@ -1803,13 +1934,13 @@ files.")
 (define-public python-pyld
   (package
     (name "python-pyld")
-    (version "1.0.3")
+    (version "1.0.5")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "PyLD" version))
               (sha256
                (base32
-                "12i2g6xdj30k7xxcibg3sc5y76snwq8l6n8fy9lyi577kgy0h2pm"))))
+                "1ywbdbsrkg533qh8xn9ifjh2mvam6v5msrjyqq73jfpvcp89qvff"))))
     (build-system python-build-system)
     (home-page "https://github.com/digitalbazaar/pyld")
     (synopsis "Python implementation of the JSON-LD specification")
@@ -2082,13 +2213,13 @@ cutting and pasting that code over and over.")
 (define-public python-unidecode
   (package
     (name "python-unidecode")
-    (version "1.1.0")
+    (version "1.1.1")
     (source (origin
              (method url-fetch)
              (uri (pypi-uri "Unidecode" version))
              (sha256
               (base32
-               "00pi0czzwvbf7djhkkjyvimj60wqdx0llbddzfnax650g9b8yscc"))))
+               "1s6cp2lv4m0f00hjckjz8p6m7d3n3v16jvg353llf5ia1iqsnsib"))))
     (build-system python-build-system)
     (home-page "https://pypi.python.org/pypi/Unidecode")
     (synopsis "ASCII transliterations of Unicode text")
@@ -2106,14 +2237,14 @@ somewhat intelligible.")
 (define-public python-pyjwt
   (package
     (name "python-pyjwt")
-    (version "1.5.3")
+    (version "1.7.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "PyJWT" version))
        (sha256
         (base32
-         "1rxsg14i33vm2i6lz0my628108c81k43v10n4h3p0gx62xdyf2sh"))
+         "15hflax5qkw1v6nssk1r0wkj83jgghskcmn875m3wgvpzdvajncd"))
        (modules '((guix build utils)))
        (snippet
         '(begin
@@ -2201,13 +2332,13 @@ JavaScript-like message boxes.  Types of dialog boxes include:
   (package
     (name "python-pympler")
     (home-page "https://pythonhosted.org/Pympler/")
-    (version "0.5")
+    (version "0.7")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "Pympler" version))
               (sha256
                (base32
-                "03qwsbilqgvnbl3a1jmpgixbr2kq6m3fvdlzyr3wdp01bwlc85kx"))))
+                "0ki7bqp1h9l1xc2k1h4vjyzsgs20i8ingvcdhszyi72s28wyf4bs"))))
     (build-system python-build-system)
     (arguments
      `(#:phases (modify-phases %standard-phases
@@ -2404,6 +2535,30 @@ written in pure Python.")
 (define-public python2-jinja2
   (package-with-python2 python-jinja2))
 
+(define-public python-jinja2-time
+  (package
+    (name "python-jinja2-time")
+    (version "0.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "jinja2-time" version))
+       (sha256
+        (base32
+         "0h0dr7cfpjnjj8bgl2vk9063a53649pn37wnlkd8hxjy656slkni"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-arrow" ,python-arrow)
+       ("python-jinja2" ,python-jinja2)))
+    (home-page
+     "https://github.com/hackebrot/jinja2-time")
+    (synopsis "Jinja2 Extension for Dates and Times")
+    (description
+     "This package provides an extension for the template engine Jinja2.  It
+adds a 'now' tag providing a convenient access to the arrow.now() API from
+templates.  A format string can be provided to control the output.")
+    (license license:expat)))
+
 (define-public python-pystache
   (package
     (name "python-pystache")
@@ -2623,7 +2778,7 @@ to deprecate classes, functions or methods.")
 (define-public python-pygithub
   (package
     (name "python-pygithub")
-    (version "1.43.7")
+    (version "1.43.8")
     (source
      ;; We fetch from the Git repo because there are no tests in the PyPI
      ;; archive.
@@ -2634,8 +2789,7 @@ to deprecate classes, functions or methods.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32
-         "0ww92zz0ja9w6rw83vphmn8rwmcn6abg16j4q7zxjc0rrg2cfj9i"))))
+        (base32 "1625v558xga5mwhl9jqmibywy5qafmg1vqrirqz6zfq1la1d22mw"))))
     (build-system python-build-system)
     (arguments
      `(#:phases (modify-phases %standard-phases
@@ -2856,14 +3010,13 @@ receive files via the SCP1 protocol, as implemented by the OpenSSH
 (define-public python-rst.linker
   (package
     (name "python-rst.linker")
-    (version "1.10")
+    (version "1.11")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "rst.linker" version))
        (sha256
-        (base32
-         "0iqaacp7pj1s8avs4kc0qg0r7dscywaq37y6l9j14glqdikk0wdj"))))
+        (base32 "0pqsfqqx8h0pq21k8l3k62kznrgaj2ala93c64s4d9rpbr4mgkd2"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-dateutil" ,python-dateutil)
@@ -2984,44 +3137,39 @@ 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
-  (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
+  (package
+    (name "python-language-server")
+    (version "0.29.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "python-language-server" version))
+       (sha256
+        (base32
+         "1f8qlflh6j3s7qfmzhirpl8fgidl6f0qbakdmiml96wdxzvka0s3"))))
+    (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-flake8" ,python-flake8)
+       ("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
@@ -3252,11 +3400,39 @@ writing C extensions for Python as easy as Python itself.")
     (properties `((python2-variant . ,(delay python2-cython))))))
 
 (define-public python2-cython
-  (package (inherit (package-with-python2
-                     (strip-python2-variant python-cython)))
-    (name "python2-cython")
-    (inputs
-     `(("python-2" ,python-2))))) ; this is not automatically changed
+  (let ((base (package-with-python2 (strip-python2-variant python-cython))))
+    (package
+      (inherit base)
+      (name "python2-cython")
+      (inputs
+       `(("python-2" ,python-2)))       ;this is not automatically changed
+      (arguments
+       (substitute-keyword-arguments (package-arguments base)
+         ((#:phases phases)
+          `(modify-phases ,phases
+             (add-before 'check 'adjust-test_embed
+               (lambda _
+                 (substitute* "runtests.py"
+                   ;; test_embed goes great lengths to find the static libpythonX.Y.a
+                   ;; so it can give the right -L flag to GCC when embedding static
+                   ;; builds of Python.  It is unaware that the Python "config"
+                   ;; directory (where the static library lives) was renamed in
+                   ;; Python 3, and falls back to sysconfig.get_config_var('LIBDIR'),
+                   ;; which works fine, because that is where the shared library is.
+                   ;;
+                   ;; It also appears to be unaware that the Makefile in Demos/embed
+                   ;; already unconditionally pass the static library location to GCC,
+                   ;; after checking sysconfig.get_config_var('LIBPL).
+                   ;;
+                   ;; The effect is that the linker is unable to resolve libexpat
+                   ;; symbols when building for Python 2, because neither the Python 2
+                   ;; shared library nor Expat is available.   To fix it, we can either
+                   ;; add Expat as an input and make it visible to the linker, or just
+                   ;; prevent it from overriding the Python shared library location.
+                   ;; The end result is identical, so we take the easy route.
+                   ((" or libname not in os\\.listdir\\(libdir\\)")
+                    ""))
+                 #t)))))))))
 
 ;; The RPython toolchain currently does not support Python 3.
 (define-public python2-rpython
@@ -3286,7 +3462,7 @@ between language specification and implementation aspects.")
 (define-public python-numpy
   (package
     (name "python-numpy")
-    (version "1.15.4")
+    (version "1.17.3")
     (source
      (origin
        (method url-fetch)
@@ -3295,7 +3471,7 @@ between language specification and implementation aspects.")
              version "/numpy-" version ".tar.gz"))
        (sha256
         (base32
-         "102vcl2qq4pjbm7a3d67vkkvn4466ngia1d8wi5avqwqh8j0jvkn"))))
+         "1ak9dmjja0q90a7fsxli51ypcwssh8c4pb6f8wkrsnf2xgdk6dy9"))))
     (build-system python-build-system)
     (inputs
      `(("openblas" ,openblas)
@@ -3360,10 +3536,24 @@ with Python.  It contains among other things: a powerful N-dimensional array
 object, sophisticated (broadcasting) functions, tools for integrating C/C++
 and Fortran code, useful linear algebra, Fourier transform, and random number
 capabilities.")
+    (properties `((python2-variant . ,(delay python2-numpy))))
     (license license:bsd-3)))
 
+;; Numpy 1.16.x are the last versions that support Python 2.
 (define-public python2-numpy
-  (package-with-python2 python-numpy))
+  (let ((numpy (package-with-python2
+                (strip-python2-variant python-numpy))))
+    (package/inherit
+     numpy
+      (version "1.16.5")
+      (source (origin
+                (method url-fetch)
+                (uri (string-append
+                      "https://github.com/numpy/numpy/releases/download/v"
+                      version "/numpy-" version ".tar.gz"))
+                (sha256
+                 (base32
+                  "0lg1cycxzi4rvvrd5zxinpdz0ni792fpx6xjd75z1923zcac8qrb")))))))
 
 ;; NOTE: NumPy 1.8 is packaged only for Python 2 because it is of
 ;; interest only for legacy code going back to NumPy's predecessor
@@ -3773,7 +3963,7 @@ To address this and enable easy cycling over arbitrary @code{kwargs}, the
 (define-public python-colorspacious
   (package
     (name "python-colorspacious")
-    (version "1.1.0")
+    (version "1.1.2")
     (source
      (origin
        (method git-fetch)
@@ -3782,7 +3972,7 @@ To address this and enable easy cycling over arbitrary @code{kwargs}, the
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0g0lxqiscy5g5rq9421vv7abg0c90jzy0zmas2z3hya6k2dr5aid"))))
+        (base32 "0x7nkphr6g5ql5fvgss8l56rgiyjgh6fm8zzs73i94ci9wzlm63w"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-numpy" ,python-numpy)))
@@ -3806,14 +3996,14 @@ convert between colorspaces like sRGB, XYZ, CIEL*a*b*, CIECAM02, CAM02-UCS, etc.
 (define-public python-matplotlib
   (package
     (name "python-matplotlib")
-    (version "3.1.1")
+    (version "3.1.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "matplotlib" version))
        (sha256
         (base32
-         "14qc109dibp32xfd9lah54djc0rc76fhbsj9cwyb328lzqmd5sqz"))))
+         "1nmshfqh7wyg15i16hx1yiylcvzkws29ivn66n3i0wyqwcpjr3lf"))))
     (build-system python-build-system)
     (propagated-inputs ; the following packages are all needed at run time
      `(("python-cycler" ,python-cycler)
@@ -3878,8 +4068,14 @@ convert between colorspaces like sRGB, XYZ, CIEL*a*b*, CIECAM02, CAM02-UCS, etc.
              (for-each delete-file
                        ;; test_normal_axes, test_get_tightbbox_polar
                        '("lib/matplotlib/tests/test_axes.py"
+                         ;; We don't use the webagg backend and this test forces it.
+                         "lib/matplotlib/tests/test_backend_webagg.py"
                          ;; test_outward_ticks
                          "lib/matplotlib/tests/test_tightlayout.py"
+                         ;; test_hidden_axes fails with minor extent
+                         ;; differences, possibly due to the use of a
+                         ;; different version of FreeType.
+                         "lib/matplotlib/tests/test_constrainedlayout.py"
                          ;; Fontconfig returns no fonts.
                          "lib/matplotlib/tests/test_font_manager.py"))
              #t))
@@ -3897,7 +4093,7 @@ convert between colorspaces like sRGB, XYZ, CIEL*a*b*, CIECAM02, CAM02-UCS, etc.
            (lambda* (#:key outputs inputs #:allow-other-keys)
              (add-installed-pythonpath inputs outputs)
              (invoke "python" "tests.py" "-v"
-                     "-m" "not network")))
+                     "-m" "not network and not webagg")))
          (add-before 'build 'configure-environment
            (lambda* (#:key outputs inputs #:allow-other-keys)
              (let ((cairo (assoc-ref inputs "cairo")))
@@ -3914,7 +4110,7 @@ tests = True~%"
                         (assoc-ref inputs "tcl")
                         (assoc-ref inputs "tk")))))
              #t)))))
-    (home-page "http://matplotlib.org")
+    (home-page "https://matplotlib.org/")
     (synopsis "2D plotting library for Python")
     (description
      "Matplotlib is a Python 2D plotting library which produces publication
@@ -3929,14 +4125,29 @@ toolkits.")
   (let ((matplotlib (package-with-python2
                      (strip-python2-variant python-matplotlib))))
     (package (inherit matplotlib)
-      (version "2.2.3")
+      (version "2.2.4")
       (source
        (origin
          (method url-fetch)
          (uri (pypi-uri "matplotlib" version))
          (sha256
           (base32
-           "1rcc7x9ig3hpchkc4cwdvym3y451w74275fxr455zkfagrsvymbk"))))
+           "09i1gnrra1590brc1f8d5rh2zvnknmfgzp613ab0462qkrwj15h2"))))
+      (arguments
+       (substitute-keyword-arguments (package-arguments matplotlib)
+         ((#:phases phases)
+          `(modify-phases ,phases
+             (replace 'install-jquery-ui
+               (lambda* (#:key outputs inputs #:allow-other-keys)
+                 (let ((dir (string-append (assoc-ref outputs "out")
+                                           "/lib/python2.7/site-packages/"
+                                           "matplotlib/backends/web_backend/")))
+                   (mkdir-p dir)
+                   (invoke "unzip"
+                           (assoc-ref inputs "jquery-ui")
+                           "-d" dir))
+                 #t))
+             (delete 'check))))) ; These tests weren't run the the past.
       ;; Make sure to use special packages for Python 2 instead
       ;; of those automatically rewritten by package-with-python2.
       (propagated-inputs
@@ -3960,6 +4171,7 @@ 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)
@@ -4037,7 +4249,12 @@ 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
@@ -4098,14 +4315,13 @@ operators such as union, intersection, and difference.")
 (define-public python-scipy
   (package
     (name "python-scipy")
-    (version "1.3.1")
+    (version "1.3.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "scipy" version))
        (sha256
-        (base32
-         "1df113c9i6vazsn6y3n9wc22jh737z1g7dmx3mypkdwpdnscyhr6"))))
+        (base32 "192d8dsybvhv19igkrsafbdafx198nz7pibkjgrqjhlr66s3jfd0"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-numpy" ,python-numpy)
@@ -4243,17 +4459,46 @@ as the original project seems to have been abandoned circa 2007.")
 (define-public python2-socksipy-branch
   (package-with-python2 python-socksipy-branch))
 
+(define-public python-socksipychain
+  (package
+    (name "python-socksipychain")
+    (version "2.0.15")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/pagekite/PySocksipyChain.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "1pkljnh9hfwla8sg7mil4f9zrnsqj0dbhr3crxjw3k8dnjz70dvk"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:tests? #f)) ; Tests try to access the network.
+    (home-page "http://pagekite.net/wiki/Floss/PySocksipyChain/")
+    (synopsis "Python SOCKS module with chained proxies support")
+    (description
+     "SocksiPyChain is a modified version of the SocksiPy SOCKS module, which
+adds support for arbitrary chaining of proxy servers and various modes of
+TLS/SSL encryption.  It was developed for use in PageKite, and also includes
+a simple netcat replacement with chaining support.")
+    (license license:bsd-3)))
+
+(define-public python2-socksipychain
+  (package-with-python2 python-socksipychain))
+
 (define-public python-pycodestyle
   (package
     (name "python-pycodestyle")
-    (version "2.4.0")
+    (version "2.5.0")
     (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "pycodestyle" version))
-        (sha256
-          (base32
-            "0fhy4vnlgpjq4qd1wdnl6pvdw7rah0ypmn8c9mkhz8clsndskz6b"))))
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "pycodestyle" version))
+       (sha256
+        (base32
+         "0v4prb05n21bm8650v0a01k1nyqjdmkrsm3zycfxh2j5k9n962p4"))))
     (build-system python-build-system)
     (home-page "https://pycodestyle.readthedocs.io/")
     (synopsis "Python style guide checker")
@@ -4915,13 +5160,13 @@ child application and control it as if a human were typing commands.")
 (define-public python-setuptools-scm
   (package
     (name "python-setuptools-scm")
-    (version "3.1.0")
+    (version "3.2.0")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "setuptools_scm" version))
               (sha256
                (base32
-                "0h4bglwfz8b9prqljv8z3w9rgydfyxzaj05bm1y6zs5m6shz548i"))))
+                "0n3knn3p1sqlx31k2lahn7z9bacvlv8nhlfidj77vz50bxqlgasj"))))
     (build-system python-build-system)
     (home-page "https://github.com/pypa/setuptools_scm/")
     (synopsis "Manage Python package versions in SCM metadata")
@@ -4931,6 +5176,18 @@ child application and control it as if a human were typing commands.")
 them as the version argument or in a SCM managed file.")
     (license license:expat)))
 
+;; Needed by python-lazy-object-proxy, remove on next update cycle.
+(define-public python-setuptools-scm-3.3
+  (package
+    (inherit python-setuptools-scm)
+    (version "3.3.3")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "setuptools_scm" version))
+              (sha256
+               (base32
+                "19cyndx23xmpbhz4qrwmfwsmnnaczd0dw7qg977ksq2dbvxy29dx"))))))
+
 (define-public python2-setuptools-scm
   (package-with-python2 python-setuptools-scm))
 
@@ -4960,14 +5217,13 @@ older Python versions.")
 (define-public python-importlib-metadata
   (package
     (name "python-importlib-metadata")
-    (version "0.18")
+    (version "0.23")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "importlib_metadata" version))
        (sha256
-        (base32
-         "1nqj6vj2z4byi8flzf2lbldhqgicsz9mkpv4k69kjd8p8qxy4vnb"))))
+        (base32 "09mdqdfv5rdrwz80jh9m379gxmvk2vhjfz0fg53hid00icvxf65a"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-configparser" ,python-configparser)
@@ -5021,13 +5277,13 @@ releases.")
 (define-public python-pathpy
   (package
     (name "python-pathpy")
-    (version "11.5.0")
+    (version "11.5.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "path.py" version))
        (sha256
-        (base32 "1jxkf91syzxlpiwgm83fjfz1m5xh3jrvv4iyl5wjsnkk599pls5n"))))
+        (base32 "0ir9j1haq2jbi7aip6k2fa9l7q1l03k4hp1awxhjhcwzsnwp3ll8"))))
     (outputs '("out" "doc"))
     (build-system python-build-system)
     (propagated-inputs
@@ -5131,14 +5387,14 @@ away.")
 (define-public python-traitlets
   (package
     (name "python-traitlets")
-    (version "4.3.2")
+    (version "4.3.3")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "traitlets" version))
        (sha256
         (base32
-         "0dbq7sx26xqz5ixs711k5nc88p8a0nqyz6162pwks5dpcz9d4jww"))))
+         "1xsrwgivpkxlbr4dfndfsi098s29yqgswgjc1qqn69yxklvfw8yh"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -5146,7 +5402,7 @@ away.")
          (replace 'check (lambda _ (invoke "pytest" "-vv" "traitlets"))))))
     (propagated-inputs
      `(("python-ipython-genutils" ,python-ipython-genutils)
-       ("python-decorator" ,python-decorator)))    ;not needed for >4.3.2
+       ("python-decorator" ,python-decorator)))
     (native-inputs
      `(("python-pytest" ,python-pytest)))
     (properties `((python2-variant . ,(delay python2-traitlets))))
@@ -5241,13 +5497,13 @@ installing @code{kernelspec}s for use with Jupyter frontends.")
 (define-public python-ipykernel
   (package
     (name "python-ipykernel")
-    (version "5.1.1")
+    (version "5.1.3")
     (source
      (origin
       (method url-fetch)
       (uri (pypi-uri "ipykernel" version))
       (sha256
-       (base32 "173nm29g85w8cac3fg40b27qaq26g41wgg6qn79ql1hq4w2n5sgh"))))
+       (base32 "1a08y677lpn80qzvv7z0smgggmr5m5ayf0bs6vds47xpxl9sss5k"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -5272,8 +5528,9 @@ installing @code{kernelspec}s for use with Jupyter frontends.")
        ;; imported at runtime during connect
        ("python-jupyter-client" ,python-jupyter-client)))
     (native-inputs
-     `(("python-pytest" ,python-pytest)
-       ("python-nose" ,python-nose)))
+     `(("python-flaky" ,python-flaky)
+       ("python-nose" ,python-nose)
+       ("python-pytest" ,python-pytest)))
     (home-page "https://ipython.org")
     (synopsis "IPython Kernel for Jupyter")
     (description
@@ -5427,13 +5684,13 @@ computing.")
 (define-public python-ipython
   (package
     (name "python-ipython")
-    (version "7.5.0")
+    (version "7.9.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "ipython" version ".tar.gz"))
        (sha256
-        (base32 "09mbxq37mfn88xjnib7qfzaq9krr7gf1jxwy1p6mcjr254082h78"))))
+        (base32 "103jkw18z7fnwdal1mdbijjxi1fndzn31g887lmj7ddpf2r07lyz"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-backcall" ,python-backcall)
@@ -5693,27 +5950,15 @@ parsing (browser/HTTP) user agent strings.")
 (define-public python-dbus
   (package
     (name "python-dbus")
-    (version "1.2.8")
+    (version "1.2.10")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://dbus.freedesktop.org/releases/dbus-python/"
                            "dbus-python-" version ".tar.gz"))
        (sha256
-        (base32
-         "0vvvjmiwnc9cjlks3gcdk43ap7llhlpz7cm1wbw0nc2yfsxjpwdb"))))
+        (base32 "11nqk01iq5bx2llgb3ksknyinijdp29w4ndj210glm009ayjncyl"))))
     (build-system gnu-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (add-before
-          'check 'pre-check
-          (lambda _
-            ;; XXX: For the missing '/etc/machine-id'.
-            (substitute* "test/run-test.sh"
-              (("DBUS_FATAL_WARNINGS=1")
-               "DBUS_FATAL_WARNINGS=0"))
-            #t)))))
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (inputs
@@ -5766,15 +6011,20 @@ the GObject Introspection bindings to libnotify for non-GTK applications.")
 (define-public python-lxml
   (package
     (name "python-lxml")
-    (version "4.2.5")
+    (version "4.4.1")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "lxml" version))
         (sha256
          (base32
-          "0zw0y9hs0nflxhl9cs6ipwwh53szi3w2x06wl0k9cylyqac0cwin"))))
+          "14jnpfcpgqr9sx8ppd286jzcbk0b36hbqsvd8jkvffipzw5v8768"))))
     (build-system python-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (replace 'check
+                    (lambda _
+                      (invoke "make" "test"))))))
     (inputs
       `(("libxml2" ,libxml2)
         ("libxslt" ,libxslt)))
@@ -5837,14 +6087,14 @@ converts incoming documents to Unicode and outgoing documents to UTF-8.")
 (define-public python-soupsieve
   (package
     (name "python-soupsieve")
-    (version "1.9.2")
+    (version "1.9.5")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "soupsieve" version))
        (sha256
         (base32
-         "0in9rc9q3h8w5b4qf7kvl3qxcvw6vrz35ckblchgf70hm6pg3dbj"))))
+         "1nhd0q0ifwva9wn645s6pn74p1rd97asn3qfg75nphx1wkgcbhg2"))))
     (build-system python-build-system)
     (arguments `(#:tests? #f))
     ;;XXX: 2 tests fail currently despite claming they were to be
@@ -5923,23 +6173,15 @@ of the structure, dynamics, and functions of complex networks.")
 (define-public python-datrie
   (package
     (name "python-datrie")
-    (version "0.7.1")
+    (version "0.8")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "datrie" version))
        (sha256
         (base32
-         "08r0if7dry2q7p34gf7ffyrlnf4bdvnprxgydlfxgfnvq8f3f4bs"))))
+         "0338r8xgmpy78556jhms0h6qkvyjr10p8bpgdvcpqzm9lrmxmmdx"))))
     (build-system python-build-system)
-    (arguments
-     `(#:phases (modify-phases %standard-phases
-                  (add-before 'build 'cythonize
-                    (lambda _
-                      ;; Regenerate Cython classes to solve ABI issues with Python
-                      ;; 3.7.0.  See <https://github.com/pytries/datrie/issues/52>.
-                      (invoke "cython" "src/datrie.pyx" "src/cdatrie.pxd"
-                              "src/stdio_ext.pxd" "-a"))))))
     (native-inputs
      `(("python-cython" ,python-cython)
        ("python-hypothesis" ,python-hypothesis)
@@ -5955,13 +6197,13 @@ Python.")
 (define-public snakemake
   (package
     (name "snakemake")
-    (version "5.2.4")
+    (version "5.7.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "snakemake" version))
        (sha256
-        (base32 "0gj0xxgiq3mp9qyyrbfzldiaq1giliqw0in64nqiz7vx49myqj7z"))))
+        (base32 "1pnpvvn8n2a78cg360wz3ldmpqrsm2wzi0c0dmvki9fnsw6fxdas"))))
     (build-system python-build-system)
     (arguments
      ;; TODO: Package missing test dependencies.
@@ -5979,18 +6221,19 @@ Python.")
                                "/bin/snakemake")))
              #t)))))
     (propagated-inputs
-     `(("python-gitpython" ,python-gitpython)
-       ("python-wrapt" ,python-wrapt)
-       ("python-requests" ,python-requests)
-       ("python-appdirs" ,python-appdirs)
+     `(("python-appdirs" ,python-appdirs)
        ("python-configargparse" ,python-configargparse)
        ("python-datrie" ,python-datrie)
        ("python-docutils" ,python-docutils)
+       ("python-gitpython" ,python-gitpython)
        ("python-jinja2" ,python-jinja2)
        ("python-jsonschema" ,python-jsonschema)
        ("python-networkx" ,python-networkx)
+       ("python-psutil" ,python-psutil)
        ("python-pyyaml" ,python-pyyaml)
-       ("python-ratelimiter" ,python-ratelimiter)))
+       ("python-ratelimiter" ,python-ratelimiter)
+       ("python-requests" ,python-requests)
+       ("python-wrapt" ,python-wrapt)))
     (home-page "https://snakemake.readthedocs.io")
     (synopsis "Python-based execution environment for make-like workflows")
     (description
@@ -5999,24 +6242,6 @@ providing a clean and modern domain specific specification language (DSL) in
 Python style, together with a fast and comfortable execution environment.")
     (license license:expat)))
 
-;; This is currently needed for the pigx-* packages.
-(define-public snakemake-4
-  (package (inherit snakemake)
-    (version "4.4.0")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (pypi-uri "snakemake" version))
-       (sha256
-        (base32 "0g0paia4z7w3srnqdmavq3hrb2x7qnpf81jx50njl0p7y4y0j8jv"))))
-    (propagated-inputs
-     `(("python-wrapt" ,python-wrapt)
-       ("python-requests" ,python-requests)
-       ("python-appdirs" ,python-appdirs)
-       ("python-configargparse" ,python-configargparse)
-       ("python-pyyaml" ,python-pyyaml)
-       ("python-ratelimiter" ,python-ratelimiter)))))
-
 (define-public python-pyqrcode
   (package
     (name "python-pyqrcode")
@@ -6046,7 +6271,19 @@ SVG, EPS, PNG and terminal output.")
        (method url-fetch)
        (uri (pypi-uri "seaborn" version))
        (sha256
-        (base32 "0bqysi3fxfjl1866m5jq8z7mynhqbqnikim74dmzn8539iwkzj3n"))))
+        (base32 "0bqysi3fxfjl1866m5jq8z7mynhqbqnikim74dmzn8539iwkzj3n"))
+       (patches
+        (list (origin
+                (method url-fetch)
+                ;; This has already been merged, but there is no new
+                ;; release including this patch.  It fixes problems
+                ;; with axis rotation that would lead to test
+                ;; failures.
+                (uri "https://patch-diff.githubusercontent.com/raw/mwaskom/seaborn/pull/1716.diff")
+                (sha256
+                 (base32
+                  "1lm870z316n9ivsyr86hpk1gxaraw0mrjvq42lqsm0znhjdp9q9w"))
+                (file-name "seaborn-0.9.0-axis-rotation.patch"))))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -6059,6 +6296,12 @@ SVG, EPS, PNG and terminal output.")
                (system (format #f "~a/bin/Xvfb :1 &" xorg-server))
                (setenv "DISPLAY" ":1")
                #t)))
+         (add-after 'unpack 'fix-tests
+           (lambda _
+             ;; test_cbar_ticks fails probably because of matplotlib's
+             ;; expectation of using an older version of FreeType.
+             (delete-file "seaborn/tests/test_matrix.py")
+             #t))
          (replace 'check (lambda _ (invoke "pytest" "seaborn") #t)))))
     (propagated-inputs
      `(("python-pandas" ,python-pandas)
@@ -6067,7 +6310,7 @@ SVG, EPS, PNG and terminal output.")
        ("python-scipy" ,python-scipy)))
     (native-inputs
      `(("python-pytest" ,python-pytest)
-       ("xorg-server" ,xorg-server)))
+       ("xorg-server" ,xorg-server-for-tests)))
     (home-page "http://stanford.edu/~mwaskom/software/seaborn/")
     (synopsis "Statistical data visualization")
     (description
@@ -6413,7 +6656,8 @@ applications.")
         (uri (pypi-uri "pep8" version))
         (sha256
           (base32
-            "002rkl4lsn6x2mxmf8ar00l0m8i3mzrc6pnzz77blyksmpsxa4x1"))))
+           "002rkl4lsn6x2mxmf8ar00l0m8i3mzrc6pnzz77blyksmpsxa4x1"))
+        (patches (search-patches "python-pep8-stdlib-tokenize-compat.patch"))))
     (build-system python-build-system)
     (home-page "https://pep8.readthedocs.org/")
     (synopsis "Python style guide checker")
@@ -6428,14 +6672,14 @@ PEP 8.")
 (define-public python-pyflakes
   (package
     (name "python-pyflakes")
-    (version "2.0.0")
+    (version "2.1.1")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "pyflakes" version))
         (sha256
           (base32
-            "0jba28czyvimdc72llms3f17swp3i8jdcabf5w0j00adfbn64xls"))))
+            "18pq95a1xj2dgdd0m85gyfsn40jajj4xc3lp8wfv7igqhrc86xnr"))))
     (build-system python-build-system)
     (home-page
       "https://github.com/pyflakes/pyflakes")
@@ -6524,35 +6768,20 @@ complexity of Python source code.")
 (define-public python2-pyflakes-0.8.1
   (package-with-python2 python-pyflakes-0.8.1))
 
-;; This package is used by hypothesis which has thousands of dependent packages.
-;; FIXME: Consolidate this with "python-flake8" below in the next rebuild cycle.
-(define-public python-flake8-3.5
+(define-public python-flake8
   (package
     (name "python-flake8")
-    (version "3.5.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "flake8" version))
-        (sha256
-          (base32
-            "184b33grvvjmiwlv9kyd7yng9qv5ld24154j70z332xxg9gjclvj"))))
+    (version "3.7.7")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "flake8" version))
+              (sha256
+               (base32
+                "0qg6zggqigrd4k3gv88shd1a27d0cwgfql8vfiq2c7rl7w3rd6c5"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         ;; Two errors don't seem to have assigned codes.
-         (add-after 'unpack 'delete-broken-test
-           (lambda _ (delete-file "tests/unit/test_pyflakes_codes.py") #t))
-         (add-after 'unpack 'fix-problem-with-pycodestyle
-           (lambda _
-             ;; See https://gitlab.com/pycqa/flake8/merge_requests/230
-             ;; This should no longer be needed with the next release.
-             (substitute* "setup.py"
-               (("PEP8_PLUGIN\\('break_around_binary_operator'\\),")
-                "PEP8_PLUGIN('break_after_binary_operator'),\
-PEP8_PLUGIN('break_before_binary_operator'),"))
-             #t))
          (delete 'check)
          (add-after 'install 'check
            (lambda* (#:key inputs outputs #:allow-other-keys)
@@ -6561,6 +6790,7 @@ PEP8_PLUGIN('break_before_binary_operator'),"))
              #t)))))
     (propagated-inputs
      `(("python-pycodestyle" ,python-pycodestyle)
+       ("python-entrypoints" ,python-entrypoints)
        ("python-pyflakes" ,python-pyflakes)
        ("python-mccabe" ,python-mccabe)))
     (native-inputs
@@ -6572,45 +6802,18 @@ PEP8_PLUGIN('break_before_binary_operator'),"))
       "The modular source code checker: pep8, pyflakes and co")
     (description
       "Flake8 is a wrapper around PyFlakes, pep8 and python-mccabe.")
-    (properties `((python2-variant . ,(delay python2-flake8-3.5))))
+    (properties `((python2-variant . ,(delay python2-flake8))))
     (license license:expat)))
 
-(define-public python2-flake8-3.5
-  (let ((base (package-with-python2 (strip-python2-variant python-flake8-3.5))))
+(define-public python2-flake8
+  (let ((base (package-with-python2 (strip-python2-variant python-flake8))))
     (package (inherit base)
       (propagated-inputs
        `(("python2-configparser" ,python2-configparser)
          ("python2-enum34" ,python2-enum34)
+         ("python2-typing" ,python2-typing)
           ,@(package-propagated-inputs base))))))
 
-;; Version 3.5.0 has compatibility issues with Pyflakes 2.0, so we need
-;; this newer version.  Keep it as a separate variable for now to avoid
-;; rebuilding "python-hypothesis"; this should be removed in the next
-;; rebuild cycle.
-(define-public python-flake8
-  (package
-    (inherit python-flake8-3.5)
-    (version "3.6.0")
-    (source (origin
-              (method url-fetch)
-              (uri (pypi-uri "flake8" version))
-              (sha256
-               (base32
-                "0w0nprx22rbvrrkbfx9v5jc5gskbm08g219l7r8wai8zfswgadba"))))
-    (arguments
-     (substitute-keyword-arguments (package-arguments python-flake8-3.5)
-       ((#:phases phases)
-        `(modify-phases ,phases
-           (delete 'delete-broken-test)
-           (delete 'fix-problem-with-pycodestyle)))))
-    (properties `((python2-variant . ,(delay python2-flake8))))))
-
-(define-public python2-flake8
-  (let ((base (package-with-python2 (strip-python2-variant python-flake8))))
-    (package (inherit base)
-             (propagated-inputs
-              (package-propagated-inputs python2-flake8-3.5)))))
-
 ;; python-hacking requires flake8 <2.6.0.
 (define-public python-flake8-2.5
   (package
@@ -6654,6 +6857,12 @@ PEP8_PLUGIN('break_before_binary_operator'),"))
        (modify-phases %standard-phases
          (replace 'check
            (lambda _
+             ;; Be compatible with Pytest 4:
+             ;; https://gitlab.com/pycqa/flake8-polyfill/merge_requests/7
+             (substitute* "setup.cfg"
+               (("\\[pytest\\]")
+                "[tool:pytest]"))
+
              (setenv "PYTHONPATH"
                      (string-append (getcwd) "/build/lib:"
                                     (getenv "PYTHONPATH")))
@@ -6787,12 +6996,16 @@ pseudo terminal (pty), and interact with both the process and its pty.")
                ;; lines, but the test expects a single line...
                (("env\\['COLUMNS'\\] = '80'")
                 "env['COLUMNS'] = '160'"))
+
+             (substitute* "Makefile"
+               ;; Recent versions of python-coverage have caused the test
+               ;; coverage to decrease (as of version 0.7).  Allow that.
+               (("--fail-under=100")
+                "--fail-under=90"))
+
              #t))
-         (delete 'check)
-         (add-after 'install 'check
+         (replace 'check
            ;; The test phase uses the built library and executable.
-           ;; It's easier to run it after install since the build
-           ;; directory contains version-specific PATH.
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (add-installed-pythonpath inputs outputs)
              (setenv "PATH" (string-append (getenv "PATH") ":"
@@ -6838,13 +7051,13 @@ add functionality and customization to your projects with their own plugins.")
 (define-public python-fonttools
   (package
     (name "python-fonttools")
-    (version "3.28.0")
+    (version "3.38.0")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "fonttools" version ".zip"))
               (sha256
                (base32
-                "0vsvjhidpb5kywpjgz1j3fywzkddxkb0afqai18qa3h6lqjyxwpb"))))
+                "12ripk3s7skgxr1bs9r8n13r94ym3s8iir7ivfixls9fa4dabmlh"))))
     (build-system python-build-system)
     (native-inputs
      `(("unzip" ,unzip)
@@ -7100,21 +7313,23 @@ Supported netlink families and protocols include:
 (define-public python-xlrd
   (package
     (name "python-xlrd")
-    (version "1.0.0")
+    (version "1.2.0")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "xlrd" version))
               (sha256
                (base32
-                "0s8hjiz01vbhy85xalrz0qlsmd9ypf36zjqrf97hh984spapvy0g"))))
+                "1ci93fda4n67qhdvfl16zasyxrpygzk53hs6m8z0rd4dxrnb6vjl"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         ;; Current test in setup.py does not work as of 1.0.0, so use nose to
-         ;; run tests instead for now.
-         (replace 'check (lambda _ (invoke "nosetests"))))))
-    (native-inputs `(("python-nose"       ,python-nose)))
+         ;; Some tests depend on writing a temporary file to the user's home
+         ;; directory.
+         (add-after 'unpack 'fix-tests
+           (lambda _
+             (delete-file "tests/test_open_workbook.py")
+             #t)))))
     (home-page "http://www.python-excel.org/")
     (synopsis "Library for extracting data from Excel files")
     (description "This package provides a library to extract data from
@@ -7641,20 +7856,21 @@ Jupyter Notebook format and Python APIs for working with notebooks.")
 (define-public python-bleach
   (package
     (name "python-bleach")
-    (version "1.4.3")
+    (version "3.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "bleach" version))
        (sha256
         (base32
-         "0jvg3jxrvnx7xmm9gj262v60ib452xlnwlb0navyp7jsvcd0d4qj"))))
+         "1yhrgrhkln8bd6gn3imj69g1h4xqah9gaz9q26crqr6gmmvpzprz"))))
     (build-system python-build-system)
     (propagated-inputs
-     `(("python-html5lib" ,python-html5lib-0.9)
+     `(("python-webencodings" ,python-webencodings)
        ("python-six" ,python-six)))
     (native-inputs
-     `(("python-nose" ,python-nose)))
+     `(("python-pytest" ,python-pytest)
+       ("python-pytest-runner" ,python-pytest-runner-2)))
     (home-page "https://github.com/jsocol/bleach")
     (synopsis "Whitelist-based HTML-sanitizing tool")
     (description "Bleach is an easy whitelist-based HTML-sanitizing tool.")
@@ -7993,6 +8209,45 @@ Jupyter kernels such as IJulia and IRKernel.")
 support for rich media output.")
     (license license:bsd-3)))
 
+(define-public python-jsbeautifier
+  (package
+    (name "python-jsbeautifier")
+    (version "1.10.2")
+    (home-page "https://github.com/beautify-web/js-beautify")
+    (source (origin
+             (method git-fetch)
+             (uri (git-reference
+                   (url home-page)
+                   (commit (string-append "v" version))))
+             (file-name (git-file-name name version))
+             (sha256
+              (base32
+               "0wawb070ki1axb3jc9xvsrgpji52vcfif3zmjzc3z4g98m5xw4kg"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'chdir
+                    (lambda _
+                      ;; The upstream Git repository contains all the code,
+                      ;; but this package only builds the python code.
+                      (chdir "python")
+                      #t))
+                  (add-after 'unpack 'patch-python-six-requirements
+                    (lambda _
+                      (substitute* "python/setup.py"
+                        (("six>=1.12.0")
+                         "six>=1.11.0"))
+                      #t)))))
+    (propagated-inputs
+     `(("python-editorconfig" ,python-editorconfig)
+       ("python-six" ,python-six)))
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
+    (synopsis "JavaScript unobfuscator and beautifier")
+    (description "Beautify, unpack or deobfuscate JavaScript, leveraging
+popular online obfuscators.")
+    (license license:expat)))
+
 (define-public jupyter
   (package
     (name "jupyter")
@@ -8042,6 +8297,8 @@ simulation, statistical modeling, machine learning and much more.")
        ("python-pytest" ,python-pytest)
        ("python-pytest-runner" ,python-pytest-runner)))
     (build-system python-build-system)
+    ;; XXX: Incompatible with Pytest 4: <https://github.com/chardet/chardet/issues/173>.
+    (arguments `(#:tests? #f))
     (home-page "https://github.com/chardet/chardet")
     (synopsis "Universal encoding detector for Python 2 and 3")
     (description
@@ -8288,13 +8545,13 @@ tables.")
 (define-public python-atomicwrites
   (package
     (name "python-atomicwrites")
-    (version "1.1.5")
+    (version "1.3.0")
     (source (origin
              (method url-fetch)
              (uri (pypi-uri "atomicwrites" version))
              (sha256
               (base32
-               "11bm90fwm2avvf4f3ib8g925w7jr4m11vcsinn1bi6ns4bm32214"))))
+               "19ngcscdf3jsqmpcxn6zl5b6anmsajb6izp1smcd1n02midl9abm"))))
     (build-system python-build-system)
     (synopsis "Atomic file writes in Python")
     (description "Library for atomic file writes using platform dependent tools
@@ -8512,6 +8769,9 @@ with a new public API, and RPython support.")
     (arguments
      '(#:phases
        (modify-phases %standard-phases
+        (add-before 'install 'set-HOME
+          (lambda _
+            (setenv "HOME" "/tmp")))
          (replace 'check
            (lambda _
              ;; Tests require write access to HOME.
@@ -8607,11 +8867,14 @@ otherwise matches 3.2’s API.")
          (base32
           "0rdjmmsab550kxsssdq49jcniz77zlkpw4pvi9hvib3lsskjmh4y"))))
     (build-system python-build-system)
-    (arguments `(#:python ,python-2
-                 ;; FIXME: Python 2.7.14 moved the test.support library,
-                 ;; but our package has not yet been adjusted.  Enable
-                 ;; tests when the python2 package has been fixed.
-                 #:tests? #f))
+    (arguments
+     `(#:python ,python-2
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (invoke "python" "test_futures.py")
+             #t)))))
     (home-page "https://github.com/agronholm/pythonfutures")
     (synopsis
      "Backport of the concurrent.futures package from Python 3.2")
@@ -8725,14 +8988,14 @@ library as well as on the command line.")
 (define-public python-pluggy
   (package
    (name "python-pluggy")
-   (version "0.7.1")
+   (version "0.11.0")
    (source
     (origin
      (method url-fetch)
      (uri (pypi-uri "pluggy" version))
      (sha256
       (base32
-       "1qbn70mksmr03hac6jgp6fiqc4l7859z8dchx2x950vhlij87swm"))))
+       "10511a54dvafw1jrk75mrhml53c7b7w4yaw7241696lc2hfvr895"))))
    (build-system python-build-system)
    (native-inputs
     `(("python-setuptools-scm" ,python-setuptools-scm)))
@@ -8784,14 +9047,14 @@ servers.")
 (define-public python-jmespath
   (package
    (name "python-jmespath")
-   (version "0.9.3")
+   (version "0.9.4")
    (source
     (origin
      (method url-fetch)
      (uri (pypi-uri "jmespath" version))
      (sha256
       (base32
-       "0r7wc7fsxmlwzxx9j1j7rms06c6xs6d4sysirdhz1jk2mb4x90ba"))))
+       "0k0765x1mybcrzajh3hiqkl8sy9hs0bmn4900frxy0j3ykvaxqmx"))))
    (build-system python-build-system)
    (native-inputs
     `(("python-nose" ,python-nose)))
@@ -8935,6 +9198,63 @@ server with very acceptable performance.")
 (define-public python2-waitress
   (package-with-python2 python-waitress))
 
+(define-public python-whichcraft
+  (package
+    (name "python-whichcraft")
+    (version "0.6.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "whichcraft" version))
+       (sha256
+        (base32
+         "11yfkzyplizdgndy34vyd5qlmr1n5mxis3a3svxmx8fnccdvknxc"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
+    (home-page "https://github.com/pydanny/whichcraft")
+    (synopsis "Cross-platform cross-python shutil.which functionality")
+    (description
+     "This package provides a shim of the shutil.which function that's
+designed to work across multiple versions of Python.")
+    (license license:bsd-3)))
+
+(define-public python-cookiecutter
+  (package
+    (name "python-cookiecutter")
+    (version "1.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "cookiecutter" version))
+       (sha256
+        (base32
+         "0glsvaz8igi2wy1hsnhm9fkn6560vdvdixzvkq6dn20z3hpaa5hk"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-freezegun" ,python-freezegun)
+       ("python-pytest" ,python-pytest)
+       ("python-pytest-catchlog" ,python-pytest-catchlog)
+       ("python-pytest-cov" ,python-pytest-cov)
+       ("python-pytest-mock" ,python-pytest-mock)))
+    (propagated-inputs
+     `(("python-binaryornot" ,python-binaryornot)
+       ("python-click" ,python-click)
+       ("python-future" ,python-future)
+       ("python-jinja2" ,python-jinja2)
+       ("python-jinja2-time" ,python-jinja2-time)
+       ("python-poyo" ,python-poyo)
+       ("python-requests" ,python-requests)
+       ("python-whichcraft" ,python-whichcraft)))
+    (home-page "https://github.com/audreyr/cookiecutter")
+    (synopsis
+     "Command-line utility that creates projects from project templates")
+    (description
+     "This package provides a command-line utility that creates projects from
+project templates, e.g. creating a Python package project from a Python package
+project template.")
+    (license license:bsd-3)))
+
 (define-public python-pyquery
   (package
     (name "python-pyquery")
@@ -9313,6 +9633,7 @@ useful for solving the Assignment Problem.")
         (base32
          "10qsqdjpbc85fykc1vgcs8xwbgn4l2l52c8d83xf1q59pwyn79bw"))))
     (build-system python-build-system)
+    (arguments '(#:tests? #f)) ; Test invocation is no longer supported by Python.
     (native-inputs
      `(("python-pytest" ,python-pytest)))
     (home-page "https://bitbucket.org/mchaput/whoosh")
@@ -9370,13 +9691,13 @@ anymore.")
 (define-public python2-pathlib2
   (package
     (name "python2-pathlib2")
-    (version "2.3.2")
+    (version "2.3.3")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "pathlib2" version))
               (sha256
                (base32
-                "10yb0iv5x2hs631rcppkhbddx799d3h8pcwmkbh2a66ns3w71ccf"))))
+                "0hpp92vqqgcd8h92msm9slv161b1q160igjwnkf2ag6cx0c96695"))))
     (build-system python-build-system)
     ;; We only need the the Python 2 variant, since for Python 3 our minimum
     ;; version is 3.4 which already includes this package as part of the
@@ -9816,14 +10137,13 @@ to occurrences in strings and comments.")
 (define-public python-py3status
   (package
     (name "python-py3status")
-    (version "3.16")
+    (version "3.21")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "py3status" version))
        (sha256
-        (base32
-         "1xrfph277bgjln3jbpzpgkhxad04fjvj7s3xfil42q1sxi4s3q3g"))))
+        (base32 "16z8zq83hxy48g6hh4xczbdz50qvxv9k1aahr4fqq7jis60cc262"))))
     (build-system python-build-system)
     (inputs
      `(("file" ,file)))
@@ -9968,13 +10288,6 @@ graphviz.")
                   (guix build utils)
                   (guix build python-build-system))
        #:phases (modify-phases %standard-phases
-                  (add-after 'unpack 'unpack-libev
-                    (lambda* (#:key inputs #:allow-other-keys)
-                      (mkdir-p "deps/libev")
-                      ;; FIXME: gevent requires building libev, even though
-                      ;; it only links against the proper one.
-                      (invoke "tar" "-xf" (assoc-ref inputs "libev-source")
-                              "--strip-components=1" "-C" "deps/libev")))
                   (add-before 'patch-source-shebangs 'patch-hard-coded-paths
                     (lambda _
                       (substitute* "src/gevent/subprocess.py"
@@ -9992,6 +10305,11 @@ graphviz.")
                       (setenv "CARES_EMBED" "false")
                       (setenv "EMBED" "false")
 
+                      ;; Prevent building bundled libev.
+                      (substitute* "setup.py"
+                        (("run_make=_BUILDING")
+                         "run_make=False"))
+
                       (let ((greenlet (string-append
                                        (assoc-ref inputs "python-greenlet")
                                        "/include")))
@@ -9999,7 +10317,7 @@ graphviz.")
                                         (lambda (item)
                                           (string-prefix? "python" item)))
                           ((python)
-                           (setenv "CPATH"
+                           (setenv "C_INCLUDE_PATH"
                                    (string-append greenlet "/" python)))))
                       #t))
                   (add-before 'check 'skip-timer-test
@@ -10031,8 +10349,7 @@ graphviz.")
      `(("python-greenlet" ,python-greenlet)
        ("python-objgraph" ,python-objgraph)))
     (native-inputs
-     `(("libev-source" ,(package-source libev))
-       ("python-six" ,python-six)))
+     `(("python-six" ,python-six)))
     (inputs
      `(("c-ares" ,c-ares)
        ("libev" ,libev)))
@@ -10347,16 +10664,16 @@ Wikipedia code samples at
 (define-public python-cleo
   (package
     (name "python-cleo")
-    (version "0.6.1")
+    (version "0.6.8")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "cleo" version))
               (sha256
                (base32
-                "0q1cf0szr0d54am4pypzwdnm74zpladdsinad94c2fz5i06fdpf7"))))
+                "06zp695hq835rkaq6irr1ds1dp2qfzyf32v60vxpd8rcnxv319l5"))))
     (build-system python-build-system)
     (native-inputs
-     `(;; For testing
+     `( ;; For testing
        ("python-mock" ,python-mock)
        ("python-pytest-mock" ,python-pytest-mock)
        ("python-pytest" ,python-pytest)))
@@ -10374,16 +10691,203 @@ docstring and colored output.")
 (define-public python2-cleo
   (package-with-python2 python-cleo))
 
+(define-public python-tomlkit
+  (package
+    (name "python-tomlkit")
+    (version "0.5.7")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "tomlkit" version))
+       (sha256
+        (base32
+         "18820ga5z3if1w8dvykxrfm000akracq01ic402xrbljgbn5grn4"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
+    (home-page
+     "https://github.com/sdispater/tomlkit")
+    (synopsis "Style preserving TOML library")
+    (description
+     "TOML Kit is a 0.5.0-compliant TOML library.  It includes a parser that
+preserves all comments, indentations, whitespace and internal element ordering,
+and makes them accessible and editable via an intuitive API.  It can also
+create new TOML documents from scratch using the provided helpers.  Part of the
+implementation as been adapted, improved and fixed from Molten.")
+    (license license:expat)))
+
+(define-public python-shellingham
+  (package
+    (name "python-shellingham")
+    (version "1.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "shellingham" version))
+       (sha256
+        (base32
+         "1q7kws7w4x2hji3g7y0ni9ddk4sd676ylrb3db54gbpys6xj6nwq"))))
+    (build-system python-build-system)
+    (home-page
+     "https://github.com/sarugaku/shellingham")
+    (synopsis "Tool to detect surrounding shell")
+    (description
+     "Shellingham detects what shell the current Python executable is
+running in.")
+    (license license:isc)))
+
+(define-public python-memcached
+  (package
+    (name "python-memcached")
+    (version "1.59")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "python-memcached" version))
+       (sha256
+        (base32
+         "0kvyapavbirk2x3n1jx4yb9nyigrj1s3x15nm3qhpvhkpqvqdqm2"))))
+    (build-system python-build-system)
+    (propagated-inputs `(("python-six" ,python-six)))
+    (home-page
+     "https://github.com/linsomniac/python-memcached")
+    (synopsis "Pure python memcached client")
+    (description
+     "This software is a pure Python interface to the memcached memory cache
+daemon.  It is the client side software which allows storing values in one or
+more, possibly remote, memcached servers.")
+    (license license:psfl)))
+
+(define-public python-clikit
+  (package
+    (name "python-clikit")
+    (version "0.2.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "clikit" version))
+       (sha256
+        (base32
+         "0dc8czib5f4j9px1ivcpqnmivnx2zjpc0xb00ldrhsqylks7r06n"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-pastel" ,python-pastel)
+       ("python-pylev" ,python-pylev)))
+    (home-page "https://github.com/sdispater/clikit")
+    (synopsis "Group of utilities to build command line interfaces")
+    (description
+     "CliKit is a group of utilities to build testable command line
+interfaces.")
+    (license license:expat)))
+
+(define-public python-msgpack-python
+  (package
+    (name "python-msgpack-python")
+    (version "0.5.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "msgpack-python" version))
+       (sha256
+        (base32
+         "16wh8qgybmfh4pjp8vfv78mdlkxfmcasg78lzlnm6nslsfkci31p"))))
+    (build-system python-build-system)
+    (home-page "http://msgpack.org/")
+    (synopsis "Package to deserialize messages in MessagePack binary format")
+    (description
+     "MessagePack is an efficient binary serialization format.  It lets you
+exchange data among multiple languages like JSON.  But it's faster and
+smaller.  Small integers are encoded into a single byte, and typical short
+strings require only one extra byte in addition to the strings themselves.")
+    (license license:asl2.0)))
+
+(define-public python-cachy
+  (package
+    (name "python-cachy")
+    (version "0.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "cachy" version))
+       (sha256
+        (base32
+         "0v6mjyhgx6j7ya20bk69cr3gdzdkdf6psay0h090rscclgji65dp"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-fakeredis" ,python-fakeredis)
+       ("python-flexmock" ,python-flexmock)
+       ("python-pytest" ,python-pytest)))
+    (propagated-inputs
+     `(("python-memcached" ,python-memcached)
+       ("python-msgpack-python" ,python-msgpack-python)
+       ("python-redis" ,python-redis)))
+    (home-page "https://github.com/sdispater/cachy")
+    (synopsis "Simple yet effective caching library")
+    (description
+     "Cachy provides a simple yet effective caching library.  A simple but
+powerful API: thread-safety; decorator syntax; support for memcached, redis,
+database, file, dict stores.  Cachy supports python versions 2.7+ and 3.2+.")
+    (license license:expat)))
+
+(define-public poetry
+  (package
+    (name "poetry")
+    (version "0.12.17")
+    ;; Poetry can only be built from source with poetry.
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "poetry" version))
+       (sha256
+        (base32
+         "0gxwcd65qjmzqzppf53x51sic1rbcd9py6cdzx3aprppipimslvf"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:tests? #f ;; Pypi does not have tests.
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'build
+           (lambda _
+             ;; Bug in poetry https://github.com/sdispater/poetry/issues/866.
+             (invoke "sed" "-i" "-e" "s/from distutils.core/from setuptools/"
+                     "setup.py")
+             #t)))))
+    (propagated-inputs
+     `(("python-cachecontrol" ,python-cachecontrol)
+       ("python-cachy" ,python-cachy)
+       ("python-cleo" ,python-cleo)
+       ("python-glob2" ,python-glob2)
+       ("python-html5lib" ,python-html5lib)
+       ("python-jsonschema" ,python-jsonschema)
+       ("python-msgpack" ,python-msgpack)
+       ("python-pathlib2" ,python-pathlib2)
+       ("python-pkginfo" ,python-pkginfo)
+       ("python-pyparsing" ,python-pyparsing)
+       ("python-pyrsistent" ,python-pyrsistent)
+       ("python-requests" ,python-requests)
+       ("python-requests-toolbelt" ,python-requests-toolbelt)
+       ("python-shellingham" ,python-shellingham)
+       ("python-tomlkit" ,python-tomlkit)
+       ("python-virtualenv" ,python-virtualenv)))
+    (home-page "https://poetry.eustace.io/")
+    (synopsis "Python dependency management and packaging made easy")
+    (description "Poetry is a tool for dependency management and packaging
+in Python.  It allows you to declare the libraries your project depends on and
+it will manage (install/update) them for you.")
+    (license license:expat)))
+
 (define-public python-lazy-object-proxy
   (package
     (name "python-lazy-object-proxy")
-    (version "1.3.1")
+    (version "1.4.3")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "lazy-object-proxy" version))
               (sha256
                (base32
-                "0yha7q9bhw857fwaby785d63mffhngl9npwzlk9i0pwlkwvbx4gb"))))
+                "1w1aaay424ciz8fz3fkzxb0pxzfxn184f2whpyn4fx72bn50x47k"))))
+    (native-inputs
+     `(("python-setuptools-scm" ,python-setuptools-scm-3.3)))
     (build-system python-build-system)
     (home-page "https://github.com/ionelmc/python-lazy-object-proxy")
     (synopsis "Lazy object proxy for python")
@@ -10830,6 +11334,16 @@ hardware-accelerated multitouch applications.")
                (base32
                 "0qc006986rb6bcbmiymwgcl1mns2jphr1j7sr7nk41nlr7gh359m"))))
     (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-tests
+           (lambda _
+             ;; TypeError: binary() got an unexpected keyword argument
+             ;; 'average_size'.
+             (substitute* "tests/test_check.py"
+              (("average_size=512") ""))
+             #t)))))
     (propagated-inputs
      `(("python-chardet" ,python-chardet)
        ("python-hypothesis" ,python-hypothesis)))
@@ -10847,6 +11361,42 @@ binary or text.")
        `(("python2-enum34" ,python2-enum34)
          ,@(package-propagated-inputs base))))))
 
+(define-public python-binwalk
+  (let ((commit "64201acfb5b0a9cdd9faa58c40a36dcff8612e29")
+        (revision "0"))
+    (package
+      (name "python-binwalk")
+      (version (git-version "2.1.1" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/ReFirmLabs/binwalk")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "1z7ca6rfp887hw5jc3sb45mm4fa0xid4lsp2z8g4r590dr7k7w15"))))
+      (build-system python-build-system)
+      (arguments
+       `(#:phases
+         (modify-phases %standard-phases
+           (add-before 'check 'set-pythonpath
+             (lambda _
+               (setenv "PYTHONPATH"
+                       (string-append
+                        (getcwd) "/src/"
+                        ":" (getenv "PYTHONPATH")))
+               (setenv "HOME" "")
+               #t)))))
+      (native-inputs
+       `(("python-coverage" ,python-coverage)
+         ("python-nose" ,python-nose)))
+      (home-page "https://github.com/ReFirmLabs/binwalk")
+      (synopsis "Firmware analysis tool")
+      (description "Binwalk is a tool for analyzing, reverse engineering, and extracting firmware images")
+      (license license:expat))))
+
 (define-public python-nltk
   (package
     (name "python-nltk")
@@ -12082,15 +12632,6 @@ protocols.")
   (package
     (inherit python-attrs)
     (name "python-attrs-bootstrap")
-    ;; Keep this on a fixed version so python-attrs can be updated without
-    ;; triggering a mass-rebuild.  FIXME: Update this in the next rebuild cycle.
-    (version "17.4.0")
-    (source (origin
-              (method url-fetch)
-              (uri (pypi-uri "attrs" version))
-              (sha256
-               (base32
-                "1jafnn1kzd6qhxgprhx6y6ik1r5m2rilx25syzcmq03azp660y8w"))))
     (native-inputs `())
     (arguments `(#:tests? #f))))
 
@@ -12248,18 +12789,18 @@ clone, while other processes access the original tree.")
 (define-public python-astroid
   (package
     (name "python-astroid")
-    (version "2.1.0")
+    (version "2.3.3")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "astroid" version))
        (sha256
-        (base32
-         "08hz675knh4294bancdapql392fmbjyimhbyrmfkz1ka7l035c1m"))))
+        (base32 "0fnibsl2cb5mvzbfm7sycj85smx48f8w8m7ks1sqlmpr9ps0gski"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-lazy-object-proxy" ,python-lazy-object-proxy)
        ("python-six" ,python-six)
+       ("python-typed-ast" ,python-typed-ast)
        ("python-wrapt" ,python-wrapt)))
     (native-inputs
      `(("python-dateutil" ,python-dateutil)
@@ -12326,7 +12867,8 @@ builds partial trees by inspecting living objects.")
          ,python2-backports-functools-lru-cache)
         ("python2-enum34" ,python2-enum34)
         ("python2-singledispatch" ,python2-singledispatch)
-        ,@(package-propagated-inputs base))))))
+        ,@(alist-delete "python-typed-ast"
+                        (package-propagated-inputs base)))))))
 
 (define-public python-isort
   (package
@@ -12390,17 +12932,14 @@ of @code{functools.lru_cache} from python 3.3.")
 (define-public python-configparser
   (package
     (name "python-configparser")
-    (version "3.5.0")
+    (version "3.7.1")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append
-             "https://bitbucket.org/ambv/configparser/get/"
-             version ".tar.bz2"))
-       (file-name (string-append name "-" version ".tar.gz"))
+       (uri (pypi-uri "configparser" version))
        (sha256
         (base32
-         "0waq40as14abwzbb321hfz4vr1fi363nscy32ga14qvfygrg96wa"))))
+         "0cnz213il9lhgda6x70fw7mfqr8da43s3wm343lwzhqx94mgmmav"))))
     (build-system python-build-system)
     (home-page "https://github.com/jaraco/configparser/")
     (synopsis "Backport of configparser from python 3.5")
@@ -13580,10 +14119,15 @@ ignoring formatting changes.")
       "Make loops show a progress bar on the console by just wrapping any
 iterable with @code{|tqdm(iterable)|}.  Offers many options to define
 design and layout.")
-    (license (list license:mpl2.0 license:expat))))
+    (license (list license:mpl2.0 license:expat))
+    (properties `((python2-variant . ,(delay python2-tqdm))))))
 
 (define-public python2-tqdm
-  (package-with-python2 python-tqdm))
+  (let ((tqdm (package-with-python2
+                (strip-python2-variant python-tqdm))))
+    (package (inherit tqdm)
+      (native-inputs `(("python2-functools32" ,python2-functools32)
+                        ,@(package-native-inputs tqdm))))))
 
 (define-public python-pkginfo
   (package
@@ -14041,14 +14585,20 @@ such as figshare or Zenodo.")
 (define-public python-pyro4
   (package
     (name "python-pyro4")
-    (version "4.75")
+    (version "4.77")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Pyro4" version))
        (sha256
-        (base32 "1dfpp36imddx19yv0kd28gk1l71ckhpqy6jd590wpm2680jw15rq"))))
+        (base32 "0gsjg869y4gpy265s1gj1f2qy6jn5iz8r2bwwnq78r1r5yi15zib"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ;FIXME: Some tests require network access.
+    (native-inputs
+     `(("python-cloudpickle" ,python-cloudpickle)
+       ("python-dill" ,python-dill)
+       ("python-msgpack" ,python-msgpack)))
     (propagated-inputs
      `(("python-serpent" ,python-serpent)))
     (home-page "https://pyro4.readthedocs.io")
@@ -14094,14 +14644,14 @@ is the new Pyro version that is actively developed.")
     (version "2.9.4")
     (source
      (origin
-       (method url-fetch)
-       (uri (string-append "https://bitbucket.org/khinsen/"
-                           "scientificpython/downloads/ScientificPython-"
-                           version ".tar.gz"))
-       (file-name (string-append "ScientificPython-" version ".tar.gz"))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/khinsen/ScientificPython")
+             (commit (string-append "rel" version))))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0fc69zhlsn9d2jvbzyjl9ah53vj598h84nkq230c83ahfvgzx5y3"))))
+         "16l48aj9fps9r7jyk8gpxppwrv0fqvlc13sayxskz28r5s6sjwbl"))))
     (build-system python-build-system)
     (inputs
      `(("netcdf" ,netcdf)))
@@ -14119,7 +14669,7 @@ is the new Pyro version that is actively developed.")
              (invoke "python" "setup.py" "build"
                      (string-append "--netcdf_prefix="
                                     (assoc-ref inputs "netcdf"))))))))
-    (home-page "https://bitbucket.org/khinsen/scientificpython")
+    (home-page "http://dirac.cnrs-orleans.fr/ScientificPython")
     (synopsis "Python modules for scientific computing")
     (description "ScientificPython is a collection of Python modules that are
 useful for scientific computing.  Most modules are rather general (Geometry,
@@ -14131,16 +14681,17 @@ not actively maintained and works only with Python 2 and NumPy < 1.9.")
 (define-public python2-mmtk
   (package
     (name "python2-mmtk")
-    (version "2.7.11")
+    (version "2.7.12")
     (source
      (origin
-       (method url-fetch)
-       (uri (string-append "https://bitbucket.org/khinsen/"
-                           "mmtk/downloads/MMTK-" version ".tar.gz"))
-       (file-name (string-append "MMTK-" version ".tar.gz"))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/khinsen/MMTK")
+             (commit (string-append "rel" version))))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "1d0nnjx4lwsvh8f99vv1r6gi50d93yba0adkz8b4zgv4za4c5862"))))
+         "1fqwh3ba9jd42nigvn5shndgwb1zy7kh9520ncvqci7n8ffjr6p1"))))
     (build-system python-build-system)
     (native-inputs
      `(("netcdf" ,netcdf)))
@@ -14293,15 +14844,14 @@ files, and Makefiles.")
 (define-public python-whatever
   (package
     (name "python-whatever")
-    (version "0.5")
+    (version "0.6")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/Suor/whatever/archive/" version
                            ".tar.gz"))
        (sha256
-        (base32
-         "1iqvnaf0zpc6b4rvbqq4xy45mszcscyzpzknv8wg6j84pbp22sap"))
+        (base32 "1rchg9hrlvw4sn20lq1zspczr4x1pv57c02gv73igiqx1hqpy2nc"))
        (file-name (string-append name "-" version ".tar.gz"))))
     (build-system python-build-system)
     (arguments
@@ -14443,14 +14993,16 @@ source bytes using the UTF-8 encoding and then rewrites Python 3.6 style
 (define-public python-typed-ast
   (package
     (name "python-typed-ast")
-    (version "1.3.5")
+    (version "1.4.0")
     (source
      (origin
-       (method url-fetch)
-       (uri (pypi-uri "typed-ast" version))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/python/typed_ast.git")
+             (commit version)))
        (sha256
-        (base32
-         "1m7pr6qpana3cvqwiw7mlvrgvmw27ch5mx1592572xhlki8g85ak"))))
+        (base32 "0l0hz809f7i356kmqkvfsaswiidb98j9hs9rrjnfawzqcbffzgyb"))
+       (file-name (git-file-name name version))))
     (build-system python-build-system)
     (arguments
      `(#:modules ((guix build utils)
@@ -14550,14 +15102,13 @@ Included are implementations of:
 (define-public bpython
   (package
     (name "bpython")
-    (version "0.17.1")
+    (version "0.18")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "bpython" version))
        (sha256
-        (base32
-         "0bxhxi5zxdkrf8b4gwn0d363kdz3qnypjwhm1aydki53ph8ca1w9"))))
+        (base32 "1hl6frgvr2lqaxqczl8amg9xih32b3gzv429vs0qrjb8wpdj1k2n"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -14580,10 +15131,10 @@ Included are implementations of:
     (propagated-inputs
      `(("python-pygments" ,python-pygments)
        ("python-requests" ,python-requests)
-       ("python-babel" ,python-babel) ; optional, for internationalization
+       ("python-babel" ,python-babel)   ; optional, for internationalization
        ("python-curtsies" ,python-curtsies) ; >= 0.1.18
        ("python-greenlet" ,python-greenlet)
-       ("python-urwid" ,python-urwid) ; for bpython-urwid only
+       ("python-urwid" ,python-urwid)   ; for bpython-urwid only
        ("python-six" ,python-six)))
     (native-inputs
      `(("python-sphinx" ,python-sphinx)
@@ -14717,52 +15268,51 @@ file system events on Linux.")
 (define-public python-more-itertools
   (package
     (name "python-more-itertools")
-    (version "4.3.0")
+    (version "7.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "more-itertools" version))
        (sha256
         (base32
-         "17h3na0rdh8xq30w4b9pizgkdxmm51896bxw600x84jflg9vaxn4"))))
+         "16phg2f2dvm6ci5wr49ncha5lmc0m2in3bsl33c61vzca4gkvd4b"))))
     (build-system python-build-system)
-    (arguments
-     `(,@(if (any (cute string-prefix? <> (or (%current-system)
-                                              (%current-target-system)))
-                  '("armhf" "i686"))
-        '(#:phases
-          (modify-phases %standard-phases
-          ;; This is required for 32-bit hardware.
-          ;; TODO: Try to remove this when upgrading.
-          (add-after 'unpack 'patch-test
-            (lambda _
-              (substitute* "more_itertools/tests/test_more.py"
-                (("10 \\*\\* 10") "9 ** 9"))
-              #t))))
-        '())))
-    (propagated-inputs
-     `(("python-six" ,python-six-bootstrap)))
     (home-page "https://github.com/erikrose/more-itertools")
     (synopsis "More routines for operating on iterables, beyond itertools")
     (description "Python's built-in @code{itertools} module implements a
 number of iterator building blocks inspired by constructs from APL, Haskell,
 and SML.  @code{more-itertools} includes additional building blocks for
 working with iterables.")
+    (properties `((python2-variant . ,(delay python2-more-itertools))))
     (license license:expat)))
 
+;; The 5.x series are the last versions supporting Python 2.7.
 (define-public python2-more-itertools
-  (package-with-python2 python-more-itertools))
+  (package
+    (inherit python-more-itertools)
+    (name "python2-more-itertools")
+    (version "5.0.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "more-itertools" version))
+              (sha256
+               (base32
+                "1r12cm6mcdwdzz7d47a6g4l437xsvapdlgyhqay3i2nrlv03da9q"))))
+    (arguments
+     `(#:python ,python2-minimal))
+    (propagated-inputs
+     `(("python2-six" ,python2-six-bootstrap)))))
 
 (define-public python-latexcodec
   (package
     (name "python-latexcodec")
-    (version "1.0.6")
+    (version "1.0.7")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "latexcodec" version))
        (sha256
-        (base32 "0s4wdbg0w2l8pj3i0y4510i0s04p8nhxcsa2z41bjsv0k66npb81"))))
+        (base32 "0wnp3yqcgx0rpy8dz51vh75lbp2qif67da19zi7m3ca98n887hgb"))))
     (build-system python-build-system)
     (inputs
      `(("python-six" ,python-six)))
@@ -14884,16 +15434,16 @@ manager compatible with @code{asyncio}.")
 (define-public python-glob2
   (package
     (name "python-glob2")
-    (version "0.6")
+    (version "0.7")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
              (url "https://github.com/miracle2k/python-glob2.git")
-             (commit version)))
+             (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1lm1xz3k3l0k1c5bcp9hlzmi3gp5j8dl1k3xhpiq5mnm0xq6n163"))))
+        (base32 "160nh2ay9lw2hi0rixpzb2k87r6ql56k0j2cm87lqz8xc8zbw919"))))
     (build-system python-build-system)
     (home-page "https://github.com/miracle2k/python-glob2/")
     (synopsis "Extended Version of the python buildin glob module")
@@ -15021,7 +15571,7 @@ under Python 2.7.")
 (define-public pybind11
   (package
     (name "pybind11")
-    (version "2.2.4")
+    (version "2.3.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -15029,7 +15579,7 @@ under Python 2.7.")
                     (commit (string-append "v" version))))
               (sha256
                (base32
-                "0pa79ymcasv8br5ifbx7878id5py2jpjac3i20cqxr6gs9l6ivlv"))
+                "11b6dniri8m05spfd2a19irz82shf4sdca73566bniggrf3zclnf"))
               (file-name (git-file-name name version))))
     (build-system cmake-build-system)
     (native-inputs
@@ -16259,3 +16809,129 @@ 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)))
+
+(define-public python-bibtexparser
+  (package
+    (name "python-bibtexparser")
+    (version "1.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "bibtexparser" version))
+       (sha256
+        (base32
+         "0zwhfkrzf3n5847dbnfng92k7ak199l9v6x6ax3dgdidfpm6d2fz"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-pyparsing" ,python-pyparsing)))
+    (native-inputs
+     `(("python-future" ,python-future)))
+    (home-page "https://github.com/sciunto-org/python-bibtexparser")
+    (synopsis "Python library to parse BibTeX files")
+    (description "BibtexParser is a Python library to parse BibTeX files.")
+    (license (list license:bsd-3 license:lgpl3))))
+
+(define-public python-distro
+  (package
+    (name "python-distro")
+    (version "1.4.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "distro" version))
+       (sha256
+        (base32
+         "0mrg75w4ap7mdzyga75yaid9n8bgb345ih5mwjp3plj6v1jxwb9n"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
+    (home-page "https://github.com/nir0s/distro")
+    (synopsis
+     "OS platform information API")
+    (description
+     "@code{distro} provides information about the OS distribution it runs on,
+such as a reliable machine-readable ID, or version information.
+
+It is the recommended replacement for Python's original
+`platform.linux_distribution` function (which will be removed in Python 3.8).
+@code{distro} also provides a command-line interface to output the platform
+information in various formats.")
+    (license license:asl2.0)))
+
+(define-public python-cairosvg
+  (package
+    (name "python-cairosvg")
+    (version "2.4.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "CairoSVG" version))
+       (sha256
+        (base32 "1bb7irxbaxxb9ahm3z5wsx1q96mm5gzskc7b6q07h9ikcnb8yrjf"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _ (invoke "pytest"))))))
+    (propagated-inputs
+     `(("python-cairocffi" ,python-cairocffi)
+       ("python-cssselect2" ,python-cssselect2)
+       ("python-defusedxml" ,python-defusedxml)
+       ("python-pillow" ,python-pillow)
+       ("python-tinycss2" ,python-tinycss2)))
+    (native-inputs
+     `(("python-pytest-flake8" ,python-pytest-flake8)
+       ("python-pytest-isort" ,python-pytest-isort)
+       ("python-pytest-runner" ,python-pytest-runner)))
+    (home-page "https://cairosvg.org/")
+    (synopsis "SVG to PDF/PS/PNG converter based on Cairo")
+    (description "CairoSVG is a SVG converter based on Cairo.  It can export
+SVG files to PDF, PostScript and PNG files.  The main part of CairoSVG is a
+SVG parser, trying to follow the SVG 1.1 recommendation from the W3C.  Once
+parsed, the result is drawn to a Cairo surface that can be exported to
+qvarious formats: PDF, PostScript, PNG and even SVG.")
+    (license license:lgpl3+)))
+
+(define-public python-pyphen
+  (package
+    (name "python-pyphen")
+    (version "0.9.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "Pyphen" version))
+       (sha256
+        (base32 "08c9y69ry9d6m4zalhnalg86lsp9v2j5n1ziw5vxfmiihx83lqrv"))))
+    (build-system python-build-system)
+    ;; TODO: Use the Guix system hyphenation packages hyphen-* rather than the
+    ;; embedded set provided by upstream - like Debian does.
+    (home-page "https://github.com/Kozea/Pyphen")
+    (synopsis "Pure Python module to hyphenate text")
+    (description "Pyphen is a pure Python module to hyphenate text using
+existing Hunspell hyphenation dictionaries.")
+    (license (list license:gpl2 license:lgpl2.1 license:mpl1.1))))
+
+(define-public python-intelhex
+  (package
+    (name "python-intelhex")
+    (version "2.2.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "intelhex" version))
+       (sha256
+        (base32
+         "0ckqjbxd8gwcg98gfzpn4vq1qxzfvq3rdbrr1hikj1nmw08qb780"))))
+    (build-system python-build-system)
+    (arguments '(#:tests? #f))          ;issue with version
+    (home-page "https://pypi.org/project/IntelHex/")
+    (synopsis "Python library for Intel HEX files manipulations")
+    (description "The Intel HEX file format is widely used in microprocessors
+and microcontrollers area (embedded systems etc.) as the de facto standard for
+representation of code to be programmed into microelectronic devices.  This
+package provides an intelhex Python library to read, write, create from
+scratch and manipulate data from Intel HEX file format.  It also includes
+several convenience Python scripts, including \"classic\" hex2bin and bin2hex
+converters and more, those based on the library itself.")
+    (license license:bsd-3)))