gnu: python-databricks-cli: Update to 0.14.1.
[jackhill/guix/guix.git] / gnu / packages / python-web.scm
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr>
3 ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Efraim Flashner <efraim@flashner.co.il>
4 ;;; Copyright © 2017 Christopher Baines <mail@cbaines.net>
5 ;;; Copyright © 2016, 2017 Danny Milosavljevic <dannym+a@scratchpost.org>
6 ;;; Copyright © 2013, 2014, 2015, 2016, 2020 Andreas Enge <andreas@enge.fr>
7 ;;; Copyright © 2016, 2017, 2019, 2020 Marius Bakke <mbakke@fastmail.com>
8 ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus <rekado@elephly.net>
9 ;;; Copyright © 2017 Roel Janssen <roel@gnu.org>
10 ;;; Copyright © 2016, 2017, 2020 Julien Lepiller <julien@lepiller.eu>
11 ;;; Copyright © 2016, 2017 Nikita <nikita@n0.is>
12 ;;; Copyright © 2014, 2017 Eric Bavier <bavier@member.fsf.org>
13 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
14 ;;; Copyright © 2015 Cyril Roelandt <tipecaml@gmail.com>
15 ;;; Copyright © 2015, 2016, 2017, 2019 Leo Famulari <leo@famulari.name>
16 ;;; Copyright © 2016, 2019 Hartmut Goebel <h.goebel@crazy-compilers.com>
17 ;;; Copyright © 2016, 2017, 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
18 ;;; Copyright © 2015, 2017 Ben Woodcroft <donttrustben@gmail.com>
19 ;;; Copyright © 2015, 2016 Christopher Allan Webber <cwebber@dustycloud.org>
20 ;;; Copyright © 2017 Adriano Peluso <catonano@gmail.com>
21 ;;; Copyright © 2016 Dylan Jeffers <sapientech@sapientech@openmailbox.org>
22 ;;; Copyright © 2016 David Craven <david@craven.ch>
23 ;;; Copyright © 2017 Oleg Pykhalov <go.wigust@gmail.com>
24 ;;; Copyright © 2015, 2016 David Thompson <davet@gnu.org>
25 ;;; Copyright © 2017 Mark Meyer <mark@ofosos.org>
26 ;;; Copyright © 2018 Tomáš Čech <sleep_walker@gnu.org>
27 ;;; Copyright © 2018, 2019 Nicolas Goaziou <mail@nicolasgoaziou.fr>
28 ;;; Copyright © 2018 Mathieu Othacehe <m.othacehe@gmail.com>
29 ;;; Copyright © 2018, 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
30 ;;; Copyright © 2019 Vagrant Cascadian <vagrant@debian.org>
31 ;;; Copyright © 2019 Brendan Tildesley <mail@brendan.scot>
32 ;;; Copyright © 2019 Pierre Langlois <pierre.langlois@gmx.com>
33 ;;; Copyright © 2019, 2020 Tanguy Le Carrour <tanguy@bioneland.org>
34 ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
35 ;;; Copyright © 2020 Evan Straw <evan.straw99@gmail.com>
36 ;;; Copyright © 2020 Alexandros Theodotou <alex@zrythm.org>
37 ;;; Copyright © 2020 Holger Peters <holger.peters@posteo.de>
38 ;;; Copyright © 2020 Noisytoot <noisytoot@gmail.com>
39 ;;; Copyright © 2020 Edouard Klein <edk@beaver-labs.com>
40 ;;; Copyright © 2020 Vinicius Monego <monego@posteo.net>
41 ;;; Copyright © 2020 Konrad Hinsen <konrad.hinsen@fastmail.net>
42 ;;;
43 ;;; This file is part of GNU Guix.
44 ;;;
45 ;;; GNU Guix is free software; you can redistribute it and/or modify it
46 ;;; under the terms of the GNU General Public License as published by
47 ;;; the Free Software Foundation; either version 3 of the License, or (at
48 ;;; your option) any later version.
49 ;;;
50 ;;; GNU Guix is distributed in the hope that it will be useful, but
51 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
52 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
53 ;;; GNU General Public License for more details.
54 ;;;
55 ;;; You should have received a copy of the GNU General Public License
56 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
57
58 (define-module (gnu packages python-web)
59 #:use-module (guix packages)
60 #:use-module (guix download)
61 #:use-module (guix git-download)
62 #:use-module (guix build-system python)
63 #:use-module (guix utils)
64 #:use-module (gnu packages)
65 #:use-module (gnu packages base)
66 #:use-module (gnu packages check)
67 #:use-module (gnu packages compression)
68 #:use-module (gnu packages curl)
69 #:use-module (gnu packages databases)
70 #:use-module (gnu packages django)
71 #:use-module (gnu packages graphviz)
72 #:use-module (gnu packages groff)
73 #:use-module (gnu packages libevent)
74 #:use-module (gnu packages libffi)
75 #:use-module (gnu packages pkg-config)
76 #:use-module (gnu packages python)
77 #:use-module (gnu packages python-check)
78 #:use-module (gnu packages python-compression)
79 #:use-module (gnu packages python-crypto)
80 #:use-module (gnu packages python-science)
81 #:use-module (gnu packages python-xyz)
82 #:use-module (gnu packages serialization)
83 #:use-module (gnu packages sphinx)
84 #:use-module (gnu packages texinfo)
85 #:use-module (gnu packages tls)
86 #:use-module (gnu packages time)
87 #:use-module (gnu packages web)
88 #:use-module (gnu packages xml)
89 #:use-module ((guix licenses) #:prefix license:)
90 #:use-module (srfi srfi-1))
91
92 (define-public python-aiohttp
93 (package
94 (name "python-aiohttp")
95 (version "3.6.3")
96 (source
97 (origin
98 (method url-fetch)
99 (uri (pypi-uri "aiohttp" version))
100 (sha256
101 (base32 "0i9n7h8n06m2d8ryqyk4fv1si1m44ibq7blbfaxq46vx7jydg339"))
102 (patches (search-patches "python-aiohttp-3.6.2-no-warning-fail.patch"))))
103 (build-system python-build-system)
104 (arguments
105 '(#:phases
106 (modify-phases %standard-phases
107 (add-after 'unpack 'fix-tests
108 (lambda _
109 ;; disable brotli tests, because we’re not providing that optional library
110 (substitute* "tests/test_http_parser.py"
111 ((" async def test_feed_eof_no_err_brotli")
112 " @pytest.mark.xfail\n async def test_feed_eof_no_err_brotli"))
113 ;; make sure the timestamp of this file is > 1990, because a few
114 ;; tests like test_static_file_if_modified_since_past_date depend on it
115 (invoke "touch" "-d" "2020-01-01" "tests/data.unknown_mime_type")
116
117 ;; FIXME: These tests are failing due to deprecation warnings
118 ;; in Python 3.8. Remove this when updating to aiohttp >= 3.7.
119 ;; https://github.com/aio-libs/aiohttp/issues/4477
120 ;; https://github.com/aio-libs/aiohttp/issues/4525
121 (with-directory-excursion "tests"
122 (for-each delete-file '("test_client_session.py"
123 "test_multipart.py"
124 "test_web_middleware.py"
125 "test_web_protocol.py"
126 "test_web_urldispatcher.py")))
127 #t)))))
128 (propagated-inputs
129 `(("python-aiodns" ,python-aiodns)
130 ("python-async-timeout" ,python-async-timeout)
131 ("python-attrs" ,python-attrs)
132 ("python-chardet" ,python-chardet)
133 ("python-idna-ssl" ,python-idna-ssl)
134 ("python-multidict" ,python-multidict)
135 ("python-yarl" ,python-yarl)))
136 (native-inputs
137 `(("python-pytest-runner" ,python-pytest-runner)
138 ("python-pytest-xdit" ,python-pytest-xdist)
139 ("python-pytest-timeout" ,python-pytest-timeout)
140 ("python-pytest-forked" ,python-pytest-forked)
141 ("python-pytest-mock" ,python-pytest-mock)
142 ("gunicorn" ,gunicorn-bootstrap)
143 ("python-freezegun" ,python-freezegun)
144 ("python-async-generator" ,python-async-generator)))
145 (home-page "https://github.com/aio-libs/aiohttp/")
146 (synopsis "Async HTTP client/server framework (asyncio)")
147 (description "@code{aiohttp} is an asynchronous HTTP client/server
148 framework.
149
150 Its main features are:
151 @itemize
152 @item Supports both client and server side of HTTP protocol.
153 @item Supports both client and server Web-Sockets out-of-the-box without the
154 Callback Hell.
155 @item Web-server has middlewares and pluggable routing.
156 @end itemize")
157 (license license:asl2.0)))
158
159 (define-public python-aiohttp-socks
160 (package
161 (name "python-aiohttp-socks")
162 (version "0.2.2")
163 (source
164 (origin
165 (method url-fetch)
166 (uri (pypi-uri "aiohttp_socks" version))
167 (sha256
168 (base32
169 "0473702jk66xrgpm28wbdgpnak4v0dh2qmdjw7ky7hf3lwwqkggf"))))
170 (build-system python-build-system)
171 (propagated-inputs
172 `(("python-aiohttp" ,python-aiohttp)))
173 (home-page "https://github.com/romis2012/aiohttp-socks")
174 (synopsis "SOCKS proxy connector for aiohttp")
175 (description "This package provides a SOCKS proxy connector for
176 aiohttp. It supports SOCKS4(a) and SOCKS5.")
177 (license license:asl2.0)))
178
179 (define-public python-aiodns
180 (package
181 (name "python-aiodns")
182 (version "1.1.1")
183 (source
184 (origin
185 (method url-fetch)
186 (uri (pypi-uri "aiodns" version))
187 (sha256
188 (base32
189 "1snr5paql8dgvc676n8xq460wypjsb1xj53cf3px1s4wczf7lryq"))))
190 (build-system python-build-system)
191 (propagated-inputs
192 `(("python-pycares" ,python-pycares)))
193 (arguments
194 `(#:tests? #f)) ;tests require internet access
195 (home-page "https://github.com/saghul/aiodns")
196 (synopsis "Simple DNS resolver for asyncio")
197 (description "@code{aiodns} provides a simple way for doing
198 asynchronous DNS resolutions with a synchronous looking interface by
199 using @url{https://github.com/saghul/pycares,pycares}.")
200 (license license:expat)))
201
202 (define-public python-aiorpcx
203 (package
204 (name "python-aiorpcx")
205 (version "0.18.3")
206 (source
207 (origin
208 (method url-fetch)
209 (uri (pypi-uri "aiorpcX" version))
210 (sha256
211 (base32
212 "0k545hc7wl6sh1svydzbv6x7sx5pig2pqkl3yxs9riwmvzawx9xp"))))
213 (build-system python-build-system)
214 (propagated-inputs
215 `(("python-attrs" ,python-attrs)))
216 (home-page "https://github.com/kyuupichan/aiorpcX")
217 (synopsis "Generic asyncio RPC implementation")
218 (description
219 "The aiorpcX library is a generic asyncio implementation of RPC suitable
220 for an application that is a client, server or both.
221
222 The package includes a module with full coverage of JSON RPC versions 1.0 and
223 2.0, JSON RPC protocol auto-detection, and arbitrary message framing. It also
224 comes with a SOCKS proxy client.")
225 (license (list license:expat license:bsd-2))))
226
227 (define-public python-asgiref
228 (package
229 (name "python-asgiref")
230 (version "3.2.10")
231 (source (origin
232 (method url-fetch)
233 (uri (pypi-uri "asgiref" version))
234 (sha256
235 (base32
236 "06kg3hnnvh7qg0w9amkvk1hd6n6bs055r04b7if6ipa7w4g92lby"))))
237 (build-system python-build-system)
238 (arguments
239 '(#:phases (modify-phases %standard-phases
240 (replace 'check
241 (lambda _
242 (setenv "PYTHONPATH"
243 (string-append "./build/lib:"
244 (getenv "PYTHONPATH")))
245 (invoke "pytest" "-vv"))))))
246 (native-inputs
247 `(("python-pytest" ,python-pytest)
248 ("python-pytest-asyncio" ,python-pytest-asyncio)))
249 (home-page "https://github.com/django/asgiref/")
250 (synopsis "ASGI specs, helper code, and adapters")
251 (description
252 "ASGI is a standard for Python asynchronous web apps and servers to
253 communicate with each other, and positioned as an asynchronous successor to
254 WSGI. This package includes libraries for implementing ASGI servers.")
255 (license license:bsd-3)))
256
257 (define-public python-css-html-js-minify
258 (package
259 (name "python-css-html-js-minify")
260 (version "2.5.5")
261 (source (origin
262 (method url-fetch)
263 (uri (pypi-uri "css-html-js-minify" version ".zip"))
264 (sha256
265 (base32
266 "0v3l2dqdk2y4r6ax259gs4ij1zzm9yxg6491s6254vs9w3vi37sa"))))
267 (build-system python-build-system)
268 ;; XXX: The git repository has no tags, and the PyPI releases do not
269 ;; contain tests.
270 (arguments '(#:tests? #f))
271 (native-inputs `(("unzip" ,unzip)))
272 (home-page "https://github.com/juancarlospaco/css-html-js-minify")
273 (synopsis "CSS/HTML/JS minifier")
274 (description
275 "This package provides a single-file minifier for CSS, HTML, and JavaScript.")
276 ;; XXX: The README just says "GNU GPL and GNU LGPL and MIT". From
277 ;; <https://github.com/juancarlospaco/css-html-js-minify/issues/9> it
278 ;; looks like the user can choose a license.
279 (license (list license:gpl3+ license:lgpl3+ license:expat))))
280
281 (define-public python-aws-sam-translator
282 (package
283 (name "python-aws-sam-translator")
284 (version "1.30.1")
285 (source (origin
286 (method url-fetch)
287 (uri (pypi-uri "aws-sam-translator" version))
288 (sha256
289 (base32
290 "0d9ppd94x2kw404m49ajswmmxgdngbs4p5ajyrdvnlivfzqbv7dx"))))
291 (build-system python-build-system)
292 (arguments
293 `(;; XXX: Tests are not distributed with the PyPI archive, and would
294 ;; introduce a circular dependency on python-cfn-lint.
295 #:tests? #f
296 #:phases (modify-phases %standard-phases
297 (add-after 'unpack 'loosen-requirements
298 (lambda _
299 ;; The package needlessly specifies exact versions
300 ;; of dependencies, when it works fine with others.
301 (substitute* "requirements/base.txt"
302 (("(.*)(~=[0-9\\.]+)" all package version)
303 package))
304 #t)))))
305 (propagated-inputs
306 `(("python-boto3" ,python-boto3)
307 ("python-jsonschema" ,python-jsonschema)
308 ("python-six" ,python-six)))
309 (home-page "https://github.com/awslabs/serverless-application-model")
310 (synopsis "Transform AWS SAM templates into AWS CloudFormation templates")
311 (description
312 "AWS SAM Translator is a library that transform @dfn{Serverless Application
313 Model} (SAM) templates into AWS CloudFormation templates.")
314 (license license:asl2.0)))
315
316 (define-public python-aws-xray-sdk
317 (package
318 (name "python-aws-xray-sdk")
319 (version "2.6.0")
320 (home-page "https://github.com/aws/aws-xray-sdk-python")
321 (source (origin
322 (method git-fetch)
323 (uri (git-reference (url home-page) (commit version)))
324 (file-name (git-file-name name version))
325 (sha256
326 (base32
327 "12fzr0ylpa1lx3xr1x2f1jx8iiyzcr6g57fb9jign0j0lxdlbzpv"))))
328 (build-system python-build-system)
329 (arguments
330 `(#:phases (modify-phases %standard-phases
331 (add-after 'unpack 'disable-tests
332 (lambda _
333 (for-each delete-file
334 '(;; These tests require packages not yet in Guix.
335 "tests/ext/aiobotocore/test_aiobotocore.py"
336 "tests/ext/aiohttp/test_middleware.py"
337 "tests/ext/pg8000/test_pg8000.py"
338 "tests/ext/psycopg2/test_psycopg2.py"
339 "tests/ext/pymysql/test_pymysql.py"
340 "tests/ext/pynamodb/test_pynamodb.py"
341 "tests/test_async_recorder.py"
342
343 ;; FIXME: Why is this failing?
344 "tests/test_patcher.py"
345
346 ;; TODO: How to configure Django for these tests.
347 "tests/ext/django/test_db.py"
348 "tests/ext/django/test_middleware.py"
349
350 ;; These tests want to access httpbin.org.
351 "tests/ext/requests/test_requests.py"
352 "tests/ext/httplib/test_httplib.py"
353 "tests/ext/aiohttp/test_client.py"))))
354 (replace 'check
355 (lambda _
356 (setenv "PYTHONPATH"
357 (string-append "./build/lib:.:"
358 (getenv "PYTHONPATH")))
359 (invoke "pytest" "-vv" "tests"))))))
360 (native-inputs
361 `(;; These are required for the test suite.
362 ("python-bottle" ,python-bottle)
363 ("python-flask" ,python-flask)
364 ("python-flask-sqlalchemy" ,python-flask-sqlalchemy)
365 ("python-pymysql" ,python-pymysql)
366 ("python-pytest" ,python-pytest)
367 ("python-pytest-aiohttp" ,python-pytest-aiohttp)
368 ("python-requests" ,python-requests)
369 ("python-sqlalchemy" ,python-sqlalchemy)
370 ("python-webtest" ,python-webtest)))
371 (propagated-inputs
372 `(("python-aiohttp" ,python-aiohttp)
373 ("python-botocore" ,python-botocore)
374 ("python-future" ,python-future)
375 ("python-jsonpickle" ,python-jsonpickle)
376 ("python-urllib3" ,python-urllib3)
377 ("python-wrapt" ,python-wrapt)))
378 (synopsis "Profile applications on AWS X-Ray")
379 (description
380 "The AWS X-Ray SDK for Python enables Python developers to record and
381 emit information from within their applications to the AWS X-Ray service.")
382 (license license:asl2.0)))
383
384 (define-public python-cfn-lint
385 (package
386 (name "python-cfn-lint")
387 (version "0.41.0")
388 (home-page "https://github.com/aws-cloudformation/cfn-python-lint")
389 (source (origin
390 (method git-fetch)
391 (uri (git-reference
392 (url home-page)
393 (commit (string-append "v" version))))
394 (file-name (git-file-name name version))
395 (sha256
396 (base32
397 "0nqs0fmj3hd7pnd9hkb4z57jvi2iv82hh6n3xxba6i6p8zgx75q4"))))
398 (build-system python-build-system)
399 (arguments
400 `(#:phases (modify-phases %standard-phases
401 (replace 'check
402 (lambda* (#:key outputs #:allow-other-keys)
403 (let ((out (assoc-ref outputs "out")))
404 ;; Remove test for the documentation update scripts
405 ;; to avoid a dependency on 'git'.
406 (delete-file
407 "test/unit/module/maintenance/test_update_documentation.py")
408 (setenv "PYTHONPATH"
409 (string-append "./build/lib:"
410 (getenv "PYTHONPATH")))
411 (setenv "PATH" (string-append out "/bin:"
412 (getenv "PATH")))
413 (invoke "python" "-m" "unittest" "discover"
414 "-s" "test")))))))
415 (native-inputs
416 `(("python-pydot" ,python-pydot)
417 ("python-mock" ,python-mock)))
418 (propagated-inputs
419 `(("python-aws-sam-translator" ,python-aws-sam-translator)
420 ("python-jsonpatch" ,python-jsonpatch)
421 ("python-jsonschema" ,python-jsonschema)
422 ("python-junit-xml" ,python-junit-xml)
423 ("python-networkx" ,python-networkx)
424 ("python-pyyaml" ,python-pyyaml)
425 ("python-six" ,python-six)))
426 (synopsis "Validate CloudFormation templates")
427 (description
428 "This package lets you validate CloudFormation YAML/JSON templates against
429 the CloudFormation spec and additional checks. Includes checking valid values
430 for resource properties and best practices.")
431 (license license:expat)))
432
433 (define-public python-falcon
434 (package
435 (name "python-falcon")
436 (version "2.0.0")
437 (source
438 (origin
439 (method url-fetch)
440 (uri (pypi-uri "falcon" version))
441 (sha256
442 (base32
443 "1z6mqfv574x6jiawf67ib52g4kk20c2x7xk7wrn1573b8v7r79gf"))
444 (modules '((guix build utils)))
445 (snippet
446 '(begin
447 (delete-file-recursively "falcon/vendor")
448 (substitute* "setup.py"
449 ((".*falcon\\.vendor\\.mimeparse.*") ""))
450 (substitute* '("falcon/media/handlers.py"
451 "falcon/request.py")
452 (("from falcon\\.vendor ") ""))
453 (substitute* "falcon.egg-info/SOURCES.txt"
454 (("falcon/vendor.*") ""))
455 #t))))
456 (build-system python-build-system)
457 (arguments
458 `(#:phases
459 (modify-phases %standard-phases
460 (replace 'check
461 (lambda* (#:key inputs outputs #:allow-other-keys)
462 ;; Skip orjson, which requires rust to build.
463 (substitute* "tests/test_media_handlers.py"
464 (("== 'CPython") "!= 'CPython"))
465 (add-installed-pythonpath inputs outputs)
466 (invoke "pytest" "--ignore" "falcon"))))))
467 (propagated-inputs
468 `(("python-mimeparse" ,python-mimeparse)))
469 (native-inputs
470 `(("python-cython" ,python-cython) ;for faster binaries
471 ("python-mujson" ,python-mujson)
472 ("python-msgpack" ,python-msgpack)
473 ("python-pytest" ,python-pytest)
474 ("python-pytest-runner" ,python-pytest-runner)
475 ("python-pyyaml" ,python-pyyaml)
476 ("python-rapidjson" ,python-rapidjson)
477 ("python-requests" ,python-requests)
478 ("python-testtools" ,python-testtools)
479 ("python-ujson" ,python-ujson)))
480 (home-page "https://falconframework.org")
481 (synopsis
482 "Web framework for building APIs and application backends")
483 (description
484 "Falcon is a web API framework for building microservices, application
485 backends and higher-level frameworks. Among its features are:
486 @itemize
487 @item Optimized and extensible code base
488 @item Routing via URI templates and REST-inspired resource
489 classes
490 @item Access to headers and bodies through request and response
491 classes
492 @item Request processing via middleware components and hooks
493 @item Idiomatic HTTP error responses
494 @item Straightforward exception handling
495 @item Unit testing support through WSGI helpers and mocks
496 @item Compatible with both CPython and PyPy
497 @item Cython support for better performance when used with CPython
498 @end itemize")
499 (properties `((python2-variant . ,(delay python2-falcon))))
500 (license license:asl2.0)))
501
502 (define-public python2-falcon
503 (let ((falcon (package-with-python2 (strip-python2-variant python-falcon))))
504 (package
505 (inherit falcon)
506 (native-inputs
507 (alist-delete "python-rapidjson" (package-native-inputs falcon))))))
508
509 (define-public python-falcon-cors
510 (package
511 (name "python-falcon-cors")
512 (version "1.1.7")
513 (source
514 (origin
515 (method url-fetch)
516 (uri (pypi-uri "falcon-cors" version))
517 (sha256
518 (base32
519 "12pym7hwsbd8b0c1azn95nas8gm3f1qpr6lpyx0958xm65ffr20p"))))
520 (build-system python-build-system)
521 (native-inputs
522 `(("python-falcon" ,python-falcon)))
523 (home-page
524 "https://github.com/lwcolton/falcon-cors")
525 (synopsis "Falcon @dfn{cross-origin resource sharing} (CORS) library")
526 (description "This middleware provides @dfn{cross-origin resource
527 sharing} (CORS) support for Falcon. It allows applying a specially crafted
528 CORS object to the incoming requests, enabling the ability to serve resources
529 over a different origin than that of the web application.")
530 (license license:asl2.0)))
531
532 (define-public python2-falcon-cors
533 (package-with-python2 python-falcon-cors))
534
535 (define-public python-furl
536 (package
537 (name "python-furl")
538 (version "2.0.0")
539 (source
540 (origin
541 (method url-fetch)
542 (uri (pypi-uri "furl" version))
543 (sha256
544 (base32
545 "1v2lakx03d5w8954a39ki44xv5mllnq0a0avhxykv9hrzg0yvjpx"))))
546 (build-system python-build-system)
547 (propagated-inputs
548 `(("python-six" ,python-six)
549 ("python-orderedmultidict" ,python-orderedmultidict)))
550 (native-inputs
551 `(("python-flake8" ,python-flake8)))
552 (home-page "https://github.com/gruns/furl")
553 (synopsis "URL manipulation in Python")
554 (description "Furl provides an easy-to-use alternative to the
555 @code{urllib} and @code{urlparse} modules for manipulating URLs.")
556 (license license:unlicense)))
557
558 (define-public python2-furl
559 (package-with-python2 python-furl))
560
561 (define-public python-httplib2
562 (package
563 (name "python-httplib2")
564 (version "0.9.2")
565 (source
566 (origin
567 (method url-fetch)
568 (uri (pypi-uri "httplib2" version))
569 (sha256
570 (base32
571 "126rsryvw9vhbf3qmsfw9lf4l4xm2srmgs439lgma4cpag4s3ay3"))))
572 (build-system python-build-system)
573 (home-page "https://github.com/jcgregorio/httplib2")
574 (synopsis "Comprehensive HTTP client library")
575 (description
576 "A comprehensive HTTP client library supporting many features left out of
577 other HTTP libraries.")
578 (license license:expat)))
579
580 (define-public python2-httplib2
581 (package-with-python2 python-httplib2))
582
583 (define-public httpie
584 (package
585 (name "httpie")
586 (version "2.3.0")
587 (source
588 (origin
589 (method url-fetch)
590 (uri (pypi-uri "httpie" version))
591 (sha256
592 (base32
593 "15ngl3yc186gkgqdx8iav9bpj8gxjpzz26y32z92jwyhj4cmfh6m"))))
594 (build-system python-build-system)
595 (arguments
596 ;; The tests attempt to access external web servers, so we cannot run them.
597 '(#:tests? #f))
598 (propagated-inputs
599 `(("python-colorama" ,python-colorama)
600 ("python-pygments" ,python-pygments)
601 ("python-requests" ,python-requests)
602 ("python-requests-toolbelt" ,python-requests-toolbelt-0.9.1)))
603 (home-page "https://httpie.io")
604 (synopsis "cURL-like tool for humans")
605 (description
606 "A command line HTTP client with an intuitive UI, JSON support,
607 syntax highlighting, wget-like downloads, plugins, and more. It consists of
608 a single http command designed for painless debugging and interaction with
609 HTTP servers, RESTful APIs, and web services.")
610 ;; This was fixed in 1.0.3.
611 (properties `((lint-hidden-cve . ("CVE-2019-10751"))))
612 (license license:bsd-3)))
613
614 (define-public python-html2text
615 (package
616 (name "python-html2text")
617 (version "2020.1.16")
618 (source
619 (origin
620 (method url-fetch)
621 (uri (pypi-uri "html2text" version))
622 (sha256
623 (base32
624 "1fvv4z6dblii2wk1x82981ag8yhxbim1v2ksgywxsndh2s7335p2"))))
625 (build-system python-build-system)
626 (arguments
627 '(#:phases
628 (modify-phases %standard-phases
629 (replace 'check
630 (lambda _
631 (invoke "pytest" "test/"))))))
632 (native-inputs
633 `(("python-pytest" ,python-pytest)))
634 (home-page "https://github.com/Alir3z4/html2text")
635 (synopsis "Convert HTML into plain text")
636 (description "html2text takes HTML and converts it into plain ASCII text
637 which is also valid markdown. html2text was originally written by Aaron
638 Swartz.")
639 (license license:gpl3+)))
640
641 (define-public python2-html2text
642 (let ((base (package-with-python2 python-html2text)))
643 (package
644 (inherit base)
645 ;; This is the last version with support for Python 2.
646 (version "2019.8.11")
647 (source (origin
648 (method url-fetch)
649 (uri (pypi-uri "html2text" version))
650 (sha256
651 (base32
652 "0ppgjplg06kmv9sj0x8p7acczcq2mcfgk1jdjwm4w5w40b0vj5pm")))))))
653
654 (define-public python-jose
655 (package
656 (name "python-jose")
657 (version "3.2.0")
658 (home-page "http://github.com/mpdavis/python-jose")
659 (source (origin
660 (method git-fetch)
661 (uri (git-reference (url home-page) (commit version)))
662 (file-name (git-file-name name version))
663 (sha256
664 (base32
665 "1xmnf8whzv2gnkkdv0fqcn9qwmcc7y647p4kw9fi3lvcp9kch8vi"))))
666 (build-system python-build-system)
667 (arguments
668 `(#:phases
669 (modify-phases %standard-phases
670 (replace 'check
671 (lambda* (#:key tests? #:allow-other-keys)
672 (if tests?
673 (invoke "pytest" "-vv")
674 (format #t "test suite not run~%"))
675 #t)))))
676 (native-inputs
677 `(;; All native inputs are for tests.
678 ("python-pyasn1" ,python-pyasn1)
679 ("python-pytest" ,python-pytest)
680 ("python-pytest-cov" ,python-pytest-cov)
681 ("python-pytest-runner" ,python-pytest-runner)))
682 (propagated-inputs
683 `(("python-cryptography" ,python-cryptography)
684 ("python-rsa" ,python-rsa)
685 ("python-six" ,python-six)))
686 (synopsis "JOSE implementation in Python")
687 (description
688 "The @dfn{JavaScript Object Signing and Encryption} (JOSE) technologies
689 - JSON Web Signature (JWS), JSON Web Encryption (JWE), JSON Web Key (JWK), and
690 JSON Web Algorithms (JWA) - collectively can be used to encrypt and/or sign
691 content using a variety of algorithms.")
692 (license license:expat)))
693
694 (define-public python-jsonpickle
695 (package
696 (name "python-jsonpickle")
697 (version "1.4.1")
698 (source (origin
699 (method url-fetch)
700 (uri (pypi-uri "jsonpickle" version))
701 (sha256
702 (base32
703 "1fn86z468hamw8njh2grw2xdhsm7g48dyxs3lw0n10nn1g6vgm78"))))
704 (build-system python-build-system)
705 (arguments
706 `(#:phases (modify-phases %standard-phases
707 (replace 'check
708 (lambda _
709 (setenv "PYTHONPATH"
710 (string-append "./build/lib:"
711 (getenv "PYTHONPATH")))
712 (invoke "pytest" "-vv"
713 ;; Prevent running the flake8 and black
714 ;; pytest plugins, which only tests style
715 ;; and frequently causes harmless failures.
716 "-o" "addopts=''"))))))
717 (native-inputs
718 `(("python-setuptools-scm" ,python-setuptools-scm)
719 ("python-toml" ,python-toml) ;XXX: for setuptools_scm[toml]
720 ;; For tests.
721 ("python-numpy" ,python-numpy)
722 ("python-pandas" ,python-pandas)
723 ("python-pytest" ,python-pytest)))
724 (home-page "https://jsonpickle.github.io/")
725 (synopsis "Serialize object graphs into JSON")
726 (description
727 "This package provides a Python library for serializing any arbitrary
728 object graph to and from JSON.")
729 (license license:bsd-3)))
730
731 (define-public python-mechanicalsoup
732 (package
733 (name "python-mechanicalsoup")
734 (version "0.11.0")
735 (source
736 (origin
737 (method url-fetch)
738 (uri (pypi-uri "MechanicalSoup" version))
739 (sha256
740 (base32 "0k59wwk75q7nz6i6gynvzhagy02ql0bv7py3qqcwgjw7607yq4i7"))))
741 (build-system python-build-system)
742 (arguments
743 ;; TODO: Enable tests when python-flake8@3.5 hits master.
744 `(#:tests? #f))
745 (propagated-inputs
746 `(("python-beautifulsoup4" ,python-beautifulsoup4)
747 ("python-lxml" ,python-lxml)
748 ("python-requests" ,python-requests)
749 ("python-six" ,python-six)))
750 ;; (native-inputs
751 ;; ;; For tests.
752 ;; `(("python-pytest-flake8" ,python-pytest-flake8)
753 ;; ("python-pytest-httpbin" ,python-pytest-httpbin)
754 ;; ("python-pytest-mock" ,python-pytest-mock)
755 ;; ("python-pytest-runner" ,python-pytest-runner)
756 ;; ("python-requests-mock" ,python-requests-mock)))
757 (home-page "https://mechanicalsoup.readthedocs.io/")
758 (synopsis "Python library for automating website interaction")
759 (description
760 "MechanicalSoup is a Python library for automating interaction with
761 websites. It automatically stores and sends cookies, follows redirects, and can
762 follow links and submit forms. It doesn’t do JavaScript.")
763 (license license:expat)))
764
765 (define-public python2-mechanicalsoup
766 (package-with-python2 python-mechanicalsoup))
767
768 (define-public python-hyperframe
769 (package
770 (name "python-hyperframe")
771 (version "5.2.0")
772 (source
773 (origin
774 (method url-fetch)
775 (uri (pypi-uri "hyperframe" version))
776 (sha256
777 (base32 "07xlf44l1cw0ghxx46sbmkgzil8vqv8kxwy42ywikiy35izw3xd9"))))
778 (build-system python-build-system)
779 (arguments
780 `(#:phases
781 (modify-phases %standard-phases
782 (replace 'check
783 (lambda* (#:key inputs outputs #:allow-other-keys)
784 (add-installed-pythonpath inputs outputs)
785 (invoke "pytest" "-vv" "test"))))))
786 (native-inputs
787 `(("python-pytest" ,python-pytest)))
788 (home-page "https://github.com/python-hyper/hyperframe")
789 (synopsis "HTTP/2 framing layer for Python")
790 (description
791 "This library contains the HTTP/2 framing code used in the hyper project.
792 It provides a pure-Python codebase that is capable of decoding a binary stream
793 into HTTP/2 frames.")
794 (license license:expat)))
795
796 (define-public python-hpack
797 (package
798 (name "python-hpack")
799 (version "3.0.0")
800 (source
801 (origin
802 ;; PyPI tarball is missing some files necessary for the tests.
803 (method git-fetch)
804 (uri (git-reference
805 (url "https://github.com/python-hyper/hpack")
806 (commit (string-append "v" version))))
807 (file-name (git-file-name name version))
808 (sha256
809 (base32 "0w8hkz50a6lzkmgi41ryicm0mh9ca9cx29pm3s0xlpn0vs29xrmd"))))
810 (build-system python-build-system)
811 (arguments
812 `(#:phases
813 (modify-phases %standard-phases
814 (replace 'check
815 (lambda* (#:key inputs outputs #:allow-other-keys)
816 (add-installed-pythonpath inputs outputs)
817 (invoke "pytest" "-vv" "test" "-k"
818 ;; This test will be fixed in the next version. See:
819 ;; https://github.com/python-hyper/hpack/issues/168.
820 "not test_get_by_index_out_of_range"))))))
821 (native-inputs
822 `(("python-pytest" ,python-pytest)))
823 (home-page "https://hyper.rtfd.org")
824 (synopsis "Pure-Python HPACK header compression")
825 (description
826 "This module contains a pure-Python HTTP/2 header encoding (HPACK) logic
827 for use in Python programs that implement HTTP/2.")
828 (license license:expat)))
829
830 (define-public python-h11
831 (package
832 (name "python-h11")
833 (version "0.9.0")
834 (source
835 (origin
836 (method url-fetch)
837 (uri (pypi-uri "h11" version))
838 (sha256
839 (base32 "1qfad70h59hya21vrzz8dqyyaiqhac0anl2dx3s3k80gpskvrm1k"))))
840 (build-system python-build-system)
841 (arguments
842 `(#:phases
843 (modify-phases %standard-phases
844 (replace 'check
845 (lambda _
846 (invoke "pytest" "-vv"))))))
847 (native-inputs
848 `(("python-pytest" ,python-pytest)))
849 (home-page "https://github.com/python-hyper/h11")
850 (synopsis "Pure-Python, bring-your-own-I/O implementation of HTTP/1.1")
851 (description
852 "This is a little HTTP/1.1 library written from scratch in Python, heavily
853 inspired by hyper-h2. It's a bring-your-own-I/O library; h11 contains no IO
854 code whatsoever. This means you can hook h11 up to your favorite network API,
855 and that could be anything you want.")
856 (license license:expat)))
857
858 (define-public python-h2
859 (package
860 (name "python-h2")
861 (version "3.2.0")
862 (source
863 (origin
864 (method url-fetch)
865 (uri (pypi-uri "h2" version))
866 (sha256
867 (base32 "051gg30aca26rdxsmr9svwqm06pdz9bv21ch4n0lgi7jsvml2pw7"))))
868 (build-system python-build-system)
869 (arguments
870 `(#:phases
871 (modify-phases %standard-phases
872 (replace 'check
873 (lambda* (#:key inputs outputs #:allow-other-keys)
874 (add-installed-pythonpath inputs outputs)
875 (invoke "pytest" "-vv" "test"))))))
876 (native-inputs
877 `(("python-pytest" ,python-pytest)))
878 (propagated-inputs
879 `(("python-hpack" ,python-hpack)
880 ("python-hyperframe" ,python-hyperframe)))
881 (home-page "https://github.com/python-hyper/hyper-h2")
882 (synopsis "HTTP/2 State-Machine based protocol implementation")
883 (description
884 "This module contains a pure-Python implementation of a HTTP/2 protocol
885 stack. It does not provide a parsing layer, a network layer, or any rules
886 about concurrency. Instead, it's a purely in-memory solution, defined in
887 terms of data actions and HTTP/2 frames. This is one building block of a full
888 Python HTTP implementation.")
889 (license license:expat)))
890
891 (define-public python-sockjs-tornado
892 (package
893 (name "python-sockjs-tornado")
894 (version "1.0.6")
895 (source
896 (origin
897 (method url-fetch)
898 (uri (pypi-uri "sockjs-tornado" version))
899 (sha256
900 (base32
901 "15dgv6hw6c7h3m310alw1h6p5443lrm9pyqhcv2smc13fz1v04pc"))))
902 (build-system python-build-system)
903 (arguments
904 `(;; There are no tests, and running the test phase requires missing
905 ;; dependencies
906 #:tests? #f))
907 (propagated-inputs
908 `(("python-tornado" ,python-tornado)))
909 (home-page "https://github.com/mrjoes/sockjs-tornado/")
910 (synopsis
911 "SockJS Python server implementation on top of the Tornado framework")
912 (description
913 "SockJS-tornado provides the server-side counterpart to a SockJS client
914 library, through the Tornado framework.
915
916 SockJS provides a low-latency, full-duplex, cross-domain communication channel
917 between a web browser and web server.")
918 (license license:expat)))
919
920 (define-public python2-sockjs-tornado
921 (package-with-python2 python-sockjs-tornado))
922
923 (define-public python-flask-babel
924 (package
925 (name "python-flask-babel")
926 (version "1.0.0")
927 (source
928 (origin
929 (method url-fetch)
930 (uri (pypi-uri "Flask-Babel" version))
931 (sha256
932 (base32
933 "0gmb165vkwv5v7dxsxa2i3zhafns0fh938m2zdcrv4d8z5l099yn"))))
934 (build-system python-build-system)
935 (arguments
936 '(#:phases (modify-phases %standard-phases
937 (replace 'check
938 (lambda _
939 (with-directory-excursion "tests"
940 (invoke "python" "tests.py")))))))
941 (propagated-inputs
942 `(("python-flask" ,python-flask)
943 ("python-babel" ,python-babel)
944 ("python-jinja2" ,python-jinja2)
945 ("python-pytz" ,python-pytz)))
946 (home-page "https://github.com/python-babel/flask-babel")
947 (synopsis "Add i18n/l10n support to Flask applications")
948 (description "This package implements internationalization and localization
949 support for Flask. This is based on the Python babel module as well as pytz -
950 both of which are installed automatically if you install this library.")
951 (license license:bsd-3)))
952
953 (define-public python2-flask-babel
954 (package-with-python2 python-flask-babel))
955
956 (define-public python-flask-cors
957 (package
958 (name "python-flask-cors")
959 (version "3.0.9")
960 (source (origin
961 (method url-fetch)
962 (uri (pypi-uri "Flask-Cors" version))
963 (sha256
964 (base32
965 "1f36hkaxc92zn12f88fkzwifdvlvsnmlp1dv3p5inpcc500c3kvb"))))
966 (build-system python-build-system)
967 (native-inputs
968 `(("python-flask" ,python-flask)
969 ("python-nose" ,python-nose)
970 ("python-packaging" ,python-packaging)))
971 (propagated-inputs
972 `(("python-six" ,python-six)))
973 (home-page "https://flask-cors.readthedocs.io/en/latest/")
974 (synopsis "Handle Cross-Origin Resource Sharing with Flask")
975 (description
976 "This package provides a Flask extension for handling @acronym{CORS,Cross
977 Origin Resource Sharing}, making cross-origin AJAX possible.")
978 (license license:expat)))
979
980 (define-public python-html5lib
981 (package
982 (name "python-html5lib")
983 (version "1.0.1")
984 (source
985 (origin
986 (method url-fetch)
987 (uri (pypi-uri "html5lib" version))
988 (sha256
989 (base32
990 "0dipzfrycv6j1jw82v9b7d8lzggx3x8xngx6l4xrqkxwvg7hvjv6"))))
991 (build-system python-build-system)
992 (propagated-inputs
993 `(("python-six" ,python-six)
994 ("python-webencodings" ,python-webencodings)))
995 (arguments
996 `(#:test-target "check"))
997 (home-page
998 "https://github.com/html5lib/html5lib-python")
999 (synopsis
1000 "Python HTML parser based on the WHATWG HTML specification")
1001 (description
1002 "Html5lib is an HTML parser based on the WHATWG HTML specification
1003 and written in Python.")
1004 (license license:expat)))
1005
1006 (define-public python2-html5lib
1007 (package-with-python2 python-html5lib))
1008
1009 ;; Needed for python-bleach, a dependency of python-notebook
1010 (define-public python-html5lib-0.9
1011 (package
1012 (inherit python-html5lib)
1013 (version "0.999")
1014 (source
1015 (origin
1016 (method url-fetch)
1017 (uri (pypi-uri "html5lib" version))
1018 (sha256
1019 (base32
1020 "17n4zfsj6ynmbwdwviywmj8r6nzr3xvfx2zs0xhndmvm51z7z263"))))))
1021
1022 (define-public python2-html5lib-0.9
1023 (package-with-python2 python-html5lib-0.9))
1024
1025 (define-public python-html5-parser
1026 (package
1027 (name "python-html5-parser")
1028 (version "0.4.9")
1029 (source (origin
1030 (method url-fetch)
1031 (uri (pypi-uri "html5-parser" version))
1032 (sha256
1033 (base32
1034 "13yl3vnf3sxl05m0nhpngnrz3g1jvyahd33lys3m3hfb91l8zzi5"))))
1035 (build-system python-build-system)
1036 (native-inputs
1037 `(("pkg-config" ,pkg-config)))
1038 (inputs
1039 `(("libxml2" ,libxml2)))
1040 (propagated-inputs
1041 `(("python-lxml" ,python-lxml)
1042 ("python-beautifulsoup4" ,python-beautifulsoup4)))
1043 (home-page "https://html5-parser.readthedocs.io")
1044 (synopsis "Fast C-based HTML5 parsing for Python")
1045 (description "This package provides a fast implementation of the HTML5
1046 parsing spec for Python. Parsing is done in C using a variant of the gumbo
1047 parser. The gumbo parse tree is then transformed into an lxml tree, also in
1048 C, yielding parse times that can be a thirtieth of the html5lib parse times.")
1049 ;; src/as-python-tree.[c|h] are licensed GPL3. The other files
1050 ;; indicate ASL2.0, including the LICENSE file for the whole project.
1051 (license (list license:asl2.0 license:gpl3))))
1052
1053 (define-public python2-html5-parser
1054 (package-with-python2 python-html5-parser))
1055
1056 (define-public python-minio
1057 (package
1058 (name "python-minio")
1059 (version "6.0.0")
1060 (source (origin
1061 (method url-fetch)
1062 (uri (pypi-uri "minio" version))
1063 (sha256
1064 (base32
1065 "1cxpa0m7mdvpdbc1g6wlihq6ja4g4paxkl6f3q84bbnx07zpbllp"))))
1066 (build-system python-build-system)
1067 (arguments
1068 '(#:phases (modify-phases %standard-phases
1069 (add-before 'check 'disable-failing-tests
1070 (lambda _
1071 ;; This test requires network access.
1072 (delete-file "tests/unit/credentials_test.py")
1073 #t)))))
1074 (native-inputs
1075 `(("python-faker" ,python-faker)
1076 ("python-mock" ,python-mock)
1077 ("python-nose" ,python-nose)))
1078 (propagated-inputs
1079 `(("python-certifi" ,python-certifi)
1080 ("python-configparser" ,python-configparser)
1081 ("python-dateutil" ,python-dateutil)
1082 ("python-pytz" ,python-pytz)
1083 ("python-urllib3" ,python-urllib3)))
1084 (home-page "https://github.com/minio/minio-py")
1085 (synopsis "Programmatically access Amazon S3 from Python")
1086 (description
1087 "This package provides a Python library for interacting with any
1088 Amazon S3 compatible object storage server.")
1089 (license license:asl2.0)))
1090
1091 (define-public python-pycurl
1092 (package
1093 (name "python-pycurl")
1094 (version "7.43.0.5")
1095 (source
1096 (origin
1097 (method url-fetch)
1098 (uri (string-append "https://dl.bintray.com/pycurl/pycurl/pycurl-"
1099 version ".tar.gz"))
1100 (sha256
1101 (base32 "1cwlb76vddqp2mxqvjbhf367caddzy82rhangddjjhjqaj8x4zgc"))))
1102 (build-system python-build-system)
1103 (arguments
1104 ;; The tests attempt to access external web servers, so we cannot run
1105 ;; them. Furthermore, they are skipped altogether when using Python 2.
1106 '(#:tests? #f
1107 #:phases (modify-phases %standard-phases
1108 (add-before 'build 'configure-tls-backend
1109 (lambda _
1110 ;; XXX: PycURL fails to automatically determine which TLS
1111 ;; backend to use when cURL is built with --disable-static.
1112 ;; See setup.py and <https://github.com/pycurl/pycurl/pull/147>.
1113 (setenv "PYCURL_SSL_LIBRARY" "gnutls")
1114 #t)))))
1115 (native-inputs
1116 `(("python-nose" ,python-nose)
1117 ("python-bottle" ,python-bottle)))
1118 (inputs
1119 `(("curl" ,curl)
1120 ("gnutls" ,gnutls)))
1121 (home-page "http://pycurl.io/")
1122 (synopsis "Lightweight Python wrapper around libcurl")
1123 (description "Pycurl is a lightweight wrapper around libcurl. It provides
1124 high-speed transfers via libcurl and frequently outperforms alternatives.")
1125
1126 ;; Per 'README.rst', this is dual-licensed: users can redistribute pycurl
1127 ;; under the terms of LGPLv2.1+ or Expat.
1128 (license (list license:lgpl2.1+ license:expat))))
1129
1130 (define-public python2-pycurl
1131 (package-with-python2 python-pycurl))
1132
1133 (define-public python-webencodings
1134 (package
1135 (name "python-webencodings")
1136 (version "0.5.1")
1137 (source (origin
1138 (method url-fetch)
1139 (uri (pypi-uri "webencodings" version))
1140 (sha256
1141 (base32
1142 "08qrgrc4hrximb2gqnl69g01s93rhf2842jfxdjljc1dbwj1qsmk"))))
1143 (build-system python-build-system)
1144 (arguments
1145 '(#:phases
1146 (modify-phases %standard-phases
1147 (replace 'check
1148 (lambda _
1149 (invoke "py.test" "-v" "webencodings/tests.py")
1150 #t)))))
1151 (native-inputs
1152 `(("python-pytest" ,python-pytest)))
1153 (home-page "https://github.com/SimonSapin/python-webencodings")
1154 (synopsis "Character encoding aliases for legacy web content")
1155 (description
1156 "In order to be compatible with legacy web content when interpreting
1157 something like @code{Content-Type: text/html; charset=latin1}, tools need
1158 to use a particular set of aliases for encoding labels as well as some
1159 overriding rules. For example, @code{US-ASCII} and @code{iso-8859-1} on
1160 the web are actually aliases for @code{windows-1252}, and a @code{UTF-8}
1161 or @code{UTF-16} BOM takes precedence over any other encoding declaration.
1162 The WHATWG @url{https://encoding.spec.whatwg.org/,Encoding} standard
1163 defines all such details so that implementations do not have to
1164 reverse-engineer each other.
1165
1166 This module implements the Encoding standard and has encoding labels and
1167 BOM detection, but the actual implementation for encoders and decoders
1168 is Python’s.")
1169 (license license:bsd-3)))
1170
1171 (define-public python2-webencodings
1172 (package-with-python2 python-webencodings))
1173
1174 (define-public python-openid
1175 (package
1176 (name "python-openid")
1177 (version "3.2.0")
1178 (source
1179 (origin
1180 (method url-fetch)
1181 (uri (pypi-uri "python3-openid" version))
1182 (sha256
1183 (base32
1184 "1bxf9a3ny1js422j962zfzl4a9dhj192pvai05whn7j0iy9gdyrk"))))
1185 (build-system python-build-system)
1186 (arguments
1187 `(#:phases
1188 (modify-phases %standard-phases
1189 (replace 'check
1190 (lambda _
1191 (invoke "coverage" "run" "-m"
1192 "unittest" "openid.test.test_suite"))))))
1193 (properties `((python2-variant . ,(delay python2-openid))))
1194 (propagated-inputs
1195 `(("python-defusedxml" ,python-defusedxml)))
1196 (native-inputs
1197 `(("python-coverage" ,python-coverage)
1198 ("python-psycopg2" ,python-psycopg2)
1199 ("python-django" ,python-django)))
1200 (home-page "https://github.com/necaris/python3-openid")
1201 (synopsis "OpenID support for servers and consumers")
1202 (description "This library provides OpenID authentication for Python, both
1203 for clients and servers.")
1204 (license license:asl2.0)))
1205
1206 (define-public python2-openid
1207 (package
1208 (name "python2-openid")
1209 (version "2.2.5")
1210 (source
1211 (origin
1212 (method url-fetch)
1213 (uri (pypi-uri "python-openid" version))
1214 (sha256
1215 (base32
1216 "1vvhxlghjan01snfdc4k7ykd80vkyjgizwgg9bncnin8rqz1ricj"))))
1217 (build-system python-build-system)
1218 (arguments
1219 ;; Python 3 support is in `python3-openid`, a separate package.
1220 `(#:python ,python-2
1221 ;; Tests aren't initialized correctly.
1222 #:tests? #f))
1223 (home-page "https://github.com/openid/python-openid")
1224 (synopsis "OpenID support for servers and consumers")
1225 (description "This library provides OpenID authentication for Python, both
1226 for clients and servers.")
1227 (license license:asl2.0)))
1228
1229 (define-public python-cssutils
1230 (package
1231 (name "python-cssutils")
1232 (version "1.0.2")
1233 (source
1234 (origin
1235 (method url-fetch)
1236 (uri (pypi-uri "cssutils" version))
1237 (sha256
1238 (base32
1239 "1bxchrbqzapwijap0yhlxdil1w9bmwvgx77aizlkhc2mcxjg1z52"))))
1240 (build-system python-build-system)
1241 (native-inputs
1242 `(("unzip" ,unzip))) ; for unpacking the source
1243 (arguments
1244 `(#:tests? #f)) ; tests require python-pbr < 1.7.0
1245 (home-page "http://cthedot.de/cssutils/")
1246 (synopsis
1247 "CSS Cascading Style Sheets library for Python")
1248 (description
1249 "Cssutils is a Python package for parsing and building CSS
1250 Cascading Style Sheets. Currently it provides a DOM only and no rendering
1251 options.")
1252 (license license:lgpl3+)))
1253
1254 (define-public python2-cssutils
1255 (package-with-python2 python-cssutils))
1256
1257 (define-public python-css-parser
1258 (package
1259 (inherit python-cssutils)
1260 (name "python-css-parser")
1261 (version "1.0.6")
1262 (source
1263 (origin
1264 (method url-fetch)
1265 (uri (pypi-uri "css-parser" version ".tar.gz"))
1266 (sha256
1267 (base32 "0bmg4kiiir6pj9x3sd12x4dz2c1xpp2bn5nn60fxnbk2lnl4im2f"))))
1268 (home-page "https://github.com/ebook-utils/css-parser")
1269 (synopsis "Fork of cssutils modified for parsing ebooks")
1270 (description
1271 "Css-parser is a Python package for parsing and building CSS
1272 Cascading Style Sheets. Currently it provides a DOM only and no rendering
1273 options.
1274
1275 It's a fork of cssutils 1.0.2, updated and modified for parsing ebooks, due to
1276 cssutils not receiving updates as of 1.0.2.")
1277 (license license:lgpl3+)))
1278
1279 (define-public python2-css-parser
1280 (package-with-python2 python-css-parser))
1281
1282 (define-public python-cssselect
1283 (package
1284 (name "python-cssselect")
1285 (version "1.1.0")
1286 (source (origin
1287 ;; The PyPI release does not contain tests.
1288 (method git-fetch)
1289 (uri (git-reference
1290 (url "https://github.com/scrapy/cssselect")
1291 (commit (string-append "v" version))))
1292 (file-name (git-file-name name version))
1293 (sha256
1294 (base32
1295 "0xslrnhbrmgakp4xg6k26qffay3kqffp3a2z2sk27c65rwxa79kc"))))
1296 (build-system python-build-system)
1297 (arguments
1298 `(#:phases (modify-phases %standard-phases
1299 (replace 'check
1300 (lambda _
1301 (invoke "pytest" "-vv"))))))
1302 (native-inputs
1303 `(("python-lxml" ,python-lxml)
1304 ("python-pytest" ,python-pytest)))
1305 (home-page "https://github.com/scrapy/cssselect")
1306 (synopsis "CSS3 selector parser and translator to XPath 1.0")
1307 (description
1308 "Cssselect ia a Python module that parses CSS3 Selectors and translates
1309 them to XPath 1.0 expressions. Such expressions can be used in lxml or
1310 another XPath engine to find the matching elements in an XML or HTML document.")
1311 (license license:bsd-3)))
1312
1313 (define-public python2-cssselect
1314 (package-with-python2 python-cssselect))
1315
1316 (define-public python-databricks-cli
1317 (package
1318 (name "python-databricks-cli")
1319 (version "0.14.1")
1320 (home-page "https://github.com/databricks/databricks-cli")
1321 (source (origin
1322 (method git-fetch)
1323 (uri (git-reference (url home-page) (commit version)))
1324 (file-name (git-file-name name version))
1325 (sha256
1326 (base32
1327 "03w19rzh72jll9phai23wp0c2mlv39qsrv50mhckziy39z60yxh8"))))
1328 (build-system python-build-system)
1329 (arguments
1330 `(#:phases (modify-phases %standard-phases
1331 (replace 'check
1332 (lambda _
1333 (setenv "PYTHONPATH"
1334 (string-append "./build/lib:"
1335 (getenv "PYTHONPATH")))
1336 (invoke "pytest" "tests" "-vv"
1337 ;; XXX: This fails with newer Pytest
1338 ;; (upstream uses Pytest 3..).
1339 "-k" "not test_get_request_with_list"))))))
1340 (native-inputs
1341 `(;; For tests.
1342 ("python-decorator" ,python-decorator)
1343 ("python-mock" ,python-mock)
1344 ("python-pytest" ,python-pytest)
1345 ("python-requests-mock" ,python-requests-mock)))
1346 (propagated-inputs
1347 `(("python-click" ,python-click)
1348 ("python-configparser" ,python-configparser)
1349 ("python-requests" ,python-requests)
1350 ("python-six" ,python-six)
1351 ("python-tabulate" ,python-tabulate)))
1352 (synopsis "Command line interface for Databricks")
1353 (description
1354 "The Databricks Command Line Interface is a tool which provides an easy
1355 to use interface to the Databricks platform. The CLI is built on top of the
1356 Databricks REST APIs.")
1357 (license license:asl2.0)))
1358
1359 (define-public python-openid-cla
1360 (package
1361 (name "python-openid-cla")
1362 (version "1.2")
1363 (source
1364 (origin
1365 (method url-fetch)
1366 (uri (pypi-uri "python-openid-cla" version))
1367 (sha256
1368 (base32
1369 "102hy2qisvjxp5s0v9lvwqi4f2dk0dhns40vjgn008yxc7k0h3cr"))))
1370 (build-system python-build-system)
1371 (arguments '(#:tests? #f)) ; No tests.
1372 (home-page "https://github.com/puiterwijk/python-openid-cla/")
1373 (synopsis "Implementation of the OpenID CLA extension for python-openid")
1374 (description "@code{openid-cla} is an implementation of the OpenID
1375 contributor license agreement extension for python-openid.")
1376 (license license:bsd-3)))
1377
1378 (define-public python2-openid-cla
1379 (package-with-python2 python-openid-cla))
1380
1381 (define-public python-openid-teams
1382 (package
1383 (name "python-openid-teams")
1384 (version "1.1")
1385 (source
1386 (origin
1387 (method url-fetch)
1388 (uri (pypi-uri "python-openid-teams" version))
1389 (sha256
1390 (base32
1391 "05zrh78alav24rxkbqlpbad6d3x2nljk6z6j7kflxf3vdqa7w969"))))
1392 (build-system python-build-system)
1393 (arguments '(#:tests? #f)) ; No tests.
1394 (home-page "https://github.com/puiterwijk/python-openid-teams/")
1395 (synopsis "Implementation of the OpenID teams extension for python-openid")
1396 (description
1397 "@code{openid-teams} is an implementation of the OpenID
1398 teams extension for python-openid.")
1399 (license license:bsd-3)))
1400
1401 (define-public python2-openid-teams
1402 (package-with-python2 python-openid-teams))
1403
1404 (define-public python-priority
1405 (package
1406 (name "python-priority")
1407 (version "1.3.0")
1408 (source
1409 (origin
1410 (method url-fetch)
1411 (uri (pypi-uri "priority" version))
1412 (sha256
1413 (base32 "1gpzn9k9zgks0iw5wdmad9b4dry8haiz2sbp6gycpjkzdld9dhbb"))))
1414 (build-system python-build-system)
1415 (arguments
1416 `(#:phases
1417 (modify-phases %standard-phases
1418 (replace 'check
1419 (lambda* (#:key inputs outputs #:allow-other-keys)
1420 (add-installed-pythonpath inputs outputs)
1421 (invoke "pytest" "-vv" "test" "-k"
1422 ;; This test exceeded the Hypothesis deadline.
1423 "not test_period_of_repetition"))))))
1424 (native-inputs
1425 `(("python-hypothesis" ,python-hypothesis)
1426 ("python-pytest" ,python-pytest)
1427 ("python-pytest-cov" ,python-pytest-cov)
1428 ("python-pytest-xdist" ,python-pytest-xdist)))
1429 (home-page "https://python-hyper.org/projects/priority/en/latest/")
1430 (synopsis "Pure-Python implementation of the HTTP/2 priority tree")
1431 (description
1432 "Priority is a pure-Python implementation of the priority logic for HTTP/2,
1433 set out in RFC 7540 Section 5.3 (Stream Priority).")
1434 (license license:expat)))
1435
1436 (define-public python-wsproto
1437 (package
1438 (name "python-wsproto")
1439 (version "0.15.0")
1440 (source
1441 (origin
1442 (method url-fetch)
1443 (uri (pypi-uri "wsproto" version))
1444 (sha256
1445 (base32 "17gsxlli4w8am1wwwl3k90hpdfa213ax40ycbbvb7hjx1v1rhiv1"))))
1446 (build-system python-build-system)
1447 (arguments
1448 `(#:phases
1449 (modify-phases %standard-phases
1450 (replace 'check
1451 (lambda* (#:key inputs outputs #:allow-other-keys)
1452 (add-installed-pythonpath inputs outputs)
1453 (invoke "pytest" "-vv" "test"))))))
1454 (native-inputs
1455 `(("python-pytest" ,python-pytest)))
1456 (propagated-inputs
1457 `(("python-h11" ,python-h11)))
1458 (home-page "https://github.com/python-hyper/wsproto/")
1459 (synopsis "WebSockets state-machine based protocol implementation")
1460 (description
1461 "@code{wsproto} is a pure-Python implementation of a WebSocket protocol
1462 stack. It's written from the ground up to be embeddable in whatever program you
1463 choose to use, ensuring that you can communicate via WebSockets, as defined in
1464 RFC6455, regardless of your programming paradigm.")
1465 (license license:expat)))
1466
1467 (define-public python-hypercorn
1468 (package
1469 (name "python-hypercorn")
1470 (version "0.10.2")
1471 (source
1472 (origin
1473 (method url-fetch)
1474 (uri (pypi-uri "Hypercorn" version))
1475 (sha256
1476 (base32 "15dgy47a18w2ls3hwykra1cyf7yzxmfjqnsqml482p12cxr2xwqr"))))
1477 (build-system python-build-system)
1478 (arguments
1479 `(#:phases
1480 (modify-phases %standard-phases
1481 (replace 'check
1482 (lambda* (#:key inputs outputs #:allow-other-keys)
1483 (add-installed-pythonpath inputs outputs)
1484 (invoke "pytest" "-vv"))))))
1485 (propagated-inputs
1486 `(("python-h11" ,python-h11)
1487 ("python-h2" ,python-h2)
1488 ("python-priority" ,python-priority)
1489 ("python-toml" ,python-toml)
1490 ("python-typing-extensions" ,python-typing-extensions)
1491 ("python-wsproto" ,python-wsproto)))
1492 (native-inputs
1493 `(("python-hypothesis" ,python-hypothesis)
1494 ("python-mock" ,python-mock)
1495 ("python-pytest" ,python-pytest)
1496 ("python-pytest-asyncio" ,python-pytest-asyncio)
1497 ("python-pytest-cov" ,python-pytest-cov)
1498 ("python-pytest-trio" ,python-pytest-trio)
1499 ("python-trio" ,python-trio)))
1500 (home-page "https://gitlab.com/pgjones/hypercorn/")
1501 (synopsis "ASGI Server based on Hyper libraries")
1502 (description
1503 "Hypercorn is an ASGI web server based on the sans-io hyper, h11, h2, and
1504 wsproto libraries and inspired by Gunicorn. It supports HTTP/1, HTTP/2,
1505 WebSockets (over HTTP/1 and HTTP/2), ASGI/2, and ASGI/3 specifications. It can
1506 utilise asyncio, uvloop, or trio worker types.")
1507 (license license:expat)))
1508
1509 (define-public python-querystring-parser
1510 (package
1511 (name "python-querystring-parser")
1512 (version "1.2.4")
1513 (source (origin
1514 (method url-fetch)
1515 (uri (pypi-uri "querystring_parser" version))
1516 (sha256
1517 (base32
1518 "0qlar8a0wa003hm2z6wcpb625r6vjj0a70rsni9h8lz0zwfcwkv4"))))
1519 (build-system python-build-system)
1520 (arguments
1521 `(#:phases (modify-phases %standard-phases
1522 (replace 'check
1523 (lambda _
1524 ;; XXX FIXME: This test is broken with Python 3.7:
1525 ;; https://github.com/bernii/querystring-parser/issues/35
1526 (substitute* "querystring_parser/tests.py"
1527 (("self\\.assertEqual\\(self\\.knownValuesNormalized, result\\)")
1528 "True"))
1529 (invoke "python" "querystring_parser/tests.py"))))))
1530 (propagated-inputs
1531 `(("python-six" ,python-six)))
1532 (home-page "https://github.com/bernii/querystring-parser")
1533 (synopsis "QueryString parser that correctly handles nested dictionaries")
1534 (description
1535 "This package provides a query string parser for Python and Django
1536 projects that correctly creates nested dictionaries from sent form/querystring
1537 data.")
1538 (license license:expat)))
1539
1540 (define-public python-tornado
1541 (package
1542 (name "python-tornado")
1543 (version "5.1.1")
1544 (source
1545 (origin
1546 (method url-fetch)
1547 (uri (pypi-uri "tornado" version))
1548 (sha256
1549 (base32
1550 "02clqk2116jbnq8lnaqmdw3p52nqrd9ib59r4xz2ll43fpcmhlaf"))))
1551 (build-system python-build-system)
1552 (arguments
1553 '(;; FIXME: Two tests error out with:
1554 ;; AssertionError: b'Error in atexit._run_exitfuncs:\nFileNotF[44 chars]ry\n' != b''
1555 ;; #:phases
1556 ;; (modify-phases %standard-phases
1557 ;; (replace 'check
1558 ;; (lambda _
1559 ;; ;; 'setup.py test' hits an AssertionError on BSD-specific
1560 ;; ;; "tornado/platform/kqueue.py". This is the supported method:
1561 ;; (invoke "python" "-m" "tornado.test.runtests")
1562 ;; #t)))
1563 #:tests? #f))
1564 (native-inputs
1565 `(("python-certifi" ,python-certifi)))
1566 (home-page "https://www.tornadoweb.org/")
1567 (synopsis "Python web framework and asynchronous networking library")
1568 (description
1569 "Tornado is a Python web framework and asynchronous networking library,
1570 originally developed at FriendFeed. By using non-blocking network I/O,
1571 Tornado can scale to tens of thousands of open connections, making it ideal
1572 for long polling, WebSockets, and other applications that require a long-lived
1573 connection to each user.")
1574 (license license:asl2.0)
1575 (properties `((python2-variant . ,(delay python2-tornado))))))
1576
1577 (define-public python-tornado-6
1578 (package
1579 (name "python-tornado")
1580 (version "6.0.4")
1581 (source
1582 (origin
1583 (method url-fetch)
1584 (uri (pypi-uri "tornado" version))
1585 (sha256
1586 (base32
1587 "1p5n7sw4580pkybywg93p8ddqdj9lhhy72rzswfa801vlidx9qhg"))))
1588 (build-system python-build-system)
1589 (arguments
1590 '(#:phases
1591 (modify-phases %standard-phases
1592 (replace 'check
1593 (lambda _
1594 (invoke "python" "-m" "tornado.test.runtests")
1595 #t)))))
1596 (native-inputs
1597 `(("python-certifi" ,python-certifi)))
1598 (home-page "https://www.tornadoweb.org/")
1599 (synopsis "Python web framework and asynchronous networking library")
1600 (description
1601 "Tornado is a Python web framework and asynchronous networking library,
1602 originally developed at FriendFeed. By using non-blocking network I/O,
1603 Tornado can scale to tens of thousands of open connections, making it ideal
1604 for long polling, WebSockets, and other applications that require a long-lived
1605 connection to each user.")
1606 (license license:asl2.0)))
1607
1608 (define-public python2-tornado
1609 (let ((tornado (package-with-python2 (strip-python2-variant python-tornado))))
1610 (package (inherit tornado)
1611 (propagated-inputs
1612 `(("python2-backport-ssl-match-hostname"
1613 ,python2-backport-ssl-match-hostname)
1614 ("python2-backports-abc" ,python2-backports-abc)
1615 ("python2-singledispatch" ,python2-singledispatch)
1616 ,@(package-propagated-inputs tornado))))))
1617
1618 (define-public python-tornado-http-auth
1619 (package
1620 (name "python-tornado-http-auth")
1621 (version "1.1.1")
1622 (source
1623 (origin
1624 (method url-fetch)
1625 (uri (pypi-uri "tornado-http-auth" version))
1626 (sha256
1627 (base32 "0hyc5f0a09i5yb99pk4bxpg6w9ichbrb5cv7hc9hff7rxd8w0v0x"))))
1628 (build-system python-build-system)
1629 (propagated-inputs
1630 `(("python-tornado" ,python-tornado)))
1631 (home-page "https://github.com/gvalkov/tornado-http-auth")
1632 (synopsis "Digest and basic authentication module for Tornado")
1633 (description
1634 "Provides support for adding authentication to services using the Tornado
1635 web framework, either via the basic or digest authentication schemes.")
1636 (license license:asl2.0)))
1637
1638 (define-public python-terminado
1639 (package
1640 (name "python-terminado")
1641 (version "0.8.1")
1642 (source
1643 (origin
1644 (method url-fetch)
1645 (uri (pypi-uri "terminado" version))
1646 (sha256
1647 (base32
1648 "0yh69k6579g848rmjyllb5h75pkvgcy27r1l3yzgkf33wnnzkasm"))))
1649 (build-system python-build-system)
1650 (propagated-inputs
1651 `(("python-tornado" ,python-tornado)
1652 ("python-ptyprocess" ,python-ptyprocess)))
1653 (native-inputs
1654 `(("python-nose" ,python-nose)))
1655 (arguments
1656 `(#:phases
1657 (modify-phases %standard-phases
1658 (replace 'check
1659 (lambda _ (invoke "nosetests") #t)))))
1660 (home-page "https://github.com/takluyver/terminado")
1661 (synopsis "Terminals served to term.js using Tornado websockets")
1662 (description "This package provides a Tornado websocket backend for the
1663 term.js Javascript terminal emulator library.")
1664 (license license:bsd-2)
1665 (properties `((python2-variant . ,(delay python2-terminado))))))
1666
1667 (define-public python2-terminado
1668 (let ((terminado (package-with-python2 (strip-python2-variant python-terminado))))
1669 (package (inherit terminado)
1670 (propagated-inputs
1671 `(("python2-backport-ssl-match-hostname"
1672 ,python2-backport-ssl-match-hostname)
1673 ("python2-futures" ,python2-futures)
1674 ,@(package-propagated-inputs terminado))))))
1675
1676 (define-public python-wsgi-intercept
1677 (package
1678 (name "python-wsgi-intercept")
1679 (version "1.2.2")
1680 (source (origin
1681 (method url-fetch)
1682 (uri (pypi-uri "wsgi_intercept" version))
1683 (sha256
1684 (base32
1685 "0kjj2v2dvmnpdd5h5gk9rzz0f54rhjb0yiz3zg65bmp65slfw65d"))))
1686 (build-system python-build-system)
1687 (propagated-inputs
1688 `(("python-six" ,python-six)))
1689 (native-inputs
1690 `(("python-pytest" ,python-pytest)
1691 ("python-httplib2" ,python-httplib2)
1692 ("python-requests" ,python-requests)
1693 ("python-urllib3" ,python-urllib3)))
1694 (synopsis "Puts a WSGI application in place of a real URI for testing")
1695 (description "Wsgi_intercept installs a WSGI application in place of a real
1696 URI for testing. Testing a WSGI application normally involves starting a
1697 server at a local host and port, then pointing your test code to that address.
1698 Instead, this library lets you intercept calls to any specific host/port
1699 combination and redirect them into a WSGI application importable by your test
1700 program. Thus, you can avoid spawning multiple processes or threads to test
1701 your Web app.")
1702 (home-page "https://github.com/cdent/wsgi-intercept")
1703 (license license:expat)))
1704
1705 (define-public python-webob
1706 (package
1707 (name "python-webob")
1708 (version "1.8.6")
1709 (source
1710 (origin
1711 (method url-fetch)
1712 (uri (pypi-uri "WebOb" version))
1713 (sha256
1714 (base32
1715 "026i3z99nr3px75isa9mbnky5i7rffiv4d124h5kxfjjsxz92fma"))))
1716 (build-system python-build-system)
1717 (native-inputs
1718 `(("python-nose" ,python-nose)))
1719 (home-page "https://webob.org/")
1720 (synopsis "WSGI request and response object")
1721 (description
1722 "WebOb provides wrappers around the WSGI request environment, and an
1723 object to help create WSGI responses.")
1724 (license license:expat)))
1725
1726 (define-public python2-webob
1727 (package-with-python2 python-webob))
1728
1729 (define-public python-zope-event
1730 (package
1731 (name "python-zope-event")
1732 (version "4.4")
1733 (source
1734 (origin
1735 (method url-fetch)
1736 (uri (pypi-uri "zope.event" version))
1737 (sha256
1738 (base32
1739 "1ksbc726av9xacml6jhcfyn828hlhb9xlddpx6fcvnlvmpmpvhk9"))))
1740 (build-system python-build-system)
1741 (home-page "https://pypi.org/project/zope.event/")
1742 (synopsis "Event publishing system for Python")
1743 (description "Zope.event provides an event publishing API, intended for
1744 use by applications which are unaware of any subscribers to their events. It
1745 is a simple event-dispatching system on which more sophisticated event
1746 dispatching systems can be built.")
1747 (license license:zpl2.1)))
1748
1749 (define-public python2-zope-event
1750 (package-with-python2 python-zope-event))
1751
1752 (define-public python-zope-interface
1753 (package
1754 (name "python-zope-interface")
1755 (version "5.1.0")
1756 (source
1757 (origin
1758 (method url-fetch)
1759 (uri (pypi-uri "zope.interface" version))
1760 (sha256
1761 (base32
1762 "03nrl6b8cb600dnnh46y149awvrm0gxyqgwq5hdw3lvys8mw9r20"))))
1763 (build-system python-build-system)
1764 (arguments '(#:tests? #f)) ; test suite can't find python-zope-testing
1765 (native-inputs
1766 `(("python-coverage" ,python-coverage)
1767 ("python-nose" ,python-nose)
1768 ("python-zope-event" ,python-zope-event)
1769 ("python-zope-testing" ,python-zope-testing)))
1770 (home-page "https://github.com/zopefoundation/zope.interface")
1771 (synopsis "Python implementation of the \"design by contract\"
1772 methodology")
1773 (description "Zope.interface provides an implementation of \"object
1774 interfaces\" for Python. Interfaces are a mechanism for labeling objects as
1775 conforming to a given API or contract.")
1776 (license license:zpl2.1)))
1777
1778 (define-public python2-zope-interface
1779 (package-with-python2 python-zope-interface))
1780
1781 (define-public python-zope-exceptions
1782 (package
1783 (name "python-zope-exceptions")
1784 (version "4.4")
1785 (source
1786 (origin
1787 (method url-fetch)
1788 (uri (pypi-uri "zope.exceptions" version))
1789 (sha256
1790 (base32
1791 "1nkgfwawswmyc6i0b8g3ymvja4mb507m8yhid8s4rbxq3dmqhwhd"))))
1792 (build-system python-build-system)
1793 (arguments
1794 '(#:phases
1795 (modify-phases %standard-phases
1796 (replace 'check
1797 (lambda _
1798 (invoke "zope-testrunner" "--test-path=src"))))))
1799 (native-inputs
1800 `(("python-zope-testrunner" ,python-zope-testrunner-bootstrap)))
1801 (propagated-inputs
1802 `(("python-zope-interface" ,python-zope-interface)))
1803 (home-page "https://pypi.org/project/zope.exceptions/")
1804 (synopsis "Zope exceptions")
1805 (description "Zope.exceptions provides general-purpose exception types
1806 that have uses outside of the Zope framework.")
1807 (license license:zpl2.1)))
1808
1809 (define-public python-zope-exceptions-bootstrap
1810 (package
1811 (inherit python-zope-exceptions)
1812 (arguments `(#:tests? #f))
1813 (propagated-inputs `())
1814 (native-inputs `())
1815 (properties `((hidden? . #t)))))
1816
1817 (define-public python2-zope-exceptions
1818 (package-with-python2 python-zope-exceptions))
1819
1820 (define-public python-zope-testing
1821 (package
1822 (name "python-zope-testing")
1823 (version "4.7")
1824 (source
1825 (origin
1826 (method url-fetch)
1827 (uri (pypi-uri "zope.testing" version))
1828 (sha256
1829 (base32
1830 "1sh3c3i0m8n8fnhqiry0bk3rr356i56ry7calmn57s1pvv8yhsyn"))))
1831 (build-system python-build-system)
1832 (home-page "https://pypi.org/project/zope.testing/")
1833 (synopsis "Zope testing helpers")
1834 (description "Zope.testing provides a number of testing utilities for HTML
1835 forms, HTTP servers, regular expressions, and more.")
1836 (license license:zpl2.1)))
1837
1838 (define-public python2-zope-testing
1839 (package-with-python2 python-zope-testing))
1840
1841 (define-public python-zope-testrunner
1842 (package
1843 (name "python-zope-testrunner")
1844 (version "5.2")
1845 (source
1846 (origin
1847 (method url-fetch)
1848 (uri (pypi-uri "zope.testrunner" version))
1849 (sha256
1850 (base32
1851 "0jyyf1dcz156q95x2y7yw2v420q2xn3cff0c5aci7hmdmcbn0gc7"))))
1852 (build-system python-build-system)
1853 (arguments
1854 '(#:tests? #f)) ; FIXME: Tests can't find zope.interface.
1855 (native-inputs
1856 `(("python-zope-testing" ,python-zope-testing)))
1857 (propagated-inputs
1858 `(("python-six" ,python-six)
1859 ("python-zope-exceptions" ,python-zope-exceptions)
1860 ("python-zope-interface" ,python-zope-interface)))
1861 (home-page "https://pypi.org/project/zope.testrunner/")
1862 (synopsis "Zope testrunner script")
1863 (description "Zope.testrunner provides a script for running Python
1864 tests.")
1865 (license license:zpl2.1)))
1866
1867 (define-public python-zope-testrunner-bootstrap
1868 (package
1869 (inherit python-zope-testrunner)
1870 (arguments `(#:tests? #f))
1871 (propagated-inputs
1872 `(("python-six" ,python-six)
1873 ("python-zope-exceptions" ,python-zope-exceptions-bootstrap)))
1874 (properties `((hidden? . #t)))))
1875
1876 (define-public python2-zope-testrunner
1877 (package-with-python2 python-zope-testrunner))
1878
1879 (define-public python-zope-i18nmessageid
1880 (package
1881 (name "python-zope-i18nmessageid")
1882 (version "5.0.1")
1883 (source
1884 (origin
1885 (method url-fetch)
1886 (uri (pypi-uri "zope.i18nmessageid" version))
1887 (sha256
1888 (base32
1889 "0ndhn4w1qgwkfbwf9vm2bgq418z5g0wmfsgl0d9nz62cd0mi8d4m"))))
1890 (build-system python-build-system)
1891 (native-inputs
1892 `(("python-coverage" ,python-coverage)
1893 ("python-zope-testrunner" ,python-zope-testrunner)))
1894 (propagated-inputs
1895 `(("python-six" ,python-six)))
1896 (home-page "https://pypi.org/project/zope.i18nmessageid/")
1897 (synopsis "Message identifiers for internationalization")
1898 (description "Zope.i18nmessageid provides facilities for declaring
1899 internationalized messages within program source text.")
1900 (license license:zpl2.1)))
1901
1902 (define-public python2-zope-i18nmessageid
1903 (package-with-python2 python-zope-i18nmessageid))
1904
1905 (define-public python-zope-schema
1906 (package
1907 (name "python-zope-schema")
1908 (version "6.0.0")
1909 (source
1910 (origin
1911 (method url-fetch)
1912 (uri (pypi-uri "zope.schema" version))
1913 (sha256
1914 (base32
1915 "09jg47bxhfg1ahr1jxb5y0cbiszyk1j6fn1r1r7s6svjl3lbryr0"))))
1916 (build-system python-build-system)
1917 (arguments
1918 `(#:phases
1919 (modify-phases %standard-phases
1920 (replace 'check
1921 (lambda* (#:key inputs outputs tests? #:allow-other-keys)
1922 (add-installed-pythonpath inputs outputs)
1923 (if tests?
1924 (invoke "zope-testrunner" "--test-path=src")
1925 #t))))))
1926 (propagated-inputs
1927 `(("python-zope-event" ,python-zope-event)
1928 ("python-zope-interface" ,python-zope-interface)))
1929 (native-inputs
1930 `(("python-zope-i18nmessageid" ,python-zope-i18nmessageid)
1931 ("python-zope-testing" ,python-zope-testing)
1932 ("python-zope-testrunner" ,python-zope-testrunner)))
1933 (home-page "https://pypi.org/project/zope.schema/")
1934 (synopsis "Zope data schemas")
1935 (description "Zope.scheme provides extensions to zope.interface for
1936 defining data schemas.")
1937 (license license:zpl2.1)))
1938
1939 (define-public python2-zope-schema
1940 (package-with-python2 python-zope-schema))
1941
1942 (define-public python-zope-configuration
1943 (package
1944 (name "python-zope-configuration")
1945 (version "4.4.0")
1946 (source (origin
1947 (method url-fetch)
1948 (uri (pypi-uri "zope.configuration" version))
1949 (sha256
1950 (base32
1951 "0g6vrl7y27z9cj5xyrww9xlzk4npj55mgmlrcd9d2nj08jn2pw79"))))
1952 (build-system python-build-system)
1953 (native-inputs
1954 `(("python-manuel" ,python-manuel)
1955 ("python-zope-testing" ,python-zope-testing)
1956 ("python-zope-testrunner" ,python-zope-testrunner)))
1957 (propagated-inputs
1958 `(("python-zope-i18nmessageid" ,python-zope-i18nmessageid)
1959 ("python-zope-interface" ,python-zope-interface)
1960 ("python-zope-schema" ,python-zope-schema)))
1961 (home-page "https://pypi.org/project/zope.configuration/")
1962 (synopsis "Zope Configuration Markup Language")
1963 (description "Zope.configuration implements ZCML, the Zope Configuration
1964 Markup Language.")
1965 (license license:zpl2.1)))
1966
1967 (define-public python-zope-configuration-bootstrap
1968 (package
1969 (inherit python-zope-configuration)
1970 (arguments `(#:tests? #f))
1971 (native-inputs `())
1972 (properties `((hidden? . #t)))))
1973
1974 (define-public python2-zope-configuration
1975 (package-with-python2 python-zope-configuration))
1976
1977 (define-public python-zope-copy
1978 (package
1979 (name "python-zope-copy")
1980 (version "4.2")
1981 (source
1982 (origin
1983 (method url-fetch)
1984 (uri (pypi-uri "zope.copy" version))
1985 (sha256
1986 (base32
1987 "06m75434krl57n6p73c2qj55k5i3fixg887j8ss01ih6zw4rvfs7"))))
1988 (build-system python-build-system)
1989 (arguments
1990 '(#:phases
1991 (modify-phases %standard-phases
1992 (replace 'check
1993 (lambda _
1994 (invoke "zope-testrunner" "--test-path=src" "\\[]"))))))
1995 (propagated-inputs
1996 `(("python-zope-interface" ,python-zope-interface)))
1997 (native-inputs
1998 `(("python-zope-component" ,python-zope-component-bootstrap)
1999 ("python-zope-location" ,python-zope-location-bootstrap)
2000 ("python-zope-testing" ,python-zope-testing)
2001 ("python-zope-testrunner" ,python-zope-testrunner)))
2002 (home-page "https://github.com/zopefoundation/zope.copy")
2003 (synopsis "Pluggable object copying mechanism")
2004 (description
2005 "This package provides a pluggable mechanism for copying persistent objects.")
2006 (license license:zpl2.1)))
2007
2008 (define-public python-zope-proxy
2009 (package
2010 (name "python-zope-proxy")
2011 (version "4.3.5")
2012 (source
2013 (origin
2014 (method url-fetch)
2015 (uri (pypi-uri "zope.proxy" version))
2016 (sha256
2017 (base32
2018 "14h7nyfbl5vpfk0rbviy4ygdfx0yx5kncvg6jpbdb0dhwna0ssm6"))))
2019 (build-system python-build-system)
2020 (native-inputs
2021 `(("python-zope-security" ,python-zope-security-bootstrap)
2022 ("python-zope-testrunner" ,python-zope-testrunner)))
2023 (propagated-inputs
2024 `(("python-zope-interface" ,python-zope-interface)))
2025 (home-page "https://pypi.org/project/zope.proxy/")
2026 (synopsis "Generic, transparent proxies")
2027 (description "Zope.proxy provides generic, transparent proxies for Python.
2028 Proxies are special objects which serve as mostly-transparent wrappers around
2029 another object, intervening in the apparent behavior of the wrapped object
2030 only when necessary to apply the policy (e.g., access checking, location
2031 brokering, etc.) for which the proxy is responsible.")
2032 (license license:zpl2.1)))
2033
2034 (define-public python-zope-proxy-bootstrap
2035 (package
2036 (inherit python-zope-proxy)
2037 (arguments `(#:tests? #f))
2038 (native-inputs `())
2039 (properties `((hidden? . #t)))))
2040
2041 (define-public python2-zope-proxy
2042 (package-with-python2 python-zope-proxy))
2043
2044 (define-public python-zope-hookable
2045 (package
2046 (name "python-zope-hookable")
2047 (version "5.0.1")
2048 (source
2049 (origin
2050 (method url-fetch)
2051 (uri (pypi-uri "zope.hookable" version))
2052 (sha256
2053 (base32
2054 "0hc82lfr7bk53nvbxvjkibkarngyrzgfk2i6bg8wshl0ly0pdl19"))))
2055 (build-system python-build-system)
2056 (native-inputs
2057 `(("python-coverage" ,python-coverage)
2058 ("python-zope-testing" ,python-zope-testing)))
2059 (home-page "https://github.com/zopefoundation/zope.hookable")
2060 (synopsis "Zope hookable")
2061 (description "This package supports the efficient creation of hookable
2062 objects, which are callable objects that are meant to be optionally replaced.
2063 The idea is that you create a function that does some default thing and make i
2064 hookable. Later, someone can modify what it does by calling its sethook method
2065 and changing its implementation. All users of the function, including those
2066 that imported it, will see the change.")
2067 (license license:zpl2.1)))
2068
2069 (define-public python-zope-location
2070 (package
2071 (name "python-zope-location")
2072 (version "4.2")
2073 (source
2074 (origin
2075 (method url-fetch)
2076 (uri (pypi-uri "zope.location" version))
2077 (sha256
2078 (base32
2079 "1b40pzl8v00d583d3gsxv1qjdw2dhghlgkbgxl3m07d5r3izj857"))))
2080 (build-system python-build-system)
2081 (arguments
2082 '(#:tests? #f)) ; FIXME: Tests can't find zope.interface.
2083 (native-inputs
2084 `(("python-zope-testrunner" ,python-zope-testrunner)))
2085 (propagated-inputs
2086 `(("python-zope-interface" ,python-zope-interface)
2087 ("python-zope-proxy" ,python-zope-proxy)
2088 ("python-zope-schema" ,python-zope-schema)))
2089 (home-page "https://pypi.org/project/zope.location/")
2090 (synopsis "Zope location library")
2091 (description "Zope.location implements the concept of \"locations\" in
2092 Zope3, which are are special objects that have a structural location.")
2093 (license license:zpl2.1)))
2094
2095 (define-public python-zope-location-bootstrap
2096 (package
2097 (inherit python-zope-location)
2098 (arguments `(#:tests? #f))
2099 (native-inputs `())
2100 (properties `((hidden? . #t)))))
2101
2102 (define-public python2-zope-location
2103 (package-with-python2 python-zope-location))
2104
2105 (define-public python-zope-security
2106 (package
2107 (name "python-zope-security")
2108 (version "5.1.1")
2109 (source
2110 (origin
2111 (method url-fetch)
2112 (uri (pypi-uri "zope.security" version))
2113 (sha256
2114 (base32
2115 "11lfw67cigscfax9c5j63xcvz2qcj724zx5fcdqyc94am2glim0h"))))
2116 (build-system python-build-system)
2117 (propagated-inputs
2118 `(("python-zope-component" ,python-zope-component)
2119 ("python-zope-i18nmessageid" ,python-zope-i18nmessageid)
2120 ("python-zope-interface" ,python-zope-interface)
2121 ("python-zope-location" ,python-zope-location)
2122 ("python-zope-proxy" ,python-zope-proxy)
2123 ("python-zope-schema" ,python-zope-schema)))
2124 (native-inputs
2125 `(("python-btrees" ,python-btrees)
2126 ("python-zope-component" ,python-zope-component-bootstrap)
2127 ("python-zope-configuration" ,python-zope-configuration-bootstrap)
2128 ("python-zope-location" ,python-zope-location-bootstrap)
2129 ("python-zope-testing" ,python-zope-testing)
2130 ("python-zope-testrunner" ,python-zope-testrunner)))
2131 (home-page "https://pypi.org/project/zope.security/")
2132 (synopsis "Zope security framework")
2133 (description "Zope.security provides a generic mechanism to implement
2134 security policies on Python objects.")
2135 (license license:zpl2.1)))
2136
2137 (define-public python-zope-security-bootstrap
2138 (package
2139 (inherit python-zope-security)
2140 (arguments `(#:tests? #f))
2141 (propagated-inputs
2142 `(("python-zope-i18nmessageid" ,python-zope-i18nmessageid)
2143 ("python-zope-interface" ,python-zope-interface)
2144 ("python-zope-proxy" ,python-zope-proxy-bootstrap)
2145 ("python-zope-schema" ,python-zope-schema)))
2146 (native-inputs `())
2147 (properties `((hidden? . #t)))))
2148
2149 (define-public python2-zope-security
2150 (package-with-python2 python-zope-security))
2151
2152 (define-public python-zope-component
2153 (package
2154 (name "python-zope-component")
2155 (version "4.6.2")
2156 (source
2157 (origin
2158 (method url-fetch)
2159 (uri (pypi-uri "zope.component" version))
2160 (sha256
2161 (base32
2162 "14iwp95hh6q5dj4k9h1iw75cbp89bs27nany4dinyglb44c8jqli"))))
2163 (build-system python-build-system)
2164 (arguments
2165 '(#:phases
2166 (modify-phases %standard-phases
2167 (replace 'check
2168 (lambda* (#:key inputs outputs #:allow-other-keys)
2169 (add-installed-pythonpath inputs outputs)
2170 (invoke "python" "setup.py" "test"))))))
2171 (native-inputs
2172 `(("python-persistent" ,python-persistent)
2173 ("python-zope-configuration" ,python-zope-configuration-bootstrap)
2174 ("python-zope-i18nmessageid" ,python-zope-i18nmessageid)
2175 ("python-zope-location" ,python-zope-location-bootstrap)
2176 ("python-zope-proxy" ,python-zope-proxy-bootstrap)
2177 ("python-zope-security" ,python-zope-security-bootstrap)
2178 ("python-zope-testing" ,python-zope-testing)
2179 ("python-zope-testrunner" ,python-zope-testrunner)))
2180 (propagated-inputs
2181 `(("python-zope-deferredimport" ,python-zope-deferredimport)
2182 ("python-zope-deprecation" ,python-zope-deprecation)
2183 ("python-zope-event" ,python-zope-event)
2184 ("python-zope-hookable" ,python-zope-hookable)
2185 ("python-zope-interface" ,python-zope-interface)))
2186 (home-page "https://github.com/zopefoundation/zope.component")
2187 (synopsis "Zope Component Architecture")
2188 (description "Zope.component represents the core of the Zope Component
2189 Architecture. Together with the zope.interface package, it provides
2190 facilities for defining, registering and looking up components.")
2191 (license license:zpl2.1)))
2192
2193 (define-public python-zope-component-bootstrap
2194 (package
2195 (inherit python-zope-component)
2196 (arguments `(#:tests? #f))
2197 (native-inputs `())
2198 (properties `((hidden? . #t)))))
2199
2200 (define-public python2-zope-component
2201 (package-with-python2 python-zope-component))
2202
2203 (define-public python-zope-deferredimport
2204 (package
2205 (name "python-zope-deferredimport")
2206 (version "4.3.1")
2207 (source
2208 (origin
2209 (method url-fetch)
2210 (uri (pypi-uri "zope.deferredimport" version))
2211 (sha256
2212 (base32
2213 "1q89v54dwniiqypjbwywwdfjdr4kdkqlyqsgrpplgvsygdg39cjp"))))
2214 (build-system python-build-system)
2215 (propagated-inputs
2216 `(("python-zope-proxy" ,python-zope-proxy)))
2217 (native-inputs
2218 `(("python-zope-testrunner" ,python-zope-testrunner)))
2219 (home-page "https://github.com/zopefoundation/zope.deferredimport")
2220 (synopsis "Defer imports until used by code")
2221 (description
2222 "Often, especially for package modules, you want to import names for
2223 convenience, but not actually perform the imports until necessary. The
2224 @code{zope.deferredimport} package provided facilities for defining names in
2225 modules that will be imported from somewhere else when used. You can also cause
2226 deprecation warnings to be issued when a variable is used.")
2227 (license license:zpl2.1)))
2228
2229 (define-public python-ndg-httpsclient
2230 (package
2231 (name "python-ndg-httpsclient")
2232 (version "0.5.1")
2233 (source (origin
2234 (method url-fetch)
2235 (uri (pypi-uri "ndg_httpsclient" version))
2236 (sha256
2237 (base32
2238 "0412b7i1s4vj7lz9r72nmb28h9syd4q2x89bdirkkc3a6z8awbyp"))))
2239 (build-system python-build-system)
2240 (arguments
2241 '(;; The tests appear to require networking.
2242 #:tests? #f))
2243 (propagated-inputs
2244 `(("python-pyopenssl" ,python-pyopenssl)))
2245 (synopsis "HTTPS support for Python's httplib and urllib2")
2246 (description "This is a HTTPS client implementation for httplib and urllib2
2247 based on PyOpenSSL. PyOpenSSL provides a more fully-featured SSL implementation
2248 over the default provided with Python and, importantly, enables full
2249 verification of the SSL peer.")
2250 (home-page "https://github.com/cedadev/ndg_httpsclient/")
2251 (license license:bsd-3)))
2252
2253 ;; python2-openssl requires special care, so package-with-python2 is
2254 ;; insufficient.
2255 (define-public python2-ndg-httpsclient
2256 (package (inherit python-ndg-httpsclient)
2257 (name "python2-ndg-httpsclient")
2258 (arguments
2259 (substitute-keyword-arguments (package-arguments python-ndg-httpsclient)
2260 ((#:python _) python-2)))
2261 (propagated-inputs
2262 `(("python2-pyopenssl" ,python2-pyopenssl)))))
2263
2264 (define-public python-websocket-client
2265 (package
2266 (name "python-websocket-client")
2267 (version "0.54.0")
2268 (source
2269 (origin
2270 (method url-fetch)
2271 (uri (pypi-uri "websocket_client" version))
2272 (sha256
2273 (base32
2274 "0j88zmikaypf38lvpkf4aaxrjp9j07dmy5ghj7kli0fv3p4n45g5"))))
2275 (build-system python-build-system)
2276 (propagated-inputs
2277 `(("python-six" ,python-six)))
2278 (home-page "https://github.com/liris/websocket-client")
2279 (synopsis "WebSocket client for Python")
2280 (description "The Websocket-client module provides the low level APIs for
2281 WebSocket usage in Python programs.")
2282 (properties `((python2-variant . ,(delay python2-websocket-client))))
2283 (license license:lgpl2.1+)))
2284
2285 (define-public python2-websocket-client
2286 (let ((base (package-with-python2
2287 (strip-python2-variant python-websocket-client))))
2288 (package
2289 (inherit base)
2290 (native-inputs
2291 `(("python2-backport-ssl-match-hostname"
2292 ,python2-backport-ssl-match-hostname)
2293 ,@(package-native-inputs base))))))
2294
2295 (define-public python-purl
2296 (package
2297 (name "python-purl")
2298 (version "1.5")
2299 (source
2300 (origin
2301 (method url-fetch)
2302 (uri (pypi-uri "purl" version))
2303 (sha256
2304 (base32
2305 "15ibnz1xrh5msmn04j0nr00sz4n7jwx6cwd6zlx99kkz3vpin53m"))))
2306 (build-system python-build-system)
2307 (propagated-inputs `(("python-six" ,python-six)))
2308 (home-page
2309 "https://github.com/codeinthehole/purl")
2310 (synopsis
2311 "Python package for URL manipulation")
2312 (description
2313 "Purl is a Python package for handling URLs.")
2314 (license license:expat)))
2315
2316 (define-public python-apiron
2317 (package
2318 (name "python-apiron")
2319 (version "5.1.0")
2320 (source
2321 (origin
2322 (method url-fetch)
2323 (uri (pypi-uri "apiron" version))
2324 (sha256
2325 (base32 "1qwbqn47sf0aqznj1snbv37v8ijx476qqkjf5l9pac7xjkxsr8qk"))))
2326 (build-system python-build-system)
2327 (arguments
2328 `(#:phases
2329 (modify-phases %standard-phases
2330 (replace 'check
2331 (lambda* (#:key inputs outputs #:allow-other-keys)
2332 (add-installed-pythonpath inputs outputs)
2333 (invoke "pytest" "-vv" "--cov" "-k"
2334 ;; This test tries to connect to the internet.
2335 "not test_call"))))))
2336 (propagated-inputs
2337 `(("python-requests" ,python-requests)))
2338 (native-inputs
2339 `(("python-pytest" ,python-pytest)
2340 ("python-pytest-cov" ,python-pytest-cov)))
2341 (home-page "https://github.com/ithaka/apiron")
2342 (synopsis "Python wrapper for interacting with RESTful APIs")
2343 (description
2344 "@code{apiron} provides a declarative, structured configuration of
2345 services and endpoints with a unified interface for interacting with RESTful
2346 APIs.")
2347 (license license:expat)))
2348
2349 (define-public python-beren
2350 (package
2351 (name "python-beren")
2352 (version "0.7.0")
2353 (source
2354 (origin
2355 (method url-fetch)
2356 (uri (pypi-uri "beren" version))
2357 (sha256
2358 (base32 "1v3mdwfqsyza892zvs124ym9w1bkng1j56b7l4dwfjir3723xcgf"))))
2359 (build-system python-build-system)
2360 (arguments
2361 ;; The test tries to open a connection to a remote server.
2362 `(#:tests? #f))
2363 (propagated-inputs
2364 `(("python-apiron" ,python-apiron)))
2365 (home-page "https://github.com/teffalump/beren")
2366 (synopsis "REST client for Orthanc DICOM servers")
2367 (description
2368 "@code{beren} provides a REST client for Orthanc, a DICOM server.")
2369 (license license:gpl3+)))
2370
2371 (define-public python-requests
2372 (package
2373 (name "python-requests")
2374 (version "2.23.0")
2375 (source (origin
2376 (method url-fetch)
2377 (uri (pypi-uri "requests" version))
2378 (sha256
2379 (base32
2380 "1rhpg0jb08v0gd7f19jjiwlcdnxpmqi1fhvw7r4s9avddi4kvx5k"))))
2381 (build-system python-build-system)
2382 (propagated-inputs
2383 `(("python-certifi" ,python-certifi)
2384 ("python-chardet" ,python-chardet)
2385 ("python-idna" ,python-idna)
2386 ("python-urllib3" ,python-urllib3)))
2387 (arguments
2388 ;; FIXME: Some tests require network access.
2389 '(#:tests? #f))
2390 (home-page "http://python-requests.org/")
2391 (synopsis "Python HTTP library")
2392 (description
2393 "Requests is a Python HTTP client library. It aims to be easier to use
2394 than Python’s urllib2 library.")
2395 (license license:asl2.0)))
2396
2397 ;; Some software requires an older version of Requests, notably Docker/Docker
2398 ;; Compose.
2399 (define-public python-requests-2.20
2400 (package (inherit python-requests)
2401 (version "2.20.1")
2402 (source (origin
2403 (method url-fetch)
2404 (uri (pypi-uri "requests" version))
2405 (sha256
2406 (base32
2407 "0qzj6cgv3k9wyj7wlxgz7xq0cfg4jbbkfm24pp8dnhczwl31527a"))))
2408 (propagated-inputs
2409 `(("python-urllib3" ,python-urllib3-1.24)
2410 ("python-idna" ,python-idna-2.7)
2411 ,@(package-propagated-inputs python-requests)))))
2412
2413 (define-public python2-requests
2414 (package-with-python2 python-requests))
2415
2416 (define-public python-requests_ntlm
2417 (package
2418 (name "python-requests_ntlm")
2419 (version "1.1.0")
2420 (source
2421 (origin
2422 (method url-fetch)
2423 (uri (pypi-uri "requests_ntlm" version))
2424 (sha256
2425 (base32
2426 "0wgbqzaq9w7bas16b7brdb75f91bh3275fb459093bk1ihpck2ci"))))
2427 (build-system python-build-system)
2428 (propagated-inputs
2429 `(("python-cryptography" ,python-cryptography)
2430 ("python-ntlm-auth" ,python-ntlm-auth)
2431 ("python-requests" ,python-requests)))
2432 (home-page "https://github.com/requests/requests-ntlm")
2433 (synopsis
2434 "NTLM authentication support for Requests")
2435 (description
2436 "This package allows for HTTP NTLM authentication using the requests
2437 library.")
2438 (license license:isc)))
2439
2440 (define-public python-requests-mock
2441 (package
2442 (name "python-requests-mock")
2443 (version "1.8.0")
2444 (source
2445 (origin
2446 (method url-fetch)
2447 (uri (pypi-uri "requests-mock" version))
2448 (sha256
2449 (base32
2450 "09nj8fmyj7xz2mgwyvbw0fl9zybmx2d3qd2hf529vvjc9s24d3z6"))))
2451 (build-system python-build-system)
2452 (propagated-inputs
2453 `(("python-requests" ,python-requests)
2454 ("python-six" ,python-six)))
2455 (native-inputs
2456 `(("python-pbr" ,python-pbr)
2457 ("python-discover" ,python-discover)
2458 ("python-docutils" ,python-docutils)
2459 ("python-fixtures" ,python-fixtures)
2460 ("python-mock" ,python-mock)
2461 ("python-purl" ,python-purl)
2462 ("python-pytest" ,python-pytest)
2463 ("python-sphinx" ,python-sphinx)
2464 ("python-testrepository" ,python-testrepository)))
2465 (home-page "https://requests-mock.readthedocs.org/")
2466 (synopsis "Mock out responses from the requests package")
2467 (description
2468 "This module provides a building block to stub out the HTTP requests
2469 portions of your testing code.")
2470 (properties `((python2-variant . ,(delay python2-requests-mock))))
2471 (license license:asl2.0)))
2472
2473 (define-public python2-requests-mock
2474 (package (inherit (package-with-python2
2475 (strip-python2-variant python-requests-mock)))
2476 (arguments
2477 `(#:python ,python-2
2478 ;; FIXME: 'subunit.run discover: error: no such option: --list'
2479 #:tests? #f))))
2480
2481 (define-public python-requests-toolbelt
2482 (package
2483 (name "python-requests-toolbelt")
2484 (version "0.8.0")
2485 (source (origin
2486 (method url-fetch)
2487 (uri (pypi-uri "requests-toolbelt" version))
2488 (sha256
2489 (base32
2490 "1dc7l42i4080r8i4m9fj51jx367lqkai170vrv7wd93gdj9k39gn"))))
2491 (build-system python-build-system)
2492 (native-inputs
2493 `(("python-betamax" ,python-betamax)
2494 ("python-mock" ,python-mock)
2495 ("python-pytest" ,python-pytest)))
2496 (propagated-inputs
2497 `(("python-requests" ,python-requests)))
2498 (synopsis "Extensions to python-requests")
2499 (description "This is a toolbelt of useful classes and functions to be used
2500 with python-requests.")
2501 (home-page "https://github.com/sigmavirus24/requests-toolbelt")
2502 (license license:asl2.0)))
2503
2504 (define-public python2-requests-toolbelt
2505 (package-with-python2 python-requests-toolbelt))
2506
2507 (define-public python-requests-toolbelt-0.9.1
2508 (package
2509 (inherit python-requests-toolbelt)
2510 (version "0.9.1")
2511 (source (origin
2512 (method url-fetch)
2513 (uri (pypi-uri "requests-toolbelt" version))
2514 (sha256
2515 (base32
2516 "1h3gm88dcjbd7gm229a7x5qkkhnsqsjz0m0l2xyavm2ab3a8k04n"))))
2517 (arguments
2518 `(;; FIXME: Some tests require network access.
2519 #:tests? #f))))
2520
2521 (define-public python-requests-ftp
2522 (package
2523 (name "python-requests-ftp")
2524 (version "0.3.1")
2525 (source
2526 (origin
2527 (method url-fetch)
2528 (uri (pypi-uri "requests-ftp" version))
2529 (sha256
2530 (base32
2531 "0yh5v21v36dsjsgv4y9dx4mmz35741l5jf6pbq9w19d8rfsww13m"))))
2532 (build-system python-build-system)
2533 (propagated-inputs
2534 `(("python-requests" ,python-requests)))
2535 (home-page
2536 "https://github.com/Lukasa/requests-ftp")
2537 (synopsis "FTP Transport Adapter for Requests")
2538 (description
2539 "Requests-FTP is an implementation of a simple FTP transport
2540 adapter for use with the Requests library.")
2541 (license license:asl2.0)))
2542
2543 (define-public python-oauthlib
2544 (package
2545 (name "python-oauthlib")
2546 (version "3.1.0")
2547 (source (origin
2548 (method url-fetch)
2549 (uri (pypi-uri "oauthlib" version))
2550 (sha256
2551 (base32
2552 "12gqnabwck30gdlpwm6af3s28qm9p2yc7b1w8s4fk9ncbz1irr5y"))))
2553 (build-system python-build-system)
2554 (arguments
2555 `(#:phases (modify-phases %standard-phases
2556 (replace 'check
2557 (lambda _
2558 (invoke "pytest" "-vv"))))))
2559 (native-inputs
2560 `(("python-pytest" ,python-pytest)
2561 ("python-pytest-cov" ,python-pytest-cov)
2562 ("python-mock" ,python-mock)))
2563 (propagated-inputs
2564 `(("python-cryptography" ,python-cryptography)
2565 ("python-pyjwt" ,python-pyjwt)
2566 ("python-blinker" ,python-blinker)))
2567 (home-page "https://github.com/oauthlib/oauthlib")
2568 (synopsis "OAuth implementation for Python")
2569 (description
2570 "Oauthlib is a generic, spec-compliant, thorough implementation of the
2571 OAuth request-signing logic.")
2572 (license license:bsd-3)))
2573
2574 (define-public python2-oauthlib
2575 (package-with-python2 python-oauthlib))
2576
2577 (define-public python-rauth
2578 (package
2579 (name "python-rauth")
2580 (version "0.7.3")
2581 (source
2582 (origin
2583 (method url-fetch)
2584 (uri (pypi-uri "rauth" version))
2585 (sha256
2586 (base32
2587 "02kv8w8l98ky223avyq7vw7x1f2ya9chrm59r77ylq45qb0xnk2j"))))
2588 (build-system python-build-system)
2589 (arguments
2590 `(#:test-target "check"))
2591 (propagated-inputs
2592 `(("python-requests" ,python-requests)))
2593 (home-page "https://github.com/litl/rauth")
2594 (synopsis "Python library for OAuth 1.0/a, 2.0, and Ofly")
2595 (description
2596 "Rauth is a Python library for OAuth 1.0/a, 2.0, and Ofly. It also
2597 provides service wrappers for convenient connection initialization and
2598 authenticated session objects providing things like keep-alive.")
2599 (license license:expat)
2600 (properties `((python2-variant . ,(delay python2-rauth))))))
2601
2602 (define-public python2-rauth
2603 (let ((base (package-with-python2 (strip-python2-variant python-rauth))))
2604 (package
2605 (inherit base)
2606 (native-inputs `(("python2-unittest2" ,python2-unittest2)
2607 ,@(package-native-inputs base))))))
2608
2609 (define-public python-urllib3
2610 (package
2611 (name "python-urllib3")
2612 (version "1.25.9")
2613 (source
2614 (origin
2615 (method url-fetch)
2616 (uri (pypi-uri "urllib3" version))
2617 (sha256
2618 (base32
2619 "09rmjqm5syhhc8fx3v06h3yv6cqy0b1081jg8wm5grpwpr72j61h"))))
2620 (build-system python-build-system)
2621 (arguments `(#:tests? #f))
2622 (propagated-inputs
2623 `(;; These 5 inputs are used to build urrlib3[secure]
2624 ("python-certifi" ,python-certifi)
2625 ("python-cryptography" ,python-cryptography)
2626 ("python-idna" ,python-idna)
2627 ("python-ipaddress" ,python-ipaddress)
2628 ("python-pyopenssl" ,python-pyopenssl)
2629 ("python-pysocks" ,python-pysocks)))
2630 (home-page "https://urllib3.readthedocs.io/")
2631 (synopsis "HTTP library with thread-safe connection pooling")
2632 (description
2633 "Urllib3 supports features left out of urllib and urllib2 libraries. It
2634 can reuse the same socket connection for multiple requests, it can POST files,
2635 supports url redirection and retries, and also gzip and deflate decoding.")
2636 (license license:expat)))
2637
2638 ;; Some software requires an older version of urllib3, notably Docker.
2639 (define-public python-urllib3-1.24
2640 (package (inherit python-urllib3)
2641 (version "1.24.3")
2642 (source (origin
2643 (method url-fetch)
2644 (uri (pypi-uri "urllib3" version))
2645 (sha256
2646 (base32
2647 "1x0slqrv6kixkbcdnxbglvjliwhc1payavxjvk8fvbqjrnasd4r3"))))))
2648
2649
2650 (define-public python2-urllib3
2651 (package-with-python2 python-urllib3))
2652
2653 (define-public awscli
2654 (package
2655 ;; Note: updating awscli typically requires updating botocore as well.
2656 (name "awscli")
2657 (version "1.18.183")
2658 (source
2659 (origin
2660 (method url-fetch)
2661 (uri (pypi-uri name version))
2662 (sha256
2663 (base32
2664 "0n1pmdl33r1v8qnrcg08ihvri9zm4fvsp14605vwmlkxvs8nb7s5"))))
2665 (build-system python-build-system)
2666 (arguments
2667 ;; FIXME: The 'pypi' release does not contain tests.
2668 '(#:tests? #f
2669 #:phases
2670 (modify-phases %standard-phases
2671 (add-after 'unpack 'fix-reference-to-groff
2672 (lambda _
2673 (substitute* "awscli/help.py"
2674 (("if not self._exists_on_path\\('groff'\\):") "")
2675 (("raise ExecutableNotFoundError\\('groff'\\)") "")
2676 (("cmdline = \\['groff'")
2677 (string-append "cmdline = ['" (which "groff") "'")))
2678 #t)))))
2679 (propagated-inputs
2680 `(("python-colorama" ,python-colorama)
2681 ("python-botocore" ,python-botocore)
2682 ("python-s3transfer" ,python-s3transfer)
2683 ("python-docutils" ,python-docutils)
2684 ("python-pyyaml" ,python-pyyaml)
2685 ("python-rsa" ,python-rsa)))
2686 (native-inputs
2687 `(("groff" ,groff)))
2688 (home-page "https://aws.amazon.com/cli/")
2689 (synopsis "Command line client for AWS")
2690 (description "AWS CLI provides a unified command line interface to the
2691 Amazon Web Services (AWS) API.")
2692 (license license:asl2.0)))
2693
2694 (define-public python-wsgiproxy2
2695 (package
2696 (name "python-wsgiproxy2")
2697 (version "0.4.6")
2698 (source
2699 (origin
2700 (method url-fetch)
2701 (uri (pypi-uri "WSGIProxy2" version ".tar.gz"))
2702 (sha256
2703 (base32 "16jch5nic0hia28lps3c678s9s9mjdq8n87igxncjg0rpi5adqnf"))))
2704 (build-system python-build-system)
2705 (native-inputs
2706 `(("python-webtest" ,python-webtest)))
2707 (propagated-inputs
2708 `(("python-requests" ,python-requests)
2709 ("python-six" ,python-six)
2710 ("python-urllib3" ,python-urllib3)
2711 ("python-webob" ,python-webob)))
2712 (home-page "https://github.com/gawel/WSGIProxy2/")
2713 (synopsis "WSGI Proxy with various http client backends")
2714 (description "WSGI turns HTTP requests into WSGI function calls.
2715 WSGIProxy turns WSGI function calls into HTTP requests.
2716 It also includes code to sign requests and pass private data,
2717 and to spawn subprocesses to handle requests.")
2718 (license license:expat)))
2719
2720 (define-public python2-wsgiproxy2
2721 (package-with-python2 python-wsgiproxy2))
2722
2723 (define-public python-pastedeploy
2724 (package
2725 (name "python-pastedeploy")
2726 (version "2.1.1")
2727 (source
2728 (origin
2729 (method url-fetch)
2730 (uri (pypi-uri "PasteDeploy" version))
2731 (sha256
2732 (base32 "05s88qdjdwd9d9qs13fap7nqgxs7qs5qfzzjbrc5va13k2mxdskd"))))
2733 (build-system python-build-system)
2734 (arguments
2735 '(#:test-target "pytest"))
2736 (native-inputs
2737 `(("python-pytest" ,python-pytest)
2738 ("python-pytest-runner" ,python-pytest-runner)))
2739 (home-page "https://pylonsproject.org/")
2740 (synopsis
2741 "Load, configure, and compose WSGI applications and servers")
2742 (description
2743 "This tool provides code to load WSGI applications and servers from URIs;
2744 these URIs can refer to Python Eggs for INI-style configuration files. Paste
2745 Script provides commands to serve applications based on this configuration
2746 file.")
2747 (license license:expat)))
2748
2749 (define-public python2-pastedeploy
2750 (package-with-python2 python-pastedeploy))
2751
2752 (define-public python-webtest
2753 (package
2754 (name "python-webtest")
2755 (version "2.0.33")
2756 (source
2757 (origin
2758 (method url-fetch)
2759 (uri (pypi-uri "WebTest" version))
2760 (sha256
2761 (base32
2762 "1l3z0cwqslsf4rcrhi2gr8kdfh74wn2dw76376i4g9i38gz8wd21"))))
2763 (build-system python-build-system)
2764 (arguments
2765 ;; Tests require python-pyquery, which creates a circular dependency.
2766 `(#:tests? #f))
2767 (propagated-inputs
2768 `(("python-waitress" ,python-waitress)
2769 ("python-webob" ,python-webob)
2770 ("python-six" ,python-six)
2771 ("python-beautifulsoup4" ,python-beautifulsoup4)))
2772 (home-page "https://docs.pylonsproject.org/projects/webtest/")
2773 (synopsis "Helper to test WSGI applications")
2774 (description "Webtest allows you to test your Python web applications
2775 without starting an HTTP server. It supports anything that supports the
2776 minimum of WSGI.")
2777 (license license:expat)))
2778
2779 (define-public python2-webtest
2780 (package-with-python2 python-webtest))
2781
2782 (define-public python-flask
2783 (package
2784 (name "python-flask")
2785 (version "1.1.2")
2786 (source (origin
2787 (method url-fetch)
2788 (uri (pypi-uri "Flask" version))
2789 (sha256
2790 (base32
2791 "0q3h295izcil7lswkzfnyg3k5gq4hpmqmpl6i7s5m1n9szi1myjf"))))
2792 (build-system python-build-system)
2793 (arguments
2794 '(#:phases
2795 (modify-phases %standard-phases
2796 (replace 'check
2797 (lambda _
2798 (setenv "PYTHONPATH" (string-append "./build/lib:"
2799 (getenv "PYTHONPATH")))
2800 (invoke "pytest" "-vv" "tests"))))))
2801 (native-inputs
2802 `(("python-pytest" ,python-pytest)))
2803 (propagated-inputs
2804 `(("python-itsdangerous" ,python-itsdangerous)
2805 ("python-jinja2" ,python-jinja2)
2806 ("python-click" ,python-click)
2807 ("python-werkzeug" ,python-werkzeug)))
2808 (home-page "https://www.palletsprojects.com/p/flask/")
2809 (synopsis "Microframework based on Werkzeug, Jinja2 and good intentions")
2810 (description "Flask is a micro web framework based on the Werkzeug toolkit
2811 and Jinja2 template engine. It is called a micro framework because it does not
2812 presume or force a developer to use a particular tool or library.")
2813 (license license:bsd-3)))
2814
2815 (define-public python2-flask
2816 (package-with-python2 python-flask))
2817
2818 (define-public python-flask-wtf
2819 (package
2820 (name "python-flask-wtf")
2821 (version "0.14.3")
2822 (source
2823 (origin
2824 (method url-fetch)
2825 (uri (pypi-uri "Flask-WTF" version))
2826 (sha256
2827 (base32
2828 "086pvg2x69n0nczcq7frknfjd8am1zdy8qqpva1sanwb02hf65yl"))))
2829 (build-system python-build-system)
2830 (arguments
2831 '(#:phases
2832 (modify-phases %standard-phases
2833 (replace 'check
2834 (lambda _
2835 (setenv "PYTHONPATH" (string-append "./build/lib:"
2836 (getenv "PYTHONPATH")))
2837 (invoke "pytest" "-vv"))))))
2838 (propagated-inputs
2839 `(("python-flask-babel" ,python-flask-babel)
2840 ("python-babel" ,python-babel)
2841 ("python-wtforms" ,python-wtforms)))
2842 (native-inputs
2843 `(("python-pytest" ,python-pytest)))
2844 (home-page "https://github.com/lepture/flask-wtf")
2845 (synopsis "Simple integration of Flask and WTForms")
2846 (description "Flask-WTF integrates Flask and WTForms, including CSRF, file
2847 upload, and reCAPTCHA.")
2848 (license license:bsd-3)))
2849
2850 (define-public python2-flask-wtf
2851 (package-with-python2 python-flask-wtf))
2852
2853 (define-public python-flask-multistatic
2854 (package
2855 (name "python-flask-multistatic")
2856 (version "1.0")
2857 (source
2858 (origin
2859 (method url-fetch)
2860 (uri (pypi-uri "flask-multistatic" version))
2861 (sha256
2862 (base32
2863 "0p4v50rwv64wcd0zlq7rzl4waprwr4hj19s3cgf1isywa7jcisgm"))))
2864 (build-system python-build-system)
2865 (propagated-inputs
2866 `(("python-flask" ,python-flask)))
2867 (home-page "https://pagure.io/flask-multistatic")
2868 (synopsis "Flask plugin to allow overriding static files")
2869 (description "@code{flask-multistatic} is a flask plugin that adds support
2870 for overriding static files.")
2871 (license license:gpl3+)))
2872
2873 (define-public python2-flask-multistatic
2874 (package-with-python2 python-flask-multistatic))
2875
2876 (define-public python-cookies
2877 (package
2878 (name "python-cookies")
2879 (version "2.2.1")
2880 (source (origin
2881 (method url-fetch)
2882 (uri (pypi-uri "cookies" version))
2883 (sha256
2884 (base32
2885 "13pfndz8vbk4p2a44cfbjsypjarkrall71pgc97glk5fiiw9idnn"))))
2886 (build-system python-build-system)
2887 (arguments
2888 `(;; test are broken: https://gitlab.com/sashahart/cookies/issues/3
2889 #:tests? #f))
2890 (native-inputs
2891 `(("python-pytest" ,python-pytest)))
2892 (synopsis "HTTP cookie parser and renderer")
2893 (description "A RFC 6265-compliant HTTP cookie parser and renderer in
2894 Python.")
2895 (home-page "https://gitlab.com/sashahart/cookies")
2896 (license license:expat)))
2897
2898 (define-public python2-cookies
2899 (package-with-python2 python-cookies))
2900
2901 (define-public python-responses
2902 (package
2903 (name "python-responses")
2904 (version "0.10.6")
2905 (source (origin
2906 (method url-fetch)
2907 (uri (pypi-uri "responses" version))
2908 (sha256
2909 (base32
2910 "147pacwkkqy3qf3hr33fnl1xbzgw0zsm3qppvvy9qhq8h069qbah"))))
2911 (build-system python-build-system)
2912 (arguments
2913 `(;; Test suite is not distributed:
2914 ;; https://github.com/getsentry/responses/issues/38
2915 #:tests? #f))
2916 (native-inputs
2917 `(("python-mock" ,python-mock)))
2918 (propagated-inputs
2919 `(("python-requests" ,python-requests)
2920 ("python-cookies" ,python-cookies)
2921 ("python-six" ,python-six)))
2922 (home-page "https://github.com/getsentry/responses")
2923 (synopsis "Utility for mocking out the `requests` Python library")
2924 (description "A utility library for mocking out the `requests` Python
2925 library.")
2926 (license license:asl2.0)))
2927
2928 (define-public python2-responses
2929 (package-with-python2 python-responses))
2930
2931 (define-public python-grequests
2932 (package
2933 (name "python-grequests")
2934 (version "0.3.0")
2935 (source
2936 (origin
2937 (method url-fetch)
2938 (uri (pypi-uri "grequests" version))
2939 (sha256
2940 (base32
2941 "1j9icncllbkv7x5719b20mx670c6q1jrdx1sakskkarvx3pc8h8g"))))
2942 (build-system python-build-system)
2943 (propagated-inputs
2944 `(("python-gevent" ,python-gevent)
2945 ("python-requests" ,python-requests)))
2946 (native-inputs
2947 `(("python-nose" ,python-nose)
2948 ("python-zope.interface" ,python-zope-interface)
2949 ("python-zope.event" ,python-zope-event)))
2950 (home-page "https://github.com/kennethreitz/grequests")
2951 (synopsis "Python library for asynchronous HTTP requests")
2952 (description "GRequests is a Python library that allows you to use
2953 @code{Requests} with @code{Gevent} to make asynchronous HTTP Requests easily")
2954 (license license:bsd-2)))
2955
2956 (define-public python-geventhttpclient
2957 (package
2958 (name "python-geventhttpclient")
2959 (version "1.3.1")
2960 (source (origin
2961 (method url-fetch)
2962 (uri (pypi-uri "geventhttpclient" version))
2963 (sha256
2964 (base32
2965 "07d0q3wzmml75227r6y6mrl5a0zpf4v9gj0ni5rhbyzmaj4az1xx"))
2966 (modules '((guix build utils)))
2967 (snippet
2968 '(begin
2969 ;; Delete pre-compiled files.
2970 (for-each delete-file (find-files "src/geventhttpclient"
2971 ".*\\.pyc"))
2972 #t))))
2973 (build-system python-build-system)
2974 (arguments
2975 '(#:phases
2976 (modify-phases %standard-phases
2977 (add-after 'unpack 'delete-network-tests
2978 (lambda _
2979 (delete-file "src/geventhttpclient/tests/test_client.py")
2980 #t))
2981 (replace 'check
2982 (lambda* (#:key inputs outputs #:allow-other-keys)
2983 (add-installed-pythonpath inputs outputs)
2984 (invoke "py.test" "src/geventhttpclient/tests" "-v"
2985 ;; Append the test modules to sys.path to avoid
2986 ;; namespace conflict which breaks SSL tests.
2987 "--import-mode=append"
2988 ;; XXX: Disable test fails with Python 3.8:
2989 ;; https://github.com/gwik/geventhttpclient/issues/119
2990 "-k" (string-append "not test_cookielib_compatibility"))
2991 #t)))))
2992 (native-inputs
2993 `(("python-pytest" ,python-pytest)))
2994 (propagated-inputs
2995 `(("python-certifi" ,python-certifi)
2996 ("python-gevent" ,python-gevent)
2997 ("python-six" ,python-six)))
2998 (home-page "https://github.com/gwik/geventhttpclient")
2999 (synopsis "HTTP client library for gevent")
3000 (description "@code{python-geventhttpclient} is a high performance,
3001 concurrent HTTP client library for python using @code{gevent}.")
3002 (license license:expat)))
3003
3004 (define-public python2-geventhttpclient
3005 (package-with-python2 python-geventhttpclient))
3006
3007 (define-public python-requests-oauthlib
3008 (package
3009 (name "python-requests-oauthlib")
3010 (version "1.2.0")
3011 (source
3012 (origin
3013 (method url-fetch)
3014 (uri (pypi-uri "requests-oauthlib" version))
3015 (sha256
3016 (base32
3017 "0mrglgcvq7k48pf27s4gifdk0za8xmgpf55jy15yjj471qrk6rdx"))))
3018 (build-system python-build-system)
3019 (arguments
3020 `(#:phases
3021 (modify-phases %standard-phases
3022 ;; removes tests that require network access
3023 (add-before 'check 'pre-check
3024 (lambda _
3025 (delete-file "tests/test_core.py")
3026 #t)))))
3027 (native-inputs
3028 `(("python-pyjwt" ,python-pyjwt)
3029 ("python-requests-mock" ,python-requests-mock)
3030 ("python-mock" ,python-mock)))
3031 (propagated-inputs
3032 `(("python-oauthlib" ,python-oauthlib)
3033 ("python-requests" ,python-requests)))
3034 (home-page
3035 "https://github.com/requests/requests-oauthlib")
3036 (synopsis
3037 "OAuthlib authentication support for Requests")
3038 (description
3039 "Requests-OAuthlib uses the Python Requests and OAuthlib libraries to
3040 provide an easy-to-use Python interface for building OAuth1 and OAuth2 clients.")
3041 (license license:isc)))
3042
3043 (define-public python2-requests-oauthlib
3044 (package-with-python2 python-requests-oauthlib))
3045
3046 (define-public python-url
3047 (package
3048 (name "python-url")
3049 (version "0.2.0")
3050 (source (origin
3051 (method url-fetch)
3052 (uri (pypi-uri "url" version))
3053 (sha256
3054 (base32
3055 "0v879yadcz9qxfl41ak6wkga1kimp9cflla9ddz03hjjvgkqy5ki"))))
3056 (build-system python-build-system)
3057 (propagated-inputs
3058 `(("python-publicsuffix" ,python-publicsuffix)))
3059 (native-inputs
3060 `(("python-coverage" ,python-coverage)
3061 ("python-nose" ,python-nose)))
3062 (arguments
3063 `(#:tests? #f)) ; FIXME: tests fail with "ImportError: No module named 'tests'"
3064 (home-page "https://github.com/seomoz/url-py")
3065 (synopsis "URL Parsing")
3066 (description "Library for parsing urls.")
3067 (license license:expat)
3068 (properties `((python2-variant . ,(delay python2-url))))))
3069
3070 (define-public python2-url
3071 (let ((base (package-with-python2 (strip-python2-variant python-url))))
3072 (package (inherit base)
3073 (propagated-inputs
3074 `(("python2-publicsuffix" ,python2-publicsuffix))))))
3075
3076 (define-public python-cachecontrol
3077 (package
3078 (name "python-cachecontrol")
3079 (version "0.12.5")
3080 (source
3081 (origin
3082 (method git-fetch)
3083 ;; Pypi does not have tests.
3084 (uri (git-reference
3085 (url "https://github.com/ionrock/cachecontrol")
3086 (commit (string-append "v" version))))
3087 (file-name (git-file-name name version))
3088 (sha256
3089 (base32
3090 "03lgc65sl04n0cgzmmgg99bk83f9i6k8yrmcd4hpl46q1pymn0kz"))))
3091 (build-system python-build-system)
3092 (arguments
3093 ;; Versions > 0.11.6 depend on CherryPy for testing.
3094 ;; It's too much work to package CherryPy for now.
3095 `(#:tests? #f))
3096 (propagated-inputs
3097 `(("python-requests" ,python-requests)
3098 ("python-msgpack" ,python-msgpack)
3099 ("python-lockfile" ,python-lockfile)))
3100 (home-page "https://github.com/ionrock/cachecontrol")
3101 (synopsis "The httplib2 caching algorithms for use with requests")
3102 (description "CacheControl is a port of the caching algorithms in
3103 @code{httplib2} for use with @code{requests} session objects.")
3104 (license license:asl2.0)))
3105
3106 (define-public python2-cachecontrol
3107 (package-with-python2 python-cachecontrol))
3108
3109 (define-public python-cachecontrol-0.11
3110 (package
3111 (inherit python-cachecontrol)
3112 (name "python-cachecontrol")
3113 (version "0.11.7")
3114 (source
3115 (origin
3116 (method url-fetch)
3117 (uri (pypi-uri "CacheControl" version))
3118 (sha256
3119 (base32
3120 "07jsfhlbcwgqg6ayz8nznzaqg5rmxqblbzxz1qvg5wc44pcjjy4g"))))))
3121
3122 (define-public python-betamax
3123 (package
3124 (name "python-betamax")
3125 (version "0.8.1")
3126 (source
3127 (origin
3128 (method url-fetch)
3129 (uri (pypi-uri "betamax" version))
3130 (sha256
3131 (base32
3132 "1hki1c2vs7adq7zr56wi6i5bhrkia4s2ywpv2c98ibnczz709w2v"))))
3133 (build-system python-build-system)
3134 (arguments
3135 '(;; Many tests fail because they require networking.
3136 #:tests? #f))
3137 (propagated-inputs
3138 `(("python-requests" ,python-requests)))
3139 (home-page "https://github.com/sigmavirus24/betamax")
3140 (synopsis "Record HTTP interactions with python-requests")
3141 (description "Betamax will record your test suite's HTTP interactions and
3142 replay them during future tests. It is designed to work with python-requests.")
3143 (license license:expat)))
3144
3145 (define-public python2-betamax
3146 (package-with-python2 python-betamax))
3147
3148 (define-public python-betamax-matchers
3149 (package
3150 (name "python-betamax-matchers")
3151 (version "0.4.0")
3152 (source
3153 (origin
3154 (method url-fetch)
3155 (uri (pypi-uri "betamax-matchers" version))
3156 (sha256
3157 (base32
3158 "07qpwjyq2i2aqhz5iwghnj4pqr2ys5n45v1vmpcfx9r5mhwrsq43"))))
3159 (build-system python-build-system)
3160 (propagated-inputs
3161 `(("python-betamax" ,python-betamax)
3162 ("python-requests-toolbelt" ,python-requests-toolbelt)))
3163 (home-page "https://github.com/sigmavirus24/betamax_matchers")
3164 (synopsis "VCR imitation for python-requests")
3165 (description "@code{betamax-matchers} provides a set of Matchers for
3166 Betamax.")
3167 (license license:asl2.0)))
3168
3169 (define-public python2-betamax-matchers
3170 (package-with-python2 python-betamax-matchers))
3171
3172 (define-public python-s3transfer
3173 (package
3174 (name "python-s3transfer")
3175 (version "0.3.3")
3176 (source (origin
3177 (method url-fetch)
3178 (uri (pypi-uri "s3transfer" version))
3179 (sha256
3180 (base32
3181 "1nzp5kwmy9669334shcz9ipg89jgpdqhrmbkgdg18r7wmvi3f6lj"))))
3182 (build-system python-build-system)
3183 (arguments
3184 `(#:phases
3185 (modify-phases %standard-phases
3186 (add-after 'unpack 'patch
3187 (lambda _
3188 ;; There's a small issue with one test with Python 3.8, this
3189 ;; change has been suggested upstream:
3190 ;; https://github.com/boto/s3transfer/pull/164
3191 (substitute* "tests/unit/test_s3transfer.py"
3192 (("super\\(FailedDownloadParts, self\\)\\.submit\\(function\\)")
3193 "futures.Future()"))
3194 #t))
3195 (replace 'check
3196 (lambda _
3197 ;; Some of the 'integration' tests require network access or
3198 ;; login credentials.
3199 (invoke "nosetests" "--exclude=integration")
3200 #t)))))
3201 (native-inputs
3202 `(("python-docutils" ,python-docutils)
3203 ("python-mock" ,python-mock)
3204 ("python-nose" ,python-nose)))
3205 (propagated-inputs
3206 `(("python-botocore" ,python-botocore)
3207 ("python-urllib3" ,python-urllib3)))
3208 (synopsis "Amazon S3 Transfer Manager")
3209 (description "S3transfer is a Python library for managing Amazon S3
3210 transfers.")
3211 (home-page "https://github.com/boto/s3transfer")
3212 (license license:asl2.0)
3213 (properties `((python2-variant . ,(delay python2-s3transfer))))))
3214
3215 (define-public python2-s3transfer
3216 (let ((base (package-with-python2 (strip-python2-variant python-s3transfer))))
3217 (package
3218 (inherit base)
3219 (native-inputs
3220 `(("python2-futures" ,python2-futures)
3221 ,@(package-native-inputs base))))))
3222
3223 (define-public python-slimit
3224 (package
3225 (name "python-slimit")
3226 (version "0.8.1")
3227 (source
3228 (origin
3229 (method url-fetch)
3230 (uri (pypi-uri "slimit" version ".zip"))
3231 (sha256
3232 (base32
3233 "02vj2x728rs1127q2nc27frrqra4fczivnb7gch6n5lzi7pxqczl"))))
3234 (build-system python-build-system)
3235 (native-inputs
3236 `(("unzip" ,unzip)))
3237 (propagated-inputs
3238 `(("python-ply" ,python-ply)))
3239 (home-page "https://slimit.readthedocs.io/")
3240 (synopsis "JavaScript minifier, parser and lexer written in Python")
3241 (description
3242 "SlimIt is a JavaScript minifier written in Python. It compiles
3243 JavaScript into more compact code so that it downloads and runs faster.
3244 SlimIt also provides a library that includes a JavaScript parser, lexer,
3245 pretty printer and a tree visitor.")
3246 (license license:expat)))
3247
3248 (define-public python-flask-restful
3249 (package
3250 (name "python-flask-restful")
3251 (version "0.3.8")
3252 (source
3253 (origin
3254 (method url-fetch)
3255 (uri (pypi-uri "Flask-RESTful" version))
3256 (patches (search-patches "python-flask-restful-werkzeug-compat.patch"))
3257 (sha256
3258 (base32
3259 "05b9lzx5yc3wgml2bcq50lq35h66m8zpj6dc9advcb5z3acsbaay"))))
3260 (build-system python-build-system)
3261 (propagated-inputs
3262 `(("python-aniso8601" ,python-aniso8601)
3263 ("python-flask" ,python-flask)
3264 ("python-pycrypto" ,python-pycrypto)
3265 ("python-pytz" ,python-pytz)))
3266 (native-inputs
3267 `(;; Optional dependency of Flask. Tests need it.
3268 ("python-blinker" ,python-blinker)
3269 ("python-mock" ,python-mock) ; For tests
3270 ("python-nose" ,python-nose))) ;for tests
3271 (home-page
3272 "https://www.github.com/flask-restful/flask-restful/")
3273 (synopsis
3274 "Flask module for creating REST APIs")
3275 (description
3276 "This package contains a Flask module for creating REST APIs.")
3277 (license license:bsd-3)))
3278
3279 (define-public python-flask-basicauth
3280 (package
3281 (name "python-flask-basicauth")
3282 (version "0.2.0")
3283 (source
3284 (origin
3285 (method url-fetch)
3286 (uri (pypi-uri "Flask-BasicAuth" version))
3287 (sha256
3288 (base32
3289 "1zq1spkjr4sjdnalpp8wl242kdqyk6fhbnhr8hi4r4f0km4bspnz"))))
3290 (build-system python-build-system)
3291 (arguments
3292 `(#:phases (modify-phases %standard-phases
3293 (add-after 'unpack 'fix-imports
3294 (lambda _
3295 (substitute* '("docs/index.rst"
3296 "docs/conf.py"
3297 "flask_basicauth.py"
3298 "test_basicauth.py")
3299 (("flask\\.ext\\.basicauth")
3300 "flask_basicauth"))
3301 #t)))))
3302 (propagated-inputs
3303 `(("python-flask" ,python-flask)))
3304 (home-page "https://github.com/jpvanhal/flask-basicauth")
3305 (synopsis "HTTP basic access authentication for Flask")
3306 (description
3307 "This package provides HTTP basic access authentication for Flask.")
3308 (license license:bsd-3)))
3309
3310 (define-public python-flask-htpasswd
3311 (package
3312 (name "python-flask-htpasswd")
3313 (version "0.3.1")
3314 (source
3315 (origin
3316 (method url-fetch)
3317 (uri (pypi-uri "flask-htpasswd" version))
3318 (sha256
3319 (base32
3320 "14q1y1y9i9bhabdnwd25jqzc4ljli23smxfyyh8abxz1vq93pxra"))))
3321 (build-system python-build-system)
3322 (propagated-inputs
3323 `(("python-flask" ,python-flask)
3324 ("python-itsdangerous" ,python-itsdangerous)
3325 ("python-passlib" ,python-passlib)
3326 ("python-tox" ,python-tox)))
3327 (home-page "https://github.com/carsongee/flask-htpasswd")
3328 (synopsis "Basic authentication via htpasswd files in Flask applications")
3329 (description "This package provides Basic authentication via
3330 @file{htpasswd} files and access_token authentication in Flask
3331 applications.")
3332 (license license:bsd-3)))
3333
3334 (define-public python-flask-sqlalchemy
3335 (package
3336 (name "python-flask-sqlalchemy")
3337 (version "2.4.4")
3338 (source (origin
3339 (method url-fetch)
3340 (uri (pypi-uri "Flask-SQLAlchemy" version))
3341 (sha256
3342 (base32
3343 "1rgsj49gnx361hnb3vn6c1h17497qh22yc3r70l1r6w0mw71bixz"))))
3344 (build-system python-build-system)
3345 (propagated-inputs
3346 `(("python-flask" ,python-flask)
3347 ("python-sqlalchemy" ,python-sqlalchemy)))
3348 (home-page "https://github.com/mitsuhiko/flask-sqlalchemy")
3349 (synopsis "Module adding SQLAlchemy support to your Flask application")
3350 (description
3351 "This package adds SQLAlchemy support to your Flask application.")
3352 (license license:bsd-3)))
3353
3354 (define-public python-flask-restplus
3355 (package
3356 (name "python-flask-restplus")
3357 (version "0.9.2")
3358 (source
3359 (origin
3360 (method url-fetch)
3361 (uri (pypi-uri "flask-restplus" version))
3362 (sha256
3363 (base32
3364 "11his6ii5brpkhld0d5bwzjjw4q3vmplpd6fmgzjrvvklsbk0cf4"))))
3365 (build-system python-build-system)
3366 (arguments
3367 '(#:tests? #f)) ; FIXME: 35/882 tests failing.
3368 ;; #:phases
3369 ;; (modify-phases %standard-phases
3370 ;; (replace 'check
3371 ;; (lambda _
3372 ;; (invoke "nosetests")
3373 ;; #t)))))
3374 (propagated-inputs
3375 `(("python-aniso8601" ,python-aniso8601)
3376 ("python-flask" ,python-flask)
3377 ("python-jsonschema" ,python-jsonschema)
3378 ("python-pytz" ,python-pytz)
3379 ("python-six" ,python-six)))
3380 (native-inputs
3381 `(("python-tzlocal" ,python-tzlocal)
3382 ("python-blinker" ,python-blinker)
3383 ("python-nose" ,python-nose)
3384 ("python-rednose" ,python-rednose)))
3385 (home-page "https://github.com/noirbizarre/flask-restplus")
3386 (synopsis "Framework for documented API development with Flask")
3387 (description "This package provides a framework for API development with
3388 the Flask web framework in Python. It is similar to package
3389 @code{python-flask-restful} but supports the @code{python-swagger}
3390 documentation builder.")
3391 (license license:expat)))
3392
3393 (define-public python-flask-restful-swagger
3394 (package
3395 (name "python-flask-restful-swagger")
3396 (version "0.20.1")
3397 (source
3398 (origin
3399 (method url-fetch)
3400 (uri (pypi-uri "flask-restful-swagger" version))
3401 (sha256
3402 (base32
3403 "1p66f98b5zpypnnz56pxpbirchqj6aniw6qyrp8h572l0dn9xlvq"))))
3404 (build-system python-build-system)
3405 (arguments '(#:tests? #f)) ;no tests
3406 (propagated-inputs
3407 `(("python-flask-restful" ,python-flask-restful)))
3408 (home-page "https://github.com/rantav/flask-restful-swagger")
3409 (synopsis "Extract Swagger specs from Flask-Restful projects")
3410 (description "This package lets you extract Swagger API documentation
3411 specs from your Flask-Restful projects.")
3412 (license license:expat)))
3413
3414 (define-public python2-flask-restful-swagger
3415 (package-with-python2 python-flask-restful-swagger))
3416
3417 (define-public python-htmlmin
3418 (package
3419 (name "python-htmlmin")
3420 (version "0.1.12")
3421 (source
3422 (origin
3423 (method url-fetch)
3424 (uri (pypi-uri "htmlmin" version))
3425 (sha256
3426 (base32
3427 "0y51xhabw6x8jk8k93xl8vznshpz3jb6l28075r5sjip613fzhah"))))
3428 (arguments
3429 `(#:tests? #f)) ; no tests
3430 (build-system python-build-system)
3431 (home-page "https://htmlmin.readthedocs.org/en/latest/")
3432 (synopsis "HTML minifier")
3433 (description "@code{htmlmin} is an HTML minifier that just works.
3434 It comes with safe defaults and easily configurable options.")
3435 (license license:bsd-3)))
3436
3437 (define-public python2-htmlmin
3438 (package-with-python2 python-htmlmin))
3439
3440 (define-public python-flask-htmlmin
3441 (package
3442 (name "python-flask-htmlmin")
3443 (version "1.2")
3444 (source
3445 (origin
3446 (method url-fetch)
3447 (uri (pypi-uri "Flask-HTMLmin" version))
3448 (sha256
3449 (base32
3450 "1n6zlq72kakkw0z2jpq6nh74lfsmxybm4g053pwhc14fbr809348"))))
3451 (propagated-inputs
3452 `(("python-flask" ,python-flask)
3453 ("python-htmlmin" ,python-htmlmin)))
3454 (build-system python-build-system)
3455 (home-page "https://github.com/hamidfzm/Flask-HTMLmin")
3456 (synopsis "HTML response minifier for Flask")
3457 (description
3458 "Minify @code{text/html} MIME type responses when using @code{Flask}.")
3459 (license license:bsd-3)))
3460
3461 (define-public python2-flask-htmlmin
3462 (package-with-python2 python-flask-htmlmin))
3463
3464 (define-public python-jsmin
3465 (package
3466 (name "python-jsmin")
3467 (version "2.2.2")
3468 (source
3469 (origin
3470 (method url-fetch)
3471 (uri (pypi-uri "jsmin" version))
3472 (sha256
3473 (base32
3474 "0fsmqbjvpxvff0984x7c0y8xmf49ax9mncz48b9xjx8wrnr9kpxn"))))
3475 (build-system python-build-system)
3476 (home-page "https://github.com/tikitu/jsmin/")
3477 (synopsis "Python JavaScript minifier")
3478 (description
3479 "@code{jsmin} is a JavaScript minifier, usable from both Python code and
3480 on the command line.")
3481 (license license:expat)))
3482
3483 (define-public python-flask-login
3484 (package
3485 (name "python-flask-login")
3486 (version "0.5.0")
3487 (source
3488 (origin
3489 (method git-fetch)
3490 (uri (git-reference
3491 (url "https://github.com/maxcountryman/flask-login")
3492 (commit version)))
3493 (file-name (git-file-name name version))
3494 (sha256
3495 (base32 "11ac924w0y4m0kf3mxnxdlidy88jfa7njw5yyrq16dvnx4iwd8gg"))))
3496 (build-system python-build-system)
3497 (propagated-inputs
3498 `(("python-flask" ,python-flask)))
3499 (native-inputs
3500 ;; For tests.
3501 `(("python-blinker" ,python-blinker)
3502 ("python-coverage" ,python-coverage)
3503 ("python-mock" ,python-mock)
3504 ("python-pycodestyle" ,python-pycodestyle)
3505 ("python-pyflakes" ,python-pyflakes)
3506 ("python-pytest" ,python-pytest)
3507 ("python-semantic-version" ,python-semantic-version)
3508 ("python-werkzeug" ,python-werkzeug)))
3509 (home-page "https://github.com/maxcountryman/flask-login")
3510 (synopsis "User session management for Flask")
3511 (description
3512 "@code{Flask-Login} provides user session management for Flask. It
3513 handles the common tasks of logging in, logging out, and remembering your
3514 users' sessions over extended periods of time.")
3515 (license license:expat)))
3516
3517 (define-public python2-flask-login
3518 (package-with-python2 python-flask-login))
3519
3520 (define-public python-oauth2client
3521 (package
3522 (name "python-oauth2client")
3523 (version "4.0.0")
3524 (source
3525 (origin
3526 (method url-fetch)
3527 (uri (pypi-uri "oauth2client" version))
3528 (sha256
3529 (base32
3530 "1irqqap2zibysf8dba8sklfqikia579srd0phm5n754ni0h59gl0"))))
3531 (build-system python-build-system)
3532 (arguments
3533 `(#:tests? #f))
3534 (propagated-inputs
3535 `(("python-httplib2" ,python-httplib2)
3536 ("python-pyasn1" ,python-pyasn1)
3537 ("python-pyasn1-modules" ,python-pyasn1-modules)
3538 ("python-rsa" ,python-rsa)
3539 ("python-six" ,python-six)))
3540 (home-page "https://github.com/google/oauth2client/")
3541 (synopsis "OAuth 2.0 client library")
3542 (description "@code{python-oauth2client} provides an OAuth 2.0 client
3543 library for Python")
3544 (license license:asl2.0)))
3545
3546 (define-public python2-oauth2client
3547 (package-with-python2 python-oauth2client))
3548
3549 (define-public python-flask-oidc
3550 (package
3551 (name "python-flask-oidc")
3552 (version "1.1.1")
3553 (source
3554 (origin
3555 (method url-fetch)
3556 (uri (pypi-uri "flask-oidc" version))
3557 (sha256
3558 (base32
3559 "1ay5j0mf174bix7i67hclr95gv16z81fpx0dijvi0gydvdj3ddy2"))))
3560 (build-system python-build-system)
3561 (propagated-inputs
3562 `(("python-flask" ,python-flask)
3563 ("python-itsdangerous" ,python-itsdangerous)
3564 ("python-oauth2client" ,python-oauth2client)
3565 ("python-six" ,python-six)))
3566 (native-inputs
3567 `(("python-nose" ,python-nose)
3568 ("python-mock" ,python-mock)))
3569 (home-page "https://github.com/puiterwijk/flask-oidc")
3570 (synopsis "OpenID Connect extension for Flask")
3571 (description "@code{python-flask-oidc} provides an OpenID Connect extension
3572 for Flask.")
3573 (license license:bsd-2)))
3574
3575 (define-public python-webassets
3576 (package
3577 (name "python-webassets")
3578 (version "2.0")
3579 (source
3580 (origin
3581 (method url-fetch)
3582 (uri (pypi-uri "webassets" version))
3583 (sha256
3584 (base32
3585 "1kc1042jydgk54xpgcp0r1ib4gys91nhy285jzfcxj3pfqrk4w8n"))))
3586 (build-system python-build-system)
3587 (arguments
3588 '(#:phases (modify-phases %standard-phases
3589 (add-before 'check 'disable-some-tests
3590 (lambda _
3591 ;; This test requires 'postcss' and 'babel' which are
3592 ;; not yet available in Guix.
3593 (delete-file "tests/test_filters.py")
3594 #t))
3595 (replace 'check
3596 (lambda _
3597 (setenv "PYTHONPATH"
3598 (string-append "./build/lib:"
3599 (getenv "PYTHONPATH")))
3600 (invoke "pytest" "-vv"))))))
3601 (native-inputs
3602 `(("python-jinja2" ,python-jinja2)
3603 ("python-mock" ,python-mock)
3604 ("python-nose" ,python-nose)
3605 ("python-pytest" ,python-pytest)))
3606 (home-page "https://github.com/miracle2k/webassets")
3607 (synopsis "Media asset management")
3608 (description "Merges, minifies and compresses Javascript and CSS files,
3609 supporting a variety of different filters, including YUI, jsmin, jspacker or
3610 CSS tidy. Also supports URL rewriting in CSS files.")
3611 (license license:bsd-2)))
3612
3613 (define-public python-cssmin
3614 (package
3615 (name "python-cssmin")
3616 (version "0.2.0")
3617 (source
3618 (origin
3619 (method url-fetch)
3620 (uri (pypi-uri "cssmin" version))
3621 (sha256
3622 (base32
3623 "1dk723nfm2yf8cp4pj785giqlwv42l0kj8rk40kczvq1hk6g04p0"))))
3624 (build-system python-build-system)
3625 (home-page "https://github.com/zacharyvoase/cssmin")
3626 (synopsis "Python port of the YUI CSS Compressor")
3627 (description "Python port of the YUI CSS Compressor.")
3628 (license (list license:expat license:bsd-3))))
3629
3630 (define-public python2-cssmin
3631 (package-with-python2 python-cssmin))
3632
3633 (define-public python-elasticsearch
3634 (package
3635 (name "python-elasticsearch")
3636 (version "7.1.0")
3637 (source
3638 (origin
3639 (method url-fetch)
3640 (uri (pypi-uri "elasticsearch" version))
3641 (sha256
3642 (base32
3643 "0rnjvlhw4v3vg14l519qliy1s1zpmx3827q0xfviwvk42rr7hh01"))))
3644 (build-system python-build-system)
3645 (native-inputs
3646 `(("python-mock" ,python-mock)
3647 ("python-nosexcover" ,python-nosexcover)
3648 ("python-pyaml" ,python-pyaml)
3649 ("python-requests" ,python-requests)))
3650 (propagated-inputs
3651 `(("urllib3" ,python-urllib3)))
3652 (arguments
3653 ;; tests require the test_elasticsearch module but it is not distributed.
3654 `(#:tests? #f))
3655 (home-page "https://github.com/elastic/elasticsearch-py")
3656 (synopsis "Low-level client for Elasticsearch")
3657 (description "Official low-level client for Elasticsearch. Its goal is to
3658 provide common ground for all Elasticsearch-related code in Python; because of
3659 this it tries to be opinion-free and very extendable.")
3660 (license license:expat)))
3661
3662 (define-public python2-elasticsearch
3663 (package-with-python2 python-elasticsearch))
3664
3665 (define-public python-flask-script
3666 (package
3667 (name "python-flask-script")
3668 (version "2.0.6")
3669 (source
3670 (origin
3671 (method url-fetch)
3672 (uri (pypi-uri "Flask-Script" version))
3673 (sha256
3674 (base32
3675 "0r8w2v89nj6b9p91p495cga5m72a673l2wc0hp0zqk05j4yrc9b4"))))
3676 (build-system python-build-system)
3677 (arguments
3678 `(#:phases
3679 (modify-phases %standard-phases
3680 (add-after 'unpack 'patch-tests
3681 (lambda _
3682 (substitute* "tests.py"
3683 (("flask\\.ext\\.script") "flask_script"))
3684 #t)))))
3685 (propagated-inputs
3686 `(("python-flask" ,python-flask)
3687 ("python-argcomplete" ,python-argcomplete)
3688 ("python-werkzeug" ,python-werkzeug)))
3689 (native-inputs
3690 `(("python-pytest" ,python-pytest)))
3691 (home-page
3692 "https://github.com/smurfix/flask-script")
3693 (synopsis "Scripting support for Flask")
3694 (description "The Flask-Script extension provides support for writing
3695 external scripts in Flask. This includes running a development server,
3696 a customised Python shell, scripts to set up your database, cronjobs,
3697 and other command-line tasks that belong outside the web application
3698 itself.")
3699 (license license:bsd-3)))
3700
3701 (define-public python2-flask-script
3702 (package-with-python2 python-flask-script))
3703
3704 (define-public python-flask-migrate
3705 (package
3706 (name "python-flask-migrate")
3707 (version "2.5.3")
3708 (source
3709 (origin
3710 (method url-fetch)
3711 (uri (pypi-uri "Flask-Migrate" version))
3712 (sha256
3713 (base32
3714 "1vip9ww6l18dxffjsggm83k71zkvihxpnhaswpv8klh95s6517d6"))))
3715 (build-system python-build-system)
3716 (propagated-inputs
3717 `(("python-flask" ,python-flask)
3718 ("python-alembic" ,python-alembic)
3719 ("python-sqlalchemy" ,python-sqlalchemy)
3720 ("python-flask-script" ,python-flask-script)
3721 ("python-flask-sqlalchemy" ,python-flask-sqlalchemy)))
3722 (home-page "https://github.com/miguelgrinberg/flask-migrate/")
3723 (synopsis "SQLAlchemy database migrations for Flask programs using
3724 Alembic")
3725 (description "This package contains SQLAlchemy database migration tools
3726 for Flask programs that are using @code{python-alembic}.")
3727 (license license:expat)))
3728
3729 (define-public python-genshi
3730 (package
3731 (name "python-genshi")
3732 (version "0.7.3")
3733 (source
3734 (origin
3735 (method git-fetch)
3736 (uri (git-reference
3737 (url "https://github.com/edgewall/genshi")
3738 (commit version)))
3739 (file-name (git-file-name name version))
3740 (sha256
3741 (base32 "04bw7nd4wyn8ixnhik57hny2xpjjpn80k5hp6691inix5gc6rxaf"))))
3742 (build-system python-build-system)
3743 (home-page "https://genshi.edgewall.org/")
3744 (synopsis "Toolkit for generation of output for the web")
3745 (description "Genshi is a Python library that provides an integrated set
3746 of components for parsing, generating, and processing HTML, XML or other
3747 textual content for output generation on the web.")
3748 (license license:bsd-3)))
3749
3750 (define-public python2-genshi
3751 (package-with-python2 python-genshi))
3752
3753 (define-public python-flask-principal
3754 (package
3755 (name "python-flask-principal")
3756 (version "0.4.0")
3757 (source
3758 (origin
3759 (method url-fetch)
3760 (uri (pypi-uri "Flask-Principal" version))
3761 (sha256
3762 (base32
3763 "0lwlr5smz8vfm5h9a9i7da3q1c24xqc6vm9jdywdpgxfbi5i7mpm"))))
3764 (build-system python-build-system)
3765 (propagated-inputs
3766 `(("python-blinker" ,python-blinker)))
3767 (native-inputs
3768 `(("python-flask" ,python-flask)
3769 ("python-nose" ,python-nose)))
3770 (home-page "https://pythonhosted.org/Flask-Principal/")
3771 (synopsis "Identity management for Flask")
3772 (description "@code{flask_principal} is a identity management library for
3773 Flask. It supports managing both authentication and authorization data in a
3774 thread-local variable.")
3775 (license license:expat)))
3776
3777 (define-public python2-flask-principal
3778 (package-with-python2 python-flask-principal))
3779
3780 (define-public python-flask-httpauth
3781 (package
3782 (name "python-flask-httpauth")
3783 (version "3.2.3")
3784 (source
3785 (origin
3786 (method url-fetch)
3787 (uri (pypi-uri "Flask-HTTPAuth" version))
3788 (sha256
3789 (base32
3790 "13gff5w1mqpzm5nccyg02v3ifb9ifqh5k866cssjhghhg6msfjsz"))))
3791 (build-system python-build-system)
3792 (native-inputs
3793 `(("python-flask" ,python-flask)))
3794 (home-page "https://github.com/miguelgrinberg/flask-httpauth/")
3795 (synopsis "Basic and Digest HTTP authentication for Flask routes")
3796 (description "@code{flask_httpauth} provides Basic and Digest HTTP
3797 authentication for Flask routes.")
3798 (license license:expat)))
3799
3800 (define-public python2-flask-httpauth
3801 (package-with-python2 python-flask-httpauth))
3802
3803 (define-public python-uritemplate
3804 (package
3805 (name "python-uritemplate")
3806 (version "3.0.1")
3807 (source
3808 (origin
3809 (method url-fetch)
3810 (uri (pypi-uri "uritemplate" version))
3811 (sha256
3812 (base32
3813 "1bkwmgr0ia9gcn4bszs2xlvml79f0bi2s4a87xg22ky9rq8avy2s"))))
3814 (build-system python-build-system)
3815 (home-page "https://uritemplate.readthedocs.org")
3816 (synopsis "Library to deal with URI Templates")
3817 (description "@code{uritemplate} provides Python library to deal with URI
3818 Templates.")
3819 (license license:bsd-2)))
3820
3821 (define-public python2-uritemplate
3822 (package-with-python2 python-uritemplate))
3823
3824 (define-public python-publicsuffix
3825 (package
3826 (name "python-publicsuffix")
3827 (version "1.1.0")
3828 (source (origin
3829 (method url-fetch)
3830 (uri (pypi-uri "publicsuffix" version))
3831 (sha256
3832 (base32
3833 "1adx520249z2cy7ykwjr1k190mn2888wqn9jf8qm27ly4qymjxxf"))))
3834 (build-system python-build-system)
3835 (arguments
3836 `(#:tests? #f)) ; tests use the internet
3837 (home-page "https://www.tablix.org/~avian/git/publicsuffix.git")
3838 (synopsis "Get suffix for a domain name")
3839 (description "Get a public suffix for a domain name using the Public Suffix
3840 List.")
3841 (license license:expat)))
3842
3843 (define-public python2-publicsuffix
3844 (package-with-python2 python-publicsuffix))
3845
3846 (define-public python-publicsuffix2
3847 (package
3848 (name "python-publicsuffix2")
3849 (version "2.20191221")
3850 (source
3851 (origin
3852 (method url-fetch)
3853 (uri (pypi-uri "publicsuffix2" version))
3854 (sha256
3855 (base32 "0yzysvfj1najr1mb4pcqrbmjir3xpb69rlffln95a3cdm8qwry00"))))
3856 (build-system python-build-system)
3857 (arguments
3858 '(#:phases
3859 (modify-phases %standard-phases
3860 (add-after 'unpack 'ignore-maintainer-inputs
3861 (lambda _
3862 ;; Comment out a demand for python-requests, which is used only by
3863 ;; the unused ‘update_psl’ helper command.
3864 (substitute* "setup.py"
3865 (("'requests " match)
3866 (format #f "# ~a" match)))
3867 #t)))
3868 #:tests? #f)) ; the test suite requires network access
3869 (home-page "https://github.com/pombredanne/python-publicsuffix2")
3870 (synopsis "Get a public suffix for a domain name using the Public Suffix List")
3871 (description "Get a public suffix for a domain name using the Public Suffix
3872 List. Forked from and using the same API as the publicsuffix package.")
3873 (license (list license:expat license:mpl2.0))))
3874
3875 (define-public python2-publicsuffix2
3876 (package-with-python2 python-publicsuffix2))
3877
3878 (define-public python-werkzeug
3879 (package
3880 (name "python-werkzeug")
3881 (version "1.0.0")
3882 (source
3883 (origin
3884 (method url-fetch)
3885 (uri (pypi-uri "Werkzeug" version))
3886 (sha256
3887 (base32
3888 "15kh0z61klp62mrc1prka13xsshxn0rsp1j1s2964iw86yisi6qn"))))
3889 (build-system python-build-system)
3890 (arguments
3891 '(#:phases
3892 (modify-phases %standard-phases
3893 (delete 'check)
3894 (add-after 'install 'check
3895 (lambda* (#:key inputs outputs #:allow-other-keys)
3896 (add-installed-pythonpath inputs outputs)
3897 (invoke "python" "-m" "pytest"))))))
3898 (propagated-inputs
3899 `(("python-requests" ,python-requests)))
3900 (native-inputs
3901 `(("python-pytest" ,python-pytest)
3902 ("python-pytest-timeout" ,python-pytest-timeout)))
3903 (home-page "https://www.palletsprojects.org/p/werkzeug/")
3904 (synopsis "Utilities for WSGI applications")
3905 (description "One of the most advanced WSGI utility modules. It includes a
3906 powerful debugger, full-featured request and response objects, HTTP utilities to
3907 handle entity tags, cache control headers, HTTP dates, cookie handling, file
3908 uploads, a powerful URL routing system and a bunch of community-contributed
3909 addon modules.")
3910 (license license:x11)))
3911
3912 (define-public python2-werkzeug
3913 (package-with-python2 python-werkzeug))
3914
3915 (define-public python-bottle
3916 (package
3917 (name "python-bottle")
3918 (version "0.12.19")
3919 (source
3920 (origin
3921 (method url-fetch)
3922 (uri (pypi-uri "bottle" version))
3923 (sha256
3924 (base32 "0b6s50vc4iad97b6bb3xnyrgajb3nj6n6jbr5p54a4vapky3zmx9"))))
3925 (build-system python-build-system)
3926 (home-page "https://bottlepy.org/")
3927 (synopsis "WSGI framework for small web-applications.")
3928 (description "@code{python-bottle} is a WSGI framework for small web-applications.")
3929 (license license:expat)))
3930
3931 (define-public python2-bottle
3932 (package-with-python2 python-bottle))
3933
3934 (define-public python-wtforms
3935 (package
3936 (name "python-wtforms")
3937 (version "2.1")
3938 (source
3939 (origin
3940 (method url-fetch)
3941 (uri (pypi-uri "WTForms" version ".zip"))
3942 (sha256
3943 (base32
3944 "0vyl26y9cg409cfyj8rhqxazsdnd0jipgjw06civhrd53yyi1pzz"))))
3945 (build-system python-build-system)
3946 (arguments
3947 '(#:phases
3948 (modify-phases %standard-phases
3949 (add-after 'unpack 'remove-django-test
3950 ;; Don't fail the tests when the inputs for the optional tests cannot be found.
3951 (lambda _
3952 (substitute*
3953 "tests/runtests.py"
3954 (("'ext_django.tests', 'ext_sqlalchemy', 'ext_dateutil', 'locale_babel'") "")
3955 (("sys.stderr.write(\"### Disabled test '%s', dependency not found\n\" % name)") ""))
3956 #t)))))
3957 (native-inputs
3958 `(("unzip" ,unzip)))
3959 (home-page "http://wtforms.simplecodes.com/")
3960 (synopsis
3961 "Form validation and rendering library for Python web development")
3962 (description
3963 "WTForms is a flexible forms validation and rendering library
3964 for Python web development. It is very similar to the web form API
3965 available in Django, but is a standalone package.")
3966 (license license:bsd-3)))
3967
3968 (define-public python2-wtforms
3969 (package-with-python2 python-wtforms))
3970
3971 (define-public python-paste
3972 (package
3973 (name "python-paste")
3974 (version "3.0.6")
3975 (source
3976 (origin
3977 (method url-fetch)
3978 (uri (pypi-uri "Paste" version))
3979 (sha256
3980 (base32
3981 "14lbi9asn5agsdf7r97prkjpz7amgmp529lbvfhf0nv881xczah6"))
3982 (patches (search-patches "python-paste-remove-timing-test.patch"))
3983 (modules '((guix build utils)))
3984 (snippet
3985 '(begin
3986 ;; This test calls out to the internet.
3987 (delete-file "tests/test_proxy.py") #t))))
3988 (build-system python-build-system)
3989 (native-inputs
3990 `(("python-pytest" ,python-pytest)
3991 ("python-pytest-runner" ,python-pytest-runner)
3992 ("python-nose" ,python-nose)))
3993 (propagated-inputs
3994 `(("python-six" ,python-six)))
3995 (home-page "https://pythonpaste.readthedocs.io/")
3996 (synopsis
3997 "Python web development tools, focusing on WSGI")
3998 (description
3999 "Paste provides a variety of web development tools and middleware which
4000 can be nested together to build web applications. Paste's design closely
4001 follows ideas flowing from WSGI (Web Standard Gateway Interface).")
4002 (license license:expat)))
4003
4004 (define-public python2-paste
4005 (package-with-python2 python-paste))
4006
4007 (define-public python-pastescript
4008 (package
4009 (name "python-pastescript")
4010 (version "2.0.2")
4011 (source
4012 (origin
4013 (method url-fetch)
4014 (uri (pypi-uri "PasteScript" version))
4015 (sha256
4016 (base32
4017 "1h3nnhn45kf4pbcv669ik4faw04j58k8vbj1hwrc532k0nc28gy0"))))
4018 (build-system python-build-system)
4019 (native-inputs
4020 `(("python-nose" ,python-nose)))
4021 (propagated-inputs
4022 `(("python-paste" ,python-paste)
4023 ("python-pastedeploy" ,python-pastedeploy)))
4024 (home-page (string-append "https://web.archive.org/web/20161025192515/"
4025 "http://pythonpaste.org/script/"))
4026 (arguments
4027 '(;; Unfortunately, this requires the latest unittest2,
4028 ;; but that requires traceback2 which requires linecache2 which requires
4029 ;; unittest2. So we're skipping tests for now.
4030 ;; (Note: Apparently linetest2 only needs unittest2 for its tests,
4031 ;; so in theory we could get around this situation somehow.)
4032 #:tests? #f))
4033 (synopsis
4034 "Pluggable command line tool for serving web applications and more")
4035 (description
4036 "PasteScript is a plugin-friendly command line tool which provides a
4037 variety of features, from launching web applications to bootstrapping project
4038 layouts.")
4039 (license license:expat)))
4040
4041 (define-public python2-pastescript
4042 (package-with-python2 python-pastescript))
4043
4044 (define-public python2-urlgrabber
4045 (package
4046 (name "python2-urlgrabber")
4047 (version "3.10.2")
4048 (source
4049 (origin
4050 (method url-fetch)
4051 (uri (pypi-uri "urlgrabber" version))
4052 (sha256
4053 (base32 "0w1h7hlsq406bxfy2pn4i9bd003bwl0q9b7p03z3g6yl0d21ddq5"))))
4054 (build-system python-build-system)
4055 (arguments `(#:python ,python-2)) ; urlgrabber supports python2 only
4056 (home-page "http://urlgrabber.baseurl.org")
4057 (synopsis "High-level cross protocol url-grabber")
4058 (description "@code{urlgrabber} is Python2 library that unifies access to
4059 files available on web, FTP or locally. It supports HTTP, FTP and file://
4060 protocols, it supports features like HTTP keep-alive, reget, throttling and
4061 more.")
4062 (license license:lgpl2.1+)))
4063
4064 (define-public python-pycares
4065 (package
4066 (name "python-pycares")
4067 (version "2.3.0")
4068 (source
4069 (origin
4070 (method url-fetch)
4071 (uri (pypi-uri "pycares" version))
4072 (sha256
4073 (base32
4074 "0h4fxw5drrhfyslzmfpljk0qnnpbhhb20hnnndzahhbwylyw1x1n"))))
4075 (build-system python-build-system)
4076 (arguments
4077 `(#:tests? #f)) ;tests require internet access
4078 (home-page "https://github.com/saghul/pycares")
4079 (synopsis "Python interface for @code{c-ares}")
4080 (description "@code{pycares} is a Python module which provides an
4081 interface to @code{c-ares}, a C library that performs DNS requests and
4082 name resolutions asynchronously.")
4083 (license license:expat)))
4084
4085 (define-public python-yarl
4086 (package
4087 (name "python-yarl")
4088 (version "1.1.1")
4089 (source
4090 (origin
4091 (method url-fetch)
4092 (uri (pypi-uri "yarl" version))
4093 (sha256
4094 (base32
4095 "1s6z13g8vgxfkkqwhn6imnm7pl7ky9arv4jygnn6bcndcbidg7d6"))))
4096 (build-system python-build-system)
4097 (native-inputs
4098 `(("python-pytest" ,python-pytest)
4099 ("python-pytest-runner" ,python-pytest-runner)))
4100 (propagated-inputs
4101 `(("python-idna" ,python-idna)
4102 ("python-multidict" ,python-multidict)))
4103 (home-page "https://github.com/aio-libs/yarl/")
4104 (synopsis "Yet another URL library")
4105 (description "@code{yarl} module provides handy @code{URL} class
4106 for URL parsing and changing.")
4107 (license license:asl2.0)))
4108
4109 (define-public python-google-api-client
4110 (package
4111 (name "python-google-api-client")
4112 (version "1.6.7")
4113 (source
4114 (origin
4115 (method url-fetch)
4116 (uri (pypi-uri "google-api-python-client" version))
4117 (sha256
4118 (base32
4119 "1wpbbbxfpy9mwxdy3kn352cb590ladv574j1aa2l4grjdqw3ln05"))))
4120 (build-system python-build-system)
4121 (arguments
4122 '(#:tests? #f)) ; tests require internet access
4123 (native-inputs
4124 `(("python-httplib2" ,python-httplib2)
4125 ("python-six" ,python-six)
4126 ("python-oauth2client" ,python-oauth2client)
4127 ("python-uritemplate" ,python-uritemplate)))
4128 (home-page "https://github.com/google/google-api-python-client")
4129 (synopsis "Core Python library for accessing Google APIs")
4130 (description "Python client library for Google's discovery based APIs")
4131 (license license:asl2.0)))
4132
4133 (define-public python2-google-api-client
4134 (package-with-python2 python-google-api-client))
4135
4136 (define-public python-hawkauthlib
4137 (package
4138 (name "python-hawkauthlib")
4139 (version "2.0.0")
4140 (source
4141 (origin
4142 (method url-fetch)
4143 (uri (pypi-uri "hawkauthlib" version))
4144 (sha256
4145 (base32
4146 "03ai47s4h8nfnrf25shbfvkm1b9n1ccd4nmmj280sg1fayi69zgg"))))
4147 (build-system python-build-system)
4148 (propagated-inputs
4149 `(("python-requests" ,python-requests)
4150 ("python-webob" ,python-webob)))
4151 (home-page "https://github.com/mozilla-services/hawkauthlib")
4152 (synopsis "Hawk Access Authentication protocol")
4153 (description
4154 "This is a low-level Python library for implementing Hawk Access Authentication,
4155 a simple HTTP request-signing scheme.")
4156 (license license:mpl2.0)))
4157
4158 (define-public python-pybrowserid
4159 (package
4160 (name "python-pybrowserid")
4161 (version "0.14.0")
4162 (source
4163 (origin
4164 (method url-fetch)
4165 (uri (pypi-uri "PyBrowserID" version))
4166 (sha256
4167 (base32
4168 "1qvi79kfb8x9kxkm5lw2mp42hm82cpps1xknmsb5ghkwx1lpc8kc"))))
4169 (build-system python-build-system)
4170 (propagated-inputs
4171 `(("python-requests" ,python-requests)))
4172 (native-inputs
4173 `(("python-mock" ,python-mock)))
4174 (home-page "https://github.com/mozilla/PyBrowserID")
4175 (synopsis "Python library for the BrowserID protocol")
4176 (description
4177 "This is a Python client library for the BrowserID protocol that
4178 underlies Mozilla Persona.")
4179 (license license:mpl2.0)))
4180
4181 (define-public python-pyfxa
4182 (package
4183 (name "python-pyfxa")
4184 (version "0.6.0")
4185 (source
4186 (origin
4187 (method url-fetch)
4188 (uri (pypi-uri "PyFxA" version))
4189 (sha256
4190 (base32
4191 "0axl16fyrz2r88gnw4b12mk7dpkqscv8c4wsc1y5hicl7bsbc4fm"))))
4192 (build-system python-build-system)
4193 (arguments '(#:tests? #f)) ; 17 tests require network access
4194 (propagated-inputs
4195 `(("python-cryptography" ,python-cryptography)
4196 ("python-hawkauthlib" ,python-hawkauthlib)
4197 ("python-pybrowserid" ,python-pybrowserid)
4198 ("python-requests" ,python-requests)
4199 ("python-six" ,python-six)))
4200 (native-inputs
4201 `(("python-grequests" ,python-grequests)
4202 ("python-mock" ,python-mock)
4203 ("python-responses" ,python-responses)
4204 ("python-unittest2" ,python-unittest2)))
4205 (home-page "https://github.com/mozilla/PyFxA")
4206 (synopsis "Firefox Accounts client library for Python")
4207 (description
4208 "This is a Python library for interacting with the Firefox Accounts
4209 ecosystem.")
4210 (license license:mpl2.0)))
4211
4212 (define-public python-hyperlink
4213 (package
4214 (name "python-hyperlink")
4215 (version "19.0.0")
4216 (source
4217 (origin
4218 (method url-fetch)
4219 (uri (pypi-uri "hyperlink" version))
4220 (sha256
4221 (base32
4222 "0m2nhi0j8wmgfscf974wd5v1xfq8mah286hil6npy1ys0m3y7222"))))
4223 (build-system python-build-system)
4224 (propagated-inputs
4225 `(("python-idna" ,python-idna)))
4226 (home-page "https://github.com/python-hyper/hyperlink")
4227 (synopsis "Python module to create immutable URLs according to spec")
4228 (description "This package provides a Python module to create immutable, and
4229 correct URLs for Python according to RFCs 3986 and 3987.")
4230 (license license:expat)))
4231
4232 (define-public python-treq
4233 (package
4234 (name "python-treq")
4235 (version "18.6.0")
4236 (source
4237 (origin
4238 (method url-fetch)
4239 (uri (pypi-uri "treq" version))
4240 (sha256
4241 (base32
4242 "0j4zwq9p1c9piv1vc66nxcv9s6hdinf90jwkbsm91k14npv9zq4i"))))
4243 (build-system python-build-system)
4244 (propagated-inputs
4245 `(("python-attrs" ,python-attrs)
4246 ("python-idna" ,python-idna)
4247 ("python-incremental" ,python-incremental)
4248 ("python-requests" ,python-requests)
4249 ("python-service-identity" ,python-service-identity)
4250 ("python-twisted" ,python-twisted)))
4251 (home-page "https://github.com/twisted/treq")
4252 (synopsis "Requests-like API built on top of twisted.web's Agent")
4253 (description "This package provides an HTTP library inspired by
4254 @code{requests}} but written on top of Twisted's @code{Agents}. It offers a
4255 high level API for making HTTP requests when using Twisted.")
4256 (license license:expat)))
4257
4258 (define-public python-autobahn
4259 (package
4260 (name "python-autobahn")
4261 (version "19.2.1")
4262 (source
4263 (origin
4264 (method url-fetch)
4265 (uri (pypi-uri "autobahn" version))
4266 (sha256
4267 (base32
4268 "1mm7j24ls01c7jb1ad5p5cpyxvzgydiyf8b04ihykh2v8g98j0x7"))))
4269 (build-system python-build-system)
4270 (arguments
4271 ;; The tests fail to run:
4272 ;; https://github.com/crossbario/autobahn-python/issues/1117
4273 `(#:tests? #f))
4274 (propagated-inputs
4275 `(("python-cffi" ,python-cffi)
4276 ("python-twisted" ,python-twisted)
4277 ("python-txaio" ,python-txaio)))
4278 (home-page "https://crossbar.io/autobahn/")
4279 (synopsis "Web Application Messaging Protocol implementation")
4280 (description "This package provides an implementation of the @dfn{Web Application
4281 Messaging Protocol} (WAMP). WAMP connects components in distributed
4282 applications using Publish and Subscribe (PubSub) and routed Remote Procedure
4283 Calls (rRPC). It is ideal for distributed, multi-client and server applications
4284 such as IoT applications or multi-user database-driven business applications.")
4285 (license license:expat)))
4286
4287 (define-public python-ws4py
4288 (package
4289 (name "python-ws4py")
4290 (version "0.5.1")
4291 (source
4292 (origin
4293 (method url-fetch)
4294 (uri (pypi-uri "ws4py" version))
4295 (sha256
4296 (base32
4297 "10slbbf2jm4hpr92jx7kh7mhf48sjl01v2w4d8z3f1p0ybbp7l19"))))
4298 (build-system python-build-system)
4299 (arguments
4300 `(#:phases
4301 (modify-phases %standard-phases
4302 (add-after 'unpack 'python3.7-compatibility
4303 (lambda _
4304 (substitute* '("ws4py/server/tulipserver.py"
4305 "ws4py/async_websocket.py")
4306 (("asyncio.async")
4307 "asyncio.ensure_future"))
4308 #t))
4309 ;; We don't have a package for cherrypy.
4310 (add-after 'unpack 'remove-cherrypy-support
4311 (lambda _
4312 (delete-file "ws4py/server/cherrypyserver.py")
4313 #t)))))
4314 (propagated-inputs
4315 `(("python-gevent" ,python-gevent)
4316 ("python-tornado" ,python-tornado)))
4317 (home-page "https://github.com/Lawouach/WebSocket-for-Python")
4318 (synopsis "WebSocket client and server library")
4319 (description
4320 "This package provides a WebSocket client and server library for
4321 Python.")
4322 (license license:bsd-3)))
4323
4324 (define-public python-slugify
4325 (package
4326 (name "python-slugify")
4327 (version "4.0.1")
4328 (source
4329 (origin
4330 (method url-fetch)
4331 (uri (pypi-uri "python-slugify" version))
4332 (sha256
4333 (base32 "0w22fapghmzk3xdasc4dn7h8sl58l08d1h5zbf72dh80drv1g9b9"))))
4334 (propagated-inputs
4335 `(("python-unidecode" ,python-unidecode)))
4336 (arguments
4337 `(#:phases
4338 (modify-phases %standard-phases
4339 (replace 'check
4340 (lambda _
4341 (invoke "python" "test.py"))))))
4342 (build-system python-build-system)
4343 (home-page "https://github.com/un33k/python-slugify")
4344 (synopsis "Python Slugify application that handles Unicode")
4345 (description "This package provides a @command{slufigy} command and
4346 library to create slugs from unicode strings while keeping it DRY.")
4347 (license license:expat)))
4348
4349 (define-public python-branca
4350 (package
4351 (name "python-branca")
4352 (version "0.3.1")
4353 (source
4354 (origin
4355 (method url-fetch)
4356 (uri (pypi-uri "branca" version))
4357 (sha256
4358 (base32
4359 "0pmigd521j2228xf8x34vbx0niwvms7xl7za0lymywj0vydjqxiy"))))
4360 (build-system python-build-system)
4361 (propagated-inputs
4362 `(("python-jinja2" ,python-jinja2)
4363 ("python-six" ,python-six)))
4364 (native-inputs
4365 `(("python-pytest" ,python-pytest)))
4366 (home-page "https://github.com/python-visualization/branca")
4367 (synopsis "Generate complex HTML+JS pages with Python")
4368 (description "Generate complex HTML+JS pages with Python")
4369 (license license:expat)))
4370
4371 (define-public python-tinycss2
4372 (package
4373 (name "python-tinycss2")
4374 (version "1.0.2")
4375 (source
4376 (origin
4377 (method url-fetch)
4378 (uri (pypi-uri "tinycss2" version))
4379 (patches (search-patches "python-tinycss2-flake8-compat.patch"))
4380 (sha256
4381 (base32 "1kw84y09lggji4krkc58jyhsfj31w8npwhznr7lf19d0zbix09v4"))))
4382 (build-system python-build-system)
4383 (arguments
4384 `(#:phases
4385 (modify-phases %standard-phases
4386 (replace 'check
4387 (lambda _ (invoke "pytest"))))))
4388 (propagated-inputs
4389 `(("python-webencodings" ,python-webencodings)))
4390 (native-inputs
4391 `(("python-pytest-flake8" ,python-pytest-flake8)
4392 ("python-pytest-isort" ,python-pytest-isort)
4393 ("python-pytest-runner" ,python-pytest-runner)))
4394 (home-page "https://tinycss2.readthedocs.io/")
4395 (synopsis "Low-level CSS parser for Python")
4396 (description "@code{tinycss2} can parse strings, return Python objects
4397 representing tokens and blocks, and generate CSS strings corresponding to
4398 these objects.
4399
4400 Based on the CSS Syntax Level 3 specification, @code{tinycss2} knows the
4401 grammar of CSS but doesn’t know specific rules, properties or values supported
4402 in various CSS modules.")
4403 (license license:bsd-3)))
4404
4405 (define-public python-cssselect2
4406 (package
4407 (name "python-cssselect2")
4408 (version "0.2.2")
4409 (source
4410 (origin
4411 (method url-fetch)
4412 (uri (pypi-uri "cssselect2" version))
4413 (sha256
4414 (base32 "0skymzb4ncrm2zdsy80f53vi0arf776lvbp51hzh4ayp1il5lj3h"))))
4415 (build-system python-build-system)
4416 (arguments
4417 `(#:phases
4418 (modify-phases %standard-phases
4419 (replace 'check
4420 (lambda _ (invoke "pytest"))))))
4421 (propagated-inputs
4422 `(("python-tinycss2" ,python-tinycss2)))
4423 (native-inputs
4424 `(("python-pytest-cov" ,python-pytest-cov)
4425 ("python-pytest-flake8" ,python-pytest-flake8)
4426 ("python-pytest-isort" ,python-pytest-isort)
4427 ("python-pytest-runner" ,python-pytest-runner)))
4428 (home-page "https://cssselect2.readthedocs.io/")
4429 (synopsis "CSS selectors for Python ElementTree")
4430 (description "@code{cssselect2} is a straightforward implementation of
4431 CSS3 Selectors for markup documents (HTML, XML, etc.) that can be read by
4432 ElementTree-like parsers (including cElementTree, lxml, html5lib, etc.).
4433
4434 Unlike the Python package @code{cssselect}, it does not translate selectors to
4435 XPath and therefore does not have all the correctness corner cases that are
4436 hard or impossible to fix in cssselect.")
4437 (license license:bsd-3)))
4438
4439 (define-public python-uvloop
4440 (package
4441 (name "python-uvloop")
4442 (version "0.14.0")
4443 (source
4444 (origin
4445 (method url-fetch)
4446 (uri (pypi-uri "uvloop" version))
4447 (sha256
4448 (base32 "07j678z9gf41j98w72ysrnb5sa41pl5yxd7ib17lcwfxqz0cjfhj"))))
4449 (build-system python-build-system)
4450 (arguments
4451 '(#:tests? #f ;FIXME: tests hang and with some errors in the way
4452 #:phases
4453 (modify-phases %standard-phases
4454 (add-after 'unpack 'preparations
4455 (lambda _
4456 ;; Use packaged libuv.
4457 (substitute* "setup.py" (("self.use_system_libuv = False")
4458 "self.use_system_libuv = True"))
4459 #t)))))
4460 (native-inputs
4461 `(("python-aiohttp" ,python-aiohttp)
4462 ("python-cython" ,python-cython)
4463 ("python-flake8" ,python-flake8)
4464 ("python-psutil" ,python-psutil)
4465 ("python-pyopenssl" ,python-pyopenssl)
4466 ("python-twine" ,python-twine)))
4467 (inputs
4468 `(("libuv" ,libuv)))
4469 (home-page "https://github.com/MagicStack/uvloop")
4470 (synopsis "Fast implementation of asyncio event loop on top of libuv")
4471 (description
4472 "@code{uvloop} is a fast, drop-in replacement of the built-in asyncio
4473 event loop. It is implemented in Cython and uses libuv under the hood.")
4474 (license license:expat)))
4475
4476 (define-public gunicorn
4477 (package
4478 (name "gunicorn")
4479 (version "20.0.4")
4480 (source
4481 (origin
4482 (method url-fetch)
4483 (uri (pypi-uri "gunicorn" version))
4484 (sha256
4485 (base32
4486 "09n6fc019bgrvph1s5h1lwhn2avcsprw6ncd203qhra3i8mvn10r"))))
4487 (outputs '("out" "doc"))
4488 (build-system python-build-system)
4489 (arguments
4490 `(#:phases
4491 (modify-phases %standard-phases
4492 (add-after 'build 'build-doc
4493 (lambda _
4494 (invoke "make" "-C" "docs" "PAPER=a4" "html" "info")
4495 (delete-file "docs/build/texinfo/Makefile")
4496 (delete-file "docs/build/texinfo/Gunicorn.texi")
4497 #t))
4498 (replace 'check
4499 (lambda _
4500 (setenv "PYTHONPATH"
4501 (string-append ".:" (getenv "PYTHONPATH")))
4502 (invoke "pytest")))
4503 (add-after 'install 'install-doc
4504 (lambda* (#:key outputs #:allow-other-keys)
4505 (let* ((doc (string-append (assoc-ref outputs "doc")
4506 "/share/doc/" ,name "-" ,version))
4507 (html (string-append doc "/html"))
4508 (info (string-append doc "/info"))
4509 (examples (string-append doc "/examples")))
4510 (mkdir-p html)
4511 (mkdir-p info)
4512 (mkdir-p examples)
4513 (copy-recursively "docs/build/html" html)
4514 (copy-recursively "docs/build/texinfo" info)
4515 (copy-recursively "examples" examples)
4516 (for-each (lambda (file)
4517 (copy-file file (string-append doc "/" file)))
4518 '("README.rst" "NOTICE" "LICENSE" "THANKS")))
4519 #t)))))
4520 (native-inputs
4521 `(("binutils" ,binutils) ;; for ctypes.util.find_library()
4522 ("python-aiohttp" ,python-aiohttp)
4523 ("python-pytest" ,python-pytest)
4524 ("python-pytest-cov" ,python-pytest-cov)
4525 ("python-sphinx" ,python-sphinx)
4526 ("texinfo" ,texinfo)))
4527 (home-page "https://gunicorn.org/")
4528 (synopsis "Python WSGI HTTP Server for UNIX")
4529 (description "Gunicorn ‘Green Unicorn’ is a Python WSGI HTTP
4530 Server for UNIX. It’s a pre-fork worker model ported from Ruby’s
4531 Unicorn project. The Gunicorn server is broadly compatible with
4532 various web frameworks, simply implemented, light on server resources,
4533 and fairly speedy.")
4534 (license license:expat)))
4535
4536 ;; break cyclic dependency for python-aiohttp, which depends on gunicorn for
4537 ;; its tests
4538 (define-public gunicorn-bootstrap
4539 (package
4540 (inherit gunicorn)
4541 (name "gunicorn")
4542 (arguments `(#:tests? #f))
4543 (properties '((hidden? . #t)))
4544 (native-inputs `())))
4545
4546 (define-public python-httptools
4547 (package
4548 (name "python-httptools")
4549 (version "0.1.1")
4550 (source
4551 (origin
4552 ;; PyPI tarball comes with a vendored http-parser and no tests.
4553 (method git-fetch)
4554 (uri (git-reference
4555 (url "https://github.com/MagicStack/httptools")
4556 (commit (string-append "v" version))))
4557 (file-name (git-file-name name version))
4558 (sha256
4559 (base32 "0g08128x2ixsiwrzskxc6c8ymgzs39wbzr5mhy0mjk30q9pqqv77"))))
4560 (build-system python-build-system)
4561 (arguments
4562 '(#:phases
4563 (modify-phases %standard-phases
4564 (add-after 'unpack 'preparations
4565 (lambda _
4566 ;; Skip a failing test (AssertionError). Bug report:
4567 ;; https://github.com/MagicStack/httptools/issues/10.
4568 (substitute* "tests/test_parser.py"
4569 ((" def test_parser_response_1")
4570 (string-append
4571 " @unittest.skip(\"Disabled.\")\n"
4572 " def test_parser_response_1")))
4573 ;; Use packaged http-parser.
4574 (substitute* "setup.py" (("self.use_system_http_parser = False")
4575 "self.use_system_http_parser = True"))
4576 ;; This path is hardcoded. Hardcode our own.
4577 (substitute* "httptools/parser/cparser.pxd"
4578 (("../../vendor/http-parser")
4579 (string-append (assoc-ref %build-inputs "http-parser")
4580 "/include")))
4581 ;; Don't force Cython version.
4582 (substitute* "setup.py" (("Cython==") "Cython>="))
4583 #t)))))
4584 (native-inputs
4585 `(("python-cython" ,python-cython)
4586 ("python-pytest" ,python-pytest)))
4587 (inputs
4588 `(("http-parser" ,http-parser)))
4589 (home-page "https://github.com/MagicStack/httptools")
4590 (synopsis "Collection of framework independent HTTP protocol utils")
4591 (description
4592 "@code{httptools} is a Python binding for the nodejs HTTP parser.")
4593 (license license:expat)))
4594
4595 (define-public python-uvicorn
4596 (package
4597 (name "python-uvicorn")
4598 (version "0.11.8")
4599 (source
4600 (origin
4601 ;; PyPI tarball has no tests.
4602 (method git-fetch)
4603 (uri (git-reference
4604 (url "https://github.com/encode/uvicorn")
4605 (commit version)))
4606 (file-name (git-file-name name version))
4607 (sha256
4608 (base32 "00iidg5ysp7k00bw3kmkvr8mghnh4jdi0p2ryiarhryf8wz2r3fy"))))
4609 (build-system python-build-system)
4610 (arguments
4611 `(#:phases
4612 (modify-phases %standard-phases
4613 (replace 'check
4614 (lambda* (#:key inputs outputs tests? #:allow-other-keys)
4615 (add-installed-pythonpath inputs outputs)
4616 (invoke "pytest" "-vv"))))))
4617 (native-inputs
4618 `(("python-black" ,python-black)
4619 ("python-codecov" ,python-codecov)
4620 ("python-flake8" ,python-flake8)
4621 ("python-isort" ,python-isort)
4622 ("python-mypy" ,python-mypy)
4623 ("python-pytest" ,python-pytest)
4624 ("python-pytest-cov" ,python-pytest-cov)
4625 ("python-pytest-mock" ,python-pytest-mock)
4626 ("python-requests" ,python-requests)))
4627 (propagated-inputs
4628 `(("python-click" ,python-click)
4629 ("python-h11" ,python-h11)
4630 ("python-httptools" ,python-httptools)
4631 ("python-pyyaml" ,python-pyyaml)
4632 ("python-uvloop" ,python-uvloop)
4633 ("python-watchgod" ,python-watchgod)
4634 ("python-websockets" ,python-websockets)
4635 ("python-wsproto" ,python-wsproto)))
4636 (home-page "https://github.com/encode/uvicorn")
4637 (synopsis "Fast ASGI server implementation")
4638 (description
4639 "@code{uvicorn} is a fast ASGI server implementation, using @code{uvloop}
4640 and @code{httptools}. It currently supports HTTP/1.1 and WebSockets. Support
4641 for HTTP/2 is planned.")
4642 (license license:bsd-3)))
4643
4644 (define-public python-translation-finder
4645 (package
4646 (name "python-translation-finder")
4647 (version "1.7")
4648 (source
4649 (origin
4650 (method url-fetch)
4651 (uri (pypi-uri "translation-finder" version))
4652 (sha256
4653 (base32
4654 "1pcy9z8gmb8x41gjhw9x0lkr0d2mv5mdxcs2hwg6q8mxs857j589"))))
4655 (build-system python-build-system)
4656 (arguments
4657 `(#:phases
4658 (modify-phases %standard-phases
4659 (add-before 'build 'remove-failing-test
4660 (lambda _
4661 (delete-file "translation_finder/test_api.py")
4662 #t)))))
4663 (propagated-inputs
4664 `(("python-chardet" ,python-chardet)
4665 ("python-pathlib2" ,python-pathlib2)
4666 ("python-ruamel.yaml" ,python-ruamel.yaml)
4667 ("python-six" ,python-six)))
4668 (native-inputs
4669 `(("python-codecov" ,python-codecov)
4670 ("python-codacy-coverage" ,python-codacy-coverage)
4671 ("python-pytest-cov" ,python-pytest-cov)
4672 ("python-pytest-runner" ,python-pytest-runner)
4673 ("python-twine" ,python-twine)))
4674 (home-page "https://weblate.org/")
4675 (synopsis "Translation file finder for Weblate")
4676 (description "This package provides a function to find translation file in
4677 the source code of a project. It supports many translation file formats and
4678 is part of the Weblate translation platform.")
4679 (license license:gpl3+)))
4680
4681 (define-public python-gitlab
4682 (package
4683 (name "python-gitlab")
4684 (version "1.15.0")
4685 (source
4686 (origin
4687 (method url-fetch)
4688 (uri (pypi-uri "python-gitlab" version))
4689 (sha256
4690 (base32
4691 "0zl6kz8v8cg1bcy2r78b2snb0lpw0b573gdx2x1ps0nhsh75l4j5"))))
4692 (build-system python-build-system)
4693 (propagated-inputs
4694 `(("python-requests" ,python-requests)
4695 ("python-six" ,python-six)))
4696 (native-inputs
4697 `(("python-httmock" ,python-httmock)
4698 ("python-mock" ,python-mock)))
4699 (home-page
4700 "https://github.com/python-gitlab/python-gitlab")
4701 (synopsis "Interact with GitLab API")
4702 (description "This package provides an extended library for interacting
4703 with GitLab instances through their API.")
4704 (license license:lgpl3+)))
4705
4706 (define-public python-path-and-address
4707 (package
4708 (name "python-path-and-address")
4709 (version "2.0.1")
4710 (source
4711 (origin
4712 ;; The source distributed on PyPI doesn't include tests.
4713 (method git-fetch)
4714 (uri (git-reference
4715 (url "https://github.com/joeyespo/path-and-address")
4716 (commit (string-append "v" version))))
4717 (file-name (git-file-name name version))
4718 (sha256
4719 (base32
4720 "0b0afpsaim06mv3lhbpm8fmawcraggc11jhzr6h72kdj1cqjk5h6"))))
4721 (build-system python-build-system)
4722 (arguments
4723 `(#:phases
4724 (modify-phases %standard-phases
4725 (replace 'check
4726 (lambda* (#:key inputs outputs #:allow-other-keys)
4727 (add-installed-pythonpath inputs outputs)
4728 (invoke "py.test"))))))
4729 (native-inputs
4730 `(("python-pytest" ,python-pytest)))
4731 (home-page "https://github.com/joeyespo/path-and-address")
4732 (synopsis "Functions for command-line server tools used by humans")
4733 (description "Path-and-address resolves ambiguities of command-line
4734 interfaces, inferring which argument is the path, and which is the address.")
4735 (license license:expat)))
4736
4737 (define-public grip
4738 ;; No release by upstream for quite some time, some bugs fixed since. See:
4739 ;; https://github.com/joeyespo/grip/issues/304
4740 (let ((commit "27a4d6d87ea1d0ea7f7f120de55baabee3de73e3"))
4741 (package
4742 (name "grip")
4743 (version (git-version "4.5.2" "1" commit))
4744 (source
4745 (origin
4746 (method git-fetch)
4747 (uri (git-reference
4748 (url "https://github.com/joeyespo/grip")
4749 (commit commit)))
4750 (file-name (git-file-name name version))
4751 (sha256
4752 (base32
4753 "0kx5hgb3q19i4l18a4vqdq9af390xgpk88lp2ay75qi96k0dc68w"))))
4754 (build-system python-build-system)
4755 (propagated-inputs
4756 `(("python-docopt" ,python-docopt)
4757 ("python-flask" ,python-flask)
4758 ("python-markdown" ,python-markdown)
4759 ("python-path-and-address" ,python-path-and-address)
4760 ("python-pygments" ,python-pygments)
4761 ("python-requests" ,python-requests)))
4762 (native-inputs
4763 `(("python-pytest" ,python-pytest)
4764 ("python-responses" ,python-responses)))
4765 (arguments
4766 `(#:phases
4767 (modify-phases %standard-phases
4768 (replace 'check
4769 (lambda* (#:key inputs outputs #:allow-other-keys)
4770 (add-installed-pythonpath inputs outputs)
4771 (setenv "PATH" (string-append
4772 (getenv "PATH") ":"
4773 (assoc-ref %outputs "out") "/bin"))
4774 (invoke "py.test" "-m" "not assumption"))))))
4775 (home-page "https://github.com/joeyespo/grip")
4776 (synopsis "Preview Markdown files using the GitHub API")
4777 (description "Grip is a command-line server application written in Python
4778 that uses the GitHub Markdown API to render a local Markdown file. The styles
4779 and rendering come directly from GitHub, so you'll know exactly how it will
4780 appear. Changes you make to the file will be instantly reflected in the browser
4781 without requiring a page refresh.")
4782 (license license:expat))))
4783
4784 (define-public python-port-for
4785 (package
4786 (name "python-port-for")
4787 (version "0.4")
4788 (source
4789 (origin
4790 (method url-fetch)
4791 (uri (pypi-uri "port-for" version))
4792 (sha256
4793 (base32
4794 "1pncxlj25ggw99r0ijfbkq70gd7cbhqdx5ivsxy4jdp0z14cpda7"))))
4795 (build-system python-build-system)
4796 (arguments
4797 `(#:phases
4798 (modify-phases %standard-phases
4799 (add-after 'unpack 'use-urllib3
4800 (lambda _
4801 (substitute* "port_for/_download_ranges.py"
4802 (("urllib2") "urllib3"))
4803 #t)))))
4804 (propagated-inputs
4805 `(("python-urllib3" ,python-urllib3)))
4806 (native-inputs
4807 `(("python-mock" ,python-mock)))
4808 (home-page "https://github.com/kmike/port-for/")
4809 (synopsis "TCP localhost port finder and association manager")
4810 (description
4811 "This package provides a utility that helps with local TCP ports
4812 management. It can find an unused TCP localhost port and remember the
4813 association.")
4814 (license license:expat)))
4815
4816 (define-public python-livereload
4817 (package
4818 (name "python-livereload")
4819 (version "2.6.1")
4820 (source
4821 (origin
4822 (method url-fetch)
4823 (uri (pypi-uri "livereload" version))
4824 (sha256
4825 (base32
4826 "0rhggz185bxc3zjnfpmhcvibyzi86i624za1lfh7x7ajsxw4y9c9"))))
4827 (build-system python-build-system)
4828 (propagated-inputs
4829 `(("python-six" ,python-six)
4830 ("python-tornado" ,python-tornado)))
4831 (home-page "https://github.com/lepture/python-livereload")
4832 (synopsis "Python LiveReload")
4833 (description
4834 "Python LiveReload provides a command line utility, @command{livereload},
4835 for starting a web server in a directory. It can trigger arbitrary commands
4836 and serve updated contents upon changes to the directory.")
4837 (license license:bsd-3)))
4838
4839 (define-public python-vf-1
4840 (package
4841 (name "python-vf-1")
4842 (version "0.0.11")
4843 (source
4844 (origin
4845 (method url-fetch)
4846 (uri (pypi-uri "VF-1" version))
4847 (sha256
4848 (base32
4849 "0xlqsaxsiayk1sd07kpz8abbcnab582y29a1y4882fq6j4gma5xi"))))
4850 (build-system python-build-system)
4851 (home-page "https://github.com/solderpunk/VF-1")
4852 (synopsis "Command line gopher client")
4853 (description "@code{VF-1} is a command line gopher client with
4854 @acronym{TLS, Transport Layer Security} support.")
4855 (license license:bsd-2)))
4856
4857 (define-public python-httpcore
4858 (package
4859 (name "python-httpcore")
4860 (version "0.11.0")
4861 (source
4862 (origin
4863 ;; PyPI tarball does not contain tests.
4864 (method git-fetch)
4865 (uri (git-reference
4866 (url "https://github.com/encode/httpcore")
4867 (commit version)))
4868 (file-name (git-file-name name version))
4869 (sha256
4870 (base32 "01bhajcxqgkdzg7b7x0fqs2lwcfsajlgqwi1nlxx58jss7g2kxn9"))))
4871 (build-system python-build-system)
4872 (arguments
4873 `(#:phases
4874 (modify-phases %standard-phases
4875 (add-after 'unpack 'remove-unavailable-tests
4876 (lambda _
4877 ;; These tests require 'mitmproxy' which is not packaged.
4878 (for-each (lambda (f)
4879 (delete-file f))
4880 '("tests/conftest.py"
4881 "tests/sync_tests/test_interfaces.py"
4882 "tests/async_tests/test_interfaces.py"))
4883 #t))
4884 (add-after 'remove-unavailable-tests 'force-h11-version
4885 ;; Allow build with h11 >= 0.10.
4886 (lambda _
4887 (substitute* "setup.py" (("h11>=0.8,<0.10") "h11"))
4888 #t))
4889 (replace 'check
4890 (lambda* (#:key inputs outputs #:allow-other-keys)
4891 (add-installed-pythonpath inputs outputs)
4892 (invoke "pytest" "-vv" "--cov=httpcore"
4893 "--cov=tests" "tests"))))))
4894 (native-inputs
4895 `(;; ("mitmproxy" ,mitmproxy) ;; TODO: Package this.
4896 ("python-autoflake" ,python-autoflake)
4897 ("python-flake8" ,python-flake8)
4898 ("python-flake8-bugbear" ,python-flake8-bugbear)
4899 ("python-flake8-pie" ,python-flake8-pie)
4900 ("python-isort" ,python-isort)
4901 ("python-mypy" ,python-mypy)
4902 ("python-pytest" ,python-pytest)
4903 ("python-pytest-asyncio" ,python-pytest-asyncio)
4904 ("python-pytest-cov" ,python-pytest-cov)
4905 ("python-pytest-trio" ,python-pytest-trio)
4906 ("python-uvicorn" ,python-uvicorn)
4907 ("python-trustme" ,python-trustme)))
4908 (propagated-inputs
4909 `(("python-h11" ,python-h11)
4910 ("python-h2" ,python-h2)
4911 ("python-sniffio" ,python-sniffio)
4912 ("python-trio" ,python-trio)
4913 ("python-trio-typing" ,python-trio-typing)))
4914 (home-page "https://github.com/encode/httpcore")
4915 (synopsis "Minimal, low-level HTTP client")
4916 (description
4917 "HTTP Core provides a minimal and low-level HTTP client, which does one
4918 thing only: send HTTP requests.
4919
4920 Some things HTTP Core does do:
4921
4922 @itemize
4923 @item Sending HTTP requests.
4924 @item Provides both sync and async interfaces.
4925 @item Supports HTTP/1.1 and HTTP/2.
4926 @item Async backend support for asyncio and trio.
4927 @item Automatic connection pooling.
4928 @item HTTP(S) proxy support.
4929 @end itemize")
4930 (license license:bsd-3)))
4931
4932 (define-public python-httpx
4933 (package
4934 (name "python-httpx")
4935 (version "0.15.4")
4936 (source
4937 (origin
4938 ;; PyPI tarball does not contain tests.
4939 (method git-fetch)
4940 (uri (git-reference
4941 (url "https://github.com/encode/httpx")
4942 (commit version)))
4943 (file-name (git-file-name name version))
4944 (sha256
4945 (base32 "1qr91xw6jxynvihmw953bi5446ssm9ffmb2c4nhfa77v7883sp21"))))
4946 (build-system python-build-system)
4947 (arguments
4948 `(#:phases
4949 (modify-phases %standard-phases
4950 (replace 'check
4951 (lambda _
4952 (invoke "pytest" "-vv" "-k"
4953 ;; These tests try to open an outgoing connection.
4954 (string-append
4955 "not test_connect_timeout"
4956 " and not test_that_send_cause_async_client_to_be_not_"
4957 "closed"
4958 " and not test_that_async_client_caused_warning_when_"
4959 "being_deleted"
4960 " and not test_that_send_cause_client_to_be_not_closed"
4961 " and not test_async_proxy_close"
4962 " and not test_sync_proxy_close")))))))
4963 (native-inputs
4964 `(("python-autoflake" ,python-autoflake)
4965 ("python-black" ,python-black)
4966 ("python-cryptography" ,python-cryptography)
4967 ("python-flake8" ,python-flake8)
4968 ("python-flake8-bugbear" ,python-flake8-bugbear)
4969 ("python-flake8-pie" ,python-flake8-pie)
4970 ("python-isort" ,python-isort)
4971 ("python-mypy" ,python-mypy)
4972 ("python-pytest" ,python-pytest)
4973 ("python-pytest-asyncio" ,python-pytest-asyncio)
4974 ("python-pytest-trio" ,python-pytest-trio)
4975 ("python-pytest-cov" ,python-pytest-cov)
4976 ("python-trio" ,python-trio)
4977 ("python-trio-typing" ,python-trio-typing)
4978 ("python-trustme" ,python-trustme)
4979 ("python-uvicorn" ,python-uvicorn)))
4980 (propagated-inputs
4981 `(("python-brotli" ,python-brotli)
4982 ("python-certifi" ,python-certifi)
4983 ("python-chardet" ,python-chardet)
4984 ("python-httpcore" ,python-httpcore)
4985 ("python-idna" ,python-idna)
4986 ("python-rfc3986" ,python-rfc3986)
4987 ("python-sniffio" ,python-sniffio)))
4988 (home-page "https://www.python-httpx.org/")
4989 (synopsis "HTTP client for Python")
4990 (description
4991 "HTTPX is a fully featured HTTP client for Python 3, which provides sync
4992 and async APIs, and support for both HTTP/1.1 and HTTP/2.
4993
4994 HTTPX builds on the well-established usability of requests, and gives you:
4995
4996 @itemize
4997 @item A broadly requests-compatible API.
4998 @item Standard synchronous interface, but with async support if you need it.
4999 @item HTTP/1.1 and HTTP/2 support.
5000 @item Ability to make requests directly to WSGI applications or ASGI applications.
5001 @item Strict timeouts everywhere.
5002 @item Fully type annotated.
5003 @item 99% test coverage.
5004 @end itemize
5005
5006 Plus all the standard features of requests:
5007
5008 @itemize
5009 @item International Domains and URLs
5010 @item Keep-Alive & Connection Pooling
5011 @item Sessions with Cookie Persistence
5012 @item Browser-style SSL Verification
5013 @item Basic/Digest Authentication
5014 @item Elegant Key/Value Cookies
5015 @item Automatic Decompression
5016 @item Automatic Content Decoding
5017 @item Unicode Response Bodies
5018 @item Multipart File Uploads
5019 @item HTTP(S) Proxy Support
5020 @item Connection Timeouts
5021 @item Streaming Downloads
5022 @item .netrc Support
5023 @item Chunked Requests
5024 @end itemize")
5025 (license license:bsd-3)))
5026
5027 (define-public python-websockets
5028 (package
5029 (name "python-websockets")
5030 (version "8.1")
5031 (source
5032 (origin
5033 (method url-fetch)
5034 (uri (pypi-uri "websockets" version))
5035 (sha256
5036 (base32
5037 "03s3ml6sbki24aajllf8aily0xzrn929zxi84p50zkkbikdd4raw"))))
5038 (build-system python-build-system)
5039 (arguments '(#:tests? #f)) ; Tests not included in release tarball.
5040 (home-page "https://github.com/aaugustin/websockets")
5041 (synopsis
5042 "Python implementation of the WebSocket Protocol (RFC 6455 & 7692)")
5043 (description
5044 "@code{websockets} is a library for building WebSocket servers and clients
5045 in Python with a focus on correctness and simplicity.
5046
5047 Built on top of @code{asyncio}, Python's standard asynchronous I/O framework,
5048 it provides an elegant coroutine-based API.")
5049 (license license:bsd-3)))
5050
5051 (define-public python-selenium
5052 (package
5053 (name "python-selenium")
5054 (version "3.141.0")
5055 (source
5056 (origin
5057 (method url-fetch)
5058 (uri (pypi-uri "selenium" version))
5059 (sha256
5060 (base32
5061 "039hf9knvl4s3hp21bzwsp1g5ri9gxsh504dp48lc6nr1av35byy"))))
5062 (build-system python-build-system)
5063 (propagated-inputs
5064 `(("python-urllib3" ,python-urllib3)))
5065 (home-page
5066 "https://github.com/SeleniumHQ/selenium/")
5067 (synopsis "Python bindings for Selenium")
5068 (description "Selenium enables web browser automation.
5069 Selenium specifically provides infrastructure for the W3C WebDriver specification
5070 — a platform and language-neutral coding interface compatible with all
5071 major web browsers.")
5072 (license license:asl2.0)))
5073
5074 (define-public python-rapidjson
5075 (package
5076 (name "python-rapidjson")
5077 (version "0.9.1")
5078 (source
5079 (origin
5080 (method url-fetch)
5081 (uri (pypi-uri "python-rapidjson" version))
5082 (sha256
5083 (base32
5084 "18cl2dhx3gds5vg52jxmh9wjlbiy8dx06c3n482rfpdi9dzbv05d"))
5085 (modules '((guix build utils)))
5086 (snippet
5087 '(begin (delete-file-recursively "rapidjson") #t))))
5088 (build-system python-build-system)
5089 (arguments
5090 `(#:configure-flags
5091 (list (string-append "--rj-include-dir="
5092 (assoc-ref %build-inputs "rapidjson")
5093 "/include/rapidjson"))
5094 #:phases
5095 (modify-phases %standard-phases
5096 (replace 'build
5097 (lambda* (#:key inputs #:allow-other-keys)
5098 (invoke "python" "setup.py" "build"
5099 (string-append "--rj-include-dir="
5100 (assoc-ref %build-inputs "rapidjson")
5101 "/include/rapidjson"))))
5102 (replace 'check
5103 (lambda* (#:key inputs outputs #:allow-other-keys)
5104 (add-installed-pythonpath inputs outputs)
5105 ;; Some tests are broken.
5106 (delete-file "tests/test_base_types.py")
5107 (delete-file "tests/test_validator.py")
5108 (invoke "python" "-m" "pytest" "tests"))))))
5109 (native-inputs
5110 `(("rapidjson" ,rapidjson)
5111 ("python-pytest" ,python-pytest)
5112 ("python-pytz" ,python-pytz)))
5113 (home-page "https://github.com/python-rapidjson/python-rapidjson")
5114 (synopsis "Python wrapper around rapidjson")
5115 (description "This package provides a python wrapper around rapidjson.")
5116 (license license:expat)))
5117
5118 (define-public python-venusian
5119 (package
5120 (name "python-venusian")
5121 (version "3.0.0")
5122 (source
5123 (origin
5124 (method url-fetch)
5125 (uri (pypi-uri "venusian" version))
5126 (sha256
5127 (base32 "0f7f67dkgxxcjfhpdd5frb9pszkf04lyzzpn5069q0xi89r2p17n"))))
5128 (build-system python-build-system)
5129 (native-inputs
5130 `(("python-pytest" ,python-pytest)
5131 ("python-runner" ,python-pytest-runner)
5132 ("python-pytest-cov" ,python-pytest-cov)))
5133 (arguments '(#:test-target "pytest"))
5134 (home-page "https://docs.pylonsproject.org/projects/venusian")
5135 (synopsis "Library for deferring decorator actions")
5136 (description
5137 "Venusian is a library which allows framework authors to defer decorator
5138 actions. Instead of taking actions when a function (or class) decorator is
5139 executed at import time, you can defer the action usually taken by the
5140 decorator until a separate scan phase.")
5141 (license license:repoze)))
5142
5143 (define-public python-zope-deprecation
5144 (package
5145 (name "python-zope-deprecation")
5146 (version "4.4.0")
5147 (source (origin
5148 (method url-fetch)
5149 (uri (pypi-uri "zope.deprecation" version))
5150 (sha256
5151 (base32
5152 "1pz2cv7gv9y1r3m0bdv7ks1alagmrn5msm5spwdzkb2by0w36i8d"))))
5153 (build-system python-build-system)
5154 (native-inputs `())
5155 (propagated-inputs `())
5156 (home-page "https://zopedeprecation.readthedocs.io/")
5157 (synopsis "Function for marking deprecations")
5158 (description "The @code{zope.deprecation} module provides a function for
5159 marking modules, classes, functions, methods and properties as deprecated,
5160 displaying warnings when usaged in application code.")
5161 (license license:zpl2.1)))
5162
5163 (define-public python-translationstring
5164 (package
5165 (name "python-translationstring")
5166 (version "1.3")
5167 (source (origin
5168 (method url-fetch)
5169 (uri (pypi-uri "translationstring" version))
5170 (sha256
5171 (base32
5172 "0bdpcnd9pv0131dl08h4zbcwmgc45lyvq3pa224xwan5b3x4rr2f"))))
5173 (build-system python-build-system)
5174 (home-page "http://docs.pylonsproject.org/projects/translationstring")
5175 (synopsis "Internationalization tooling for the Pylons project")
5176 (description "This package provides a library used by various Pylons
5177 project packages for internationalization (i18n) duties related to
5178 translation.")
5179 (license license:repoze)))
5180
5181 (define-public python-plaster
5182 (package
5183 (name "python-plaster")
5184 (version "1.0")
5185 (source (origin
5186 (method url-fetch)
5187 (uri (pypi-uri "plaster" version))
5188 (sha256
5189 (base32
5190 "1hy8k0nv2mxq94y5aysk6hjk9ryb4bsd13g83m60hcyzxz3wflc3"))))
5191 (build-system python-build-system)
5192 (native-inputs
5193 `(("python-pytest" ,python-pytest)))
5194 (home-page "https://docs.pylonsproject.org/projects/plaster/en/latest/")
5195 (synopsis "Configuration loader for multiple config file formats")
5196 (description
5197 "Plaster is a loader interface around multiple config file formats. It
5198 exists to define a common API for applications to use when they wish to load
5199 configuration. The library itself does not aim to handle anything except a
5200 basic API that applications may use to find and load configuration settings.
5201 Any specific constraints should be implemented in a pluggable loader which can
5202 be registered via an entrypoint.")
5203 (license license:repoze)))
5204
5205 (define-public python-plaster-pastedeploy
5206 (package
5207 (name "python-plaster-pastedeploy")
5208 (version "0.7")
5209 (source (origin
5210 (method url-fetch)
5211 (uri (pypi-uri "plaster_pastedeploy" version))
5212 (sha256
5213 (base32
5214 "1zg7gcsvc1kzay1ry5p699rg2qavfsxqwl17mqxzr0gzw6j9679r"))))
5215 (build-system python-build-system)
5216 (native-inputs
5217 `(("python-pytest" ,python-pytest)))
5218 (propagated-inputs
5219 `(("python-plaster" ,python-plaster)
5220 ("python-pastedeploy" ,python-pastedeploy)))
5221 (home-page "https://github.com/Pylons/plaster_pastedeploy")
5222 (synopsis "Plugin for python-plaster adding PasteDeploy syntax")
5223 (description
5224 "This plugin for @code{python-plaster} adds support for PasteDeploy
5225 syntax, it provides a plaster @code{Loader} object that can parse ini files
5226 according to the standard set by PasteDeploy ")
5227 (license license:expat)))
5228
5229 (define-public python-hupper
5230 (package
5231 (name "python-hupper")
5232 (version "1.10.2")
5233 (source (origin
5234 (method url-fetch)
5235 (uri (pypi-uri "hupper" version))
5236 (sha256
5237 (base32
5238 "0am0p6g5cz6xmcaf04xq8q6dzdd9qz0phj6gcmpsckf2mcyza61q"))))
5239 (build-system python-build-system)
5240 (arguments '(#:test-target "pytest"))
5241 (native-inputs
5242 `(("python-pytest" ,python-pytest)
5243 ("python-pytest-runner" ,python-pytest-runner)
5244 ("python-watchdog" ,python-watchdog)
5245 ("python-mock" ,python-mock)
5246 ("python-pytest-cov" ,python-pytest-cov)))
5247 (propagated-inputs
5248 `(("python-pytz" ,python-pytz)))
5249 (home-page "https://readthedocs.org/projects/hupper")
5250 (synopsis "Integrated process monitor tracking changes to imported Python files")
5251 (description
5252 "Hupper is an integrated process monitor that will track changes to any
5253 imported Python files in sys.modules as well as custom paths. When files are
5254 changed the process is restarted.")
5255 (license license:expat)))
5256
5257 (define-public python-pyramid
5258 (package
5259 (name "python-pyramid")
5260 (version "1.10.4")
5261 (source (origin
5262 (method url-fetch)
5263 (uri (pypi-uri "pyramid" version))
5264 (sha256
5265 (base32
5266 "0rkxs1ajycg2zh1c94xlmls56mx5m161sn8112skj0amza6cn36q"))))
5267 (build-system python-build-system)
5268 (propagated-inputs
5269 `(("python-hupper" ,python-hupper)
5270 ("python-plaster-pastedeploy" ,python-plaster-pastedeploy)
5271 ("python-translationstring" ,python-translationstring)
5272 ("python-venusian" ,python-venusian)
5273 ("python-webob" ,python-webob)
5274 ("python-zope-deprecation" ,python-zope-deprecation)
5275 ("python-zope-interface" ,python-zope-interface)
5276 ("python-webtest" ,python-webtest)
5277 ("python-zope-component" ,python-zope-component)
5278 ("python-plaster" ,python-plaster)))
5279 (home-page "https://trypyramid.com/")
5280 (synopsis "Python web-framework suitable for small and large sites")
5281 (description
5282 "Pyramid makes it easy to write web applications. From minimal
5283 request/response web apps to larger, grown applications.")
5284 (license license:repoze)))
5285
5286 (define-public python-random-user-agent
5287 (package
5288 (name "python-random-user-agent")
5289 (version "1.0.1")
5290 (source
5291 (origin
5292 (method url-fetch)
5293 (uri (pypi-uri "random_user_agent" version))
5294 (sha256
5295 (base32
5296 "04nhzdh2ki7ybhjrmghxci6hcm6i03vvin2q2ynj87fbr1pa534g"))))
5297 (build-system python-build-system)
5298 (home-page "https://github.com/Luqman-Ud-Din/random_user_agent")
5299 (synopsis "List of user agents")
5300 (description
5301 "This package provides a list of user agents, from a collection of more
5302 than 326,000 known user-agents. Users can pick a random one, or select one
5303 based on filters.")
5304 (license license:expat)))
5305
5306 (define-public python-flask-restx
5307 (package
5308 (name "python-flask-restx")
5309 (version "0.2.0")
5310 (source
5311 ;; We fetch from the Git repo because there are no tests in the PyPI
5312 ;; archive.
5313 (origin
5314 (method git-fetch)
5315 (uri (git-reference
5316 (url "https://github.com/python-restx/flask-restx")
5317 (commit version)))
5318 (file-name (git-file-name name version))
5319 (sha256
5320 (base32 "0xf2vkmdngp9cv9klznizai4byxjcf0iqh1pr4b83nann0jxqwy7"))))
5321 (build-system python-build-system)
5322 (propagated-inputs
5323 `(("python-aniso8601" ,python-aniso8601)
5324 ("python-flask" ,python-flask)
5325 ("python-jsonschema" ,python-jsonschema)
5326 ("python-pytz" ,python-pytz)))
5327 (native-inputs
5328 `(("python-blinker" ,python-blinker)
5329 ("python-faker" ,python-faker)
5330 ("python-pytest" ,python-pytest)
5331 ("python-pytest-benchmark"
5332 ,python-pytest-benchmark)
5333 ("python-pytest-flask" ,python-pytest-flask)
5334 ("python-pytest-mock" ,python-pytest-mock)))
5335 (arguments
5336 `(#:phases
5337 (modify-phases %standard-phases
5338 (replace 'check
5339 (lambda _
5340 (invoke "pytest" "--benchmark-skip" "-k"
5341 ;; Those tests need internet access
5342 "not test_check and not test_valid_value_check"))))))
5343 (home-page "https://github.com/python-restx/flask-restx")
5344 (synopsis
5345 "Framework for fast, easy and documented API development with Flask")
5346 (description
5347 "Flask-RESTX is an extension for Flask that adds support for quickly building
5348 REST APIs. Flask-RESTX encourages best practices with minimal setup. If you are familiar
5349 with Flask, Flask-RESTX should be easy to pick up. It provides a coherent collection of
5350 decorators and tools to describe your API and expose its documentation properly using
5351 Swagger.")
5352 (license license:bsd-3)))
5353
5354 (define-public python-manuel
5355 (package
5356 (name "python-manuel")
5357 (version "1.10.1")
5358 (source
5359 (origin
5360 (method url-fetch)
5361 (uri (pypi-uri "manuel" version))
5362 (sha256
5363 (base32
5364 "1bdzay7j70fly5fy6wbdi8fbrxjrrlxnxnw226rwry1c8a351rpy"))))
5365 (build-system python-build-system)
5366 (propagated-inputs
5367 `(("python-six" ,python-six)))
5368 (native-inputs
5369 `(("python-zope-testing" ,python-zope-testing)))
5370 (home-page "https://pypi.org/project/manuel/")
5371 (synopsis "Build tested documentation")
5372 (description
5373 "Manuel lets you mix and match traditional doctests with custom test syntax.")
5374 (license license:asl2.0)))
5375
5376 (define-public python-persistent
5377 (package
5378 (name "python-persistent")
5379 (version "4.6.4")
5380 (source
5381 (origin
5382 (method url-fetch)
5383 (uri (pypi-uri "persistent" version))
5384 (sha256
5385 (base32
5386 "0imm9ji03lhkpcfmhid7x5209ix8g2rlgki9ik1qxks4b8sm8gzq"))))
5387 (build-system python-build-system)
5388 (propagated-inputs
5389 `(("python-cffi" ,python-cffi)
5390 ("python-zope-interface" ,python-zope-interface)))
5391 (native-inputs
5392 `(("python-manuel" ,python-manuel)
5393 ("python-zope-testrunner" ,python-zope-testrunner)))
5394 (home-page "https://github.com/zopefoundation/persistent/")
5395 (synopsis "Translucent persistent objects")
5396 (description "This package contains a generic persistence implementation for
5397 Python. It forms the core protocol for making objects interact
5398 \"transparently\" with a database such as the ZODB.")
5399 (license license:zpl2.1)))
5400
5401 (define-public python-btrees
5402 (package
5403 (name "python-btrees")
5404 (version "4.7.2")
5405 (source
5406 (origin
5407 (method url-fetch)
5408 (uri (pypi-uri "BTrees" version))
5409 (sha256
5410 (base32
5411 "0iiq0g9k1g6qgqq84q9h6639vlvzznk1rgdm0rfcnnqkbkmsbr3w"))))
5412 (build-system python-build-system)
5413 (propagated-inputs
5414 `(("python-persistent" ,python-persistent)
5415 ("python-zope-interface" ,python-zope-interface)))
5416 (native-inputs
5417 `(("python-persistent" ,python-persistent)
5418 ("python-transaction" ,python-transaction)
5419 ("python-zope-testrunner" ,python-zope-testrunner)))
5420 (home-page "https://github.com/zopefoundation/BTrees")
5421 (synopsis "Scalable persistent object containers")
5422 (description
5423 "This package contains a set of persistent object containers built around a
5424 modified BTree data structure. The trees are optimized for use inside ZODB's
5425 \"optimistic concurrency\" paradigm, and include explicit resolution of
5426 conflicts detected by that mechanism.")
5427 (license license:zpl2.1)))
5428
5429 (define-public python-transaction
5430 (package
5431 (name "python-transaction")
5432 (version "3.0.0")
5433 (source
5434 (origin
5435 (method url-fetch)
5436 (uri (pypi-uri "transaction" version))
5437 (sha256
5438 (base32
5439 "0bdaks31bgfh78wnj3sij24bfysmqk25crsis6amz8kzrc0d82iv"))))
5440 (build-system python-build-system)
5441 (propagated-inputs
5442 `(("python-zope-interface" ,python-zope-interface)))
5443 (native-inputs
5444 `(("python-coverage" ,python-coverage)
5445 ("python-mock" ,python-mock)
5446 ("python-nose" ,python-nose)))
5447 (home-page "https://github.com/zopefoundation/transaction")
5448 (synopsis "Transaction management for Python")
5449 (description "This package contains a generic transaction implementation
5450 for Python. It is mainly used by the ZODB.")
5451 (license license:zpl2.1)))
5452
5453 (define-public python-robot-detection
5454 (package
5455 (name "python-robot-detection")
5456 (version "0.4")
5457 (source
5458 (origin
5459 (method url-fetch)
5460 (uri (pypi-uri "robot-detection" version))
5461 (sha256
5462 (base32
5463 "1xd2jm3yn31bnk1kqzggils2rxj26ylxsfz3ap7bhr3ilhnbg3rx"))))
5464 (build-system python-build-system)
5465 (arguments '(#:tests? #f)) ; Tests not shipped in pypi release.
5466 (propagated-inputs `(("python-six" ,python-six)))
5467 (home-page "https://github.com/rory/robot-detection")
5468 (synopsis "Detect web crawlers")
5469 (description
5470 "@code{robot_detection} is a python module to detect if a given HTTP User
5471 Agent is a web crawler. It uses the list of registered robots from
5472 @url{http://www.robotstxt.org}.")
5473 (license license:gpl3+)))
5474
5475 (define-public python-pysolr
5476 (package
5477 (name "python-pysolr")
5478 (version "3.9.0")
5479 (source
5480 (origin
5481 (method url-fetch)
5482 (uri (pypi-uri "pysolr" version))
5483 (sha256
5484 (base32
5485 "1rj5jmscvxjwcmlfi6hmkj44l4x6n3ln5p7d8d18j566hzmmzw3f"))))
5486 (build-system python-build-system)
5487 (arguments
5488 '(#:tests? #f)) ; Tests require network access.
5489 (propagated-inputs
5490 `(("python-requests" ,python-requests)))
5491 (native-inputs
5492 `(("python-setuptools-scm" ,python-setuptools-scm)))
5493 (home-page "https://github.com/django-haystack/pysolr/")
5494 (synopsis "Lightweight python wrapper for Apache Solr")
5495 (description
5496 "This module provides an interface that queries the Apache Solr server
5497 using a pure Python implementation.")
5498 (license license:bsd-3)))
5499
5500 (define-public python-http-ece
5501 (package
5502 (name "python-http-ece")
5503 (version "1.1.0")
5504 (source
5505 (origin
5506 (method git-fetch)
5507 (uri (git-reference
5508 (url "https://github.com/web-push-libs/encrypted-content-encoding")
5509 (commit (string-append "v" version))))
5510 (file-name (git-file-name name version))
5511 (sha256
5512 (base32
5513 "0bp4cc0xc123i72h80ax3qz3ixfwx3j7pw343kc7i6kdvfi8klx7"))))
5514 (build-system python-build-system)
5515 (arguments
5516 `(#:phases
5517 (modify-phases %standard-phases
5518 (add-after 'unpack 'change-directory
5519 (lambda _ (chdir "python") #t)))))
5520 (propagated-inputs
5521 `(("python-cryptography" ,python-cryptography)))
5522 (native-inputs
5523 `(("python-coverage" ,python-coverage)
5524 ("python-flake8" ,python-flake8)
5525 ("python-mock" ,python-mock)
5526 ("python-nose" ,python-nose)))
5527 (home-page "https://github.com/web-push-libs/encrypted-content-encoding")
5528 (synopsis "Encrypted Content Encoding for HTTP")
5529 (description
5530 "This package provices a simple implementation of Encrypted Content
5531 Encoding for HTTP.")
5532 (license license:expat)))
5533
5534 (define-public python-cloudscraper
5535 (package
5536 (name "python-cloudscraper")
5537 (version "1.2.48")
5538 (source
5539 (origin
5540 (method url-fetch)
5541 (uri (pypi-uri "cloudscraper" version))
5542 (sha256
5543 (base32 "0qjxzb0z5bprvmdhx42ayqhlhi2h49d9dwc0vvycj817s71f2sxv"))
5544 (modules '((guix build utils)))
5545 (snippet
5546 '(with-directory-excursion "cloudscraper"
5547 (for-each delete-file
5548 '("captcha/2captcha.py"
5549 "captcha/9kw.py"
5550 "captcha/anticaptcha.py"
5551 "captcha/deathbycaptcha.py"
5552 "interpreters/js2py.py"
5553 "interpreters/v8.py"))
5554 (substitute* "__init__.py"
5555 ;; Perhaps it's a joke, but don't promote proprietary software.
5556 (("([Th]is feature is not available) in the .*'" _ prefix)
5557 (string-append prefix ".'")))
5558 #t))))
5559 (build-system python-build-system)
5560 (propagated-inputs
5561 `(("python-requests" ,python-requests)
5562 ("python-requests-toolbelt" ,python-requests-toolbelt-0.9.1)
5563 ("python-pyparsing" ,python-pyparsing-2.4.7)))
5564 (native-inputs
5565 `(("python-pytest" ,python-pytest)))
5566 (home-page "https://github.com/venomous/cloudscraper")
5567 (synopsis "Cloudflare anti-bot bypass")
5568 (description
5569 "This module acts as a webbrowser solving Cloudflare's Javascript
5570 challenges.")
5571 (license license:expat)))
5572
5573 (define-public python-imap-tools
5574 (package
5575 (name "python-imap-tools")
5576 (version "0.29.0")
5577 (source
5578 (origin
5579 (method url-fetch)
5580 (uri (pypi-uri "imap_tools" version))
5581 (sha256
5582 (base32
5583 "0x122jwpc74wwyw2rsv2fvh6p12y31019ndfr9717jzjkj2d3lhb"))))
5584 (build-system python-build-system)
5585 (arguments '(#:tests? #f)) ; tests require internet access
5586 (home-page "https://github.com/ikvk/imap_tools")
5587 (synopsis "Work with email and mailbox by IMAP")
5588 (description
5589 "This Python library provides tools to deal with email and mailboxes
5590 over IMAP:
5591
5592 @itemize
5593 @item Parsed email message attributes
5594 @item Query builder for searching emails
5595 @item Work with emails in folders (copy, delete, flag, move, seen)
5596 @item Work with mailbox folders (list, set, get, create, exists, rename, delete, status)
5597 @end itemize")
5598 (license license:asl2.0)))