summary refs log tree commit diff
path: root/gnu/packages/python.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/python.scm')
-rw-r--r--gnu/packages/python.scm561
1 files changed, 522 insertions, 39 deletions
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 97b8ace869..55dc6bc739 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -30,7 +30,7 @@
 ;;; Copyright © 2016, 2017 Stefan Reichör <stefan@xsteve.at>
 ;;; Copyright © 2016 Dylan Jeffers <sapientech@sapientech@openmailbox.org>
 ;;; Copyright © 2016, 2017 Alex Vong <alexvong1995@gmail.com>
-;;; Copyright © 2016, 2017 Arun Isaac <arunisaac@systemreboot.net>
+;;; Copyright © 2016, 2017, 2018 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2016, 2017 Julien Lepiller <julien@lepiller.eu>
 ;;; Copyright © 2016, 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2016, 2017 Thomas Danckaert <post@thomasdanckaert.be>
@@ -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 Mathieu Othacehe <m.othacehe@gmail.com>
+;;; Copyright © 2017, 2018 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>
@@ -51,6 +51,8 @@
 ;;; Copyright © 2018 Mathieu Lirzin <mthl@gnu.org>
 ;;; Copyright © 2018 Adam Massmann <massmannak@gmail.com>
 ;;; Copyright © 2016, 2018 Tomáš Čech <sleep_walker@gnu.org>
