summary refs log tree commit diff
path: root/gnu
diff options
context:
space:
mode:
Diffstat (limited to 'gnu')
-rw-r--r--gnu/local.mk4
-rw-r--r--gnu/packages/admin.scm22
-rw-r--r--gnu/packages/backup.scm19
-rw-r--r--gnu/packages/bioinformatics.scm37
-rw-r--r--gnu/packages/calendar.scm2
-rw-r--r--gnu/packages/django.scm13
-rw-r--r--gnu/packages/enlightenment.scm12
-rw-r--r--gnu/packages/jrnl.scm2
-rw-r--r--gnu/packages/mail.scm6
-rw-r--r--gnu/packages/music.scm2
-rw-r--r--gnu/packages/openstack.scm143
-rw-r--r--gnu/packages/patches/python-dendropy-fix-tests.patch41
-rw-r--r--gnu/packages/patches/python-fake-factory-fix-build-32bit.patch36
-rw-r--r--gnu/packages/patches/python-pbr-fix-man-page-support.patch28
-rw-r--r--gnu/packages/patches/python-pygit2-disable-network-tests.patch64
-rw-r--r--gnu/packages/patches/python-pyopenssl-skip-network-test.patch50
-rw-r--r--gnu/packages/pdf.scm4
-rw-r--r--gnu/packages/python.scm1039
-rw-r--r--gnu/packages/rdf.scm22
-rw-r--r--gnu/packages/terminals.scm3
-rw-r--r--gnu/packages/version-control.scm2
-rw-r--r--gnu/packages/vpn.scm8
22 files changed, 1237 insertions, 322 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 584ab75a57..15003bcab0 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -856,14 +856,18 @@ dist_patch_DATA =						\
   %D%/packages/patches/python-3-search-paths.patch		\
   %D%/packages/patches/python-3.4-fix-tests.patch		\
   %D%/packages/patches/python-3.5-fix-tests.patch		\
+  %D%/packages/patches/python-dendropy-fix-tests.patch		\
   %D%/packages/patches/python-file-double-encoding-bug.patch	\
   %D%/packages/patches/python-fix-tests.patch			\
   %D%/packages/patches/python-parse-too-many-fields.patch	\
   %D%/packages/patches/python2-rdflib-drop-sparqlwrapper.patch	\
   %D%/packages/patches/python-statsmodels-fix-tests.patch	\
   %D%/packages/patches/python-configobj-setuptools.patch	\
+  %D%/packages/patches/python-fake-factory-fix-build-32bit.patch	\
   %D%/packages/patches/python-paste-remove-website-test.patch	\
   %D%/packages/patches/python-paste-remove-timing-test.patch	\
+  %D%/packages/patches/python-pygit2-disable-network-tests.patch	\
+  %D%/packages/patches/python-pyopenssl-skip-network-test.patch	\
   %D%/packages/patches/python-pycrypto-CVE-2013-7459.patch	\
   %D%/packages/patches/python2-pygobject-2-gi-info-type-error-domain.patch \
   %D%/packages/patches/python-pygpgme-fix-pinentry-tests.patch	\
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 17d726b7ac..d2001d4e2c 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -1699,15 +1699,29 @@ throughput (in the same interval).")
                (base32
                 "04q2cn8c83f6z6wn1scla1ilrpi5ssjc64987hvmwfvwvb82bvkp"))))
     (build-system python-build-system)
