X-Git-Url: https://git.hcoop.net/jackhill/guix/guix.git/blobdiff_plain/f3d446ccf4719f9e44d091f84d530bf09b7329c7..7802875abc2cdefae89bf67b7701988efb7936be:/gnu/packages/python-web.scm diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm index 81cee4dad3..b5d4a62c7d 100644 --- a/gnu/packages/python-web.scm +++ b/gnu/packages/python-web.scm @@ -3,7 +3,7 @@ ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Efraim Flashner ;;; Copyright © 2017 Christopher Baines ;;; Copyright © 2016, 2017 Danny Milosavljevic -;;; Copyright © 2013, 2014, 2015, 2016 Andreas Enge +;;; Copyright © 2013, 2014, 2015, 2016, 2020 Andreas Enge ;;; Copyright © 2016, 2017, 2020 Marius Bakke ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus ;;; Copyright © 2017 Roel Janssen @@ -37,6 +37,8 @@ ;;; Copyright © 2020 Holger Peters ;;; Copyright © 2020 Noisytoot ;;; Copyright © 2020 Edouard Klein +;;; Copyright © 2020 Vinicius Monego +;;; Copyright © 2020 Konrad Hinsen ;;; ;;; This file is part of GNU Guix. ;;; @@ -67,10 +69,12 @@ #:use-module (gnu packages databases) #:use-module (gnu packages django) #:use-module (gnu packages groff) + #:use-module (gnu packages libevent) #:use-module (gnu packages libffi) #:use-module (gnu packages pkg-config) #:use-module (gnu packages python) #:use-module (gnu packages python-check) + #:use-module (gnu packages python-compression) #:use-module (gnu packages python-crypto) #:use-module (gnu packages python-xyz) #:use-module (gnu packages serialization) @@ -183,7 +187,7 @@ aiohttp. It supports SOCKS4(a) and SOCKS5.") (base32 "1snr5paql8dgvc676n8xq460wypjsb1xj53cf3px1s4wczf7lryq")))) (build-system python-build-system) - (inputs + (propagated-inputs `(("python-pycares" ,python-pycares))) (arguments `(#:tests? #f)) ;tests require internet access @@ -464,6 +468,129 @@ follow links and submit forms. It doesn’t do JavaScript.") (define-public python2-mechanicalsoup (package-with-python2 python-mechanicalsoup)) +(define-public python-hyperframe + (package + (name "python-hyperframe") + (version "5.2.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "hyperframe" version)) + (sha256 + (base32 "07xlf44l1cw0ghxx46sbmkgzil8vqv8kxwy42ywikiy35izw3xd9")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda* (#:key inputs outputs #:allow-other-keys) + (add-installed-pythonpath inputs outputs) + (invoke "pytest" "-vv" "test")))))) + (native-inputs + `(("python-pytest" ,python-pytest))) + (home-page "https://github.com/python-hyper/hyperframe") + (synopsis "HTTP/2 framing layer for Python") + (description + "This library contains the HTTP/2 framing code used in the hyper project. +It provides a pure-Python codebase that is capable of decoding a binary stream +into HTTP/2 frames.") + (license license:expat))) + +(define-public python-hpack + (package + (name "python-hpack") + (version "3.0.0") + (source + (origin + ;; PyPI tarball is missing some files necessary for the tests. + (method git-fetch) + (uri (git-reference + (url "https://github.com/python-hyper/hpack") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 "0w8hkz50a6lzkmgi41ryicm0mh9ca9cx29pm3s0xlpn0vs29xrmd")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda* (#:key inputs outputs #:allow-other-keys) + (add-installed-pythonpath inputs outputs) + (invoke "pytest" "-vv" "test" "-k" + ;; This test will be fixed in the next version. See: + ;; https://github.com/python-hyper/hpack/issues/168. + "not test_get_by_index_out_of_range")))))) + (native-inputs + `(("python-pytest" ,python-pytest))) + (home-page "https://hyper.rtfd.org") + (synopsis "Pure-Python HPACK header compression") + (description + "This module contains a pure-Python HTTP/2 header encoding (HPACK) logic +for use in Python programs that implement HTTP/2.") + (license license:expat))) + +(define-public python-h11 + (package + (name "python-h11") + (version "0.9.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "h11" version)) + (sha256 + (base32 "1qfad70h59hya21vrzz8dqyyaiqhac0anl2dx3s3k80gpskvrm1k")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda _ + (invoke "pytest" "-vv")))))) + (native-inputs + `(("python-pytest" ,python-pytest))) + (home-page "https://github.com/python-hyper/h11") + (synopsis "Pure-Python, bring-your-own-I/O implementation of HTTP/1.1") + (description + "This is a little HTTP/1.1 library written from scratch in Python, heavily +inspired by hyper-h2. It's a bring-your-own-I/O library; h11 contains no IO +code whatsoever. This means you can hook h11 up to your favorite network API, +and that could be anything you want.") + (license license:expat))) + +(define-public python-h2 + (package + (name "python-h2") + (version "3.2.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "h2" version)) + (sha256 + (base32 "051gg30aca26rdxsmr9svwqm06pdz9bv21ch4n0lgi7jsvml2pw7")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda* (#:key inputs outputs #:allow-other-keys) + (add-installed-pythonpath inputs outputs) + (invoke "pytest" "-vv" "test")))))) + (native-inputs + `(("python-pytest" ,python-pytest))) + (propagated-inputs + `(("python-hpack" ,python-hpack) + ("python-hyperframe" ,python-hyperframe))) + (home-page "https://github.com/python-hyper/hyper-h2") + (synopsis "HTTP/2 State-Machine based protocol implementation") + (description + "This module contains a pure-Python implementation of a HTTP/2 protocol +stack. It does not provide a parsing layer, a network layer, or any rules +about concurrency. Instead, it's a purely in-memory solution, defined in +terms of data actions and HTTP/2 frames. This is one building block of a full +Python HTTP implementation.") + (license license:expat))) + (define-public python-sockjs-tornado (package (name "python-sockjs-tornado") @@ -872,6 +999,111 @@ teams extension for python-openid.") (define-public python2-openid-teams (package-with-python2 python-openid-teams)) +(define-public python-priority + (package + (name "python-priority") + (version "1.3.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "priority" version)) + (sha256 + (base32 "1gpzn9k9zgks0iw5wdmad9b4dry8haiz2sbp6gycpjkzdld9dhbb")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda* (#:key inputs outputs #:allow-other-keys) + (add-installed-pythonpath inputs outputs) + (invoke "pytest" "-vv" "test" "-k" + ;; This test exceeded the Hypothesis deadline. + "not test_period_of_repetition")))))) + (native-inputs + `(("python-hypothesis" ,python-hypothesis) + ("python-pytest" ,python-pytest) + ("python-pytest-cov" ,python-pytest-cov) + ("python-pytest-xdist" ,python-pytest-xdist))) + (home-page "https://python-hyper.org/projects/priority/en/latest/") + (synopsis "Pure-Python implementation of the HTTP/2 priority tree") + (description + "Priority is a pure-Python implementation of the priority logic for HTTP/2, +set out in RFC 7540 Section 5.3 (Stream Priority).") + (license license:expat))) + +(define-public python-wsproto + (package + (name "python-wsproto") + (version "0.15.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "wsproto" version)) + (sha256 + (base32 "17gsxlli4w8am1wwwl3k90hpdfa213ax40ycbbvb7hjx1v1rhiv1")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda* (#:key inputs outputs #:allow-other-keys) + (add-installed-pythonpath inputs outputs) + (invoke "pytest" "-vv" "test")))))) + (native-inputs + `(("python-pytest" ,python-pytest))) + (propagated-inputs + `(("python-h11" ,python-h11))) + (home-page "https://github.com/python-hyper/wsproto/") + (synopsis "WebSockets state-machine based protocol implementation") + (description + "@code{wsproto} is a pure-Python implementation of a WebSocket protocol +stack. It's written from the ground up to be embeddable in whatever program you +choose to use, ensuring that you can communicate via WebSockets, as defined in +RFC6455, regardless of your programming paradigm.") + (license license:expat))) + +(define-public python-hypercorn + (package + (name "python-hypercorn") + (version "0.10.2") + (source + (origin + (method url-fetch) + (uri (pypi-uri "Hypercorn" version)) + (sha256 + (base32 "15dgy47a18w2ls3hwykra1cyf7yzxmfjqnsqml482p12cxr2xwqr")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda* (#:key inputs outputs #:allow-other-keys) + (add-installed-pythonpath inputs outputs) + (invoke "pytest" "-vv")))))) + (propagated-inputs + `(("python-h11" ,python-h11) + ("python-h2" ,python-h2) + ("python-priority" ,python-priority) + ("python-toml" ,python-toml) + ("python-typing-extensions" ,python-typing-extensions) + ("python-wsproto" ,python-wsproto))) + (native-inputs + `(("python-hypothesis" ,python-hypothesis) + ("python-mock" ,python-mock) + ("python-pytest" ,python-pytest) + ("python-pytest-asyncio" ,python-pytest-asyncio) + ("python-pytest-cov" ,python-pytest-cov) + ("python-pytest-trio" ,python-pytest-trio) + ("python-trio" ,python-trio))) + (home-page "https://gitlab.com/pgjones/hypercorn/") + (synopsis "ASGI Server based on Hyper libraries") + (description + "Hypercorn is an ASGI web server based on the sans-io hyper, h11, h2, and +wsproto libraries and inspired by Gunicorn. It supports HTTP/1, HTTP/2, +WebSockets (over HTTP/1 and HTTP/2), ASGI/2, and ASGI/3 specifications. It can +utilise asyncio, uvloop, or trio worker types.") + (license license:expat))) + (define-public python-tornado (package (name "python-tornado") @@ -1087,17 +1319,21 @@ dispatching systems can be built.") (define-public python-zope-interface (package (name "python-zope-interface") - (version "4.7.2") + (version "5.1.0") (source (origin (method url-fetch) (uri (pypi-uri "zope.interface" version)) (sha256 (base32 - "0r9kvb1q3lxrdhxabliv9nwhjsdmn1n0vcjv93rlqkyb7yyh24gx")))) + "03nrl6b8cb600dnnh46y149awvrm0gxyqgwq5hdw3lvys8mw9r20")))) (build-system python-build-system) + (arguments '(#:tests? #f)) ; test suite can't find python-zope-testing (native-inputs - `(("python-zope-event" ,python-zope-event))) + `(("python-coverage" ,python-coverage) + ("python-nose" ,python-nose) + ("python-zope-event" ,python-zope-event) + ("python-zope-testing" ,python-zope-testing))) (home-page "https://github.com/zopefoundation/zope.interface") (synopsis "Python implementation of the \"design by contract\" methodology") @@ -1236,17 +1472,24 @@ internationalized messages within program source text.") (define-public python-zope-schema (package (name "python-zope-schema") - (version "5.0.1") + (version "6.0.0") (source (origin (method url-fetch) (uri (pypi-uri "zope.schema" version)) (sha256 (base32 - "0q93j0x52a42khw12al90jw2bk0wly3jwghql3a25zpwwxvn24ya")))) + "09jg47bxhfg1ahr1jxb5y0cbiszyk1j6fn1r1r7s6svjl3lbryr0")))) (build-system python-build-system) (arguments - '(#:tests? #f)) ; FIXME: Tests can't find zope.event. + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda* (#:key inputs outputs tests? #:allow-other-keys) + (add-installed-pythonpath inputs outputs) + (if tests? + (invoke "zope-testrunner" "--test-path=src") + #t)))))) (propagated-inputs `(("python-zope-event" ,python-zope-event) ("python-zope-interface" ,python-zope-interface))) @@ -1266,18 +1509,17 @@ defining data schemas.") (define-public python-zope-configuration (package (name "python-zope-configuration") - (version "4.3.1") + (version "4.4.0") (source (origin (method url-fetch) (uri (pypi-uri "zope.configuration" version)) (sha256 (base32 - "1qb88764fd7nkkmqv7fl9bxd1jirynkg5vbqkpqdiffnkxzp85kf")))) + "0g6vrl7y27z9cj5xyrww9xlzk4npj55mgmlrcd9d2nj08jn2pw79")))) (build-system python-build-system) - (arguments - '(#:tests? #f)) ; FIXME: Tests can't find zope.interface. (native-inputs - `(("python-zope-testing" ,python-zope-testing) + `(("python-manuel" ,python-manuel) + ("python-zope-testing" ,python-zope-testing) ("python-zope-testrunner" ,python-zope-testrunner))) (propagated-inputs `(("python-zope-i18nmessageid" ,python-zope-i18nmessageid) @@ -1289,25 +1531,62 @@ defining data schemas.") Markup Language.") (license license:zpl2.1))) +(define-public python-zope-configuration-bootstrap + (package + (inherit python-zope-configuration) + (arguments `(#:tests? #f)) + (native-inputs `()) + (properties `((hidden? . #t))))) + (define-public python2-zope-configuration (package-with-python2 python-zope-configuration)) +(define-public python-zope-copy + (package + (name "python-zope-copy") + (version "4.2") + (source + (origin + (method url-fetch) + (uri (pypi-uri "zope.copy" version)) + (sha256 + (base32 + "06m75434krl57n6p73c2qj55k5i3fixg887j8ss01ih6zw4rvfs7")))) + (build-system python-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda _ + (invoke "zope-testrunner" "--test-path=src" "\\[]")))))) + (propagated-inputs + `(("python-zope-interface" ,python-zope-interface))) + (native-inputs + `(("python-zope-component" ,python-zope-component-bootstrap) + ("python-zope-location" ,python-zope-location-bootstrap) + ("python-zope-testing" ,python-zope-testing) + ("python-zope-testrunner" ,python-zope-testrunner))) + (home-page "https://github.com/zopefoundation/zope.copy") + (synopsis "Pluggable object copying mechanism") + (description + "This package provides a pluggable mechanism for copying persistent objects.") + (license license:zpl2.1))) + (define-public python-zope-proxy (package (name "python-zope-proxy") - (version "4.3.4") + (version "4.3.5") (source (origin (method url-fetch) (uri (pypi-uri "zope.proxy" version)) (sha256 (base32 - "1g0rcfnbchpvqhm76aixqlz544dawrgmy8gw9zwmijhk6wfl9f26")))) + "14h7nyfbl5vpfk0rbviy4ygdfx0yx5kncvg6jpbdb0dhwna0ssm6")))) (build-system python-build-system) - (arguments - '(#:tests? #f)) ; FIXME: Tests can't find zope.interface. (native-inputs - `(("python-zope-testrunner" ,python-zope-testrunner))) + `(("python-zope-security" ,python-zope-security-bootstrap) + ("python-zope-testrunner" ,python-zope-testrunner))) (propagated-inputs `(("python-zope-interface" ,python-zope-interface))) (home-page "https://pypi.org/project/zope.proxy/") @@ -1329,6 +1608,31 @@ brokering, etc.) for which the proxy is responsible.") (define-public python2-zope-proxy (package-with-python2 python-zope-proxy)) +(define-public python-zope-hookable + (package + (name "python-zope-hookable") + (version "5.0.1") + (source + (origin + (method url-fetch) + (uri (pypi-uri "zope.hookable" version)) + (sha256 + (base32 + "0hc82lfr7bk53nvbxvjkibkarngyrzgfk2i6bg8wshl0ly0pdl19")))) + (build-system python-build-system) + (native-inputs + `(("python-coverage" ,python-coverage) + ("python-zope-testing" ,python-zope-testing))) + (home-page "https://github.com/zopefoundation/zope.hookable") + (synopsis "Zope hookable") + (description "This package supports the efficient creation of hookable +objects, which are callable objects that are meant to be optionally replaced. +The idea is that you create a function that does some default thing and make i +hookable. Later, someone can modify what it does by calling its sethook method +and changing its implementation. All users of the function, including those +that imported it, will see the change.") + (license license:zpl2.1))) + (define-public python-zope-location (package (name "python-zope-location") @@ -1355,23 +1659,28 @@ brokering, etc.) for which the proxy is responsible.") Zope3, which are are special objects that have a structural location.") (license license:zpl2.1))) +(define-public python-zope-location-bootstrap + (package + (inherit python-zope-location) + (arguments `(#:tests? #f)) + (native-inputs `()) + (properties `((hidden? . #t))))) + (define-public python2-zope-location (package-with-python2 python-zope-location)) (define-public python-zope-security (package (name "python-zope-security") - (version "5.1.0") + (version "5.1.1") (source (origin (method url-fetch) (uri (pypi-uri "zope.security" version)) (sha256 (base32 - "1npfrgnm202v48wavpwn3450dsn7az12lfww95vbhxyjl11f14yb")))) + "11lfw67cigscfax9c5j63xcvz2qcj724zx5fcdqyc94am2glim0h")))) (build-system python-build-system) - (arguments - '(#:tests? #f)) ; FIXME: Tests can't find zope.testrunner. (propagated-inputs `(("python-zope-component" ,python-zope-component) ("python-zope-i18nmessageid" ,python-zope-i18nmessageid) @@ -1380,40 +1689,67 @@ Zope3, which are are special objects that have a structural location.") ("python-zope-proxy" ,python-zope-proxy) ("python-zope-schema" ,python-zope-schema))) (native-inputs - `(("python-zope-configuration" ,python-zope-configuration) - ("python-zope-testrunner" ,python-zope-testrunner) - ("python-zope-testing" ,python-zope-testing))) + `(("python-btrees" ,python-btrees) + ("python-zope-component" ,python-zope-component-bootstrap) + ("python-zope-configuration" ,python-zope-configuration-bootstrap) + ("python-zope-location" ,python-zope-location-bootstrap) + ("python-zope-testing" ,python-zope-testing) + ("python-zope-testrunner" ,python-zope-testrunner))) (home-page "https://pypi.org/project/zope.security/") (synopsis "Zope security framework") (description "Zope.security provides a generic mechanism to implement security policies on Python objects.") (license license:zpl2.1))) +(define-public python-zope-security-bootstrap + (package + (inherit python-zope-security) + (arguments `(#:tests? #f)) + (propagated-inputs + `(("python-zope-i18nmessageid" ,python-zope-i18nmessageid) + ("python-zope-interface" ,python-zope-interface) + ("python-zope-proxy" ,python-zope-proxy-bootstrap) + ("python-zope-schema" ,python-zope-schema))) + (native-inputs `()) + (properties `((hidden? . #t))))) + (define-public python2-zope-security (package-with-python2 python-zope-security)) (define-public python-zope-component (package (name "python-zope-component") - (version "4.3.0") + (version "4.6.2") (source (origin (method url-fetch) (uri (pypi-uri "zope.component" version)) (sha256 (base32 - "1hlvzwj1kcfz1qms1dzhwsshpsf38z9clmyksb1gh41n8k3kchdv")))) + "14iwp95hh6q5dj4k9h1iw75cbp89bs27nany4dinyglb44c8jqli")))) (build-system python-build-system) (arguments - ;; Skip tests due to circular dependency with python-zope-security. - '(#:tests? #f)) + '(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda* (#:key inputs outputs #:allow-other-keys) + (add-installed-pythonpath inputs outputs) + (invoke "python" "setup.py" "test")))))) (native-inputs - `(("python-zope-testing" ,python-zope-testing))) - (propagated-inputs - `(("python-zope-event" ,python-zope-event) - ("python-zope-interface" ,python-zope-interface) + `(("python-persistent" ,python-persistent) + ("python-zope-configuration" ,python-zope-configuration-bootstrap) ("python-zope-i18nmessageid" ,python-zope-i18nmessageid) - ("python-zope-configuration" ,python-zope-configuration))) + ("python-zope-location" ,python-zope-location-bootstrap) + ("python-zope-proxy" ,python-zope-proxy-bootstrap) + ("python-zope-security" ,python-zope-security-bootstrap) + ("python-zope-testing" ,python-zope-testing) + ("python-zope-testrunner" ,python-zope-testrunner))) + (propagated-inputs + `(("python-zope-deferredimport" ,python-zope-deferredimport) + ("python-zope-deprecation" ,python-zope-deprecation) + ("python-zope-event" ,python-zope-event) + ("python-zope-hookable" ,python-zope-hookable) + ("python-zope-interface" ,python-zope-interface))) (home-page "https://github.com/zopefoundation/zope.component") (synopsis "Zope Component Architecture") (description "Zope.component represents the core of the Zope Component @@ -1421,9 +1757,42 @@ Architecture. Together with the zope.interface package, it provides facilities for defining, registering and looking up components.") (license license:zpl2.1))) +(define-public python-zope-component-bootstrap + (package + (inherit python-zope-component) + (arguments `(#:tests? #f)) + (native-inputs `()) + (properties `((hidden? . #t))))) + (define-public python2-zope-component (package-with-python2 python-zope-component)) +(define-public python-zope-deferredimport + (package + (name "python-zope-deferredimport") + (version "4.3.1") + (source + (origin + (method url-fetch) + (uri (pypi-uri "zope.deferredimport" version)) + (sha256 + (base32 + "1q89v54dwniiqypjbwywwdfjdr4kdkqlyqsgrpplgvsygdg39cjp")))) + (build-system python-build-system) + (propagated-inputs + `(("python-zope-proxy" ,python-zope-proxy))) + (native-inputs + `(("python-zope-testrunner" ,python-zope-testrunner))) + (home-page "https://github.com/zopefoundation/zope.deferredimport") + (synopsis "Defer imports until used by code") + (description + "Often, especially for package modules, you want to import names for +convenience, but not actually perform the imports until necessary. The +@code{zope.deferredimport} package provided facilities for defining names in +modules that will be imported from somewhere else when used. You can also cause +deprecation warnings to be issued when a variable is used.") + (license license:zpl2.1))) + (define-public python-ndg-httpsclient (package (name "python-ndg-httpsclient") @@ -1490,6 +1859,82 @@ WebSocket usage in Python programs.") ,python2-backport-ssl-match-hostname) ,@(package-native-inputs base)))))) +(define-public python-purl + (package + (name "python-purl") + (version "1.5") + (source + (origin + (method url-fetch) + (uri (pypi-uri "purl" version)) + (sha256 + (base32 + "15ibnz1xrh5msmn04j0nr00sz4n7jwx6cwd6zlx99kkz3vpin53m")))) + (build-system python-build-system) + (propagated-inputs `(("python-six" ,python-six))) + (home-page + "https://github.com/codeinthehole/purl") + (synopsis + "Python package for URL manipulation") + (description + "Purl is a Python package for handling URLs.") + (license license:expat))) + +(define-public python-apiron + (package + (name "python-apiron") + (version "5.1.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "apiron" version)) + (sha256 + (base32 "1qwbqn47sf0aqznj1snbv37v8ijx476qqkjf5l9pac7xjkxsr8qk")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda* (#:key inputs outputs #:allow-other-keys) + (add-installed-pythonpath inputs outputs) + (invoke "pytest" "-vv" "--cov" "-k" + ;; This test tries to connect to the internet. + "not test_call")))))) + (propagated-inputs + `(("python-requests" ,python-requests))) + (native-inputs + `(("python-pytest" ,python-pytest) + ("python-pytest-cov" ,python-pytest-cov))) + (home-page "https://github.com/ithaka/apiron") + (synopsis "Python wrapper for interacting with RESTful APIs") + (description + "@code{apiron} provides a declarative, structured configuration of +services and endpoints with a unified interface for interacting with RESTful +APIs.") + (license license:expat))) + +(define-public python-beren + (package + (name "python-beren") + (version "0.7.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "beren" version)) + (sha256 + (base32 "1v3mdwfqsyza892zvs124ym9w1bkng1j56b7l4dwfjir3723xcgf")))) + (build-system python-build-system) + (arguments + ;; The test tries to open a connection to a remote server. + `(#:tests? #f)) + (propagated-inputs + `(("python-apiron" ,python-apiron))) + (home-page "https://github.com/teffalump/beren") + (synopsis "REST client for Orthanc DICOM servers") + (description + "@code{beren} provides a REST client for Orthanc, a DICOM server.") + (license license:gpl3+))) + (define-public python-requests (package (name "python-requests") @@ -1532,18 +1977,6 @@ than Python’s urllib2 library.") ("python-idna" ,python-idna-2.7) ,@(package-propagated-inputs python-requests))))) -;; Some software requires an older version of Requests, notably Docker -;; Compose. -(define-public python-requests-2.7 - (package (inherit python-requests) - (version "2.7.0") - (source (origin - (method url-fetch) - (uri (pypi-uri "requests" version)) - (sha256 - (base32 - "0gdr9dxm24amxpbyqpbh3lbwxc2i42hnqv50sigx568qssv3v2ir")))))) - (define-public python2-requests (package-with-python2 python-requests)) @@ -1574,14 +2007,14 @@ library.") (define-public python-requests-mock (package (name "python-requests-mock") - (version "1.3.0") + (version "1.8.0") (source (origin (method url-fetch) (uri (pypi-uri "requests-mock" version)) (sha256 (base32 - "0jr997dvk6zbmhvbpcv3rajrgag69mcsm1ai3w3rgk2jdh6rg1mx")))) + "09nj8fmyj7xz2mgwyvbw0fl9zybmx2d3qd2hf529vvjc9s24d3z6")))) (build-system python-build-system) (propagated-inputs `(("python-requests" ,python-requests) @@ -1592,9 +2025,10 @@ library.") ("python-docutils" ,python-docutils) ("python-fixtures" ,python-fixtures) ("python-mock" ,python-mock) + ("python-purl" ,python-purl) + ("python-pytest" ,python-pytest) ("python-sphinx" ,python-sphinx) - ("python-testrepository" ,python-testrepository) - ("python-testtools" ,python-testtools))) + ("python-testrepository" ,python-testrepository))) (home-page "https://requests-mock.readthedocs.org/") (synopsis "Mock out responses from the requests package") (description @@ -1628,15 +2062,51 @@ portions of your testing code.") ("python-pytest" ,python-pytest))) (propagated-inputs `(("python-requests" ,python-requests))) - (synopsis "Extensions to python-requests") - (description "This is a toolbelt of useful classes and functions to be used -with python-requests.") - (home-page "https://github.com/sigmavirus24/requests-toolbelt") + (synopsis "Extensions to python-requests") + (description "This is a toolbelt of useful classes and functions to be used +with python-requests.") + (home-page "https://github.com/sigmavirus24/requests-toolbelt") + (license license:asl2.0))) + +(define-public python2-requests-toolbelt + (package-with-python2 python-requests-toolbelt)) + +(define-public python-requests-toolbelt-0.9.1 + (package + (inherit python-requests-toolbelt) + (version "0.9.1") + (source (origin + (method url-fetch) + (uri (pypi-uri "requests-toolbelt" version)) + (sha256 + (base32 + "1h3gm88dcjbd7gm229a7x5qkkhnsqsjz0m0l2xyavm2ab3a8k04n")))) + (arguments + `(;; FIXME: Some tests require network access. + #:tests? #f)))) + +(define-public python-requests-ftp + (package + (name "python-requests-ftp") + (version "0.3.1") + (source + (origin + (method url-fetch) + (uri (pypi-uri "requests-ftp" version)) + (sha256 + (base32 + "0yh5v21v36dsjsgv4y9dx4mmz35741l5jf6pbq9w19d8rfsww13m")))) + (build-system python-build-system) + (propagated-inputs + `(("python-requests" ,python-requests))) + (home-page + "https://github.com/Lukasa/requests-ftp") + (synopsis "FTP Transport Adapter for Requests") + (description + "Requests-FTP is an implementation of a simple FTP transport +adapter for use with the Requests library.") (license license:asl2.0))) -(define-public python2-requests-toolbelt - (package-with-python2 python-requests-toolbelt)) - (define-public python-oauthlib (package (name "python-oauthlib") @@ -2408,13 +2878,13 @@ applications.") (define-public python-flask-sqlalchemy (package (name "python-flask-sqlalchemy") - (version "2.4.3") + (version "2.4.4") (source (origin (method url-fetch) (uri (pypi-uri "Flask-SQLAlchemy" version)) (sha256 (base32 - "19apnn2m9bl1d1h2nc52pnmiyx993mwzmfjrv04l3wn5hyznyr8b")))) + "1rgsj49gnx361hnb3vn6c1h17497qh22yc3r70l1r6w0mw71bixz")))) (build-system python-build-system) (propagated-inputs `(("python-flask" ,python-flask) @@ -3385,17 +3855,13 @@ Python.") (define-public python-slugify (package (name "python-slugify") - (version "3.0.4") + (version "4.0.1") (source (origin (method url-fetch) (uri (pypi-uri "python-slugify" version)) (sha256 - (base32 "0dv97yi5fq074q5qyqbin09pmi8ixg36caf5nkpw2bqkd8jh6pap")) - (patches - (search-patches "python-slugify-depend-on-unidecode.patch")))) - (native-inputs - `(("python-wheel" ,python-wheel))) + (base32 "0w22fapghmzk3xdasc4dn7h8sl58l08d1h5zbf72dh80drv1g9b9")))) (propagated-inputs `(("python-unidecode" ,python-unidecode))) (arguments @@ -3501,6 +3967,43 @@ XPath and therefore does not have all the correctness corner cases that are hard or impossible to fix in cssselect.") (license license:bsd-3))) +(define-public python-uvloop + (package + (name "python-uvloop") + (version "0.14.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "uvloop" version)) + (sha256 + (base32 "07j678z9gf41j98w72ysrnb5sa41pl5yxd7ib17lcwfxqz0cjfhj")))) + (build-system python-build-system) + (arguments + '(#:tests? #f ;FIXME: tests hang and with some errors in the way + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'preparations + (lambda _ + ;; Use packaged libuv. + (substitute* "setup.py" (("self.use_system_libuv = False") + "self.use_system_libuv = True")) + #t))))) + (native-inputs + `(("python-aiohttp" ,python-aiohttp) + ("python-cython" ,python-cython) + ("python-flake8" ,python-flake8) + ("python-psutil" ,python-psutil) + ("python-pyopenssl" ,python-pyopenssl) + ("python-twine" ,python-twine))) + (inputs + `(("libuv" ,libuv))) + (home-page "https://github.com/MagicStack/uvloop") + (synopsis "Fast implementation of asyncio event loop on top of libuv") + (description + "@code{uvloop} is a fast, drop-in replacement of the built-in asyncio +event loop. It is implemented in Cython and uses libuv under the hood.") + (license license:expat))) + (define-public gunicorn (package (name "gunicorn") @@ -3567,10 +4070,108 @@ and fairly speedy.") (package (inherit gunicorn) (name "gunicorn") - (arguments `(#:tests? #f)) - (properties '((hidden? . #t))) + (arguments `(#:tests? #f)) + (properties '((hidden? . #t))) (native-inputs `()))) +(define-public python-httptools + (package + (name "python-httptools") + (version "0.1.1") + (source + (origin + ;; PyPI tarball comes with a vendored http-parser and no tests. + (method git-fetch) + (uri (git-reference + (url "https://github.com/MagicStack/httptools") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 "0g08128x2ixsiwrzskxc6c8ymgzs39wbzr5mhy0mjk30q9pqqv77")))) + (build-system python-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'preparations + (lambda _ + ;; Skip a failing test (AssertionError). Bug report: + ;; https://github.com/MagicStack/httptools/issues/10. + (substitute* "tests/test_parser.py" + ((" def test_parser_response_1") + (string-append + " @unittest.skip(\"Disabled.\")\n" + " def test_parser_response_1"))) + ;; Use packaged http-parser. + (substitute* "setup.py" (("self.use_system_http_parser = False") + "self.use_system_http_parser = True")) + ;; This path is hardcoded. Hardcode our own. + (substitute* "httptools/parser/cparser.pxd" + (("../../vendor/http-parser") + (string-append (assoc-ref %build-inputs "http-parser") + "/include"))) + ;; Don't force Cython version. + (substitute* "setup.py" (("Cython==") "Cython>=")) + #t))))) + (native-inputs + `(("python-cython" ,python-cython) + ("python-pytest" ,python-pytest))) + (inputs + `(("http-parser" ,http-parser))) + (home-page "https://github.com/MagicStack/httptools") + (synopsis "Collection of framework independent HTTP protocol utils") + (description + "@code{httptools} is a Python binding for the nodejs HTTP parser.") + (license license:expat))) + +(define-public python-uvicorn + (package + (name "python-uvicorn") + (version "0.11.8") + (source + (origin + ;; PyPI tarball has no tests. + (method git-fetch) + (uri (git-reference + (url "https://github.com/encode/uvicorn") + (commit version))) + (file-name (git-file-name name version)) + (sha256 + (base32 "00iidg5ysp7k00bw3kmkvr8mghnh4jdi0p2ryiarhryf8wz2r3fy")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda* (#:key inputs outputs tests? #:allow-other-keys) + (add-installed-pythonpath inputs outputs) + (invoke "pytest" "-vv")))))) + (native-inputs + `(("python-black" ,python-black) + ("python-codecov" ,python-codecov) + ("python-flake8" ,python-flake8) + ("python-isort" ,python-isort) + ("python-mypy" ,python-mypy) + ("python-pytest" ,python-pytest) + ("python-pytest-cov" ,python-pytest-cov) + ("python-pytest-mock" ,python-pytest-mock) + ("python-requests" ,python-requests))) + (propagated-inputs + `(("python-click" ,python-click) + ("python-h11" ,python-h11) + ("python-httptools" ,python-httptools) + ("python-pyyaml" ,python-pyyaml) + ("python-uvloop" ,python-uvloop) + ("python-watchgod" ,python-watchgod) + ("python-websockets" ,python-websockets) + ("python-wsproto" ,python-wsproto))) + (home-page "https://github.com/encode/uvicorn") + (synopsis "Fast ASGI server implementation") + (description + "@code{uvicorn} is a fast ASGI server implementation, using @code{uvloop} +and @code{httptools}. It currently supports HTTP/1.1 and WebSockets. Support +for HTTP/2 is planned.") + (license license:bsd-3))) + (define-public python-translation-finder (package (name "python-translation-finder") @@ -3784,6 +4385,168 @@ and serve updated contents upon changes to the directory.") @acronym{TLS, Transport Layer Security} support.") (license license:bsd-2))) +(define-public python-httpcore + (package + (name "python-httpcore") + (version "0.10.2") + (source + (origin + ;; PyPI tarball does not contain tests. + (method git-fetch) + (uri (git-reference + (url "https://github.com/encode/httpcore") + (commit version))) + (file-name (git-file-name name version)) + (sha256 + (base32 "00gn8nfv814rg6fj7xv97mrra3fvx6fzjcgx9y051ihm6hxljdsi")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'remove-unavailable-tests + (lambda _ + ;; These tests require 'mitmproxy' which is not packaged. + (for-each (lambda (f) + (delete-file f)) + '("tests/conftest.py" + "tests/sync_tests/test_interfaces.py" + "tests/async_tests/test_interfaces.py")) + #t)) + (add-after 'remove-unavailable-tests 'force-h11-version + ;; Allow build with h11 >= 0.10. + (lambda _ + (substitute* "setup.py" (("h11>=0.8,<0.10") "h11")) + #t)) + (replace 'check + (lambda* (#:key inputs outputs #:allow-other-keys) + (add-installed-pythonpath inputs outputs) + (invoke "pytest" "-vv" "--cov=httpcore" + "--cov=tests" "tests")))))) + (native-inputs + `(;; ("mitmproxy" ,mitmproxy) ;; TODO: Package this. + ("python-autoflake" ,python-autoflake) + ("python-flake8" ,python-flake8) + ("python-flake8-bugbear" ,python-flake8-bugbear) + ("python-flake8-pie" ,python-flake8-pie) + ("python-isort" ,python-isort) + ("python-mypy" ,python-mypy) + ("python-pytest" ,python-pytest) + ("python-pytest-asyncio" ,python-pytest-asyncio) + ("python-pytest-cov" ,python-pytest-cov) + ("python-pytest-trio" ,python-pytest-trio) + ("python-uvicorn" ,python-uvicorn) + ("python-trustme" ,python-trustme))) + (propagated-inputs + `(("python-h11" ,python-h11) + ("python-h2" ,python-h2) + ("python-sniffio" ,python-sniffio) + ("python-trio" ,python-trio) + ("python-trio-typing" ,python-trio-typing))) + (home-page "https://github.com/encode/httpcore") + (synopsis "Minimal, low-level HTTP client") + (description + "HTTP Core provides a minimal and low-level HTTP client, which does one +thing only: send HTTP requests. + +Some things HTTP Core does do: + +@itemize +@item Sending HTTP requests. +@item Provides both sync and async interfaces. +@item Supports HTTP/1.1 and HTTP/2. +@item Async backend support for asyncio and trio. +@item Automatic connection pooling. +@item HTTP(S) proxy support. +@end itemize") + (license license:bsd-3))) + +(define-public python-httpx + (package + (name "python-httpx") + (version "0.14.3") + (source + (origin + ;; PyPI tarball does not contain tests. + (method git-fetch) + (uri (git-reference + (url "https://github.com/encode/httpx") + (commit version))) + (file-name (git-file-name name version)) + (sha256 + (base32 "0mn8gqkgaij3s2pbwgrih20iq34f3f82dfvypaw3nnh7n63vna43")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (replace 'check + (lambda _ + (invoke "pytest" "-vv" "-k" + ;; This test tries to open an outgoing connection. + "not test_connect_timeout[asyncio]")))))) + (native-inputs + `(("python-autoflake" ,python-autoflake) + ("python-black" ,python-black) + ("python-cryptography" ,python-cryptography) + ("python-flake8" ,python-flake8) + ("python-flake8-bugbear" ,python-flake8-bugbear) + ("python-flake8-pie" ,python-flake8-pie) + ("python-isort" ,python-isort) + ("python-mypy" ,python-mypy) + ("python-pytest" ,python-pytest) + ("python-pytest-asyncio" ,python-pytest-asyncio) + ("python-pytest-trio" ,python-pytest-trio) + ("python-pytest-cov" ,python-pytest-cov) + ("python-trio" ,python-trio) + ("python-trio-typing" ,python-trio-typing) + ("python-trustme" ,python-trustme) + ("python-uvicorn" ,python-uvicorn))) + (propagated-inputs + `(("python-brotli" ,python-brotli) + ("python-certifi" ,python-certifi) + ("python-chardet" ,python-chardet) + ("python-httpcore" ,python-httpcore) + ("python-idna" ,python-idna) + ("python-rfc3986" ,python-rfc3986) + ("python-sniffio" ,python-sniffio))) + (home-page "https://github.com/encode/httpx") + (synopsis "HTTP client for Python") + (description + "HTTPX is a fully featured HTTP client for Python 3, which provides sync +and async APIs, and support for both HTTP/1.1 and HTTP/2. + +HTTPX builds on the well-established usability of requests, and gives you: + +@itemize +@item A broadly requests-compatible API. +@item Standard synchronous interface, but with async support if you need it. +@item HTTP/1.1 and HTTP/2 support. +@item Ability to make requests directly to WSGI applications or ASGI applications. +@item Strict timeouts everywhere. +@item Fully type annotated. +@item 99% test coverage. +@end itemize + +Plus all the standard features of requests: + +@itemize +@item International Domains and URLs +@item Keep-Alive & Connection Pooling +@item Sessions with Cookie Persistence +@item Browser-style SSL Verification +@item Basic/Digest Authentication +@item Elegant Key/Value Cookies +@item Automatic Decompression +@item Automatic Content Decoding +@item Unicode Response Bodies +@item Multipart File Uploads +@item HTTP(S) Proxy Support +@item Connection Timeouts +@item Streaming Downloads +@item .netrc Support +@item Chunked Requests +@end itemize") + (license license:bsd-3))) + (define-public python-websockets (package (name "python-websockets") @@ -4110,3 +4873,219 @@ REST APIs. Flask-RESTX encourages best practices with minimal setup. If you ar decorators and tools to describe your API and expose its documentation properly using Swagger.") (license license:bsd-3))) + +(define-public python-manuel + (package + (name "python-manuel") + (version "1.10.1") + (source + (origin + (method url-fetch) + (uri (pypi-uri "manuel" version)) + (sha256 + (base32 + "1bdzay7j70fly5fy6wbdi8fbrxjrrlxnxnw226rwry1c8a351rpy")))) + (build-system python-build-system) + (propagated-inputs + `(("python-six" ,python-six))) + (native-inputs + `(("python-zope-testing" ,python-zope-testing))) + (home-page "https://pypi.org/project/manuel/") + (synopsis "Build tested documentation") + (description + "Manuel lets you mix and match traditional doctests with custom test syntax.") + (license license:asl2.0))) + +(define-public python-persistent + (package + (name "python-persistent") + (version "4.6.4") + (source + (origin + (method url-fetch) + (uri (pypi-uri "persistent" version)) + (sha256 + (base32 + "0imm9ji03lhkpcfmhid7x5209ix8g2rlgki9ik1qxks4b8sm8gzq")))) + (build-system python-build-system) + (propagated-inputs + `(("python-cffi" ,python-cffi) + ("python-zope-interface" ,python-zope-interface))) + (native-inputs + `(("python-manuel" ,python-manuel) + ("python-zope-testrunner" ,python-zope-testrunner))) + (home-page "https://github.com/zopefoundation/persistent/") + (synopsis "Translucent persistent objects") + (description "This package contains a generic persistence implementation for +Python. It forms the core protocol for making objects interact +\"transparently\" with a database such as the ZODB.") + (license license:zpl2.1))) + +(define-public python-btrees + (package + (name "python-btrees") + (version "4.7.2") + (source + (origin + (method url-fetch) + (uri (pypi-uri "BTrees" version)) + (sha256 + (base32 + "0iiq0g9k1g6qgqq84q9h6639vlvzznk1rgdm0rfcnnqkbkmsbr3w")))) + (build-system python-build-system) + (propagated-inputs + `(("python-persistent" ,python-persistent) + ("python-zope-interface" ,python-zope-interface))) + (native-inputs + `(("python-persistent" ,python-persistent) + ("python-transaction" ,python-transaction) + ("python-zope-testrunner" ,python-zope-testrunner))) + (home-page "https://github.com/zopefoundation/BTrees") + (synopsis "Scalable persistent object containers") + (description + "This package contains a set of persistent object containers built around a +modified BTree data structure. The trees are optimized for use inside ZODB's +\"optimistic concurrency\" paradigm, and include explicit resolution of +conflicts detected by that mechanism.") + (license license:zpl2.1))) + +(define-public python-transaction + (package + (name "python-transaction") + (version "3.0.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "transaction" version)) + (sha256 + (base32 + "0bdaks31bgfh78wnj3sij24bfysmqk25crsis6amz8kzrc0d82iv")))) + (build-system python-build-system) + (propagated-inputs + `(("python-zope-interface" ,python-zope-interface))) + (native-inputs + `(("python-coverage" ,python-coverage) + ("python-mock" ,python-mock) + ("python-nose" ,python-nose))) + (home-page "https://github.com/zopefoundation/transaction") + (synopsis "Transaction management for Python") + (description "This package contains a generic transaction implementation +for Python. It is mainly used by the ZODB.") + (license license:zpl2.1))) + +(define-public python-robot-detection + (package + (name "python-robot-detection") + (version "0.4") + (source + (origin + (method url-fetch) + (uri (pypi-uri "robot-detection" version)) + (sha256 + (base32 + "1xd2jm3yn31bnk1kqzggils2rxj26ylxsfz3ap7bhr3ilhnbg3rx")))) + (build-system python-build-system) + (arguments '(#:tests? #f)) ; Tests not shipped in pypi release. + (propagated-inputs `(("python-six" ,python-six))) + (home-page "https://github.com/rory/robot-detection") + (synopsis "Detect web crawlers") + (description + "@code{robot_detection} is a python module to detect if a given HTTP User +Agent is a web crawler. It uses the list of registered robots from +@url{http://www.robotstxt.org}.") + (license license:gpl3+))) + +(define-public python-pysolr + (package + (name "python-pysolr") + (version "3.9.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "pysolr" version)) + (sha256 + (base32 + "1rj5jmscvxjwcmlfi6hmkj44l4x6n3ln5p7d8d18j566hzmmzw3f")))) + (build-system python-build-system) + (arguments + '(#:tests? #f)) ; Tests require network access. + (propagated-inputs + `(("python-requests" ,python-requests))) + (native-inputs + `(("python-setuptools-scm" ,python-setuptools-scm))) + (home-page "https://github.com/django-haystack/pysolr/") + (synopsis "Lightweight python wrapper for Apache Solr") + (description + "This module provides an interface that queries the Apache Solr server +using a pure Python implementation.") + (license license:bsd-3))) + +(define-public python-http-ece + (package + (name "python-http-ece") + (version "1.1.0") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/web-push-libs/encrypted-content-encoding") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "0bp4cc0xc123i72h80ax3qz3ixfwx3j7pw343kc7i6kdvfi8klx7")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'change-directory + (lambda _ (chdir "python") #t))))) + (propagated-inputs + `(("python-cryptography" ,python-cryptography))) + (native-inputs + `(("python-coverage" ,python-coverage) + ("python-flake8" ,python-flake8) + ("python-mock" ,python-mock) + ("python-nose" ,python-nose))) + (home-page "https://github.com/web-push-libs/encrypted-content-encoding") + (synopsis "Encrypted Content Encoding for HTTP") + (description + "This package provices a simple implementation of Encrypted Content +Encoding for HTTP.") + (license license:expat))) + +(define-public python-cloudscraper + (package + (name "python-cloudscraper") + (version "1.2.46") + (source + (origin + (method url-fetch) + (uri (pypi-uri "cloudscraper" version)) + (sha256 + (base32 + "1br4p648yassywsd7whz1c7s10rwdysnd7wdqfjq9bksqfxrac3r")) + (modules '((guix build utils))) + (snippet + '(with-directory-excursion "cloudscraper" + (for-each delete-file + '("captcha/2captcha.py" + "captcha/9kw.py" + "captcha/anticaptcha.py" + "captcha/deathbycaptcha.py" + "interpreters/js2py.py" + "interpreters/v8.py")) + #t)))) + (build-system python-build-system) + (propagated-inputs + `(("python-requests" ,python-requests) + ("python-requests-toolbelt" ,python-requests-toolbelt-0.9.1) + ("python-pyparsing" ,python-pyparsing-2.4.7))) + (native-inputs + `(("python-pytest" ,python-pytest))) + (home-page "https://github.com/venomous/cloudscraper") + (synopsis "Cloudflare anti-bot bypass") + (description + "This module acts as a webbrowser solving Cloudflare's Javascript +challenges.") + (license license:expat)))