+;;; Copyright © 2018 Nicolas Goaziou <mail@nicolasgoaziou.fr>
+;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -141,7 +143,7 @@
 
 (define-public python-2.7
   (package
-    (name "python")
+    (name "python2")
     (version "2.7.14")
     (source
      (origin
@@ -339,9 +341,19 @@ data types.")
 ;; Current 2.x version.
 (define-public python-2 python-2.7)
 
+(define-public python2-called-python
+  ;; Both 2.x and 3.x used to be called "python".  In commit
+  ;; a7714d42de2c3082f3609d1e63c83d703fb39cf9 (March 2018), we renamed the
+  ;; Python 2.x package to "python2".
+  (package
+    (inherit python-2)
+    (name "python")
+    (properties `((superseded . ,python-2)))))
+
 (define-public python-3.6
   (package (inherit python-2)
-    (version "3.6.3")
+    (name "python")
+    (version "3.6.5")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://www.python.org/ftp/python/"
@@ -354,7 +366,7 @@ data types.")
               (patch-flags '("-p0"))
               (sha256
                (base32
-                "1nl1raaagr4car787a2hmjv2dw6gqny53xfd6wisbgx4r5kxk9yd"))
+                "19l7inxm056jjw33zz97z0m02hsi7jnnx5kyb76abj5ml4xhad7l"))
               (snippet
                '(begin
                   (for-each delete-file
@@ -362,8 +374,75 @@ data types.")
                               "Lib/ctypes/test/test_win32.py" ; fails on aarch64
                               "Lib/test/test_fcntl.py")) ; fails on aarch64
                   #t))))
-    (arguments (substitute-keyword-arguments (package-arguments python-2)
-                 ((#:tests? _) #t)))
+    (arguments
+     (substitute-keyword-arguments (package-arguments python-2)
+       ((#:tests? _) #t)
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-after 'unpack 'patch-timestamp-for-pyc-files
+             (lambda _
+               ;; We set DETERMINISTIC_BUILD to only override the mtime when
+               ;; building with Guix, lest we break auto-compilation in
+               ;; environments.
+               (setenv "DETERMINISTIC_BUILD" "1")
+               (substitute* "Lib/py_compile.py"
+                 (("source_stats\\['mtime'\\]")
+                  "(1 if 'DETERMINISTIC_BUILD' in os.environ else source_stats['mtime'])"))
+
+               ;; Use deterministic hashes for strings, bytes, and datetime
+               ;; objects.
+               (setenv "PYTHONHASHSEED" "0")
+
+               ;; Reset mtime when validating bytecode header.
+               (substitute* "Lib/importlib/_bootstrap_external.py"
+                 (("source_mtime = int\\(source_stats\\['mtime'\\]\\)")
+                  "source_mtime = 1"))
+               #t))
+           ;; These tests fail because of our change to the bytecode
+           ;; validation.  They fail because expected exceptions do not get
+           ;; thrown.  This seems to be no problem.
+           (add-after 'unpack 'disable-broken-bytecode-tests
+             (lambda _
+               (substitute* "Lib/test/test_importlib/source/test_file_loader.py"
+                 (("test_bad_marshal")
+                  "disable_test_bad_marshal")
+                 (("test_no_marshal")
+                  "disable_test_no_marshal")
+                 (("test_non_code_marshal")
+                  "disable_test_non_code_marshal"))
+               #t))
+           ;; Unset DETERMINISTIC_BUILD to allow for tests that check that
+           ;; stale pyc files are rebuilt.
+           (add-before 'check 'allow-non-deterministic-compilation
+             (lambda _ (unsetenv "DETERMINISTIC_BUILD") #t))
+           ;; We need to rebuild all pyc files for three different
+           ;; optimization levels to replace all files that were not built
+           ;; deterministically.
+
+           ;; FIXME: Without this phase we have close to 2000 files that
+           ;; differ across different builds of this package.  With this phase
+           ;; there are about 500 files left that differ.
+           (add-after 'install 'rebuild-bytecode
+             (lambda* (#:key outputs #:allow-other-keys)
+               (setenv "DETERMINISTIC_BUILD" "1")
+               (let ((out (assoc-ref outputs "out")))
+                 (for-each
+                  (lambda (opt)
+                    (format #t "Compiling with optimization level: ~a\n"
+                            (if (null? opt) "none" (car opt)))
+                    (for-each (lambda (file)
+                                (apply invoke
+                                       `(,(string-append out "/bin/python3")
+                                         ,@opt
+                                         "-m" "compileall"
+                                         "-f" ; force rebuild
+                                         ;; Don't build lib2to3, because it's Python 2 code.
+                                         ;; Also don't build obviously broken test code.
+                                         "-x" "(lib2to3|test/bad.*)"
+                                         ,file)))
+                              (find-files out "\\.py$")))
+                  (list '() '("-O") '("-OO")))
+                 #t)))))))
     (native-search-paths
      (list (search-path-specification
             (variable "PYTHONPATH")
@@ -382,7 +461,7 @@ data types.")
 
 (define-public python2-minimal
   (package (inherit python-2)
-    (name "python-minimal")
+    (name "python2-minimal")
     (outputs '("out"))
 
     ;; Keep zlib, which is used by 'pip' (via the 'zipimport' module), which
@@ -1074,7 +1153,7 @@ from the Python interpreter, or as a small part of a larger application.")
        (modify-phases %standard-phases
          (replace 'check
            (lambda _
-             (zero? (system* "py.test" "-v")))))))
+             (invoke "py.test" "-v"))))))
     (native-inputs
      `(("python-py" ,python-py)
        ("python-pytest" ,python-pytest-bootstrap)))
@@ -1091,6 +1170,16 @@ Python file, so it can be easily copied into your project.")
 (define-public python2-six
   (package-with-python2 python-six))
 
+(define-public python-six-bootstrap
+  (package
+    (inherit python-six)
+    (name "python-six-bootstrap")
+    (native-inputs `())
+    (arguments `(#:tests? #f))))
+
+(define-public python2-six-bootstrap
+  (package-with-python2 python-six-bootstrap))
+
 (define-public python-schedule
   (package
     (name "python-schedule")
@@ -1645,6 +1734,15 @@ matching them against a list of media-ranges.")
      "Backport of @code{funcsigs} which was introduced in Python 3.3.")
     (license license:asl2.0)))
 
+(define-public python2-funcsigs-bootstrap
+  (package
+    (inherit python2-funcsigs)
+    (name "python2-funcsigs-bootstrap")
+    (native-inputs `())
+    (arguments
+     `(#:tests? #f
+       ,@(package-arguments python2-funcsigs)))))
+
 (define-public python-pafy
   (package
     (name "python-pafy")
@@ -1672,14 +1770,14 @@ matching them against a list of media-ranges.")
 (define-public python-py
   (package
     (name "python-py")
-    (version "1.4.34")
+    (version "1.5.3")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "py" version))
        (sha256
         (base32
-         "1qyd5z0hv8ymxy84v5vig3vps2fvhcf4bdlksb3r03h549fmhb8g"))))
+         "10gq2lckvgwlk9w6yzijhzkarx44hsaknd0ypa08wlnpjnsgmj99"))))
     (build-system python-build-system)
     (arguments
      ;; FIXME: "ImportError: 'test' module incorrectly imported from
@@ -1687,7 +1785,7 @@ matching them against a list of media-ranges.")
      ;; Expected '/tmp/guix-build-python-py-1.4.31.drv-0/py-1.4.31/py'.
      ;; Is this module globally installed?"
      '(#:tests? #f))
-    (home-page "http://pylib.readthedocs.org/")
+    (home-page "http://pylib.readthedocs.io/")
     (synopsis "Python library for parsing, I/O, instrospection, and logging")
     (description
      "Py is a Python library for file name parsing, .ini file parsing, I/O,
@@ -2501,6 +2599,36 @@ sources.")
       (propagated-inputs `(("python2-pytz" ,python2-pytz)
                        ,@(package-propagated-inputs base))))))
 
