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