+
+(define-public python-vf-1
+ (package
+ (name "python-vf-1")
+ (version "0.0.11")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "VF-1" version))
+ (sha256
+ (base32
+ "0xlqsaxsiayk1sd07kpz8abbcnab582y29a1y4882fq6j4gma5xi"))))
+ (build-system python-build-system)
+ (home-page "https://github.com/solderpunk/VF-1")
+ (synopsis "Command line gopher client")
+ (description "@code{VF-1} is a command line gopher client with
+@acronym{TLS, Transport Layer Security} support.")
+ (license license:bsd-2)))
+
+(define-public python-httpcore
+ (package
+ (name "python-httpcore")
+ (version "0.10.2")
+ (source
+ (origin
+ ;; PyPI tarball does not contain tests.
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/encode/httpcore")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "00gn8nfv814rg6fj7xv97mrra3fvx6fzjcgx9y051ihm6hxljdsi"))))
+ (build-system python-build-system)
+ (arguments
+ `(#:phases
+ (modify-phases %standard-phases
+ (add-after 'unpack 'remove-unavailable-tests
+ (lambda _
+ ;; These tests require 'mitmproxy' which is not packaged.
+ (for-each (lambda (f)
+ (delete-file f))
+ '("tests/conftest.py"
+ "tests/sync_tests/test_interfaces.py"
+ "tests/async_tests/test_interfaces.py"))
+ #t))
+ (add-after 'remove-unavailable-tests 'force-h11-version
+ ;; Allow build with h11 >= 0.10.
+ (lambda _
+ (substitute* "setup.py" (("h11>=0.8,<0.10") "h11"))
+ #t))
+ (replace 'check
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (add-installed-pythonpath inputs outputs)
+ (invoke "pytest" "-vv" "--cov=httpcore"
+ "--cov=tests" "tests"))))))
+ (native-inputs
+ `(;; ("mitmproxy" ,mitmproxy) ;; TODO: Package this.
+ ("python-autoflake" ,python-autoflake)
+ ("python-flake8" ,python-flake8)
+ ("python-flake8-bugbear" ,python-flake8-bugbear)
+ ("python-flake8-pie" ,python-flake8-pie)
+ ("python-isort" ,python-isort)
+ ("python-mypy" ,python-mypy)
+ ("python-pytest" ,python-pytest)
+ ("python-pytest-asyncio" ,python-pytest-asyncio)
+ ("python-pytest-cov" ,python-pytest-cov)
+ ("python-pytest-trio" ,python-pytest-trio)
+ ("python-uvicorn" ,python-uvicorn)
+ ("python-trustme" ,python-trustme)))
+ (propagated-inputs
+ `(("python-h11" ,python-h11)
+ ("python-h2" ,python-h2)
+ ("python-sniffio" ,python-sniffio)
+ ("python-trio" ,python-trio)
+ ("python-trio-typing" ,python-trio-typing)))
+ (home-page "https://github.com/encode/httpcore")
+ (synopsis "Minimal, low-level HTTP client")
+ (description
+ "HTTP Core provides a minimal and low-level HTTP client, which does one
+thing only: send HTTP requests.
+
+Some things HTTP Core does do:
+
+@itemize
+@item Sending HTTP requests.
+@item Provides both sync and async interfaces.
+@item Supports HTTP/1.1 and HTTP/2.
+@item Async backend support for asyncio and trio.
+@item Automatic connection pooling.
+@item HTTP(S) proxy support.
+@end itemize")
+ (license license:bsd-3)))
+
+(define-public python-httpx
+ (package
+ (name "python-httpx")
+ (version "0.14.3")
+ (source
+ (origin
+ ;; PyPI tarball does not contain tests.
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/encode/httpx")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "0mn8gqkgaij3s2pbwgrih20iq34f3f82dfvypaw3nnh7n63vna43"))))
+ (build-system python-build-system)
+ (arguments
+ `(#:phases
+ (modify-phases %standard-phases
+ (replace 'check
+ (lambda _
+ (invoke "pytest" "-vv" "-k"
+ ;; This test tries to open an outgoing connection.
+ "not test_connect_timeout[asyncio]"))))))
+ (native-inputs
+ `(("python-autoflake" ,python-autoflake)
+ ("python-black" ,python-black)
+ ("python-cryptography" ,python-cryptography)
+ ("python-flake8" ,python-flake8)
+ ("python-flake8-bugbear" ,python-flake8-bugbear)
+ ("python-flake8-pie" ,python-flake8-pie)
+ ("python-isort" ,python-isort)
+ ("python-mypy" ,python-mypy)
+ ("python-pytest" ,python-pytest)
+ ("python-pytest-asyncio" ,python-pytest-asyncio)
+ ("python-pytest-trio" ,python-pytest-trio)
+ ("python-pytest-cov" ,python-pytest-cov)
+ ("python-trio" ,python-trio)
+ ("python-trio-typing" ,python-trio-typing)
+ ("python-trustme" ,python-trustme)
+ ("python-uvicorn" ,python-uvicorn)))
+ (propagated-inputs
+ `(("python-brotli" ,python-brotli)
+ ("python-certifi" ,python-certifi)
+ ("python-chardet" ,python-chardet)
+ ("python-httpcore" ,python-httpcore)
+ ("python-idna" ,python-idna)
+ ("python-rfc3986" ,python-rfc3986)
+ ("python-sniffio" ,python-sniffio)))
+ (home-page "https://github.com/encode/httpx")
+ (synopsis "HTTP client for Python")
+ (description
+ "HTTPX is a fully featured HTTP client for Python 3, which provides sync
+and async APIs, and support for both HTTP/1.1 and HTTP/2.
+
+HTTPX builds on the well-established usability of requests, and gives you:
+
+@itemize
+@item A broadly requests-compatible API.
+@item Standard synchronous interface, but with async support if you need it.
+@item HTTP/1.1 and HTTP/2 support.
+@item Ability to make requests directly to WSGI applications or ASGI applications.
+@item Strict timeouts everywhere.
+@item Fully type annotated.
+@item 99% test coverage.
+@end itemize
+
+Plus all the standard features of requests:
+
+@itemize
+@item International Domains and URLs
+@item Keep-Alive & Connection Pooling
+@item Sessions with Cookie Persistence
+@item Browser-style SSL Verification
+@item Basic/Digest Authentication
+@item Elegant Key/Value Cookies
+@item Automatic Decompression
+@item Automatic Content Decoding
+@item Unicode Response Bodies
+@item Multipart File Uploads
+@item HTTP(S) Proxy Support
+@item Connection Timeouts
+@item Streaming Downloads
+@item .netrc Support
+@item Chunked Requests
+@end itemize")
+ (license license:bsd-3)))
+
+(define-public python-websockets
+ (package
+ (name "python-websockets")
+ (version "8.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "websockets" version))
+ (sha256
+ (base32
+ "03s3ml6sbki24aajllf8aily0xzrn929zxi84p50zkkbikdd4raw"))))
+ (build-system python-build-system)
+ (arguments '(#:tests? #f)) ; Tests not included in release tarball.
+ (home-page "https://github.com/aaugustin/websockets")
+ (synopsis
+ "Python implementation of the WebSocket Protocol (RFC 6455 & 7692)")
+ (description
+ "@code{websockets} is a library for building WebSocket servers and clients
+in Python with a focus on correctness and simplicity.
+
+Built on top of @code{asyncio}, Python's standard asynchronous I/O framework,
+it provides an elegant coroutine-based API.")
+ (license license:bsd-3)))
+
+(define-public python-selenium
+ (package
+ (name "python-selenium")
+ (version "3.141.0")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "selenium" version))
+ (sha256
+ (base32
+ "039hf9knvl4s3hp21bzwsp1g5ri9gxsh504dp48lc6nr1av35byy"))))
+ (build-system python-build-system)
+ (propagated-inputs
+ `(("python-urllib3" ,python-urllib3)))
+ (home-page
+ "https://github.com/SeleniumHQ/selenium/")
+ (synopsis "Python bindings for Selenium")
+ (description "Selenium enables web browser automation.
+Selenium specifically provides infrastructure for the W3C WebDriver specification
+— a platform and language-neutral coding interface compatible with all
+major web browsers.")
+ (license license:asl2.0)))
+
+(define-public python-rapidjson
+ (package
+ (name "python-rapidjson")
+ (version "0.9.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "python-rapidjson" version))
+ (sha256
+ (base32
+ "18cl2dhx3gds5vg52jxmh9wjlbiy8dx06c3n482rfpdi9dzbv05d"))
+ (modules '((guix build utils)))
+ (snippet
+ '(begin (delete-file-recursively "rapidjson") #t))))
+ (build-system python-build-system)
+ (arguments
+ `(#:configure-flags
+ (list (string-append "--rj-include-dir="
+ (assoc-ref %build-inputs "rapidjson")
+ "/include/rapidjson"))
+ #:phases
+ (modify-phases %standard-phases
+ (replace 'build
+ (lambda* (#:key inputs #:allow-other-keys)
+ (invoke "python" "setup.py" "build"
+ (string-append "--rj-include-dir="
+ (assoc-ref %build-inputs "rapidjson")
+ "/include/rapidjson"))))
+ (replace 'check
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (add-installed-pythonpath inputs outputs)
+ ;; Some tests are broken.
+ (delete-file "tests/test_base_types.py")
+ (delete-file "tests/test_validator.py")
+ (invoke "python" "-m" "pytest" "tests"))))))
+ (native-inputs
+ `(("rapidjson" ,rapidjson)
+ ("python-pytest" ,python-pytest)
+ ("python-pytz" ,python-pytz)))
+ (home-page "https://github.com/python-rapidjson/python-rapidjson")
+ (synopsis "Python wrapper around rapidjson")
+ (description "This package provides a python wrapper around rapidjson.")
+ (license license:expat)))
+
+(define-public python-venusian
+ (package
+ (name "python-venusian")
+ (version "3.0.0")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "venusian" version))
+ (sha256
+ (base32 "0f7f67dkgxxcjfhpdd5frb9pszkf04lyzzpn5069q0xi89r2p17n"))))
+ (build-system python-build-system)
+ (native-inputs
+ `(("python-pytest" ,python-pytest)
+ ("python-runner" ,python-pytest-runner)
+ ("python-pytest-cov" ,python-pytest-cov)))
+ (arguments '(#:test-target "pytest"))
+ (home-page "https://docs.pylonsproject.org/projects/venusian")
+ (synopsis "Library for defering decorator actions")
+ (description
+ "Venusian is a library which allows framework authors to defer decorator
+actions. Instead of taking actions when a function (or class) decorator is
+executed at import time, you can defer the action usually taken by the
+decorator until a separate scan phase.")
+ (license license:repoze)))
+
+(define-public python-zope-deprecation
+ (package
+ (name "python-zope-deprecation")
+ (version "4.4.0")
+ (source (origin
+ (method url-fetch)
+ (uri (pypi-uri "zope.deprecation" version))
+ (sha256
+ (base32
+ "1pz2cv7gv9y1r3m0bdv7ks1alagmrn5msm5spwdzkb2by0w36i8d"))))
+ (build-system python-build-system)
+ (native-inputs `())
+ (propagated-inputs `())
+ (home-page "https://zopedeprecation.readthedocs.io/")
+ (synopsis "Function for marking deprecations")
+ (description "The @code{zope.deprecation} module provides a function for
+marking modules, classes, functions, methods and properties as deprecated,
+displaying warnings when usaged in application code.")
+ (license license:zpl2.1)))
+
+(define-public python-translationstring
+ (package
+ (name "python-translationstring")
+ (version "1.3")
+ (source (origin
+ (method url-fetch)
+ (uri (pypi-uri "translationstring" version))
+ (sha256
+ (base32
+ "0bdpcnd9pv0131dl08h4zbcwmgc45lyvq3pa224xwan5b3x4rr2f"))))
+ (build-system python-build-system)
+ (home-page "http://docs.pylonsproject.org/projects/translationstring")
+ (synopsis "Internationalization tooling for the Pylons project")
+ (description "This package provides a library used by various Pylons
+project packages for internationalization (i18n) duties related to
+translation.")
+ (license license:repoze)))
+
+(define-public python-plaster
+ (package
+ (name "python-plaster")
+ (version "1.0")
+ (source (origin
+ (method url-fetch)
+ (uri (pypi-uri "plaster" version))
+ (sha256
+ (base32
+ "1hy8k0nv2mxq94y5aysk6hjk9ryb4bsd13g83m60hcyzxz3wflc3"))))
+ (build-system python-build-system)
+ (native-inputs
+ `(("python-pytest" ,python-pytest)))
+ (home-page "https://docs.pylonsproject.org/projects/plaster/en/latest/")
+ (synopsis "Configuration loader for multiple config file formats")
+ (description
+ "Plaster is a loader interface around multiple config file formats. It
+exists to define a common API for applications to use when they wish to load
+configuration. The library itself does not aim to handle anything except a
+basic API that applications may use to find and load configuration settings.
+Any specific constraints should be implemented in a pluggable loader which can
+be registered via an entrypoint.")
+ (license license:repoze)))
+
+(define-public python-plaster-pastedeploy
+ (package
+ (name "python-plaster-pastedeploy")
+ (version "0.7")
+ (source (origin
+ (method url-fetch)
+ (uri (pypi-uri "plaster_pastedeploy" version))
+ (sha256
+ (base32
+ "1zg7gcsvc1kzay1ry5p699rg2qavfsxqwl17mqxzr0gzw6j9679r"))))
+ (build-system python-build-system)
+ (native-inputs
+ `(("python-pytest" ,python-pytest)))
+ (propagated-inputs
+ `(("python-plaster" ,python-plaster)
+ ("python-pastedeploy" ,python-pastedeploy)))
+ (home-page "https://github.com/Pylons/plaster_pastedeploy")
+ (synopsis "Plugin for python-plaster adding PasteDeploy syntax")
+ (description
+ "This plugin for @code{python-plaster} adds support for PasteDeploy
+syntax, it provides a plaster @code{Loader} object that can parse ini files
+according to the standard set by PasteDeploy ")
+ (license license:expat)))
+
+(define-public python-hupper
+ (package
+ (name "python-hupper")
+ (version "1.10.2")
+ (source (origin
+ (method url-fetch)
+ (uri (pypi-uri "hupper" version))
+ (sha256
+ (base32
+ "0am0p6g5cz6xmcaf04xq8q6dzdd9qz0phj6gcmpsckf2mcyza61q"))))
+ (build-system python-build-system)
+ (arguments '(#:test-target "pytest"))
+ (native-inputs
+ `(("python-pytest" ,python-pytest)
+ ("python-pytest-runner" ,python-pytest-runner)
+ ("python-watchdog" ,python-watchdog)
+ ("python-mock" ,python-mock)
+ ("python-pytest-cov" ,python-pytest-cov)))
+ (propagated-inputs
+ `(("python-pytz" ,python-pytz)))
+ (home-page "https://readthedocs.org/projects/hupper")
+ (synopsis "Integrated process monitor tracking changes to imported Python files")
+ (description
+ "Hupper is an integrated process monitor that will track changes to any
+imported Python files in sys.modules as well as custom paths. When files are
+changed the process is restarted.")
+ (license license:expat)))
+
+(define-public python-pyramid
+ (package
+ (name "python-pyramid")
+ (version "1.10.4")
+ (source (origin
+ (method url-fetch)
+ (uri (pypi-uri "pyramid" version))
+ (sha256
+ (base32
+ "0rkxs1ajycg2zh1c94xlmls56mx5m161sn8112skj0amza6cn36q"))))
+ (build-system python-build-system)
+ (propagated-inputs
+ `(("python-hupper" ,python-hupper)
+ ("python-plaster-pastedeploy" ,python-plaster-pastedeploy)
+ ("python-translationstring" ,python-translationstring)
+ ("python-venusian" ,python-venusian)
+ ("python-webob" ,python-webob)
+ ("python-zope-deprecation" ,python-zope-deprecation)
+ ("python-zope-interface" ,python-zope-interface)
+ ("python-webtest" ,python-webtest)
+ ("python-zope-component" ,python-zope-component)
+ ("python-plaster" ,python-plaster)))
+ (home-page "https://trypyramid.com/")
+ (synopsis "Python web-framework suitable for small and large sites")
+ (description
+ "Pyramid makes it easy to write web applications. From minimal
+request/response web apps to larger, grown applications.")
+ (license license:repoze)))
+
+(define-public python-random-user-agent
+ (package
+ (name "python-random-user-agent")
+ (version "1.0.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "random_user_agent" version))
+ (sha256
+ (base32
+ "04nhzdh2ki7ybhjrmghxci6hcm6i03vvin2q2ynj87fbr1pa534g"))))
+ (build-system python-build-system)
+ (home-page "https://github.com/Luqman-Ud-Din/random_user_agent")
+ (synopsis "List of user agents")
+ (description
+ "This package provides a list of user agents, from a collection of more
+than 326,000 known user-agents. Users can pick a random one, or select one
+based on filters.")
+ (license license:expat)))
+
+(define-public python-flask-restx
+ (package
+ (name "python-flask-restx")
+ (version "0.2.0")
+ (source
+ ;; We fetch from the Git repo because there are no tests in the PyPI
+ ;; archive.
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/python-restx/flask-restx")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "0xf2vkmdngp9cv9klznizai4byxjcf0iqh1pr4b83nann0jxqwy7"))))
+ (build-system python-build-system)
+ (propagated-inputs
+ `(("python-aniso8601" ,python-aniso8601)
+ ("python-flask" ,python-flask)
+ ("python-jsonschema" ,python-jsonschema)
+ ("python-pytz" ,python-pytz)))
+ (native-inputs
+ `(("python-blinker" ,python-blinker)
+ ("python-faker" ,python-faker)
+ ("python-pytest" ,python-pytest)
+ ("python-pytest-benchmark"
+ ,python-pytest-benchmark)
+ ("python-pytest-flask" ,python-pytest-flask)
+ ("python-pytest-mock" ,python-pytest-mock)))
+ (arguments
+ `(#:phases
+ (modify-phases %standard-phases
+ (replace 'check
+ (lambda _
+ (invoke "pytest" "--benchmark-skip" "-k"
+ ;; Those tests need internet access
+ "not test_check and not test_valid_value_check"))))))
+ (home-page "https://github.com/python-restx/flask-restx")
+ (synopsis
+ "Framework for fast, easy and documented API development with Flask")
+ (description
+ "Flask-RESTX is an extension for Flask that adds support for quickly building
+REST APIs. Flask-RESTX encourages best practices with minimal setup. If you are familiar
+ with Flask, Flask-RESTX should be easy to pick up. It provides a coherent collection of
+decorators and tools to describe your API and expose its documentation properly using
+Swagger.")
+ (license license:bsd-3)))
+
+(define-public python-manuel
+ (package
+ (name "python-manuel")
+ (version "1.10.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "manuel" version))
+ (sha256
+ (base32
+ "1bdzay7j70fly5fy6wbdi8fbrxjrrlxnxnw226rwry1c8a351rpy"))))
+ (build-system python-build-system)
+ (propagated-inputs
+ `(("python-six" ,python-six)))
+ (native-inputs
+ `(("python-zope-testing" ,python-zope-testing)))
+ (home-page "https://pypi.org/project/manuel/")
+ (synopsis "Build tested documentation")
+ (description
+ "Manuel lets you mix and match traditional doctests with custom test syntax.")
+ (license license:asl2.0)))
+
+(define-public python-persistent
+ (package
+ (name "python-persistent")
+ (version "4.6.4")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "persistent" version))
+ (sha256
+ (base32
+ "0imm9ji03lhkpcfmhid7x5209ix8g2rlgki9ik1qxks4b8sm8gzq"))))
+ (build-system python-build-system)
+ (propagated-inputs
+ `(("python-cffi" ,python-cffi)
+ ("python-zope-interface" ,python-zope-interface)))
+ (native-inputs
+ `(("python-manuel" ,python-manuel)
+ ("python-zope-testrunner" ,python-zope-testrunner)))
+ (home-page "https://github.com/zopefoundation/persistent/")
+ (synopsis "Translucent persistent objects")
+ (description "This package contains a generic persistence implementation for
+Python. It forms the core protocol for making objects interact
+\"transparently\" with a database such as the ZODB.")
+ (license license:zpl2.1)))
+
+(define-public python-btrees
+ (package
+ (name "python-btrees")
+ (version "4.7.2")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "BTrees" version))
+ (sha256
+ (base32
+ "0iiq0g9k1g6qgqq84q9h6639vlvzznk1rgdm0rfcnnqkbkmsbr3w"))))
+ (build-system python-build-system)
+ (propagated-inputs
+ `(("python-persistent" ,python-persistent)
+ ("python-zope-interface" ,python-zope-interface)))
+ (native-inputs
+ `(("python-persistent" ,python-persistent)
+ ("python-transaction" ,python-transaction)
+ ("python-zope-testrunner" ,python-zope-testrunner)))
+ (home-page "https://github.com/zopefoundation/BTrees")
+ (synopsis "Scalable persistent object containers")
+ (description
+ "This package contains a set of persistent object containers built around a
+modified BTree data structure. The trees are optimized for use inside ZODB's
+\"optimistic concurrency\" paradigm, and include explicit resolution of
+conflicts detected by that mechanism.")
+ (license license:zpl2.1)))
+
+(define-public python-transaction
+ (package
+ (name "python-transaction")
+ (version "3.0.0")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "transaction" version))
+ (sha256
+ (base32
+ "0bdaks31bgfh78wnj3sij24bfysmqk25crsis6amz8kzrc0d82iv"))))
+ (build-system python-build-system)
+ (propagated-inputs
+ `(("python-zope-interface" ,python-zope-interface)))
+ (native-inputs
+ `(("python-coverage" ,python-coverage)
+ ("python-mock" ,python-mock)
+ ("python-nose" ,python-nose)))
+ (home-page "https://github.com/zopefoundation/transaction")
+ (synopsis "Transaction management for Python")
+ (description "This package contains a generic transaction implementation
+for Python. It is mainly used by the ZODB.")
+ (license license:zpl2.1)))
+
+(define-public python-robot-detection
+ (package
+ (name "python-robot-detection")
+ (version "0.4")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "robot-detection" version))
+ (sha256
+ (base32
+ "1xd2jm3yn31bnk1kqzggils2rxj26ylxsfz3ap7bhr3ilhnbg3rx"))))
+ (build-system python-build-system)
+ (arguments '(#:tests? #f)) ; Tests not shipped in pypi release.
+ (propagated-inputs `(("python-six" ,python-six)))
+ (home-page "https://github.com/rory/robot-detection")
+ (synopsis "Detect web crawlers")
+ (description
+ "@code{robot_detection} is a python module to detect if a given HTTP User
+Agent is a web crawler. It uses the list of registered robots from
+@url{http://www.robotstxt.org}.")
+ (license license:gpl3+)))
+
+(define-public python-pysolr
+ (package
+ (name "python-pysolr")
+ (version "3.9.0")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "pysolr" version))
+ (sha256
+ (base32
+ "1rj5jmscvxjwcmlfi6hmkj44l4x6n3ln5p7d8d18j566hzmmzw3f"))))
+ (build-system python-build-system)
+ (arguments
+ '(#:tests? #f)) ; Tests require network access.
+ (propagated-inputs
+ `(("python-requests" ,python-requests)))
+ (native-inputs
+ `(("python-setuptools-scm" ,python-setuptools-scm)))
+ (home-page "https://github.com/django-haystack/pysolr/")
+ (synopsis "Lightweight python wrapper for Apache Solr")
+ (description
+ "This module provides an interface that queries the Apache Solr server
+using a pure Python implementation.")
+ (license license:bsd-3)))
+
+(define-public python-http-ece
+ (package
+ (name "python-http-ece")
+ (version "1.1.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/web-push-libs/encrypted-content-encoding")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0bp4cc0xc123i72h80ax3qz3ixfwx3j7pw343kc7i6kdvfi8klx7"))))
+ (build-system python-build-system)
+ (arguments
+ `(#:phases
+ (modify-phases %standard-phases
+ (add-after 'unpack 'change-directory
+ (lambda _ (chdir "python") #t)))))
+ (propagated-inputs
+ `(("python-cryptography" ,python-cryptography)))
+ (native-inputs
+ `(("python-coverage" ,python-coverage)
+ ("python-flake8" ,python-flake8)
+ ("python-mock" ,python-mock)
+ ("python-nose" ,python-nose)))
+ (home-page "https://github.com/web-push-libs/encrypted-content-encoding")
+ (synopsis "Encrypted Content Encoding for HTTP")
+ (description
+ "This package provices a simple implementation of Encrypted Content
+Encoding for HTTP.")
+ (license license:expat)))
+
+(define-public python-cloudscraper
+ (package
+ (name "python-cloudscraper")
+ (version "1.2.46")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "cloudscraper" version))
+ (sha256
+ (base32
+ "1br4p648yassywsd7whz1c7s10rwdysnd7wdqfjq9bksqfxrac3r"))
+ (modules '((guix build utils)))
+ (snippet
+ '(with-directory-excursion "cloudscraper"
+ (for-each delete-file
+ '("captcha/2captcha.py"
+ "captcha/9kw.py"
+ "captcha/anticaptcha.py"
+ "captcha/deathbycaptcha.py"
+ "interpreters/js2py.py"
+ "interpreters/v8.py"))
+ #t))))
+ (build-system python-build-system)
+ (propagated-inputs
+ `(("python-requests" ,python-requests)
+ ("python-requests-toolbelt" ,python-requests-toolbelt-0.9.1)
+ ("python-pyparsing" ,python-pyparsing-2.4.7)))
+ (native-inputs
+ `(("python-pytest" ,python-pytest)))
+ (home-page "https://github.com/venomous/cloudscraper")
+ (synopsis "Cloudflare anti-bot bypass")
+ (description
+ "This module acts as a webbrowser solving Cloudflare's Javascript
+challenges.")
+ (license license:expat)))