-    (inputs
+    (arguments
+     '(#:tests? #f))
+       ;; FIXME: 10 test failures. Some require newer pytest (> 2.9.2).
+       ;; Others need more work. Un-comment the below to run the tests.
+       ;; #:phases
+       ;; (modify-phases %standard-phases
+       ;;   (replace 'check
+       ;;     (lambda _
+       ;;       ;; Some tests need write access to $HOME.
+       ;;       (setenv "HOME" "/tmp")
+       ;;       (zero? (system* "py.test" "-v")))))))
+    (propagated-inputs
      `(("python-colorama" ,python-colorama)
        ("python-decorator" ,python-decorator)
        ("python-psutil" ,python-psutil)
        ("python-six" ,python-six)))
     (native-inputs
-     ;; Requires setuptools >= 17.1 due to some features used, while our
-     ;; python currently only includes 12.0. TODO: Remove this input.
-     `(("python-setuptools" ,python-setuptools)))
+     `(("python-mock" ,python-mock)
+       ("python-pytest" ,python-pytest)
+       ("python-pytest-mock" ,python-pytest-mock)
+       ;; Requires setuptools >= 17.1 due to some features used, while our
+       ;; python currently only includes 12.0. TODO: Remove this input.
+       ("python-setuptools" ,python-setuptools)))
     (home-page "https://github.com/nvbn/thefuck")
     (synopsis "Correct mistyped console command")
     (description
diff --git a/gnu/packages/backup.scm b/gnu/packages/backup.scm
index ae4e4b20ea..986ffef08f 100644
--- a/gnu/packages/backup.scm
+++ b/gnu/packages/backup.scm
@@ -67,6 +67,7 @@
     (build-system python-build-system)
     (native-inputs
      `(("util-linux" ,util-linux)     ;setsid command, for the tests
+       ("par2cmdline" ,par2cmdline)
        ("python-pexpect" ,python2-pexpect)
        ("mock" ,python2-mock)))
     (propagated-inputs
@@ -83,16 +84,18 @@
        #:test-target "test"
        #:phases
        (modify-phases %standard-phases
-         (add-before
-          'build 'patch-source ; embed gpg store name
-          (lambda* (#:key inputs #:allow-other-keys)
-            (substitute* "duplicity/gpginterface.py"
-              (("self.call = 'gpg'")
-               (string-append "self.call = '" (assoc-ref inputs "gnupg") "/bin/gpg'")))))
-         (add-before 'check 'check-setup
+         (add-before 'build 'patch-source
            (lambda* (#:key inputs #:allow-other-keys)
-             (substitute* "testing/functional/__init__.py"
+             ;; embed gpg store name
+             (substitute* "duplicity/gpginterface.py"
+               (("self.call = 'gpg'")
+                (string-append "self.call = '" (assoc-ref inputs "gnupg") "/bin/gpg'")))
+             (substitute* '("testing/functional/__init__.py"
+                            "testing/overrides/bin/lftp")
                (("/bin/sh") (which "sh")))
+             #t))
+         (add-before 'check 'check-setup
+           (lambda* (#:key inputs #:allow-other-keys)
              (setenv "HOME" (getcwd)) ;gpg needs to write to $HOME
              (setenv "TZDIR"          ;some timestamp checks need TZDIR
                      (string-append (assoc-ref inputs "tzdata")
diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
index 0fc8c0483e..7bf39c6b03 100644
--- a/gnu/packages/bioinformatics.scm
+++ b/gnu/packages/bioinformatics.scm
@@ -499,6 +499,9 @@ provides the Ribotaper pipeline.")
        ("python-matplotlib" ,python2-matplotlib)
        ("python-scipy" ,python2-scipy)
        ("python-statsmodels" ,python2-statsmodels)))
+    (native-inputs
+     `(("python-mock" ,python2-mock)
+       ("python-nose" ,python2-nose)))
     (home-page "http://public.bmi.inf.ethz.ch/user/zhongy/RiboDiff/")
     (synopsis "Detect translation efficiency changes from ribosome footprints")
     (description "RiboDiff is a statistical tool that detects the protein
@@ -604,6 +607,8 @@ Python.")
       ("python-future" ,python-future)
       ("python-click" ,python-click)
       ("python-h5py" ,python-h5py)))
+   (native-inputs
+    `(("python-nose" ,python-nose)))
    (home-page "http://www.biom-format.org")
    (synopsis "Biological Observation Matrix (BIOM) format utilities")
    (description
@@ -1602,6 +1607,7 @@ databases.")
        ("python-scipy" ,python2-scipy)))
     (native-inputs
      `(("python-mock" ,python2-mock)   ; for tests
+       ("python-nose" ,python2-nose)   ; for tests
        ("python-pytz" ,python2-pytz))) ; for tests
     (home-page "https://github.com/YeoLab/clipper")
     (synopsis "CLIP peak enrichment recognition")
@@ -1978,7 +1984,8 @@ accessing bigWig files.")
        (uri (pypi-uri "DendroPy" version))
        (sha256
         (base32
-         "15c7s3d5gf19ljsxvq5advaa752wfi7pwrdjyhzmg85hccyvp47p"))))
+         "15c7s3d5gf19ljsxvq5advaa752wfi7pwrdjyhzmg85hccyvp47p"))
+       (patches (search-patches "python-dendropy-fix-tests.patch"))))
     (build-system python-build-system)
     (home-page "http://packages.python.org/DendroPy/")
     (synopsis "Library for phylogenetics and phylogenetic computing")
@@ -2030,6 +2037,7 @@ trees (phylogenies) and characters.")
        ("python-pybigwig" ,python2-pybigwig)))
     (native-inputs
      `(("python-mock" ,python2-mock)   ;for tests
+       ("python-nose" ,python2-nose)   ;for tests
        ("python-pytz" ,python2-pytz))) ;for tests
     (home-page "https://github.com/fidelram/deepTools")
     (synopsis "Tools for normalizing and visualizing deep-sequencing data")
@@ -2969,28 +2977,10 @@ data.  It also provides the bgzip, htsfile, and tabix utilities.")
                 "1k3x44biak00aiv3hpm1yd6nn4hhp7n0qnbs3zh2q9sw7qr1qj5r"))))
     (build-system python-build-system)
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-after
-          'install 'wrap-program
-          (lambda* (#:key inputs outputs #:allow-other-keys)
-            (let* ((out (assoc-ref outputs "out"))
-                   (python-version (string-take (string-take-right
-                                                 (assoc-ref inputs "python") 5) 3))
-                   (path (string-join
-                          (map (lambda (name)
-                                 (string-append (assoc-ref inputs name)
-                                                "/lib/python" python-version
-                                                "/site-packages"))
-                               '("python-scipy"
-                                 "python-numpy"
-                                 "python-matplotlib"))
-                          ":")))
-              (wrap-program (string-append out "/bin/idr")
-                `("PYTHONPATH" ":" prefix (,path))))
-            #t)))))
-    (inputs
+     `(#:tests? #f)) ; FIXME: "ImportError: No module named 'utility'"
+    (propagated-inputs
      `(("python-scipy" ,python-scipy)
+       ("python-sympy" ,python-sympy)
        ("python-numpy" ,python-numpy)
        ("python-matplotlib" ,python-matplotlib)))
     (native-inputs
@@ -3679,6 +3669,9 @@ the phenotype as it models the data.")
       (build-system python-build-system)
       (arguments
        `(#:python ,python-2
+         ;; FIXME: Tests fail with "No such file or directory:
+         ;; pbtools/pbtranscript/modified_bx_intervals/intersection_unique.so"
+         #:tests? #f
          #:phases
          (modify-phases %standard-phases
            (add-after 'unpack 'enter-directory
diff --git a/gnu/packages/calendar.scm b/gnu/packages/calendar.scm
index 4726abffde..7831870c55 100644
--- a/gnu/packages/calendar.scm
+++ b/gnu/packages/calendar.scm
@@ -125,7 +125,7 @@ data units.")
      `(("sqlite" ,sqlite)))
     (propagated-inputs
      `(("python-configobj" ,python-configobj)
-       ("python-dateutil-2" ,python-dateutil-2)
+       ("python-dateutil" ,python-dateutil)
        ("python-icalendar" ,python-icalendar)
        ("python-tzlocal" ,python-tzlocal)
        ("python-urwid" ,python-urwid)
diff --git a/gnu/packages/django.scm b/gnu/packages/django.scm
index 9a3c66c45e..185fbf8e62 100644
--- a/gnu/packages/django.scm
+++ b/gnu/packages/django.scm
@@ -106,6 +106,10 @@ to the @dfn{don't repeat yourself} (DRY) principle.")
                (base32
                 "0906hms6y6znjhpd0g4wmzv9vcla4brkdpsm4zha9zdj8g5vq2hd"))))
     (build-system python-build-system)
+    (arguments
+     ;; FIXME: Upstream uses a 'runtests.py' script that is not
+     ;; present in the pypi tarball.
+     '(#:tests? #f))
     (propagated-inputs
      `(("python-django" ,python-django)))
     (home-page "https://github.com/alsoicode/django-simple-math-captcha")
@@ -131,7 +135,8 @@ with arguments to the field constructor.")
                 "1mmc7zsz3dlhs6sx4sppkj1vgshabi362r1a8b8wpj1qfximpqcb"))))
     (build-system python-build-system)
     (arguments
-     `(#:phases
+     `(#:tests? #f ; FIXME: How to run tests?
+       #:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'patch-setuppy
            (lambda _
@@ -163,6 +168,12 @@ useful tools for testing Django applications and projects.")
                (base32
                 "0f78hmk8c903zwfzlsiw7ivgag81ymmb5hi73rzxbhnlg2v0l3fx"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (zero? (system* "python" "runtests.py")))))))
     (native-inputs
      `(("python-django" ,python-django)
        ("python-mock" ,python-mock)))
diff --git a/gnu/packages/enlightenment.scm b/gnu/packages/enlightenment.scm
index bc455c0bd4..b9a55333df 100644
--- a/gnu/packages/enlightenment.scm
+++ b/gnu/packages/enlightenment.scm
@@ -253,7 +253,17 @@ embedded systems.")
          (lambda _
            (setenv "CFLAGS"
                    (string-append "-I" (assoc-ref %build-inputs "python-dbus")
-                                  "/include/dbus-1.0")))))))
+                                  "/include/dbus-1.0"))
+           #t))
+        (add-before 'check 'set-environment
+          (lambda _
+            ;; Some tests require write access to HOME.
+            (setenv "HOME" "/tmp")
+            #t)))
+       ;; FIXME: Some tests require a running D-Bus server or a network
+       ;; connection and should be disabled. Other test failures looks
+       ;; legitimate. Disabled for now, needs work!
+       #:tests? #f))
     (native-inputs
      `(("pkg-config" ,pkg-config)
        ("python-cython" ,python-cython)))
diff --git a/gnu/packages/jrnl.scm b/gnu/packages/jrnl.scm
index ef1f52956c..f26de0d4ab 100644
--- a/gnu/packages/jrnl.scm
+++ b/gnu/packages/jrnl.scm
@@ -48,7 +48,7 @@
        ("python-pytz" ,python-pytz)
        ("python-tzlocal" ,python-tzlocal)
        ("python-six" ,python-six)
-       ("python-dateutil" , python-dateutil-2)
+       ("python-dateutil" ,python-dateutil)
        ("python-parsedatetime" ,python-parsedatetime)))
     (home-page "http://maebert.github.io/jrnl/")
     (synopsis "Personal journal application")
diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index ee82a1b8bb..b70597b84d 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -1512,7 +1512,11 @@ maintained.")
             (lambda* (#:key outputs #:allow-other-keys)
               (let* ((out (assoc-ref outputs "out"))
                      (doc (string-append out "/share/doc/khard")))
-                (copy-recursively "misc/khard" doc)))))))
+                (copy-recursively "misc/khard" doc)
+                #t))))
+        ;; FIXME: check phase fails with
+        ;; "Config file /tmp/.config/khard/khard.conf not available"
+        #:tests? #f))
     (propagated-inputs
      `(("python-vobject" ,python-vobject)
        ("python-pyyaml" ,python-pyyaml)
diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index 730d981e67..87b6d5b9b3 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -2061,6 +2061,8 @@ detailed track info including timbre, pitch, rhythm and loudness information.
                (base32
                 "0bml11gfkxqd3i2jxkn5k2xllc4rvxjcyhs8an05gcyy1zp2bwvb"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Requires unpackaged python-flaky.
     (native-inputs
      `(("python-coverage" ,python-coverage)
        ("python-mock" ,python-mock)
diff --git a/gnu/packages/openstack.scm b/gnu/packages/openstack.scm
index e2672668d8..51566b65e3 100644
--- a/gnu/packages/openstack.scm
+++ b/gnu/packages/openstack.scm
@@ -19,6 +19,7 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages openstack)
+  #:use-module (gnu packages gnupg)
   #:use-module (gnu packages python)
   #:use-module (gnu packages ssh)
   #:use-module (gnu packages tls)
@@ -64,10 +65,16 @@
 To do this Bandit processes each file, builds an AST from it, and runs
 appropriate plugins against the AST nodes.  Once Bandit has finished scanning
 all the files it generates a report.")
+    (properties `((python2-variant . ,(delay python2-bandit))))
     (license asl2.0)))
 
 (define-public python2-bandit
-  (package-with-python2 python-bandit))
+  (package (inherit (package-with-python2
+                     (strip-python2-variant python-bandit)))
+           (arguments
+            `(#:python ,python-2
+              ;; FIXME: 'subunit.run discover: error: no such option: --list'
+              #:tests? #f))))
 
 (define-public python-debtcollector
   (package
@@ -81,6 +88,8 @@ all the files it generates a report.")
           (base32
            "0g4dfskaiy47rhsh4gh66l5vmdsrgq0qk68pl3ix1cj3ffvfndzv"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ;FIXME: Requires packaging python-doc8.
     (propagated-inputs
      `(("python-six" ,python-six)
        ("python-wrapt" ,python-wrapt)))
@@ -113,6 +122,9 @@ manner.")
         (base32
          "1a310k3dv04jg7zvmk37h2ql7y9kf4hvdxb74bjlwdxgmy6h4wap"))))
     (build-system python-build-system)
+    (arguments
+     ;; TODO: Requires unpackaged 'eventlet'.
+     '(#:tests? #f))
     (propagated-inputs
       `(("python-flake8-2.2.4" ,python-flake8-2.2.4)
         ("python-mccabe-0.2.1" ,python-mccabe-0.2.1)
@@ -146,9 +158,14 @@ guidelines}.")
           (base32
            "0njmh40i1lg5mzn9hc2ax83adj6dli455j6xifilrw27c4wlkjzx"))))
     (build-system python-build-system)
+    (arguments
+     ;; TODO: Resolve dependency cycle and re-enable.
+     '(#:tests? #f))
     (native-inputs
       `(("python-fixtures" ,python-fixtures)
+        ; TODO re-add ("python-oslosphinx" ,python-oslosphinx)
         ("python-pbr" ,python-pbr)
+        ("python-sphinx" ,python-sphinx)
         ("python-testtools" ,python-testtools)))
     (home-page "http://www.openstack.org/")
     (synopsis "Mock object framework for Python")
@@ -234,14 +251,14 @@ tested on Python version 3.2, 2.7 and 2.6.")
 (define-public python-requests-mock
   (package
     (name "python-requests-mock")
-    (version "1.0.0")
+    (version "1.3.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "requests-mock" version))
        (sha256
         (base32
-         "0gcjjwsckhqixyffflc54i59x41jnbb37bli077vabii1bjmkin6"))))
+         "0jr997dvk6zbmhvbpcv3rajrgag69mcsm1ai3w3rgk2jdh6rg1mx"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-requests" ,python-requests)
@@ -260,10 +277,16 @@ tested on Python version 3.2, 2.7 and 2.6.")
     (description
       "This module provides a building block to stub out the HTTP requests
 portions of your testing code.")
+    (properties `((python2-variant . ,(delay python2-requests-mock))))
     (license asl2.0)))
 
 (define-public python2-requests-mock
-  (package-with-python2 python-requests-mock))
+  (package (inherit (package-with-python2
+                     (strip-python2-variant python-requests-mock)))
+           (arguments
+            `(#:python ,python-2
+              ;; FIXME: 'subunit.run discover: error: no such option: --list'
+              #:tests? #f))))
 
 (define-public python-stevedore
   (package
@@ -282,10 +305,13 @@ portions of your testing code.")
     (native-inputs
       `(("python-pbr" ,python-pbr)
         ;; Tests
+        ("python-discover" ,python-discover)
         ("python-docutils" ,python-docutils)
         ("python-mock" ,python-mock)
+        ("python-oslosphinx" ,python-oslosphinx)
         ("python-oslotest" ,python-oslotest)
-        ("python-sphinx" ,python-sphinx)))
+        ("python-sphinx" ,python-sphinx)
+        ("python-testrepository" ,python-testrepository)))
     (home-page "https://github.com/dreamhost/stevedore")
     (synopsis "Manage dynamic plugins for Python applications")
     (description
@@ -297,10 +323,16 @@ mechanism by building on top of setuptools entry points.  The code for managing
 entry points tends to be repetitive, though, so stevedore provides manager
 classes for implementing common patterns for using dynamically loaded
 extensions.")
+    (properties `((python2-variant . ,(delay python2-stevedore))))
     (license asl2.0)))
 
 (define-public python2-stevedore
-  (package-with-python2 python-stevedore))
+  (package (inherit (package-with-python2
+                     (strip-python2-variant python-stevedore)))
+           (arguments
+            `(#:python ,python-2
+              ;; FIXME: 'subunit.run discover: error: no such option: --list'
+              #:tests? #f))))
 
 (define-public python-tempest-lib
   (package
@@ -315,7 +347,8 @@ extensions.")
         "1cpp2vwmawpd29hjsklsps181lq2ah91cl412qvpnz228nf9sqn5"))))
     (build-system python-build-system)
     (arguments
-     `(#:phases
+     `(#:tests? #f ; FIXME: Requires oslo.log >= 1.14.0.
+       #:phases
        (modify-phases %standard-phases
          (add-before
           'check 'pre-check
@@ -362,6 +395,8 @@ common features used in Tempest.")
          (base32
           "13r778jfb0fhna37c2pd1f2xipnsbd7zli7qhn96acrzymrwj5k1"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Requires packaging python-argparse.
     (propagated-inputs
       `(("python-netaddr" ,python-netaddr)
         ("python-six" ,python-six)
@@ -395,11 +430,19 @@ common features used in Tempest.")
         (base32
          "0kvha0rs9295njyl2z6n6zm5dapi5mrl5zwjm0m6ldqrvccyf8c3"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Requires python-mock >= 1.2.
     (native-inputs
       `(("python-babel" ,python-babel)
         ("python-pbr" ,python-pbr)
         ;; Tests.
-        ("python-oslotest" ,python-oslotest)))
+        ("python-coverage" ,python-coverage)
+        ("python-hacking" ,python-hacking)
+        ("python-mock" ,python-mock)
+        ("python-os-client-config" ,python-os-client-config)
+        ("python-oslotest" ,python-oslotest)
+        ("python-oslosphinx" ,python-oslosphinx)
+        ("python-sphinx" ,python-sphinx)))
     (home-page "http://launchpad.net/oslo")
     (synopsis "Oslo context library")
     (description
@@ -423,6 +466,8 @@ pipeline and used by various modules such as logging.")
           (base32
            "0bpb1c20sm8my650gl824nzaip83bfn8hr91s65k5ncmyh8hb6pl"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Circular dependency on python-oslo.config.
     (propagated-inputs
       `(("python-babel" ,python-babel)
         ("python-six" ,python-six)))
@@ -459,6 +504,8 @@ in an application or library.")
         (base32
           "1fhy6yvbd565nv4x4i3ppyrlbmz3yy9d0xsvw5nkqsa7g43nmf8z"))))
   (build-system python-build-system)
+  (arguments
+   '(#:tests? #f)) ; FIXME: Requires oslo.utils >= 3.2.0.
   (propagated-inputs
    `(("python-debtcollector" ,python-debtcollector)
      ("python-oslo.config" ,python-oslo.config)
@@ -496,6 +543,8 @@ handlers and support for context specific logging (like resource id’s etc).")
         (base32
          "00s03krhf833gs76aw5ns32w9m1i4hx6x6d9g82m0j5wyqk0sci4"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Requires python-oslo.utils >= 3.2.0.
     (propagated-inputs
       `(("python-iso8601" ,python-iso8601)
         ("python-netaddr" ,python-netaddr)
@@ -520,18 +569,74 @@ in transmittable and storable formats, such as JSON and MessagePack.")
 (define-public python2-oslo.serialization
   (package-with-python2 python-oslo.serialization))
 
+(define-public python-reno
+  (package
+    (name "python-reno")
+    (version "2.0.3")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "reno" version))
+        (sha256
+          (base32 "1i2wnn5fnm3jm5774pahg000q0lma5i913hml91bbbm2mybphndd"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'init-git
+           (lambda _
+             ;; reno expects a git repo
+             (zero? (system* "git" "init")))))))
+    (propagated-inputs
+      `(("python-babel" ,python-babel)
+        ("python-dulwich" ,python-dulwich)
+        ("python-pyyaml" ,python-pyyaml)
+        ("python-six" ,python-six)))
+    (native-inputs
+      `(("python-testtools" ,python-testtools)
+        ("python-pbr" ,python-pbr)
+        ("python-testscenarios" ,python-testscenarios)
+        ("python-testrepository" ,python-testrepository)
+        ("python-mock" ,python-mock)
+        ("python-oslotest" ,python-oslotest)
+        ("gnupg" ,gnupg)
+        ("git" ,git)))
+    (home-page "http://docs.openstack.org/developer/reno/")
+    (synopsis "Release notes manager")
+    (description "Reno is a tool for storing release notes in a git repository
+and building documentation from them.")
+    (properties `((python2-variant . ,(delay python2-reno))))
+    (license asl2.0)))
+
+(define-public python2-reno
+  (package (inherit (package-with-python2
+                     (strip-python2-variant python-reno)))
+           (arguments
+            `(#:python ,python-2
+              ;; FIXME: 'subunit.run discover: error: no such option: --list'
+              #:tests? #f))))
+
 (define-public python-oslosphinx
   (package
     (name "python-oslosphinx")
-    (version "4.3.0")
+    (version "4.10.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "oslosphinx" version))
        (sha256
         (base32
-         "0cz8ym4i1n4rgljlqhyhfkpgdmid7nkb909k8r8nk186m9cmpla2"))))
+         "09mxqyabi68f3s3arvdhlhq0mn38vf74jbsfcg84151hcj6czhnl"))))
     (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             ;; Note: Upstream tests would have also built the release notes.
+             ;; That only would work if we were in a git checkout.
+             ;; Therefore, we don't do it here.
+             (zero? (system* "python" "setup.py" "build_sphinx")))))))
     (propagated-inputs
       `(("python-requests" ,python-requests)))
     (native-inputs
@@ -581,10 +686,16 @@ from the OpenStack project.")
     (description
       "The Oslo Test framework provides common fixtures, support for debugging,
 and better support for mocking results.")
+    (properties `((python2-variant . ,(delay python2-oslotest))))
     (license asl2.0)))
 
 (define-public python2-oslotest
-  (package-with-python2 python-oslotest))
+  (package (inherit (package-with-python2
+                     (strip-python2-variant python-oslotest)))
+           (arguments
+            `(#:python ,python-2
+              ;; FIXME: 'subunit.run discover: error: no such option: --list'
+              #:tests? #f))))
 
 (define-public python-oslo.utils
   (package
@@ -603,6 +714,8 @@ and better support for mocking results.")
             ;; phase.
             (delete-file "oslo_utils/tests/test_netutils.py")))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Requires oslo.config >= 2.7.0.
     (propagated-inputs
       `(("python-debtcollector" ,python-debtcollector)
         ("python-oslo.i18n" ,python-oslo.i18n)
@@ -616,6 +729,8 @@ and better support for mocking results.")
       `(("python-babel" ,python-babel)
         ("python-pbr" ,python-pbr)
         ;; Tests.
+        ("python-bandit" ,python-bandit)
+        ("python-oslo.config" ,python-oslo.config)
         ("python-oslotest" ,python-oslotest)
         ("python-mock" ,python-mock)
         ("python-mox3" ,python-mox3)
@@ -643,6 +758,8 @@ handling.")
          (base32
           "1w4csvkah67rfpxylxnvs2s3594i0f9isy8pf4gnsqs5zirvjaa4"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Many tests are failing.
     (native-inputs
      `(("python-sphinx" ,python-sphinx)
        ;; and some packages for the tests
@@ -749,6 +866,10 @@ permanence.")
 (define-public python2-swiftclient
   (let ((swiftclient (package-with-python2 python-swiftclient)))
     (package (inherit swiftclient)
+      (arguments
+       `(#:python ,python-2
+         ;; FIXME: subunit.run discover: error: no such option: --list
+         #:tests? #f))
       (propagated-inputs
        `(("python2-futures" ,python2-futures)
          ("python2-requests" ,python2-requests)
diff --git a/gnu/packages/patches/python-dendropy-fix-tests.patch b/gnu/packages/patches/python-dendropy-fix-tests.patch
new file mode 100644
index 0000000000..30ab618ff1
--- /dev/null
+++ b/gnu/packages/patches/python-dendropy-fix-tests.patch
@@ -0,0 +1,41 @@
+This patch fixes two test failures.  It was downloaded from:
+https://github.com/jeetsukumaran/DendroPy/commit/93f984bba7a6c588a28ca87f4e557ce283809453
+
+From 93f984bba7a6c588a28ca87f4e557ce283809453 Mon Sep 17 00:00:00 2001
+From: jeetsukumaran <jeetsukumaran@gmail.com>
+Date: Tue, 21 Feb 2017 16:41:01 -0500
+Subject: [PATCH] Update to Python 3 container and iteration semantics
+
+---
+ dendropy/dataio/newickreader.py | 3 ++-
+ dendropy/datamodel/treemodel.py | 3 +++
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/dendropy/dataio/newickreader.py b/dendropy/dataio/newickreader.py
+index 6dcf3c5..f978729 100644
+--- a/dendropy/dataio/newickreader.py
++++ b/dendropy/dataio/newickreader.py
+@@ -303,7 +303,8 @@ def tree_iter(self,
+                     taxon_symbol_map_fn=taxon_symbol_mapper.require_taxon_for_symbol)
+             yield tree
+             if tree is None:
+-                raise StopIteration
++                # raise StopIteration
++                return
+ 
+     def _read(self,
+             stream,
+diff --git a/dendropy/datamodel/treemodel.py b/dendropy/datamodel/treemodel.py
+index 0ecfe31..73146f0 100644
+--- a/dendropy/datamodel/treemodel.py
++++ b/dendropy/datamodel/treemodel.py
+@@ -772,6 +772,9 @@ def __hash__(self):
+     def __eq__(self, other):
+         return self is other
+ 
++    def __lt__(self, other):
++        return id(self) < id(other)
++
+     ###########################################################################
+     ### Basic Structure
+ 
diff --git a/gnu/packages/patches/python-fake-factory-fix-build-32bit.patch b/gnu/packages/patches/python-fake-factory-fix-build-32bit.patch
new file mode 100644
index 0000000000..cb60896fad
--- /dev/null
+++ b/gnu/packages/patches/python-fake-factory-fix-build-32bit.patch
@@ -0,0 +1,36 @@
+These tests fail on 32-bit due to an overflow.
+
+Upstream bug URL: https://github.com/joke2k/faker/issues/408
+
+diff --git a/faker/tests/__init__.py b/faker/tests/__init__.py
+index 6026772..58b6b83 100644
+--- a/faker/tests/__init__.py
++++ b/faker/tests/__init__.py
+@@ -384,7 +384,6 @@ class FactoryTestCase(unittest.TestCase):
+         provider = Provider
+         # test century
+         self.assertTrue(self._datetime_to_time(provider.date_time_this_century(after_now=False)) <= self._datetime_to_time(datetime.datetime.now()))
+-        self.assertTrue(self._datetime_to_time(provider.date_time_this_century(before_now=False, after_now=True)) >= self._datetime_to_time(datetime.datetime.now()))
+         # test decade
+         self.assertTrue(self._datetime_to_time(provider.date_time_this_decade(after_now=False)) <= self._datetime_to_time(datetime.datetime.now()))
+         self.assertTrue(self._datetime_to_time(provider.date_time_this_decade(before_now=False, after_now=True)) >= self._datetime_to_time(datetime.datetime.now()))
+@@ -413,8 +412,6 @@ class FactoryTestCase(unittest.TestCase):
+ 
+         # ensure all methods provide timezone aware datetimes
+         with self.assertRaises(TypeError):
+-            provider.date_time_this_century(before_now=False, after_now=True, tzinfo=utc) >= datetime.datetime.now()
+-        with self.assertRaises(TypeError):
+             provider.date_time_this_decade(after_now=False, tzinfo=utc) <= datetime.datetime.now()
+         with self.assertRaises(TypeError):
+             provider.date_time_this_year(after_now=False, tzinfo=utc) <= datetime.datetime.now()
+@@ -423,7 +420,6 @@ class FactoryTestCase(unittest.TestCase):
+ 
+         # test century
+         self.assertTrue(provider.date_time_this_century(after_now=False, tzinfo=utc) <= datetime.datetime.now(utc))
+-        self.assertTrue(provider.date_time_this_century(before_now=False, after_now=True, tzinfo=utc) >= datetime.datetime.now(utc))
+         # test decade
+         self.assertTrue(provider.date_time_this_decade(after_now=False, tzinfo=utc) <= datetime.datetime.now(utc))
+         self.assertTrue(provider.date_time_this_decade(before_now=False, after_now=True, tzinfo=utc) >= datetime.datetime.now(utc))
+-- 
+2.11.1
+
diff --git a/gnu/packages/patches/python-pbr-fix-man-page-support.patch b/gnu/packages/patches/python-pbr-fix-man-page-support.patch
new file mode 100644
index 0000000000..b9036f5b01
--- /dev/null
+++ b/gnu/packages/patches/python-pbr-fix-man-page-support.patch
@@ -0,0 +1,28 @@
+See: https://bugs.launchpad.net/oslosphinx/+bug/1661861
+diff -ur orig/pbr-1.10.0/pbr/builddoc.py pbr-1.10.0/pbr/builddoc.py
+--- orig/pbr-1.10.0/pbr/builddoc.py	2016-05-23 21:38:18.000000000 +0200
++++ pbr-1.10.0/pbr/builddoc.py	2017-02-18 14:01:37.424434317 +0100
+@@ -138,7 +138,8 @@
+             sphinx_config.init_values(warnings.warn)
+         else:
+             sphinx_config.init_values()
+-        if self.builder == 'man' and len(sphinx_config.man_pages) == 0:
++        if self.builder == 'man' and len(
++                getattr(sphinx_config, 'man_pages', '')) == 0:
+             return
+         app = application.Sphinx(
+             self.source_dir, self.config_dir,
+diff -ur orig/pbr-1.10.0/pbr/util.py pbr-1.10.0/pbr/util.py
+--- orig/pbr-1.10.0/pbr/util.py	2016-05-23 21:38:18.000000000 +0200
++++ pbr-1.10.0/pbr/util.py	2017-02-18 15:36:32.951196795 +0100
+@@ -211,7 +211,9 @@
+     parser.read(path)
+     config = {}
+     for section in parser.sections():
+-        config[section] = dict(parser.items(section))
++        config[section] = dict()
++        for k, value in parser.items(section):
++            config[section][k.replace('-', '_')] = value
+ 
+     # Run setup_hooks, if configured
+     setup_hooks = has_get_option(config, 'global', 'setup_hooks')
diff --git a/gnu/packages/patches/python-pygit2-disable-network-tests.patch b/gnu/packages/patches/python-pygit2-disable-network-tests.patch
new file mode 100644
index 0000000000..e46d244807
--- /dev/null
+++ b/gnu/packages/patches/python-pygit2-disable-network-tests.patch
@@ -0,0 +1,64 @@
+Disable tests trying to look up remote servers.
+
+diff --git a/test/test_credentials.py b/test/test_credentials.py
+index 92482d9..9a281e5 100644
+--- a/test/test_credentials.py
++++ b/test/test_credentials.py
+@@ -68,39 +68,5 @@ class CredentialCreateTest(utils.NoRepoTestCase):
+         self.assertEqual((username, None, None, None), cred.credential_tuple)
+ 
+ 
+-class CredentialCallback(utils.RepoTestCase):
+-    def test_callback(self):
+-        class MyCallbacks(pygit2.RemoteCallbacks):
+-            @staticmethod
+-            def credentials(url, username, allowed):
+-                self.assertTrue(allowed & GIT_CREDTYPE_USERPASS_PLAINTEXT)
+-                raise Exception("I don't know the password")
+-
+-        url = "https://github.com/github/github"
+-        remote = self.repo.create_remote("github", url)
+-
+-        self.assertRaises(Exception, lambda: remote.fetch(callbacks=MyCallbacks()))
+-
+-    def test_bad_cred_type(self):
+-        class MyCallbacks(pygit2.RemoteCallbacks):
+-            @staticmethod
+-            def credentials(url, username, allowed):
+-                self.assertTrue(allowed & GIT_CREDTYPE_USERPASS_PLAINTEXT)
+-                return Keypair("git", "foo.pub", "foo", "sekkrit")
+-
+-        url = "https://github.com/github/github"
+-        remote = self.repo.create_remote("github", url)
+-        self.assertRaises(TypeError, lambda: remote.fetch(callbacks=MyCallbacks()))
+-
+-class CallableCredentialTest(utils.RepoTestCase):
+-
+-    def test_user_pass(self):
+-        credentials = UserPass("libgit2", "libgit2")
+-        callbacks = pygit2.RemoteCallbacks(credentials=credentials)
+-
+-        url = "https://bitbucket.org/libgit2/testgitrepository.git"
+-        remote = self.repo.create_remote("bb", url)
+-        remote.fetch(callbacks=callbacks)
+-
+ if __name__ == '__main__':
+     unittest.main()
+diff --git a/test/test_repository.py b/test/test_repository.py
+index cfdf01e..c0d8de4 100644
+--- a/test/test_repository.py
++++ b/test/test_repository.py
+@@ -538,13 +538,6 @@ class CloneRepositoryTest(utils.NoRepoTestCase):
+         self.assertTrue('refs/remotes/custom_remote/master' in repo.listall_references())
+         self.assertIsNotNone(repo.remotes["custom_remote"])
+ 
+-    def test_clone_with_credentials(self):
+-        repo = clone_repository(
+-            "https://bitbucket.org/libgit2/testgitrepository.git",
+-            self._temp_dir, callbacks=pygit2.RemoteCallbacks(credentials=pygit2.UserPass("libgit2", "libgit2")))
+-
+-        self.assertFalse(repo.is_empty)
+-
+     def test_clone_with_checkout_branch(self):
+         # create a test case which isolates the remote
+         test_repo = clone_repository('./test/data/testrepo.git',
diff --git a/gnu/packages/patches/python-pyopenssl-skip-network-test.patch b/gnu/packages/patches/python-pyopenssl-skip-network-test.patch
new file mode 100644
index 0000000000..a24eaf69a0
--- /dev/null
+++ b/gnu/packages/patches/python-pyopenssl-skip-network-test.patch
@@ -0,0 +1,50 @@
+This test tries connecting to an external server which is not supported
+in the build environment. See discussion at:
+
+https://lists.gnu.org/archive/html/guix-devel/2016-12/msg00650.html
+
+diff --git a/tests/test_ssl.py b/tests/test_ssl.py
+index ee849fd..60048b8 100644
+--- a/tests/test_ssl.py
++++ b/tests/test_ssl.py
+@@ -1180,40 +1180,6 @@ class ContextTests(TestCase, _LoopbackMixin):
+             TypeError, context.load_verify_locations, None, None, None
+         )
+ 
+-    @pytest.mark.skipif(
+-        platform == "win32",
+-        reason="set_default_verify_paths appears not to work on Windows.  "
+-        "See LP#404343 and LP#404344."
+-    )
+-    def test_set_default_verify_paths(self):
+-        """
+-        :py:obj:`Context.set_default_verify_paths` causes the
+-        platform-specific CA certificate locations to be used for
+-        verification purposes.
+-        """
+-        # Testing this requires a server with a certificate signed by one
+-        # of the CAs in the platform CA location.  Getting one of those
+-        # costs money.  Fortunately (or unfortunately, depending on your
+-        # perspective), it's easy to think of a public server on the
+-        # internet which has such a certificate.  Connecting to the network
+-        # in a unit test is bad, but it's the only way I can think of to
+-        # really test this. -exarkun
+-
+-        # Arg, verisign.com doesn't speak anything newer than TLS 1.0
+-        context = Context(SSLv23_METHOD)
+-        context.set_default_verify_paths()
+-        context.set_verify(
+-            VERIFY_PEER,
+-            lambda conn, cert, errno, depth, preverify_ok: preverify_ok)
+-
+-        client = socket()
+-        client.connect(("encrypted.google.com", 443))
+-        clientSSL = Connection(context, client)
+-        clientSSL.set_connect_state()
+-        clientSSL.do_handshake()
+-        clientSSL.send(b"GET / HTTP/1.0\r\n\r\n")
+-        self.assertTrue(clientSSL.recv(1024))
+-
+     def test_set_default_verify_paths_signature(self):
+         """
+         :py:obj:`Context.set_default_verify_paths` takes no arguments and
diff --git a/gnu/packages/pdf.scm b/gnu/packages/pdf.scm
index 13dbd0ecd1..873100cd78 100644
--- a/gnu/packages/pdf.scm
+++ b/gnu/packages/pdf.scm
@@ -646,6 +646,10 @@ using a stylus.")
                (base32
                 "0rz2pg04wnzjjm2f5a8ik9v8s54mv4xrjhv5liqjijqv6awh12gl"))))
     (build-system python-build-system)
+    (arguments
+     '(;; FIXME: There is one test failure, but it does not cause the
+       ;; build to fail. No time to investigate right now.
+       #:test-target "tests"))
     (propagated-inputs
      `(("python-pillow" ,python-pillow)))
     (home-page "http://www.reportlab.com")
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 05ce8d72a9..5631c7ac0b 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -69,6 +69,7 @@
   #:use-module (gnu packages ghostscript)
   #:use-module (gnu packages gl)
   #:use-module (gnu packages glib)
+  #:use-module (gnu packages graphviz)
   #:use-module (gnu packages gstreamer)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages icu4c)
@@ -77,6 +78,7 @@
   #:use-module (gnu packages libevent)
   #:use-module (gnu packages libffi)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages man)
   #:use-module (gnu packages maths)
   #:use-module (gnu packages multiprecision)
   #:use-module (gnu packages networking)
@@ -89,6 +91,7 @@
   #:use-module (gnu packages protobuf)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages sdl)
+  #:use-module (gnu packages shells)
   #:use-module (gnu packages statistics)
   #:use-module (gnu packages tex)
   #:use-module (gnu packages texinfo)
@@ -440,6 +443,9 @@ instead of @command{python3}.")))
         (base32
          "1w4r09fvn6kd80m5mx4ws1wz100brkaq6hzzpwrns8cgjzjpl6c6"))))
     (build-system python-build-system)
+    (arguments
+     ;; FIXME: some tests does not return and times out.
+     '(#:tests? #f))
     (home-page "https://www.github.com/giampaolo/psutil")
     (synopsis "Library for retrieving information on running processes")
     (description
@@ -540,6 +546,14 @@ John the Ripper).")
         (base32
          "14k8z7ndc3zk5xivnm4d8lncchx475ll5izpf8vmfbq7rp9yp5rj"))))
     (build-system python-build-system)
+    (arguments
+     '(;; FIXME: One test fails with "EOFError not raised by connect".
+       #:tests? #f))
+       ;; #:phases
+       ;; (modify-phases %standard-phases
+       ;;   (replace 'check
+       ;;     (lambda _
+       ;;       (zero? (system* "python" "test.py")))))))
     (propagated-inputs
      `(("python-pycrypto" ,python-pycrypto)
        ("python-ecdsa" ,python-ecdsa)))
@@ -1082,6 +1096,9 @@ password storage.")
        (base32
         "0snmb8xffb3vsma0z67i0h0w2g2dy0p3gsgh9gi4i0kgc5l8spqh"))))
     (build-system python-build-system)
+    (native-inputs
+     `(("python-py" ,python-py)
+       ("python-pytest" ,python-pytest)))
     (home-page "http://pypi.python.org/pypi/six/")
     (synopsis "Python 2 and 3 compatibility utilities")
     (description
@@ -1095,7 +1112,7 @@ Python file, so it can be easily copied into your project.")
 (define-public python2-six
   (package-with-python2 python-six))
 
-(define-public python-dateutil-2
+(define-public python-dateutil
   (package
     (name "python-dateutil")
     (version "2.5.3")
@@ -1116,29 +1133,6 @@ Python file, so it can be easily copied into your project.")
 datetime module, available in Python 2.3+.")
     (license license:bsd-3)))
 
-(define-public python2-dateutil-2
-  (package-with-python2 python-dateutil-2))
-
-(define-public python-dateutil
-  (package
-    (name "python-dateutil")
-    (version "1.5") ; last version for python < 3
-    (source
-     (origin
-      (method url-fetch)
-      (uri (string-append "http://labix.org/download/python-dateutil/"
-                          "python-dateutil-" version ".tar.gz"))
-      (sha256
-       (base32
-        "0fqfglhy5khbvsipr3x7m6bcaqljh8xl5cw33vbfxy7qhmywm2n0"))))
-    (build-system python-build-system)
-    (home-page "https://dateutil.readthedocs.io/en/stable/")
-    (synopsis "Extensions to the standard datetime module")
-    (description
-     "The dateutil module provides powerful extensions to the standard
-datetime module, available in Python 2.3+.")
-    (license license:psfl)))
-
 (define-public python2-dateutil
   (package-with-python2 python-dateutil))
 
@@ -1184,7 +1178,7 @@ datetime module, available in Python 2.3+.")
     (propagated-inputs
      `(("python-numpy" ,python-numpy)
        ("python-pytz" ,python-pytz)
-       ("python-dateutil" ,python-dateutil-2)))
+       ("python-dateutil" ,python-dateutil)))
     (native-inputs
      `(("python-nose" ,python-nose)
        ("python-cython" ,python-cython)))
@@ -1328,6 +1322,15 @@ Python 3.3+.")
        (base32
         "16rmxy9y0qhqqna2v49i7nzwm09as699rbyvh4raw7w602w55c3k"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'delete-failing-test
+           (lambda _
+             ;; XXX: These tests require locales that are unavailable
+             ;; in the build environment.
+             (delete-file "test/test_DateTimeParserGenerator.py")
+             #t)))))
     (inputs
      `(("icu4c" ,icu4c)))
     (home-page "http://pyicu.osafoundation.org/")
@@ -1760,6 +1763,12 @@ standard library.")
         (base32
          "0561gz2w3i825gyl42mcq14y3dcgkapfiv5zv9a2bz15qxiijl56"))))
     (build-system python-build-system)
+    (arguments
+     ;; FIXME: "ImportError: 'test' module incorrectly imported from
+     ;; '/gnu/store/...-python-pytest-mimimal-3.0.5/lib/python3.5/site-packages'.
+     ;; 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/")
     (synopsis "Python library for parsing, I/O, instrospection, and logging")
     (description
@@ -1958,6 +1967,15 @@ same arguments.")
            (for-each delete-file (find-files "." "\\.pyc$"))
            #t))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ;FIXME: Some tests are failing.
+       ;; #:phases
+       ;; (modify-phases %standard-phases
+       ;;   (delete 'check)
+       ;;   (add-after 'install 'check
+       ;;     (lambda* (#:key inputs outputs #:allow-other-keys)
+       ;;       (add-installed-pythonpath inputs outputs)
+       ;;       (zero? (system* "py.test" "-v")))))
     (native-inputs
      `(("unzip" ,unzip)
        ("python-setuptools-scm" ,python-setuptools-scm)))
@@ -2010,17 +2028,36 @@ subprocess and see the output as well as any file modifications.")
 (define-public python-testtools
   (package
     (name "python-testtools")
-    (version "1.0.0")
+    (version "1.4.0")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append
-             "https://pypi.python.org/packages/source/t/testtools/testtools-"
-             version ".tar.gz"))
+       (uri (pypi-uri "testtools" version))
        (sha256
         (base32
-         "1dyml28ykpl5jb9khdmcdvhy1cxqingys6qvj2k04fzlaj6z3bbx"))))
+         "1vw8yljnd75d396hhw6s2hrf4cclzy845ifd5am0lxsl235z3i8c"))))
     (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-module-imports
+           (lambda _
+             (substitute* "setup.py"
+               (("'unittest2>=0.8.0',") ""))
+             (substitute* '("testtools/testcase.py"
+                            "testtools/testsuite.py"
+                            "testtools/run.py"
+                            "testtools/tests/test_run.py"
+                            "testtools/tests/test_testsuite.py"
+                            "testtools/tests/test_deferredruntest.py")
+               ;; unittest2 is a backport of Python2.7 features to Python 2.4.
+               (("import unittest2 as unittest") "import unittest")
+               (("import unittest2") "import unittest as unittest2")
+               (("from unittest2 import") "from unittest import"))
+             (substitute* "testtools/tests/test_testresult.py"
+               ;; NUL in source code is not allowed (raises ValueError).
+               (("\\x00\\x04") "\\x04"))
+             #t)))))
     (propagated-inputs
      `(("python-mimeparse" ,python-mimeparse)
        ("python-extras" ,python-extras)))
@@ -2136,7 +2173,8 @@ protocol.")
        (uri (pypi-uri "pbr" version))
        (sha256
         (base32
-         "177kd9kbv1hvf2ban7l3x9ymzbi1md4hkaymwbgnz7ihf312hr0q"))))
+         "177kd9kbv1hvf2ban7l3x9ymzbi1md4hkaymwbgnz7ihf312hr0q"))
+       (patches (search-patches "python-pbr-fix-man-page-support.patch"))))
     (build-system python-build-system)
     (arguments
      `(#:tests? #f))
@@ -2191,10 +2229,18 @@ from git information.
         (base32
          "0djxvdwm8s60dbfn7bhf40x6g818p3b3mlwijm1c3bqg7msn271y"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (zero? (system* "python" "-m" "testtools.run"
+                             "fixtures.test_suite")))))))
     (propagated-inputs
      `(("python-six" ,python-six)))
     (native-inputs
-     `(("python-pbr-minimal" ,python-pbr-minimal)
+     `(("python-mock" ,python-mock)
+       ("python-pbr-minimal" ,python-pbr-minimal)
        ("python-testtools" ,python-testtools)))
     (home-page "https://launchpad.net/python-fixtures")
     (synopsis "Python test fixture library")
@@ -2220,6 +2266,9 @@ Python tests.")
         (base32
          "1ssqb07c277010i6gzzkbdd46gd9mrj0bi0i8vn560n2k2y4j93m"))))
     (build-system python-build-system)
+    (arguments
+     ;; FIXME: Many tests are failing.
+     '(#:tests? #f))
     (propagated-inputs
      `(("python-fixtures" ,python-fixtures)
        ("python-subunit" ,python-subunit)
@@ -2249,6 +2298,9 @@ have failed since the last commit or what tests are currently failing.")
         (base32
          "01rbr4br4lsk0lwn8fb96zwd2xr4f0mg1w7iq3j11i8f5ig2nqs1"))))
     (build-system python-build-system)
+    (arguments
+     ;; FIXME: 95 tests failed, 539 passed, 6 skipped, 2 errors.
+     '(#:tests? #f))
     (home-page "http://nedbatchelder.com/code/coverage")
     (synopsis "Code coverage measurement for Python")
     (description
@@ -2424,7 +2476,12 @@ is used by the Requests library to verify HTTPS requests.")
                (substitute* "click/_unicodefun.py"
                  (("'locale'")
                   (string-append "'" glibc "/bin/locale'"))))
-             #t)))))
+             #t))
+         (replace 'check
+           (lambda _
+             (zero? (system* "make" "test")))))))
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
     (home-page "http://click.pocoo.org")
     (synopsis "Command line library for Python")
     (description
@@ -2483,12 +2540,11 @@ installed with a newer @code{pip} or with wheel's own command line utility.")
              (sha256
               (base32
                "1s0wg4any4dsv5l3hqjxqk2zgb7pdbqhy9rhc8kh3aigfq4ws8jp"))))
+    ;; TODO: unbundle urllib3 and chardet.
     (build-system python-build-system)
-    (native-inputs
-     `(("python-py" ,python-py)
-       ("python-pytest" ,python-pytest)
-       ("python-pytest-cov" ,python-pytest-cov)
-       ("python-wheel" ,python-wheel)))
+    (arguments
+     ;; FIXME: Some tests require network access.
+     '(#:tests? #f))
     (home-page "http://python-requests.org/")
     (synopsis "Python HTTP library")
     (description
@@ -2690,6 +2746,7 @@ easier to build concurrent applications.")
     (build-system python-build-system)
     (native-inputs
      `(("python-nose" ,python-nose)
+       ("python-mock" ,python-mock)
        ("python-cryptography" ,python-cryptography)
        ("python-pyjwt" ,python-pyjwt)
        ("python-blinker" ,python-blinker)))
@@ -2706,7 +2763,6 @@ OAuth request-signing logic.")
     (package
       (inherit base)
       (native-inputs `(("python2-unittest2" ,python2-unittest2)
-                       ("python2-mock" ,python2-mock)
                        ,@(package-native-inputs base))))))
 
 (define-public python-itsdangerous
@@ -2853,15 +2909,26 @@ written in pure Python.")
                (base32
                 "0nmqsfmiw4arjxqkmf9z66ml950pcdjk6aq4gin4sywmzdjw5fzp"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Python 3 tests are failing.
     (home-page "http://defunkt.io/pystache/")
     (synopsis "Python logic-less template engine")
     (description
      "Pystache is a Python implementation of the framework agnostic,
 logic-free templating system Mustache.")
-    (license license:expat)))
+    (license license:expat)
+    (properties `((python2-variant . ,(delay python2-pystache))))))
 
 (define-public python2-pystache
-  (package-with-python2 python-pystache))
+  (package (inherit (package-with-python2
+                     (strip-python2-variant python-pystache)))
+           (arguments
+            `(#:python ,python-2
+              #:phases
+              (modify-phases %standard-phases
+                (replace 'check
+                  (lambda _
+                    (zero? (system* "python" "test_pystache.py")))))))))
 
 (define-public python-joblib
   (package
@@ -2958,6 +3025,9 @@ reStructuredText.")
         (base32
          "10axnp2wpjnq9g8wg53fx0c70dfxqrz498jyz8mrdx9a3flwir48"))))
     (build-system python-build-system)
+    (arguments
+     ;; FIXME: Tests require sphinx, which depends on this.
+     '(#:tests? #f))
     (home-page "http://pygments.org/")
     (synopsis "Syntax highlighting")
     (description
@@ -2970,30 +3040,74 @@ reStructuredText.")
 (define-public python-sphinx
   (package
     (name "python-sphinx")
-    (version "1.2.3")
+    (version "1.5.1")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append
-             "https://pypi.python.org/packages/source/S/Sphinx/Sphinx-"
-             version ".tar.gz"))
+       (uri (pypi-uri "Sphinx" version))
        (sha256
         (base32
-         "011xizm3jnmf4cvs5i6kgf6c5nn046h79i8j0vd0f27yw9j3p4wl"))))
+         "1i8p9idnli4gr0y4x67yakbdk5w6a0xjzhrg6bg51y9d1fi7fslf"))))
     (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             ;; Requires Internet access.
+             (delete-file "tests/test_build_linkcheck.py")
+             (zero? (system* "make" "test")))))))
     (propagated-inputs
-     `(("python-jinja2" ,python-jinja2)
+     `(("python-imagesize" ,python-imagesize)
+       ("python-sphinx-alabaster-theme"
+        ,python-sphinx-alabaster-theme)
+       ("python-babel" ,python-babel)
+       ("python-snowballstemmer" ,python-snowballstemmer)
        ("python-docutils" ,python-docutils)
-       ("python-pygments" ,python-pygments)))
+       ("python-jinja2" ,python-jinja2)
+       ("python-pygments" ,python-pygments)
+       ("python-requests" ,python-requests)
+       ("python-six" ,python-six)))
+    (native-inputs
+     `(("graphviz" ,graphviz)
+       ("python-html5lib" ,python-html5lib)
+       ("python-mock" ,python-mock)
+       ("python-nose" ,python-nose)))
     (home-page "http://sphinx-doc.org/")
     (synopsis "Python documentation generator")
     (description "Sphinx is a tool that makes it easy to create documentation
 for Python projects or other documents consisting of multiple reStructuredText
 sources.")
-    (license license:bsd-3)))
+    (license license:bsd-3)
+    (properties `((python2-variant . ,(delay python2-sphinx))))))
 
 (define-public python2-sphinx
-  (package-with-python2 python-sphinx))
+  (let ((base (package-with-python2 (strip-python2-variant python-sphinx))))
+    (package
+      (inherit base)
+      (native-inputs `(("python2-mock" ,python2-mock)
+                       ("python2-enum34" ,python2-enum34)
+                       ,@(package-native-inputs base)))
+      (propagated-inputs `(("python2-pytz" ,python2-pytz)
+                       ,@(package-propagated-inputs base))))))
+
+;; This is needed for python-matplotlib@1.4 and python-scipy@0.16, at least.
+;; Try removing this when they are updated.
+(define-public python-sphinx-1.2.3
+  (package (inherit python-sphinx)
+           (version "1.2.3")
+           (source (origin
+                     (method url-fetch)
+                     (uri (pypi-uri "Sphinx" version))
+                     (sha256
+                      (base32
+                       "011xizm3jnmf4cvs5i6kgf6c5nn046h79i8j0vd0f27yw9j3p4wl"))))
+           ;; XXX: "'NoneType' object has no attribute 'split'".
+           (arguments '(#:tests? #f))))
+
+(define-public python2-sphinx-1.2.3
+  (package (inherit (package-with-python2
+                     (strip-python2-variant python-sphinx-1.2.3)))))
 
 (define-public python-sphinx-rtd-theme
   (package
@@ -3009,6 +3123,9 @@ sources.")
         (base32
          "19nw3rn7awplcdrz63kg1njqwkbymfg9lwn7l2grhdyhyr2gaa8g"))))
     (build-system python-build-system)
+    (arguments '(#:tests? #f)) ; No tests.
+    (propagated-inputs
+     `(("python-sphinx" ,python-sphinx)))
     (home-page "https://github.com/snide/sphinx_rtd_theme/")
     (synopsis "ReadTheDocs.org theme for Sphinx")
     (description "A theme for Sphinx used by ReadTheDocs.org.")
@@ -3030,7 +3147,7 @@ sources.")
          "0bh4lnj2p1nh0wf5pgxgfbrp27xhb1rinahkb5j7s3qprq6qn0sr"))))
     (build-system python-build-system)
     (propagated-inputs
-     `(("python-dateutil" ,python-dateutil-2)
+     `(("python-dateutil" ,python-dateutil)
        ("python-six" ,python-six)))
     (native-inputs
      `(("python-setuptools-scm" ,python-setuptools-scm)))
@@ -3124,7 +3241,7 @@ interested parties to subscribe to events, or \"signals\".")
        ("python-blinker" ,python-blinker)
        ("python-unidecode" ,python-unidecode)
        ("python-six" ,python-six)
-       ("python-dateutil-2" ,python-dateutil-2)))
+       ("python-dateutil" ,python-dateutil)))
     (home-page "http://getpelican.com/")
     (arguments
      `(;; XXX Requires a lot more packages to do unit tests :P
@@ -3165,11 +3282,20 @@ and is very extensible.")
     (build-system python-build-system)
     (arguments
      `(#:phases
-       (alist-cons-before
-        'check 'set-HOME
-        ;; some tests require access to "$HOME"
-        (lambda _ (setenv "HOME" "/tmp"))
-        %standard-phases)))
+       (modify-phases %standard-phases
+         (delete 'check)
+         (add-after 'install 'check
+           ;; Running tests from the source directory requires
+           ;; an "inplace" build with paths relative to CWD.
+           ;; http://scikit-learn.org/stable/developers/advanced_installation.html#testing
+           ;; Use the installed version instead.
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (add-installed-pythonpath inputs outputs)
+             ;; some tests require access to "$HOME"
+             (setenv "HOME" "/tmp")
+             ;; Step out of the source directory just to be sure.
+             (chdir "..")
+             (zero? (system* "nosetests" "-v" "sklearn")))))))
     (inputs
      `(("openblas" ,openblas)))
     (native-inputs
@@ -3201,6 +3327,9 @@ mining and data analysis.")
        (sha256
         (base32 "0jz416fqvpahqyffw8plmszzfj669w8wvf3y9clnr5lr6a7md3kn"))))
     (build-system python-build-system)
+    (arguments
+     ;; TODO: Some tests require running X11 server. Disable them?
+     '(#:tests? #f))
     ;; See DEPENDS.txt for the list of build and run time requiremnts
     (propagated-inputs
      `(("python-matplotlib" ,python-matplotlib)
@@ -3450,7 +3579,8 @@ objects.")
     (native-inputs
      `(("unzip" ,unzip)
        ("python2-cython" ,python2-cython)
-       ("python2-mock" ,python2-mock)))
+       ("python2-mock" ,python2-mock)
+       ("python2-nose" ,python2-nose)))
     (home-page "http://research.microsoft.com/en-us/um/redmond/projects/mscompbio/fastlmm/")
     (synopsis "Perform genome-wide association studies on large data sets")
     (description
@@ -3533,7 +3663,9 @@ association studies (GWAS) on extremely large data sets.")
        (uri (pypi-uri "pygit2" version))
        (sha256
         (base32
-         "0wf5rp0fvrw7j3j18dvwjq6xqlbm611wd55aphrfpps0v1gxh3ny"))))
+         "0wf5rp0fvrw7j3j18dvwjq6xqlbm611wd55aphrfpps0v1gxh3ny"))
+       (patches
+        (search-patches "python-pygit2-disable-network-tests.patch"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-six" ,python-six)
@@ -3715,7 +3847,7 @@ To address this and enable easy cycling over arbitrary @code{kwargs}, the
        ("python-pygobject" ,python-pygobject)
        ("gobject-introspection" ,gobject-introspection)
        ("python-tkinter" ,python "tk")
-       ("python-dateutil" ,python-dateutil-2)
+       ("python-dateutil" ,python-dateutil)
        ("python-numpy" ,python-numpy-bootstrap)
        ("python-pillow" ,python-pillow)
        ("python-pytz" ,python-pytz)
@@ -3748,7 +3880,7 @@ To address this and enable easy cycling over arbitrary @code{kwargs}, the
        ("tk" ,tk)))
     (native-inputs
      `(("pkg-config" ,pkg-config)
-       ("python-sphinx" ,python-sphinx)
+       ("python-sphinx" ,python-sphinx-1.2.3)
        ("python-numpydoc" ,python-numpydoc)
        ("python-nose" ,python-nose)
        ("python-mock" ,python-mock)
@@ -3756,62 +3888,65 @@ To address this and enable easy cycling over arbitrary @code{kwargs}, the
        ("texinfo" ,texinfo)))
     (arguments
      `(#:phases
-       (alist-cons-before
-        'build 'configure-environment
-        (lambda* (#:key outputs inputs #:allow-other-keys)
-          (let ((cairo (assoc-ref inputs "cairo"))
-                (gtk+ (assoc-ref inputs "gtk+")))
-            ;; Setting these directories in the 'basedirlist' of 'setup.cfg'
-            ;; has not effect.
-            (setenv "LD_LIBRARY_PATH"
-                    (string-append cairo "/lib:" gtk+ "/lib"))
-            (setenv "HOME" (getcwd))
-            (call-with-output-file "setup.cfg"
-              (lambda (port)
-                (format port "[directories]~%
+       (modify-phases %standard-phases
+         (add-before 'build 'configure-environment
+           (lambda* (#:key outputs inputs #:allow-other-keys)
+             (let ((cairo (assoc-ref inputs "cairo"))
+                   (gtk+ (assoc-ref inputs "gtk+")))
+               ;; Setting these directories in the 'basedirlist' of 'setup.cfg'
+               ;; has not effect.
+               (setenv "LD_LIBRARY_PATH"
+                       (string-append cairo "/lib:" gtk+ "/lib"))
+               (setenv "HOME" (getcwd))
+               (call-with-output-file "setup.cfg"
+                 (lambda (port)
+                   (format port "[directories]~%
 basedirlist = ~a,~a~%
  [rc_options]~%
 backend = TkAgg~%"
-                        (assoc-ref inputs "tcl")
-                        (assoc-ref inputs "tk"))))))
-        (alist-cons-after
-         'install 'install-doc
-         (lambda* (#:key inputs outputs #:allow-other-keys)
-           (let* ((data (string-append (assoc-ref outputs "doc") "/share"))
-                  (doc (string-append data "/doc/" ,name "-" ,version))
-                  (info (string-append data "/info"))
-                  (html (string-append doc "/html")))
-             ;; Make installed package available for building the
-             ;; documentation
-             (add-installed-pythonpath inputs outputs)
-             (with-directory-excursion "doc"
-               ;; Produce pdf in 'A4' format.
-               (substitute* (find-files "." "conf\\.py")
-                 (("latex_paper_size = 'letter'")
-                  "latex_paper_size = 'a4'"))
-               (mkdir-p html)
-               (mkdir-p info)
-               ;; The doc recommends to run the 'html' target twice.
-               (system* "python" "make.py" "html")
-               (system* "python" "make.py" "html")
-               (copy-recursively "build/html" html)
-               (system* "python" "make.py" "latex")
-               (system* "python" "make.py" "texinfo")
-               (symlink (string-append html "/_images")
-                        (string-append info "/matplotlib-figures"))
-               (with-directory-excursion "build/texinfo"
-                 (substitute* "matplotlib.texi"
-                   (("@image\\{([^,]*)" all file)
-                    (string-append "@image{matplotlib-figures/" file)))
+                           (assoc-ref inputs "tcl")
+                           (assoc-ref inputs "tk"))))
+               #t)))
+         (add-after 'install 'install-doc
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((data (string-append (assoc-ref outputs "doc") "/share"))
+                    (doc (string-append data "/doc/" ,name "-" ,version))
+                    (info (string-append data "/info"))
+                    (html (string-append doc "/html")))
+               ;; Make installed package available for building the
+               ;; documentation
+               (add-installed-pythonpath inputs outputs)
+               (with-directory-excursion "doc"
+                 ;; Produce pdf in 'A4' format.
+                 (substitute* (find-files "." "conf\\.py")
+                   (("latex_paper_size = 'letter'")
+                    "latex_paper_size = 'a4'"))
+                 (substitute* "users/intro.rst"
+                   ;; Fix reST markup error (see <https://github.com/sphinx-doc/sphinx/issues/3044>)
+                   (("[[][*][]]") "[#]"))
+                 (mkdir-p html)
+                 (mkdir-p info)
+                 ;; The doc recommends to run the 'html' target twice.
+                 (system* "python" "make.py" "html")
+                 (system* "python" "make.py" "html")
+                 (copy-recursively "build/html" html)
+                 (system* "python" "make.py" "latex")
+                 (system* "python" "make.py" "texinfo")
                  (symlink (string-append html "/_images")
-                          "./matplotlib-figures")
-                 (system* "makeinfo" "--no-split"
-                          "-o" "matplotlib.info" "matplotlib.texi"))
-               (copy-file "build/texinfo/matplotlib.info"
-                          (string-append info "/matplotlib.info"))
-               (copy-file "build/latex/Matplotlib.pdf"
-                          (string-append doc "/Matplotlib.pdf")))))
-        %standard-phases))))
+                          (string-append info "/matplotlib-figures"))
+                 (with-directory-excursion "build/texinfo"
+                   (substitute* "matplotlib.texi"
+                     (("@image\\{([^,]*)" all file)
+                      (string-append "@image{matplotlib-figures/" file)))
+                   (symlink (string-append html "/_images")
+                            "./matplotlib-figures")
+                   (system* "makeinfo" "--no-split"
+                            "-o" "matplotlib.info" "matplotlib.texi"))
+                 (copy-file "build/texinfo/matplotlib.info"
+                            (string-append info "/matplotlib.info"))
+                 (copy-file "build/latex/Matplotlib.pdf"
+                            (string-append doc "/Matplotlib.pdf")))
+                 #t))))))
     (home-page "http://matplotlib.org")
     (synopsis "2D plotting library for Python")
     (description
@@ -3829,6 +3964,10 @@ toolkits.")
     (package (inherit matplotlib)
       ;; Make sure to use special packages for Python 2 instead
       ;; of those automatically rewritten by package-with-python2.
+      (native-inputs
+       `(("python2-sphinx" ,python2-sphinx-1.2.3)
+         ,@(fold alist-delete (package-native-inputs matplotlib)
+                 '("python-sphinx"))))
       (propagated-inputs
        `(("python2-pycairo" ,python2-pycairo)
          ("python2-pygobject-2" ,python2-pygobject-2)
@@ -3879,6 +4018,16 @@ operators such as union, intersection, and difference.")
         (base32
          "0nhan2qvrw7b7gg5zddwa22kybdv3x1g26vkd7q8lvnkgzrs4dga"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (delete 'check)
+         (add-after 'install 'check
+           (lambda* (#:key outputs inputs #:allow-other-keys)
+             ;; It's easier to run tests after install.
+             ;; Make installed package available for running the tests
+             (add-installed-pythonpath inputs outputs)
+             (zero? (system* "python" "-m" "rpy2.tests" "-v")))))))
     (propagated-inputs
      `(("python-six" ,python-six)))
     (inputs
@@ -3926,7 +4075,7 @@ functions.")
        ("openblas" ,openblas)))
     (native-inputs
      `(("python-nose" ,python-nose)
-       ("python-sphinx" ,python-sphinx)
+       ("python-sphinx" ,python-sphinx-1.2.3)
        ("python-numpydoc" ,python-numpydoc)
        ("gfortran" ,gfortran)
        ("texlive" ,texlive)
@@ -3934,13 +4083,18 @@ functions.")
     (outputs '("out" "doc"))
     (arguments
      `(#:phases
-       (alist-cons-before
-        'build 'configure-openblas
-        (lambda* (#:key inputs #:allow-other-keys)
-          (call-with-output-file "site.cfg"
-            (lambda (port)
-              (format port
-                      "[blas]
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-tests
+           (lambda _
+             (substitute* "scipy/integrate/tests/test_quadpack.py"
+               (("libm.so") "libm.so.6"))
+             #t))
+         (add-before 'build 'configure-openblas
+           (lambda* (#:key inputs #:allow-other-keys)
+             (call-with-output-file "site.cfg"
+               (lambda (port)
+                 (format port
+                         "[blas]
 libraries = openblas
 library_dirs = ~a/lib
 include_dirs = ~a/include
@@ -3950,62 +4104,62 @@ include_dirs = ~a/include
 library_dirs = ~a/lib
 atlas_libs = openblas
 "
-                      (assoc-ref inputs "openblas")
-                      (assoc-ref inputs "openblas")
-                      (assoc-ref inputs "openblas"))))
-          #t)
-        (alist-cons-after
-         'install 'install-doc
-         (lambda* (#:key inputs outputs #:allow-other-keys)
-           (let* ((data (string-append (assoc-ref outputs "doc") "/share"))
-                  (doc (string-append data "/doc/" ,name "-" ,version))
-                  (html (string-append doc "/html"))
-                  (pyver ,(string-append "PYVER=")))
-             ;; Make installed package available for building the
-             ;; documentation
-             (add-installed-pythonpath inputs outputs)
-             (with-directory-excursion "doc"
-               ;; Fix generation of images for mathematical expressions.
-               (substitute* (find-files "source" "conf\\.py")
-                 (("pngmath_use_preview = True")
-                  "pngmath_use_preview = False"))
-               (mkdir-p html)
-               (system* "make" "html" pyver)
-               (system* "make" "latex" "PAPER=a4" pyver)
-               (system* "make" "-C" "build/latex" "all-pdf" "PAPER=a4" pyver)
-               (copy-file "build/latex/scipy-ref.pdf"
-                          (string-append doc "/scipy-ref.pdf"))
-               (with-directory-excursion "build/html"
-                 (for-each (lambda (file)
-                             (let* ((dir (dirname file))
-                                    (tgt-dir (string-append html "/" dir)))
-                               (install-file file html)))
-                           (find-files "." ".*"))))))
-         ;; Tests can only be run after the library has been installed and not
-         ;; within the source directory.
-         (alist-cons-after
-          'install 'check
-          (lambda _
-            (with-directory-excursion "/tmp"
-              (zero? (system* "python" "-c" "import scipy; scipy.test()"))))
-          (alist-delete
-           'check
-           (alist-cons-after
-            'unpack 'fix-tests
-            (lambda _
-              (substitute* "scipy/integrate/tests/test_quadpack.py"
-                (("libm.so") "libm.so.6"))
-              #t)
-            %standard-phases)))))))
+                         (assoc-ref inputs "openblas")
+                         (assoc-ref inputs "openblas")
+                         (assoc-ref inputs "openblas"))))
+             #t))
+           (delete 'check)
+           (add-after 'install 'install-doc
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let* ((data (string-append (assoc-ref outputs "doc") "/share"))
+                      (doc (string-append data "/doc/" ,name "-" ,version))
+                      (html (string-append doc "/html"))
+                      (pyver ,(string-append "PYVER=")))
+                 ;; Make installed package available for building the
+                 ;; documentation
+                 (add-installed-pythonpath inputs outputs)
+                 (with-directory-excursion "doc"
+                   ;; Fix generation of images for mathematical expressions.
+                   (substitute* (find-files "source" "conf\\.py")
+                     (("pngmath_use_preview = True")
+                      "pngmath_use_preview = False"))
+                   (mkdir-p html)
+                   (system* "make" "html" pyver)
+                   (system* "make" "latex" "PAPER=a4" pyver)
+                   (system* "make" "-C" "build/latex" "all-pdf" "PAPER=a4" pyver)
+                   (copy-file "build/latex/scipy-ref.pdf"
+                              (string-append doc "/scipy-ref.pdf"))
+                   (with-directory-excursion "build/html"
+                     (for-each (lambda (file)
+                                 (let* ((dir (dirname file))
+                                        (tgt-dir (string-append html "/" dir)))
+                                   (install-file file html)))
+                               (find-files "." ".*"))))
+                 #t)))
+           (add-after 'install-doc 'check
+             (lambda _
+               ;; Tests can only be run after the library has been installed and not
+               ;; within the source directory.
+               (with-directory-excursion "/tmp"
+                 (zero? (system* "python" "-c" "import scipy; scipy.test()"))))))))
     (home-page "http://www.scipy.org/")
     (synopsis "The Scipy library provides efficient numerical routines")
     (description "The SciPy library is one of the core packages that make up
 the SciPy stack.  It provides many user-friendly and efficient numerical
 routines such as routines for numerical integration and optimization.")
+    (properties `((python2-variant . ,(delay python2-scipy))))
     (license license:bsd-3)))
 
 (define-public python2-scipy
-  (package-with-python2 python-scipy))
+  (let ((scipy (package-with-python2
+                (strip-python2-variant python-scipy))))
+    (package (inherit scipy)
+             ;; Make sure to use special packages for Python 2 instead
+             ;; of those automatically rewritten by package-with-python2.
+             (native-inputs
+              `(("python2-sphinx" ,python2-sphinx-1.2.3)
+                ,@(fold alist-delete (package-native-inputs scipy)
+                        '("python-sphinx")))))))
 
 (define-public python-socksipy-branch
   (package
@@ -4193,11 +4347,22 @@ both of which are installed automatically if you install this library.")
          (base32
           "1wghyvk73cmq3iqyg3fczw128fv2pan2v76m0xg1bw05h8fhvnk3"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Many tests require a running database server.
+       ;; #:phases
+       ;; (modify-phases %standard-phases
+       ;;   (replace 'check
+       ;;     (lambda _
+       ;;       (zero? (system* "py.test" "sqlalchemy_utils" "tests")))))
     (propagated-inputs
      `(("python-six" ,python-six)
        ("python-sqlalchemy" ,python-sqlalchemy)))
     (native-inputs
-     `(("python-pytest" ,python-pytest)))
+     `(("python-dateutil" ,python-dateutil)
+       ("python-flexmock" ,python-flexmock)
+       ("python-psycopg2" ,python-psycopg2)
+       ("python-pytest" ,python-pytest)
+       ("python-pytz" ,python-pytz)))
     (home-page "https://github.com/kvesteri/sqlalchemy-utils")
     (synopsis "Various utility functions for SQLAlchemy")
     (description
@@ -4488,16 +4653,18 @@ a front-end for C compilers or analysis tools.")
      `(("python-cffi" ,python-cffi) ; used at run time
        ("python-six" ,python-six)))
     (arguments
-     `(#:phases
-       (alist-cons-after
-        'install 'install-doc
-        (lambda* (#:key outputs #:allow-other-keys)
-          (let ((doc (string-append (assoc-ref outputs "out") "/share"
-                                    "/doc/" ,name "-" ,version)))
-            (mkdir-p doc)
-            (copy-file "README.md"
-                       (string-append doc "/README.md"))))
-        %standard-phases)))
+     `(;; FIXME: Tests cannot load libxcb.so.1
+       #:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'install-doc
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((doc (string-append (assoc-ref outputs "out") "/share"
+                                       "/doc/" ,name "-" ,version)))
+               (mkdir-p doc)
+               (copy-file "README.md"
+                          (string-append doc "/README.md"))
+               #t))))))
     (home-page "https://github.com/tych0/xcffib")
     (synopsis "XCB Python bindings")
     (description
@@ -4534,25 +4701,27 @@ support for Python 3 and PyPy.  It is based on cffi.")
     (propagated-inputs
      `(("python-xcffib" ,python-xcffib))) ; used at run time
     (arguments
-     `(#:phases
-       (alist-cons-after
-        'install 'install-doc
-        (lambda* (#:key inputs outputs #:allow-other-keys)
-          (let* ((data (string-append (assoc-ref outputs "doc") "/share"))
-                 (doc (string-append data "/doc/" ,name "-" ,version))
-                 (html (string-append doc "/html")))
-            (setenv "LD_LIBRARY_PATH"
-                    (string-append (assoc-ref inputs "cairo") "/lib" ":"
-                                   (assoc-ref inputs "gdk-pixbuf") "/lib"))
-            (setenv "LANG" "en_US.UTF-8")
-            (mkdir-p html)
-            (for-each (lambda (file)
-                        (copy-file (string-append "." file)
-                                   (string-append doc file)))
-                      '("/README.rst" "/CHANGES" "/LICENSE"))
-            (system* "python" "setup.py" "build_sphinx")
-            (copy-recursively "docs/_build/html" html)))
-        %standard-phases)))
+     `(;; FIXME: Tests cannot find 'libcairo.so.2'.
+       #:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'install-doc
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((data (string-append (assoc-ref outputs "doc") "/share"))
+                    (doc (string-append data "/doc/" ,name "-" ,version))
+                    (html (string-append doc "/html")))
+               (setenv "LD_LIBRARY_PATH"
+                       (string-append (assoc-ref inputs "cairo") "/lib" ":"
+                                      (assoc-ref inputs "gdk-pixbuf") "/lib"))
+               (setenv "LANG" "en_US.UTF-8")
+               (mkdir-p html)
+               (for-each (lambda (file)
+                           (copy-file (string-append "." file)
+                                      (string-append doc file)))
+                         '("/README.rst" "/CHANGES" "/LICENSE"))
+               (system* "python" "setup.py" "build_sphinx")
+               (copy-recursively "docs/_build/html" html)
+               #t))))))
     (home-page "https://github.com/SimonSapin/cairocffi")
     (synopsis "Python bindings and object-oriented API for Cairo")
     (description
@@ -4633,6 +4802,8 @@ Python language binding specification.")
        (sha256
         (base32 "1gzjg2k6f14i1msm2b0ax8d9ds1hvk6qd5nlaivg8m4cxqp4cp1x"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Requires python-cherrypy.
     (propagated-inputs
      `(("python-psutil" ,python-psutil)
        ("python-drmaa" ,python-drmaa)
@@ -4651,21 +4822,39 @@ cluster without needing to write any wrapper code yourself.")
 (define-public python-pexpect
   (package
     (name "python-pexpect")
-    (version "3.3")
+    (version "4.2.1")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://pypi.python.org/packages/source/p/"
-                           "pexpect/pexpect-" version ".tar.gz"))
+       (uri (pypi-uri "pexpect" version))
        (sha256
-        (base32 "1fp5gm976z7ghm8jw57463rj19cv06c8zw842prgyg788f6n3snz"))))
+        (base32 "14ls7k99pwvl21zqv65kzrhccv50j89m5ij1hf0slmsvlxjj84rx"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
+         (add-before 'check 'prepare-tests
+           (lambda _
+             (substitute* (find-files "tests")
+               (("/bin/ls") (which "ls"))
+               (("/bin/echo") (which "echo"))
+               (("/bin/which") (which "which"))
+               ;; Many tests try to use the /bin directory which
+               ;; is not present in the build environment.
+               ;; Use one that's non-empty and unlikely to change.
+               (("/bin'") "/dev'"))
+             ;; XXX: Socket connection test gets "Connection reset by peer".
+             ;; Why does it not work? Delete for now.
+             (delete-file "tests/test_socket.py")
+             #t))
          (replace 'check (lambda _ (zero? (system* "nosetests")))))))
     (native-inputs
-     `(("python-nose" ,python-nose)))
+     `(("python-nose" ,python-nose)
+       ("python-pytest" ,python-pytest)
+       ("man-db" ,man-db)
+       ("which" ,which)))
+    (propagated-inputs
+     `(("python-ptyprocess" ,python-ptyprocess)))
     (home-page "http://pexpect.readthedocs.org/")
     (synopsis "Controlling interactive console applications")
     (description
@@ -5381,13 +5570,12 @@ implementation of D-Bus.")
       `(("sqlite" ,sqlite)))
     (arguments
      `(#:phases
-        ;; swap check and install phases
-        (alist-cons-after
-         'install 'check
-         (assoc-ref %standard-phases 'check)
-         (alist-delete
-          'check
-          %standard-phases))))
+       (modify-phases %standard-phases
+         (delete 'check)
+         (add-after 'install 'check
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (add-installed-pythonpath inputs outputs)
+             (zero? (system* "python" "setup.py" "test")))))))
     (home-page "https://github.com/rogerbinns/apsw/")
     (synopsis "Another Python SQLite Wrapper")
     (description "APSW is a Python wrapper for the SQLite
@@ -5459,7 +5647,8 @@ screen-scraping projects.  It offers Pythonic idioms for navigating,
 searching, and modifying a parse tree, providing a toolkit for
 dissecting a document and extracting what you need.  It automatically
 converts incoming documents to Unicode and outgoing documents to UTF-8.")
-    (license license:expat)))
+    (license license:expat)
+    (properties `((python2-variant . ,(delay python2-beautifulsoup4))))))
 
 (define-public python2-beautifulsoup4
   (package
@@ -5536,6 +5725,7 @@ another XPath engine to find the matching elements in an XML or HTML document.")
         (base32
          "102hy2qisvjxp5s0v9lvwqi4f2dk0dhns40vjgn008yxc7k0h3cr"))))
     (build-system python-build-system)
+    (arguments '(#:tests? #f)) ; No tests.
     (home-page "https://github.com/puiterwijk/python-openid-cla/")
     (synopsis "Implementation of the OpenID CLA extension for python-openid")
     (description "@code{openid-cla} is an implementation of the OpenID
@@ -5557,6 +5747,7 @@ contributor license agreement extension for python-openid.")
         (base32
          "05zrh78alav24rxkbqlpbad6d3x2nljk6z6j7kflxf3vdqa7w969"))))
     (build-system python-build-system)
+    (arguments '(#:tests? #f)) ; No tests.
     (home-page "https://github.com/puiterwijk/python-openid-teams/")
     (synopsis "Implementation of the OpenID teams extension for python-openid")
     (description
@@ -5623,17 +5814,18 @@ of the structure, dynamics, and functions of complex networks.")
 (define-public snakemake
   (package
     (name "snakemake")
-    (version "3.2.1")
+    (version "3.9.0")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append
-             "https://pypi.python.org/packages/source/s/snakemake/snakemake-"
-             version ".tar.gz"))
+       (uri (pypi-uri "snakemake" version))
        (sha256
-        (base32 "0fi4b63sj60hvi7rfydvmz2icl4wj74djw5sn2gl8hxd02qw4b91"))))
+        (base32 "1d48ql0010v9ls6mac7fz6j391gm4h74a64hqgw89s0vfqgdyzdl"))))
     (build-system python-build-system)
-    (home-page "https://bitbucket.org/johanneskoester/snakemake")
+    (arguments
+     ;; TODO: Package missing test dependencies.
+     '(#:tests? #f))
+    (home-page "https://bitbucket.org/snakemake/snakemake/wiki/Home")
     (synopsis "Python-based execution environment for make-like workflows")
     (description
       "Snakemake aims to reduce the complexity of creating workflows by
@@ -5652,6 +5844,8 @@ Python style, together with a fast and comfortable execution environment.")
        (sha256
         (base32 "0pawrqc3mxpwd5g9pvi9gba02637bh5c8ldpp8izfwpfn52469zs"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; Tests requires a running X11 server.
     (propagated-inputs
      `(("python-pandas" ,python-pandas)
        ("python-matplotlib" ,python-matplotlib)
@@ -5673,10 +5867,40 @@ and statistical routines from scipy and statsmodels.")
       (propagated-inputs `(("python2-pytz" ,python2-pytz)
                            ,@(package-propagated-inputs base))))))
 
+(define-public python-mpmath
+  (package
+  (name "python-mpmath")
+  (version "0.19")
+  (source (origin
+            (method url-fetch)
+            (uri (string-append "http://mpmath.org/files/mpmath-"
+                                version ".tar.gz"))
+            (sha256
+             (base32
+              "08ijsr4ifrqv3cjc26mkw0dbvyygsa99in376hr4b96ddm1gdpb8"))))
+  (build-system python-build-system)
+  (arguments
+   '(#:phases
+     (modify-phases %standard-phases
+       (replace 'check
+         (lambda _
+           (zero?
+            (system* "python" "mpmath/tests/runtests.py" "-local")))))))
+  (home-page "http://mpmath.org")
+  (synopsis "Arbitrary-precision floating-point arithmetic in python")
+  (description
+    "@code{mpmath} can be used as an arbitrary-precision substitute for
+Python's float/complex types and math/cmath modules, but also does much
+more advanced mathematics.")
+  (license license:bsd-3)))
+
+(define-public python2-mpmath
+  (package-with-python2 python-mpmath))
+
 (define-public python-sympy
   (package
     (name "python-sympy")
-    (version "0.7.6")
+    (version "1.0")
     (source
      (origin
        (method url-fetch)
@@ -5684,8 +5908,10 @@ and statistical routines from scipy and statsmodels.")
              "https://github.com/sympy/sympy/releases/download/sympy-"
              version "/sympy-" version ".tar.gz"))
        (sha256
-        (base32 "19yp0gy4i7p4g6l3b8vaqkj9qj7yqb5kqy0qgbdagpzgkdz958yz"))))
+        (base32 "1bpzjwr9hrr7w88v4vgnj9lr6vxcldc94si13n8xpr1rv08d5b1y"))))
     (build-system python-build-system)
+    (propagated-inputs
+     `(("python-mpmath" ,python-mpmath)))
     (home-page "http://www.sympy.org/")
     (synopsis "Python library for symbolic mathematics")
     (description
@@ -5803,6 +6029,17 @@ It is written entirely in Python.")
        (sha256
         (base32 "1gzgwayl6hmc9jfcl88bni4jcsk2jcca9dn1rvrfsvnijcjx7hn9"))))
     (build-system python-build-system)
+    (arguments
+     '(;; FIXME: Two tests error out with:
+       ;; AssertionError: b'Error in atexit._run_exitfuncs:\nFileNotF[44 chars]ry\n' != b''
+       ;; #:phases
+       ;; (modify-phases %standard-phases
+       ;;   (replace 'check
+       ;;     (lambda _
+       ;;       ;; 'setup.py test' hits an AssertionError on BSD-specific
+       ;;       ;; "tornado/platform/kqueue.py". This is the supported method:
+       ;;       (zero? (system* "python" "-m" "tornado.test")))))
+       #:tests? #f))
     (native-inputs
      `(("python-certifi" ,python-certifi)))
     (propagated-inputs
@@ -6012,7 +6249,10 @@ complexity of Python source code.")
                ".tar.gz"))
         (sha256
           (base32
-            "12b9bbdbwnspxgak14xg58c130x2n0blxzlms5jn2dszn8qj3d0m"))))))
+           "12b9bbdbwnspxgak14xg58c130x2n0blxzlms5jn2dszn8qj3d0m"))))
+    (arguments
+     ;; XXX Tests not compatible with Python 3.5.
+     '(#:tests? #f))))
 
 (define-public python2-pep8-1.5.7
   (package-with-python2 python-pep8-1.5.7))
@@ -6031,7 +6271,10 @@ complexity of Python source code.")
                ".tar.gz"))
         (sha256
           (base32
-            "0sbpq6pqm1i9wqi41mlfrsc5rk92jv4mskvlyxmnhlbdnc80ma1z"))))))
+           "0sbpq6pqm1i9wqi41mlfrsc5rk92jv4mskvlyxmnhlbdnc80ma1z"))))
+    (arguments
+     ;; XXX Tests not compatible with Python 3.5.
+     '(#:tests? #f))))
 
 (define-public python2-pyflakes-0.8.1
   (package-with-python2 python-pyflakes-0.8.1))
@@ -6099,7 +6342,10 @@ complexity of Python source code.")
             (for-each delete-file-recursively
                       (find-files "." "__pycache__" #:directories? #t))
             (for-each delete-file (find-files "." "\\.pyc$"))
-            #t))))))
+            #t))))
+    (arguments
+     ;; XXX Fails with Python 3.5.
+     '(#:tests? #f))))
 
 (define-public python2-flake8-2.2.4
   (package-with-python2 python-flake8-2.2.4))
@@ -6116,6 +6362,20 @@ complexity of Python source code.")
         (base32
          "02gn2wxvh9vnf7m7dld7ca4l60mg5c370hv3swwppkngwaqmcw67"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (setenv "PYTHONPATH"
+                     (string-append (getcwd) "/build/lib:"
+                                    (getenv "PYTHONPATH")))
+             (zero? (system* "py.test" "-v")))))))
+    (native-inputs
+     `(("python-flake8" ,python-flake8)
+       ("python-mock" ,python-mock)
+       ("python-pycodestyle" ,python-pycodestyle)
+       ("python-pytest" ,python-pytest)))
     (home-page "https://gitlab.com/pycqa/flake8-polyfill")
     (synopsis "Polyfill package for Flake8 plugins")
     (description
@@ -6388,6 +6648,9 @@ from an XML-based format.")
         (base32
          "0g6n288l83sfwavxh1aryi0aqvsr3sp7v6f903mckwqa4scpky62"))))
     (build-system python-build-system)
+    (arguments
+     ;; FIXME: Some tests need network access.
+     '(#:tests? #f))
     (synopsis "Tool and library for manipulating LilyPond files")
     (description "This package provides a Python library to parse, manipulate
 or create documents in LilyPond format.  A command line program ly is also
@@ -6556,6 +6819,8 @@ and MAC network addresses.")
        (base32
         "0c7gh3lsdjds262h0v1sqc66l7hqgfwbakn96qrhdbl0i3vm5yz8"))))
   (build-system python-build-system)
+  (native-inputs
+   `(("python-pytest" ,python-pytest)))
   (home-page "https://bitbucket.org/micktwomey/pyiso8601")
   (synopsis "Module to parse ISO 8601 dates")
   (description
@@ -6968,13 +7233,25 @@ message digests and key derivation functions.")
        (uri (pypi-uri "pyOpenSSL" version))
        (sha256
         (base32
-         "0vji4yrfshs15xpczbhzhasnjrwcarsqg87n98ixnyafnyxs6ybp"))))
+         "0vji4yrfshs15xpczbhzhasnjrwcarsqg87n98ixnyafnyxs6ybp"))
+       (patches
+        (search-patches "python-pyopenssl-skip-network-test.patch"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (delete 'check)
+         (add-after 'install 'check
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (add-installed-pythonpath inputs outputs)
+             (zero? (system* "py.test" "-v")))))))
     (propagated-inputs
      `(("python-cryptography" ,python-cryptography)
        ("python-six" ,python-six)))
     (inputs
      `(("openssl" ,openssl)))
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
     (home-page "https://github.com/pyca/pyopenssl")
     (synopsis "Python wrapper module around the OpenSSL library")
     (description
@@ -7289,9 +7566,19 @@ functions to find and load entry points.")
         (base32
          "0brclbb18l4nmd5qy3dl9wn05rjdh1fz4rmzdlfqacj12rcdvdgp"))))
     (build-system python-build-system)
-    ;; The "bdist_egg" target is disabled by default, causing the installation
-    ;; to fail.
-    (arguments `(#:configure-flags (list "bdist_egg")))
+    (arguments
+     `(;; The "bdist_egg" target is disabled by default, causing the installation
+       ;; to fail.
+       #:configure-flags (list "bdist_egg")
+       ;; FIXME: 5 failures, 40 errors.
+       #:tests? #f))
+       ;; #:phases
+       ;; (modify-phases %standard-phases
+       ;;   (replace 'check
+       ;;     (lambda _
+       ;;       (zero? (system* "py.test" "-v")))))
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
     (propagated-inputs
      `(("python-bleach" ,python-bleach)
        ("python-entrypoints" ,python-entrypoints)
@@ -7392,7 +7679,8 @@ interactive computing.")
     (propagated-inputs
      `(("python-notebook" ,python-notebook)))
     (native-inputs
-     `(("python-nose" ,python-nose)))
+     `(("python-certifi" ,python-certifi)
+       ("python-nose" ,python-nose)))
     (home-page "http://ipython.org")
     (synopsis "IPython HTML widgets for Jupyter")
     (description "This package provides interactive HTML widgets for Jupyter
@@ -7673,6 +7961,8 @@ forms, HTTP servers, regular expressions, and more.")
         (base32
          "1r7iqknhh55y45f64mz5hghgvzx34h1i11k350s0avx6q8gznja1"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Tests can't find zope.interface.
     (native-inputs
      `(("python-six" ,python-six)
        ;("python-zope-interface" ,python-zope-interface)
@@ -7733,8 +8023,11 @@ internationalized messages within program source text.")
         (base32
          "1p943jdxb587dh7php4vx04qvn7b2877hr4qs5zyckvp5afhhank"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Tests can't find zope.event.
     (propagated-inputs
      `(("python-zope-event" ,python-zope-event)
+       ("python-zope-exceptions", python-zope-exceptions)
        ("python-zope-interface" ,python-zope-interface)))
     (native-inputs
      `(("python-zope-testing" ,python-zope-testing)
@@ -7762,6 +8055,8 @@ defining data schemas.")
                (base32
                 "1x9dfqypgympnlm25p9m43xh4qv3p7d75vksv9pzqibrb4cggw5n"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Tests can't find zope.interface.
     (propagated-inputs
      `(("python-zope-i18nmessageid" ,python-zope-i18nmessageid)
        ("python-zope-schema" ,python-zope-schema)))
@@ -7787,6 +8082,8 @@ Markup Language.")
         (base32
          "0pqwwmvm1prhwv1ziv9lp8iirz7xkwb6n2kyj36p2h0ppyyhjnm4"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Tests can't find zope.interface.
     (propagated-inputs
      `(("python-zope-interface" ,python-zope-interface)))
     (home-page "http://pypi.python.org/pypi/zope.proxy")
@@ -7814,6 +8111,8 @@ brokering, etc.) for which the proxy is responsible.")
         (base32
          "1nj9da4ksiyv3h8n2vpzwd0pb03mdsh7zy87hfpx72b6p2zcwg74"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Tests can't find zope.interface.
     (propagated-inputs
      `(("python-zope-proxy" ,python-zope-proxy)
        ("python-zope-schema" ,python-zope-schema)))
@@ -7839,12 +8138,15 @@ Zope3, which are are special objects that have a structural location.")
         (base32
          "14zmf684amc0x32kq05yxnhfqd1cmyhafkw05gn81rn90zjv6ssy"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Tests can't find zope.testrunner.
     (propagated-inputs
      `(("python-zope-i18nmessageid" ,python-zope-i18nmessageid)
        ("python-zope-proxy" ,python-zope-proxy)
        ("python-zope-schema" ,python-zope-schema)))
-     (native-inputs
-     `(("python-zope-component" ,python-zope-component)
+    (native-inputs
+     `(("python-six" ,python-six)
+       ("python-zope-component" ,python-zope-component)
        ("python-zope-configuration" ,python-zope-configuration)
        ("python-zope-location" ,python-zope-location)
        ("python-zope-testrunner" ,python-zope-testrunner)
@@ -8318,6 +8620,8 @@ minimal and fast API targetting the following uses:
          (base32
           "0k3vypszmgmaipgw9xscvgm79h2zd6p6ci8gdp5sxl6g5kbqr9fy"))))
     (build-system python-build-system)
+    ;; TODO: Tests require packaging 'hiredis'.
+    (arguments '(#:tests? #f))
     (home-page "https://github.com/benjolitz/trollius-redis")
     (synopsis "Port of asyncio-redis to trollius")
     (description "@code{trollius-redis} is a Redis client for Python
@@ -8448,7 +8752,7 @@ processes across test runs.")
                "086jslw8cg2hni79j267p1dy6d27m7q5hi39ni2clh9waqbdf5v3"))))
     (build-system python-build-system)
     (propagated-inputs
-     `(("python-dateutil-2" ,python-dateutil-2)
+     `(("python-dateutil" ,python-dateutil)
        ("python-pytz" ,python-pytz)))
     (synopsis "Python library for parsing iCalendar files")
     (description "The icalendar package is a parser/generator of iCalendar
@@ -8466,6 +8770,7 @@ files for use with Python.")
              (sha256
               (base32
                "1d7gam3mn8v4in4p16yn3v10vps7nnaz6ilw99j4klij39dqd37p"))))
+    (arguments '(#:tests? #f)) ; No tests.
     (build-system python-build-system)
     (propagated-inputs
      `(("python-sphinx" ,python-sphinx)))
@@ -8506,6 +8811,14 @@ Blog, News or Announcements section to a Sphinx website.")
                (base32
                 "1an5lkkqk1zha47198p42ji3m94xmzx1a03dn7866m87n4r4q8h5"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (zero? (system* "py.test" "-v")))))))
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
     (propagated-inputs
      `(("python-args" ,python-args)))
     (home-page "https://github.com/kennethreitz/clint")
@@ -8575,6 +8888,17 @@ with a new public API, and RPython support.")
                (base32
                 "1msqv747iz12r73mz4qvsmlwkddwjvrahlrk7ysrcz07h7dsscxs"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             ;; Tests require write access to HOME.
+             (setenv "HOME" "/tmp")
+             (zero? (system* "nosetests")))))))
+    (native-inputs
+     `(("python-coverage" ,python-coverage)
+       ("python-nose" ,python-nose)))
     (propagated-inputs
      `(("python-astor" ,python-astor)
        ("python-clint" ,python-clint)
@@ -8849,6 +9173,8 @@ servers.")
       (base32
        "0g9xvl69y7nr3w7ag4fsp6sm4fqf6vrqjw7504x2hzrrsh3ampq8"))))
    (build-system python-build-system)
+   (native-inputs
+    `(("python-nose" ,python-nose)))
    (synopsis "JSON Matching Expressions")
    (description "JMESPath (pronounced “james path”) is a Python library that
 allows one to declaratively specify how to extract elements from a JSON
@@ -8871,8 +9197,11 @@ document.")
       (base32
        "1hqvqwhgfcch4knm1l02ynx7qd1igxk3pj34c1x2b0r79jca524n"))))
    (build-system python-build-system)
+   (arguments
+    ;; FIXME: Many tests are failing.
+    '(#:tests? #f))
    (propagated-inputs
-    `(("python-dateutil" ,python-dateutil-2)
+    `(("python-dateutil" ,python-dateutil)
       ("python-docutils" ,python-docutils)
       ("python-jmespath" ,python-jmespath)))
    (native-inputs
@@ -8908,12 +9237,9 @@ interface to the Amazon Web Services (AWS) API.")
       ("python-s3transfer" ,python-s3transfer)
       ("python-docutils" ,python-docutils)
       ("python-rsa" ,python-rsa)))
-   (native-inputs
-    `(("python-mock" ,python-mock)
-      ("python-nose" ,python-nose)
-      ("python-sphinx" ,python-sphinx)
-      ("python-tox" ,python-tox)
-      ("python-wheel" ,python-wheel)))
+   (arguments
+    ;; FIXME: The 'pypi' release does not contain tests.
+    '(#:tests? #f))
    (home-page "https://aws.amazon.com/cli/")
    (synopsis "Command line client for AWS")
    (description "AWS CLI provides a unified command line interface to the
@@ -8931,7 +9257,7 @@ Amazon Web Services (AWS) API.")
                (base32
                 "0qyqq9akm4vshhn8cngjc1qykcvsn7cz6dlm6njfsgpbraqrmbbw"))))
     (build-system python-build-system)
-    (propagated-inputs
+    (native-inputs
      `(("python-flake8" ,python-flake8)
        ("python-pytest" ,python-pytest)))
     (synopsis "Library for property based testing")
@@ -8948,7 +9274,8 @@ seamlessly into your existing Python unit testing work flow.")
                      (strip-python2-variant python-hypothesis))))
     (package (inherit hypothesis)
       (native-inputs
-       `(("python2-enum34" ,python2-enum34))))))
+       `(("python2-enum34" ,python2-enum34)
+         ,@(package-native-inputs hypothesis))))))
 
 (define-public python-pytest-subtesthack
   (package
@@ -9070,7 +9397,8 @@ available in Django, but is a standalone package.")
      `(("python-markupsafe" ,python-markupsafe)))
     (native-inputs
      `(("python-mock" ,python-mock)
-       ("python-nose" ,python-nose)))
+       ("python-nose" ,python-nose)
+       ("python-pytest" ,python-pytest)))
     (home-page "http://www.makotemplates.org/")
     (synopsis "Templating language for Python")
     (description "Mako is a templating language for Python that compiles
@@ -9414,6 +9742,10 @@ RabbitMQ messaging server is the most popular implementation.")
                 (strip-python2-variant python-kombu))))
     (package
       (inherit kombu)
+      (arguments `(;; FIXME: 'TestTransport.test_del_sync' fails on python2.
+                   ;; It works fine on the python3 variant.
+                   #:tests? #f
+                   ,@(package-arguments kombu)))
       (native-inputs `(("python2-unittest2" ,python2-unittest2)
                 ,@(package-native-inputs kombu))))))
 
@@ -9560,6 +9892,9 @@ programmatically interfacing with your system's $EDITOR.")
                (base32
                 "098as6z1s0gb4dh5xcr1fd2vpm91zj93jzvgawspxf5s4hqs0xhp"))))
     (build-system python-build-system)
+    (arguments
+     ;; FIXME: Many tests are failing and the upstream is gone.
+     '(#:tests? #f))
     (propagated-inputs
      `(("python-sphinx" ,python-sphinx)))
     (synopsis "Sphinx extension to include program output")
@@ -9582,6 +9917,7 @@ commands into documents, helping you to keep your command examples up to date.")
                (base32
                 "08ycivzf7bh4a1zcyp31hbyqs1b2c9r26raa3vxjwwmbfqr3iw4f"))))
     (build-system python-build-system)
+    (arguments '(#:tests? #f)) ; No tests.
     (propagated-inputs
      `(("python-sphinx" ,python-sphinx)
        ("python-zope-interface" ,python-zope-interface)))
@@ -9637,7 +9973,7 @@ introspection of @code{zope.interface} instances in code.")
      '(;; The test suite relies on some non-portable Windows interfaces.
        #:tests? #f))
     (propagated-inputs
-     `(("python-dateutil-2" ,python-dateutil-2)
+     `(("python-dateutil" ,python-dateutil)
        ("python-pyicu" ,python-pyicu)))
     (synopsis "Parse and generate vCard and vCalendar files")
     (description "Vobject is intended to be a full featured Python package for
@@ -9712,6 +10048,16 @@ presume or force a developer to use a particular tool or library.")
         (base32
          "04l5743j2dici46038sqlzvf0xzpg8rf7s9ld2x24xv7f4idg990"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'drop-failing-test
+           (lambda _
+             ;; FIXME: This file tries resolving an external server, which
+             ;; fails. Try to patch out the offending section instead of
+             ;; deleting the whole thing.
+             (delete-file "tests/test_recaptcha.py")
+             #t)))))
     (propagated-inputs
      `(("python-flask-babel" ,python-flask-babel)
        ("python-babel" ,python-babel)
@@ -10323,6 +10669,8 @@ to occurences in strings and comments.")
         (base32
          "0i283z1pivmir61z8kbiycigc94l61v33ygzkhczf1ifq7cppyds"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; TODO: Requires many libraries not in Guix.
     (home-page "https://github.com/ultrabug/py3status")
     (synopsis "Extensible i3status wrapper written in Python")
     (description "py3status is an i3status wrapper which extends i3status
@@ -10466,6 +10814,72 @@ to provide a high-level synchronous API on top of the libev event loop.")
 (define-public python2-gevent
   (package-with-python2 python-gevent))
 
+(define-public python-geventhttpclient
+  (package
+    (name "python-geventhttpclient")
+    (version "1.3.1")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "geventhttpclient" version))
+              (sha256
+               (base32
+                "07d0q3wzmml75227r6y6mrl5a0zpf4v9gj0ni5rhbyzmaj4az1xx"))
+              (modules '((guix build utils)))
+              (snippet
+               '(begin
+                  ;; Delete pre-compiled files.
+                  (for-each delete-file (find-files "src/geventhttpclient"
+                                                    ".*\\.pyc"))
+                  #t))))
+    (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'delete-network-tests
+           (lambda _
+             (delete-file "src/geventhttpclient/tests/test_client.py")
+             #t))
+         (delete 'check)
+         (add-after 'install 'check
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (add-installed-pythonpath inputs outputs)
+             (zero? (system* "py.test" "src/geventhttpclient/tests" "-v")))))))
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
+    (propagated-inputs
+     `(("python-certifi" ,python-certifi)
+       ("python-gevent" ,python-gevent)
+       ("python-six" ,python-six)))
+    (home-page "https://github.com/gwik/geventhttpclient")
+    (synopsis "HTTP client library for gevent")
+    (description "@code{python-geventhttpclient} is a high performance,
+concurrent HTTP client library for python using @code{gevent}.")
+    (license license:expat)))
+
+(define-public python2-geventhttpclient
+  (package-with-python2 python-geventhttpclient))
+
+(define-public python-fastimport
+  (package
+    (name "python-fastimport")
+    (version "0.9.6")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "fastimport" version))
+        (sha256
+          (base32 "1aqjsin4rmqm7ln4j0p73fzxifws6c6ikgyhav7r137m2ixsxl43"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/jelmer/python-fastimport")
+    (synopsis "VCS fastimport parser and generator in Python")
+    (description "This package provides a parser for and generator of the Git
+@url{https://www.kernel.org/pub/software/scm/git/docs/git-fast-import.html,fastimport}
+format.")
+    (license license:gpl2+)))
+
+(define-public python2-fastimport
+  (package-with-python2 python-fastimport))
+
 (define-public python-twisted
   (package
     (name "python-twisted")
@@ -10477,6 +10891,13 @@ to provide a high-level synchronous API on top of the libev event loop.")
                (base32
                 "0ydxrp9myw1mvsz3qfzx5579y5llmqa82pxvqchgp5syczffi450"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: Some tests are failing.
+       ;; #:phases
+       ;; (modify-phases %standard-phases
+       ;;   (replace 'check
+       ;;     (lambda _
+       ;;       (zero? (system* "./bin/trial" "twisted")))))
     (propagated-inputs
      `(("python-zope-interface" ,python-zope-interface)))
     (home-page "https://twistedmatrix.com/")
@@ -10546,18 +10967,12 @@ It uses LR parsing and does extensive error checking.")
              (uri (pypi-uri "tabulate" version))
              (sha256
               (base32
-               "1inqhspd4frxnp08c32yndr0lc4px1xfkqah184i5w09gkhvi843"))
-             ;; Fix tests
-             (modules '((guix build utils)))
-             (snippet '(substitute* '("test/test_cli.py"
-                                      "test/test_input.py"
-                                      "test/test_output.py"
-                                      "test/test_regression.py")
-                         (("from common") "from nose.tools")))))
+               "1inqhspd4frxnp08c32yndr0lc4px1xfkqah184i5w09gkhvi843"))))
     (build-system python-build-system)
-    (native-inputs
-     `(;; For testing
-       ("python-nose" ,python-nose)))
+    (arguments
+     ;; FIXME: The pypi release tarball is missing a 'test/common.py'
+     ;; and the latest release is not tagged in the upstream repository.
+     '(#:tests? #f))
     (home-page "https://bitbucket.org/astanin/python-tabulate")
     (synopsis "Pretty-print tabular data")
     (description
@@ -10715,7 +11130,7 @@ objects, patterned after the Mocha library for Ruby.")
        ("python-chai" ,python-chai)
        ("python-simplejson" ,python-simplejson)))
     (propagated-inputs
-     `(("python-dateutil" ,python-dateutil-2)))
+     `(("python-dateutil" ,python-dateutil)))
     (home-page "https://github.com/crsmithdev/arrow/")
     (synopsis "Dates and times for Python")
     (description
@@ -10738,6 +11153,8 @@ datetime type.")
               (base32
                "1jhnxgnw8y3mbzjssixh6qkc7a3afc4fygajhqrqalnilyvpzshq"))))
     (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
     (home-page "http://github.com/jpvanhal/inflection")
     (synopsis "Python string transformation library")
     (description
@@ -10904,15 +11321,24 @@ parsing UK postcodes.")
             (uri (pypi-uri "fake-factory" version))
             (sha256
              (base32
-              "0vs0dkmg0dlaxf8w6q2i3k0i03gmp56ablldv7ci9x3nbadkn71g"))))
+              "0vs0dkmg0dlaxf8w6q2i3k0i03gmp56ablldv7ci9x3nbadkn71g"))
+            (patches
+             (search-patches
+              "python-fake-factory-fix-build-32bit.patch"))))
   (build-system python-build-system)
+  (arguments
+   '(#:phases
+     (modify-phases %standard-phases
+       (replace 'check
+         (lambda _
+           (zero? (system* "python" "-m" "unittest" "-v" "faker.tests")))))))
   (native-inputs
    `(;; For testing
      ("python-email-validator" ,python-email-validator)
      ("python-mock" ,python-mock)
      ("python-ukpostcodeparser" ,python-ukpostcodeparser)))
   (propagated-inputs
-   `(("python-dateutil" ,python-dateutil-2)
+   `(("python-dateutil" ,python-dateutil)
      ("python-six" ,python-six)))
   (home-page "https://github.com/joke2k/faker")
   (synopsis "Python package that generates fake data")
@@ -10942,6 +11368,8 @@ addresses, and phone numbers.")
                (base32
                 "1f5m28vkh4ksq3d80d8mmd2z8wxvc3mgy2pmrv2751dm2xgznm4w"))))
     (build-system python-build-system)
+    (native-inputs
+     `(("python-unidecode" ,python-unidecode)))
     (propagated-inputs
      `(("python-pyyaml" ,python-pyyaml)))
     (home-page "https://github.com/mk-fg/pretty-yaml")
@@ -11056,6 +11484,11 @@ characters, mouse support, and auto suggestions.")
           (base32
             "0c8x962ynpx001fdvp07m2q5jk4igkxbj3rmnydavphvlgxijk1v"))))
     (build-system python-build-system)
+    (arguments
+     ;; FIXME: One test fails (use "py.test" instead of 'setup.py test').
+     '(#:tests? #f))
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
     (home-page "https://github.com/davidhalter/jedi")
     (synopsis
       "Autocompletion for Python that can be used for text editors")
@@ -11077,6 +11510,8 @@ characters, mouse support, and auto suggestions.")
                (base32
                 "1mmbiyzf0n8hm7z2a562x7w5cbl6jc0zsk6vp40q1z4cyblv1k13"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: No tests in pypi tarball.
     (propagated-inputs
      `(("python-docopt" ,python-docopt)
        ("python-jedi" ,python-jedi)
@@ -11182,6 +11617,13 @@ relays publish about themselves.")
           (base32
             "0k1nfdrxxkdlv4zgaqsdv8li0pj3gbh2pyxw8q2bsg6f9490amyn"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: 3/49 tests are failing.
+       ;; #:phases
+       ;; (modify-phases %standard-phases
+       ;;   (replace 'check
+       ;;     (lambda _
+       ;;       (zero? (system* "python" "test/run_all_tests.py" "loop://")))))))
     (home-page
       "https://github.com/pyserial/pyserial")
     (synopsis "Python Serial Port Bindings")
@@ -11501,7 +11943,7 @@ List.  Forked from and using the same API as the publicsuffix package.")
        ("python-coverage" ,python-coverage)))
     (propagated-inputs
      `(("python-six" ,python-six)
-       ("python-dateutil-2" ,python-dateutil-2)))
+       ("python-dateutil" ,python-dateutil)))
     (arguments
      `(#:phases (modify-phases %standard-phases
         ;; The tests are normally executed via `make test`, but the PyPi
@@ -11938,6 +12380,8 @@ English stemmer.")
                (base32
                 "0zm9ap4p5dzln8f1m2immadaxv2xpg8jg4w53y52rhfl7pdb58vy"))))
     (build-system python-build-system)
+    ;; FIXME: The 'pypi' release archive does not contain tests.
+    (arguments '(#:tests? #f))
     (native-inputs
      `(("python-sphinx" ,python-sphinx)))
     (home-page "https://bitbucket.org/ecollins/cloud_sptheme")
@@ -12152,7 +12596,7 @@ useful as a validator for JSON data.")
             "1k5mjg9iqbjfslb5prrsfz7dhlvi6s35p1jxq8dm87w1b7dn5i2g"))))
     (build-system python-build-system)
     (propagated-inputs
-     `(("python-dateutil-2" ,python-dateutil-2)))
+     `(("python-dateutil" ,python-dateutil)))
     (home-page
       "https://bitbucket.org/nielsenb/aniso8601")
     (synopsis
@@ -12349,10 +12793,7 @@ python-axolotl.")
            (lambda _
              (for-each delete-file-recursively
                        '("axolotl/tests" "build/lib/axolotl/tests"))
-             #t)))
-       ;; Prevent creation of the egg. This works around
-       ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=20765
-       #:configure-flags '("--root=/")))
+             #t)))))
     (propagated-inputs
      `(("python-axolotl-curve25519" ,python-axolotl-curve25519)
        ("python-dateutil" ,python-dateutil)
@@ -12380,6 +12821,12 @@ asynchronous messaging environments.")
           (base32
             "17wzkkcqy5zc0g68xlad3kcv66iw14d2pwqc0h9420gak0vbhx7g"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (zero? (system* "python" "test3.py")))))))
     (home-page "http://github.com/gfxmonk/termstyle")
     (synopsis "Console text coloring for Python")
     (description "This package provides console text coloring for Python.")
@@ -12430,6 +12877,13 @@ asynchronous messaging environments.")
           (base32
             "11his6ii5brpkhld0d5bwzjjw4q3vmplpd6fmgzjrvvklsbk0cf4"))))
     (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; FIXME: 35/882 tests failing.
+       ;; #:phases
+       ;; (modify-phases %standard-phases
+       ;;   (replace 'check
+       ;;     (lambda _
+       ;;       (zero? (system* "nosetests")))))))
     (propagated-inputs
       `(("python-aniso8601" ,python-aniso8601)
         ("python-flask" ,python-flask)
@@ -12510,6 +12964,9 @@ specs from your Flask-Restful projects.")
           (base32
             "11bwiw6j0nilgz81xnw6f1npyga3prp8asjqrm87cdr3ria5l03x"))))
     (build-system python-build-system)
+    (native-inputs
+     `(("python-pexpect" ,python-pexpect)
+       ("tcsh" ,tcsh)))
     (home-page "https://github.com/kislyuk/argcomplete")
     (synopsis "Shell tab completion for Python argparse")
     (description "argcomplete provides extensible command line tab completion
@@ -12591,6 +13048,52 @@ Features:
 @end enumerate")
     (license (license:x11-style "file://LICENSE"))))
 
+(define-public python-dulwich
+  (package
+    (name "python-dulwich")
+    (version "0.16.3")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (list (string-append "https://www.dulwich.io/releases/"
+                            "dulwich-" version ".tar.gz")
+                   (pypi-uri "dulwich" version)))
+        (sha256
+          (base32 "0fl47vzfgc3w3rmhn8naii905cjqcp0vc68iyvymxp7567hh6als"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'fix-tests
+           (lambda* (#:key inputs #:allow-other-keys)
+             ;; The tests use Popen with a custom environment which doesn't
+             ;; include PATH.
+             (substitute* "dulwich/tests/compat/utils.py"
+               (("'git'") (string-append "'"
+                                         (which "git")
+                                         "'")))
+             (substitute* '("dulwich/tests/test_repository.py"
+                            "dulwich/tests/test_hooks.py")
+               (("#!/bin/sh") (string-append "#!" (which "sh"))))
+             (setenv "TEST_RUNNER" "unittest")
+             (setenv "PYTHONHASHSEED" "random")
+             #t)))))
+    (propagated-inputs
+     `(("python-fastimport" ,python-fastimport)))
+    (native-inputs
+     `(("python-mock" ,python-mock)
+       ("python-geventhttpclient" ,python-geventhttpclient)
+       ("git" ,git)))
+    (home-page "https://www.dulwich.io/")
+    (synopsis "Git implementation in Python")
+    (description "Dulwich is an implementation of the Git file formats and
+protocols written in pure Python.")
+    ;; Can be used with either license.
+    (license (list license:asl2.0 license:gpl2+))))
+
+(define-public python2-dulwich
+  (package-with-python2 python-dulwich))
+
 (define-public python-pbkdf2
   (package
     (name "python-pbkdf2")
@@ -12603,6 +13106,15 @@ Features:
         (base32
          "0yb99rl2mbsaamj571s1mf6vgniqh23v98k4632150hjkwv9fqxc"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (setenv "PYTHONPATH"
+                     (string-append (getcwd) "/build/lib:"
+                                    (getenv "PYTHONPATH")))
+             (zero? (system* "python" "test/test_pbkdf2.py")))))))
     (propagated-inputs
      `(("python-pycrypto" ,python-pycrypto)))  ; optional
     (home-page "http://www.dlitz.net/software/python-pbkdf2/")
@@ -12632,6 +13144,9 @@ a file-like object from which an arbitrarly-sized key can be read.")
         (base32
          "0kljfrfq0c2rmxf8am57333ia41kd0snbm2rnqbdy816hgpcq5a1"))))
     (build-system python-build-system)
+    (arguments
+     ;; FIXME: Tests require packaging 'pymaging'.
+     '(#:tests? #f))
     (propagated-inputs
      `(("python-lxml" ,python-lxml)     ; for SVG output
        ("python-pillow" ,python-pillow) ; for PNG output
diff --git a/gnu/packages/rdf.scm b/gnu/packages/rdf.scm
index 1dd23c28e3..97e6b881cc 100644
--- a/gnu/packages/rdf.scm
+++ b/gnu/packages/rdf.scm
@@ -315,6 +315,18 @@ ideal (e.g. in LV2 implementations or embedded applications).")
           (base32
             "0kvaf332cqbi47rqzlpdx4mbkvw12mkrzkj8n9l19wk713d4py9w"))))
     (build-system python-build-system)
+    (arguments
+     '(;; FIXME: Three test failures. Try uncommenting the below next update.
+       #:tests? #f))
+       ;; #:phases
+       ;; (modify-phases %standard-phases
+       ;;   (replace 'check
+       ;;     (lambda _
+       ;;       ;; Run tests from the build directory so python3 only
+       ;;       ;; sees the installed 2to3 version.
+       ;;       (zero? (system* "nosetests" "--where=./build/src")))))
+    (native-inputs
+     `(("python-nose" ,python-nose)))
     (propagated-inputs
       `(("python-html5lib" ,python-html5lib)
         ("python-isodate" ,python-isodate)
@@ -329,12 +341,4 @@ powerful language for representing information.")
                         "See LICENSE in the distribution."))))
 
 (define-public python2-rdflib
-  (let ((base (package-with-python2 python-rdflib)))
-    (package
-      (inherit base)
-      (inputs
-        (append (package-inputs base)
-                `(("python2-nose" ,python2-nose))))
-      (arguments
-        `(#:python ,python-2
-          #:tests? #f))))) ; 3 tests fail, also outside Guix
+  (package-with-python2 python-rdflib))
diff --git a/gnu/packages/terminals.scm b/gnu/packages/terminals.scm
index e90ee6847f..d0d99932c4 100644
--- a/gnu/packages/terminals.scm
+++ b/gnu/packages/terminals.scm
@@ -166,6 +166,9 @@ insert mode and command mode where keybindings have different functions.")
                   (string-append "'" ncurses "/bin/tput'"))))
              #t)))))
     (inputs `(("ncurses" ,ncurses)))
+    (native-inputs
+     ;; For tests.
+     `(("python-requests" ,python-requests)))
     (home-page "https://asciinema.org")
     (synopsis "Terminal session recorder")
     (description
diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index 7e2700beba..1c3ffb040c 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -1210,7 +1210,7 @@ Mercurial, Bazaar, Darcs, CVS, Fossil, and Veracity.")
      `(;; for the tests
        ("python2-six" ,python2-six)))
     (propagated-inputs
-     `(("python2-dateutil" ,python2-dateutil-2)
+     `(("python2-dateutil" ,python2-dateutil)
        ("python2-futures" ,python2-futures)
        ("python2-rauth" ,python2-rauth)
        ("python2-swiftclient" ,python2-swiftclient)))
diff --git a/gnu/packages/vpn.scm b/gnu/packages/vpn.scm
index 8c7f07a263..efb46f73d4 100644
--- a/gnu/packages/vpn.scm
+++ b/gnu/packages/vpn.scm
@@ -248,6 +248,14 @@ DNS domain name queries.")
         (base32
          "0a92lk8790dpp9j64vb6p4sazax0x3nby01lnfll7mxs1hx6n27q"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-paths
+           (lambda _
+             (substitute* "sshoot/tests/test_manager.py"
+               (("/bin/sh") (which "sh")))
+             #t)))))
     (inputs
      `(("python-argcomplete" ,python-argcomplete)
        ("python-prettytable" ,python-prettytable)