+(define-public python-sphinx-gallery
+  (package
+    (name "python-sphinx-gallery")
+    (version "0.1.13")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/sphinx-gallery/sphinx-gallery"
+                                  "/archive/v" version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "03fs99mcb1r7qp0xixqv07vcz98sk21yq19ffdysi0infdcpzfkd"))))
+    (build-system python-build-system)
+    (arguments
+     ;; FIXME: Tests attempt to download <https://docs.python.org/3/objects.inv>,
+     ;; <https://docs.scipy.org/doc/numpy/objects.inv>, and
+     ;; <https://matplotlib.org/objects.inv>.
+     `(#:tests? #f))
+    (native-inputs
+     `(("python-pytest-runner" ,python-pytest-runner)))
+    (home-page "https://sphinx-gallery.github.io/")
+    (synopsis "Generate an examples gallery automatically")
+    (description
+     "@code{sphinx_gallery} is a Sphinx extension that builds an HTML version
+from any set of Python scripts and puts it into an examples gallery.")
+    (license license:bsd-3)))
+
+(define-public python2-sphinx-gallery
+  (package-with-python2 python-sphinx-gallery))
+
 (define-public python-sphinx-rtd-theme
   (package
     (name "python-sphinx-rtd-theme")
@@ -2782,7 +2910,7 @@ between language specification and implementation aspects.")
 (define-public python-numpy
   (package
     (name "python-numpy")
-    (version "1.14.0")
+    (version "1.14.3")
     (source
      (origin
        (method url-fetch)
@@ -2791,7 +2919,7 @@ between language specification and implementation aspects.")
              version "/numpy-" version ".tar.gz"))
        (sha256
         (base32
-         "1kh7y2ay21s9mcc11mq59g2f1yc75v152z2k2vlh0xmh9c9rjpf4"))))
+         "1yim2bxlycn4dhxmfxid6slplpmcb4ynhp411b37ahmsm2lwgkyg"))))
     (build-system python-build-system)
     (inputs
      `(("openblas" ,openblas)
@@ -3232,7 +3360,8 @@ that client code uses to construct the grammar directly in Python code.")
            ;; input since it would create a circular dependency: Extend the
            ;; test for Python 3, where it is already dropped, to Python 2.
            (substitute* "numpydoc/tests/test_plot_directive.py"
-             (("3") "2"))))))
+             (("3") "2"))
+           #t))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-sphinx" ,python-sphinx)))
@@ -3251,14 +3380,14 @@ that client code uses to construct the grammar directly in Python code.")
 (define-public python-numexpr
   (package
     (name "python-numexpr")
-    (version "2.6.4")
+    (version "2.6.5")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "numexpr" version))
        (sha256
         (base32
-         "1kpnbb5d5n927113zccfibn16z7gidjipyac6kbbhzs0lnizkgph"))))
+         "1frnbcwmsi312154x274xl28xazr1k8vjby83fwyla2n10a81bgq"))))
     (build-system python-build-system)
     (arguments `(#:tests? #f))          ; no tests included
     (propagated-inputs
@@ -3342,17 +3471,18 @@ convert between colorspaces like sRGB, XYZ, CIEL*a*b*, CIECAM02, CAM02-UCS, etc.
 (define-public python-matplotlib
   (package
     (name "python-matplotlib")
-    (version "2.0.2")
+    (version "2.2.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "matplotlib" version))
        (sha256
         (base32
-         "1w8z2a1l7s72p1byfz7g03wqhygqxi8w82619dqb3a1lm97w9yqg"))))
+         "1s6dv225w3k4fv52h8lfjc7qq5y56i9755ayx0mz48ddi99fzisd"))))
     (build-system python-build-system)
     (propagated-inputs ; the following packages are all needed at run time
      `(("python-cycler" ,python-cycler)
+       ("python-kiwisolver" ,python-kiwisolver)
        ("python-pyparsing" ,python-pyparsing)
        ("python-pygobject" ,python-pygobject)
        ("gobject-introspection" ,gobject-introspection)
@@ -3432,6 +3562,8 @@ toolkits.")
       ;; of those automatically rewritten by package-with-python2.
       (propagated-inputs
        `(("python2-pycairo" ,python2-pycairo)
+         ("python2-backports-functools-lru-cache"
+          ,python2-backports-functools-lru-cache)
          ("python2-functools32" ,python2-functools32)
          ("python2-pygobject-2" ,python2-pygobject-2)
          ("python2-subprocess32" ,python2-subprocess32)
@@ -3448,7 +3580,8 @@ toolkits.")
     (native-inputs
      `(("python-matplotlib" ,python-matplotlib)
        ("python-colorspacious" ,python-colorspacious)
-       ("python-sphinx" ,python-sphinx)
+       ("python-sphinx" ,python-sphinx-1.6)
+       ("python-sphinx-gallery" ,python-sphinx-gallery)
        ("python-numpydoc" ,python-numpydoc)
        ("python-ipython" ,python-ipython)
        ("python-mock" ,python-mock)
@@ -3471,7 +3604,7 @@ toolkits.")
                (("latex_elements\\['pointsize'\\] = '11pt'" match)
                 ;; insert at a point where latex_elements{} is defined:
                 (string-append match "\nlatex_elements['papersize'] = 'a4paper'")))
-             (zero? (system* "python" "make.py" "html" "latex" "texinfo"))))
+             (invoke "make" "SPHINXBUILD=sphinx-build" "html" "latex" "texinfo")))
          (replace 'install
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let* ((data (string-append (assoc-ref outputs "out") "/share"))
@@ -3605,14 +3738,14 @@ functions.")
 (define-public python-scipy
   (package
     (name "python-scipy")
-    (version "1.0.0")
+    (version "1.0.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "scipy" version))
        (sha256
         (base32
-         "043djb3vyk6qripmyw30jhl0g8qza0fmar6wck10iv79l08izsl7"))))
+         "1fj0r7bg0cfk5clvl57ga06y9bfh05iwlv1dqqs1r6pd89wccfc7"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-numpy" ,python-numpy)
@@ -3750,6 +3883,27 @@ Python code against some of the style conventions in
 (define-public python2-pycodestyle
   (package-with-python2 python-pycodestyle))
 
+(define-public python-multidict
+  (package
+    (name "python-multidict")
+    (version "4.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "multidict" version))
+       (sha256
+        (base32
+         "1vf5bq8hn5a9rvhr5v4fwbmarfsp35hhr8gs74kqfijy34j2f194"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)
+       ("python-pytest-runner" ,python-pytest-runner)))
+    (home-page "https://github.com/aio-libs/multidict/")
+    (synopsis "Multidict implementation")
+    (description "Multidict is dict-like collection of key-value pairs
+where key might be occurred more than once in the container.")
+    (license license:asl2.0)))
+
 (define-public python-orderedmultidict
   (package
     (name "python-orderedmultidict")
@@ -4908,14 +5062,14 @@ converts incoming documents to Unicode and outgoing documents to UTF-8.")
 (define-public python-netifaces
   (package
     (name "python-netifaces")
-    (version "0.10.6")
+    (version "0.10.7")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "netifaces" version))
         (sha256
           (base32
-            "1q7bi5k2r955rlcpspx4salvkkpk28jky67fjbpz2dkdycisak8c"))))
+            "1gccklrcplbbqh81g1mdgpa5y8na7kkf29cq2ka3f5a2fp5hyndx"))))
     (build-system python-build-system)
     (home-page "https://github.com/al45tair/netifaces")
     (synopsis
@@ -5099,6 +5253,29 @@ more advanced mathematics.")
 (define-public python2-mpmath
   (package-with-python2 python-mpmath))
 
+(define-public python-bigfloat
+  (package
+    (name "python-bigfloat")
+    (version "0.3.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "bigfloat" version))
+       (sha256
+        (base32 "0xd7q4l7v0f463diznjv4k9wlaks80pn9drdqmfifi7zx8qvybi6"))))
+    (build-system python-build-system)
+    (inputs
+     `(("mpfr" ,mpfr)))
+    (home-page "https://github.com/mdickinson/bigfloat")
+    (synopsis "Arbitrary precision floating-point arithmetic for Python")
+    (description
+     "This packages provides a Python interface to the MPFR library for
+multiprecision arithmetic.")
+    (license license:lgpl3+)))
+
+(define-public python2-bigfloat
+  (package-with-python2 python-bigfloat))
+
 (define-public python-sympy
   (package
     (name "python-sympy")
@@ -5315,13 +5492,14 @@ so it might be a tiny bit slower.")
        (modify-phases %standard-phases
          (replace 'build
            (lambda _
-             (zero? (system* "python" "waf-light" "configure" "build"))))
+             (invoke "python" "waf-light" "configure" "build")))
          (replace 'check
            (lambda _
-             (zero? (system* "python" "waf" "--version"))))
+             (invoke "python" "waf" "--version")))
          (replace 'install
            (lambda _
-             (copy-file "waf" %output))))))
+             (copy-file "waf" %output)
+             #t)))))
     (home-page "https://waf.io/")
     (synopsis "Python-based build system")
     (description
@@ -6128,14 +6306,14 @@ designed to efficiently cope with extremely large amounts of data.")
 (define-public python-pyasn1
   (package
     (name "python-pyasn1")
-    (version "0.2.3")
+    (version "0.4.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "pyasn1" version))
        (sha256
         (base32
-         "1b86yx23c1x74clai05a5ma8c8nfmhlx3j1mxq0ff657i2ylx33k"))))
+         "05bxnr4wmrg62m4qr1pg1p3z7bhwrv74jll3k42pgxwl36kv0n6j"))))
     (build-system python-build-system)
     (home-page "http://pyasn1.sourceforge.net/")
     (synopsis "ASN.1 types and codecs")
