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