@@ -6250,6 +6428,26 @@ specification.")
 (define-public python2-idna
   (package-with-python2 python-idna))
 
+(define-public python-idna-ssl
+  (package
+    (name "python-idna-ssl")
+    (version "1.0.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "idna-ssl" version))
+       (sha256
+        (base32
+         "0ydrc8hpg9mdr5hqq1lqfsfbn6sjq69slwpfrnlrm3k0phqg14qj"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:tests? #f))          ;circular dependency with python-aiohttp
+    (home-page "https://github.com/aio-libs/idna-ssl")
+    (synopsis "Patch @code{ssl.match_hostname} for Unicode(idna) domains support")
+    (description "Patch @code{ssl.match_hostname} for Unicode(idna)
+domains support.")
+    (license license:expat)))
+
 (define-public python-pretend
   (package
     (name "python-pretend")
@@ -6805,6 +7003,12 @@ Jupyter kernels such as IJulia and IRKernel.")
        ("python-jupyter-console" ,python-jupyter-console)
        ("python-nbconvert" ,python-nbconvert)
        ("python-notebook" ,python-notebook)))
+
+    (native-search-paths
+     (list (search-path-specification
+            (variable "JUPYTER_PATH")
+            (files '("share/jupyter")))))
+
     (home-page "http://jupyter.org")
     (synopsis "Web application for interactive documents")
     (description
@@ -7495,14 +7699,14 @@ library as well as on the command line.")
 (define-public python-pluggy
   (package
    (name "python-pluggy")
-   (version "0.3.1")
+   (version "0.6.0")
    (source
     (origin
      (method url-fetch)
      (uri (pypi-uri "pluggy" version))
      (sha256
       (base32
-       "18qfzfm40bgx672lkg8q9x5hdh76n7vax99aank7vh2nw21wg70m"))))
+       "1zqckndfn85l1cd8pndw212zg1bq9fkg1nnj32kp2mppppsyg2kz"))))
    (build-system python-build-system)
    (synopsis "Plugin and hook calling mechanism for Python")
    (description "Pluggy is an extraction of the plugin manager as used by
@@ -10414,6 +10618,10 @@ a file-like object from which an arbitrarly-sized key can be read.")
      `(("python-lxml" ,python-lxml)     ; for SVG output
        ("python-pillow" ,python-pillow) ; for PNG output
        ("python-six" ,python-six)))
+    (inputs
+     `(;; The setup.cfg file needs to be used, and support for this requires
+       ;; at least version 30.3.0 of setuptools
+       ("python-setuptools" ,python-setuptools)))
     (home-page "https://github.com/lincolnloop/python-qrcode")
     (synopsis "QR Code image generator")
     (description "This package provides a pure Python QR Code generator
@@ -10479,14 +10687,14 @@ convering text with ANSI color codes to HTML or LaTeX.")
 (define-public python-ddt
   (package
     (name "python-ddt")
-    (version "1.1.2")
+    (version "1.1.3")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "ddt" version))
        (sha256
         (base32
-         "1wqkmz0yhanly8sif5vb02p2iik7mwxwph8ywph2kbb8ws8szdpx"))))
+         "1lw17420iimhghkgzgax85nn8d1an2d6k2cfvb7j5kwn2dqlr1vk"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-mock" ,python-mock)
@@ -10691,19 +10899,21 @@ and bit flag values.")
 (define-public python-attrs
   (package
     (name "python-attrs")
-    (version "17.2.0")
+    (version "17.4.0")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "attrs" version))
               (sha256
                (base32
-                "04gx08ikpk26wnq22f7l42gapcvk8iz1512r927k6sadz6cinkax"))))
+                "1jafnn1kzd6qhxgprhx6y6ik1r5m2rilx25syzcmq03azp660y8w"))))
     (build-system python-build-system)
     (native-inputs
-     `(("python-pytest" ,python-pytest)
+     `(("python-coverage" ,python-coverage)
        ("python-hypothesis" ,python-hypothesis)
-       ("python-zope-interface" ,python-zope-interface)
-       ("python-six" ,python-six)))
+       ("python-pytest" ,python-pytest)
+       ("python-six" ,python-six)
+       ("python-sphinx" ,python-sphinx)
+       ("python-zope-interface" ,python-zope-interface)))
     (home-page "https://github.com/python-attrs/attrs/")
     (synopsis "Attributes without boilerplate")
     (description "@code{attrs} is a Python package with class decorators that
@@ -10714,6 +10924,16 @@ protocols.")
 (define-public python2-attrs
   (package-with-python2 python-attrs))
 
+(define-public python-attrs-bootstrap
+  (package
+    (inherit python-attrs)
+    (name "python-attrs-bootstrap")
+    (native-inputs `())
+    (arguments `(#:tests? #f))))
+
+(define-public python2-attrs-bootstrap
+  (package-with-python2 python-attrs-bootstrap))
+
 (define-public python2-cliapp
   (package
     (name "python2-cliapp")
@@ -13088,6 +13308,31 @@ file system events on Linux.")
          "0svc9nla3b9145d6b7fb9dizx412l3difzqw0ilh9lz52nsixw8j"))
        (file-name (string-append name "-" version ".tar.gz"))))))
 
+(define-public python-more-itertools
+  (package
+    (name "python-more-itertools")
+    (version "4.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "more-itertools" version))
+       (sha256
+        (base32
+         "0i3ch700g5fyjp692gprlnzbysl8w0sa2vijbp3s40drvk67xkn9"))))
+    (build-system python-build-system)
+    (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.")
+    (license license:expat)))
+
+(define-public python2-more-itertools
+  (package-with-python2 python-more-itertools))
+
 (define-public python-latexcodec
   (package
     (name "python-latexcodec")
@@ -13174,3 +13419,241 @@ Parso is also able to list multiple syntax errors in your Python file.")
 
 (define-public python2-parso
   (package-with-python2 python-parso))
+
+(define-public python-async-generator
+  (package
+    (name "python-async-generator")
+    (version "1.9")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "async_generator" version))
+       (sha256
+        (base32
+         "0wc3hidz1q85cja93k5pzybn0fprfnqyrv4qlkdqdzklc5f4dmdp"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
+    (home-page "https://github.com/python-trio/async_generator")
+    (synopsis "Async generators and context managers for Python 3.5+")
+    (description "@code{async_generator} back-ports Python 3.6's native async
+generators and Python 3.7's context managers into Python 3.5.")
+    ;; Dual licensed.
+    (license (list license:expat license:asl2.0))))
+
+(define-public python-async-timeout
+  (package
+    (name "python-async-timeout")
+    (version "2.0.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "async-timeout" version))
+       (sha256
+        (base32
+         "1l3kg062m02mph6rf9rdv8r5c5n356clxa6b6mrn0i77vk9g9kq0"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/aio-libs/async_timeout/")
+    (synopsis "Timeout context manager for asyncio programs")
+    (description "@code{async-timeout} provides a timeout timeout context
+manager compatible with @code{asyncio}.")
+    (license license:asl2.0)))
+
+(define-public python-glob2
+  (package
+    (name "python-glob2")
+    (version "0.6")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://github.com/miracle2k/python-glob2/archive/"
+                    version
+                    ".tar.gz"))
+              (sha256
+               (base32
+                "0ja168f0dz4kbz4m06dm0rd3acaypk6hjx2km541pw22y9s40mag"))
+              (file-name (string-append name "-" version ".tar.gz"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/miracle2k/python-glob2/")
+    (synopsis "Extended Version of the python buildin glob module")
+    (description "This is an extended version of the Python
+@url{http://docs.python.org/library/glob.html, built-in glob module} which
+adds:
+
+@itemize
+@item The ability to capture the text matched by glob patterns, and return
+those matches alongside the file names.
+@item A recursive @code{**} globbing syntax, akin for example to the
+@code{globstar} option of Bash.
+@item The ability to replace the file system functions used, in order to glob
+on virtual file systems.
+@item Compatible with Python 2 and Python 3 (tested with 3.3).
+@end itemize
+
+Glob2 currently based on the glob code from Python 3.3.1.")
+    (license license:bsd-2)))
+
+(define-public python2-glob2
+  (package-with-python2 python-glob2))
+
+(define-public python-gipc
+  (package
+    (name "python-gipc")
+    (version "0.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "gipc" version ".zip"))
+       (sha256
+        (base32
+         "0pd9by719qh882hqs6xpby61sn1x5h98hms5p2p8yqnycrf1s0h2"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("unzip" ,unzip)))
+    (propagated-inputs
+     `(("python-gevent" ,python-gevent)))
+    (home-page "http://gehrcke.de/gipc")
+    (synopsis "Child process management in the context of gevent")
+    (description "Usage of Python's multiprocessing package in a
+gevent-powered application may raise problems.  With @code{gipc},
+process-based child processes can safely be created anywhere within a
+gevent-powered application.")
+    (license license:expat)))
+
+(define-public python2-gipc
+  (package-with-python2 python-gipc))
+
+(define-public python-fusepy
+  (package
+    (name "python-fusepy")
+    (version "2.0.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "fusepy" version))
+       (sha256
+        (base32
+         "0v5grm4zyf58hsplwsxfbihddw95lz9w8cy3rpzbyha287swgx8h"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'set-library-file-name
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let ((fuse (assoc-ref inputs "fuse")))
+               (substitute* "fuse.py"
+                 (("find_library\\('fuse'\\)")
+                  (string-append "'" fuse "/lib/libfuse.so'")))
+               #t))))))
+    (propagated-inputs
+     `(("fuse" ,fuse)))
+    (home-page "https://github.com/fusepy/fusepy")
+    (synopsis "Simple ctypes bindings for FUSE")
+    (description "Python module that provides a simple interface to FUSE and
+MacFUSE.  The binding is created using the standard @code{ctypes} library.")
+    (license license:isc)))
+
+(define-public python2-fusepy
+  (package-with-python2 python-fusepy))
+
+(define-public python2-gdrivefs
+  (package
+    (name "python2-gdrivefs")
+    (version "0.14.9")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "gdrivefs" version))
+       (sha256
+        (base32
+         "0v9sp2cfg4ki3wagkwf3rnfpjhvgf845anz3757il9z95yvvcvb7"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:python ,python-2
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'patch-setup-py
+           (lambda _
+             ;; Update requirements from dependency==version
+             ;; to dependency>=version
+             (substitute* "gdrivefs/resources/requirements.txt"
+               (("==") ">="))
+             #t)))))
+    (native-inputs
+     `(("python2-gipc" ,python2-gipc)
+       ("python2-gevent" ,python2-gevent)
+       ("python2-greenlet" ,python2-greenlet)
+       ("python2-httplib2" ,python2-httplib2)
+       ("python2-uritemplate" ,python2-uritemplate)
+       ("python2-oauth2client" ,python2-oauth2client)
+       ("python2-six" ,python2-six)))
+    (propagated-inputs
+     `(("python2-dateutil" ,python2-dateutil)
+       ("python2-fusepy" ,python2-fusepy)
+       ("python2-google-api-client" ,python2-google-api-client)))
+    (home-page "https://github.com/dsoprea/GDriveFS")
+    (synopsis "Mount Google Drive as a local file system")
+    (description "@code{gdrivefs} provides a FUSE wrapper for Google Drive
+under Python 2.7.")
+    (license license:gpl2)))
+
+(define-public pybind11
+  (package
+    (name "pybind11")
+    (version "2.2.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://github.com/pybind/pybind11/archive/v"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "1sj0x4fwsbnwdai5sxpw1l1vh8m5hpbkfk3zanxcbcgs39jpnfrs"))
+              (file-name (string-append name "-" version ".tar.gz"))))
+    (build-system cmake-build-system)
+    (native-inputs
+     `(("python" ,python)
+       ("python-pytest" ,python-pytest)))
+    (arguments
+     `(#:test-target "check"))
+    (home-page "https://github.com/pybind/pybind11/")
+    (synopsis "Seamless operability between C++11 and Python")
+    (description "pybind11 is a lightweight header-only library that exposes
+C++ types in Python and vice versa, mainly to create Python bindings of
+existing C++ code.  Its goals and syntax are similar to the excellent
+Boost.Python library by David Abrahams: to minimize boilerplate code in
+traditional extension modules by inferring type information using compile-time
+introspection.")
+    (license license:expat)))
+
+(define-public python-fasteners
+  (package
+    (name "python-fasteners")
+    (version "0.14.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "fasteners" version))
+       (sha256
+        (base32
+         "063y20kx01ihbz2mziapmjxi2cd0dq48jzg587xdsdp07xvpcz22"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-monotonic" ,python-monotonic)
+       ("python-six" ,python-six)
+       ("python-testtools" ,python-testtools)))
+    (home-page "https://github.com/harlowja/fasteners")
+    (synopsis "Python package that provides useful locks")
+    (description
+     "This package provides a Python program that provides following locks:
+
+@itemize
+@item Locking decorator
+@item Reader-writer locks
+@item Inter-process locks
+@item Generic helpers
+@end itemize\n")
+    (license license:asl2.0)))
+
+(define-public python2-fasteners
+  (package-with-python2 python-fasteners))