(define-module (weblate) #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu packages) #:use-module (gnu packages acl) #:use-module (gnu packages certs) #:use-module (gnu packages autotools) #:use-module (gnu packages django) #:use-module (gnu packages python-xyz) #:use-module (gnu packages algebra) #:use-module (gnu packages adns) #:use-module (gnu packages aidc) #:use-module (gnu packages attr) #:use-module (gnu packages backup) #:use-module (gnu packages bash) #:use-module (gnu packages check) #:use-module (gnu packages cmake) #:use-module (gnu packages compression) #:use-module (gnu packages crypto) #:use-module (gnu packages databases) #:use-module (gnu packages dbm) #:use-module (gnu packages djvu) #:use-module (gnu packages docker) #:use-module (gnu packages enchant) #:use-module (gnu packages file) #:use-module (gnu packages fontutils) #:use-module (gnu packages gcc) #:use-module (gnu packages geo) #:use-module (gnu packages ghostscript) #:use-module (gnu packages gl) #:use-module (gnu packages glib) #:use-module (gnu packages gnome) #:use-module (gnu packages gnupg) #:use-module (gnu packages graphviz) #:use-module (gnu packages graphics) #:use-module (gnu packages gsasl) #:use-module (gnu packages gstreamer) #:use-module (gnu packages gtk) #:use-module (gnu packages haskell-xyz) #:use-module (gnu packages icu4c) #:use-module (gnu packages image) #:use-module (gnu packages kerberos) #:use-module (gnu packages libevent) #:use-module (gnu packages libffi) #:use-module (gnu packages libidn) #:use-module (gnu packages linux) #:use-module (gnu packages llvm) #:use-module (gnu packages man) #:use-module (gnu packages maths) #:use-module (gnu packages monitoring) #:use-module (gnu packages multiprecision) #:use-module (gnu packages networking) #:use-module (gnu packages ncurses) #:use-module (gnu packages openstack) #:use-module (gnu packages pcre) #:use-module (gnu packages perl) #:use-module (gnu packages photo) #:use-module (gnu packages pkg-config) #:use-module (gnu packages python) #:use-module (gnu packages python-check) #:use-module (gnu packages python-compression) #:use-module (gnu packages python-crypto) #:use-module (gnu packages python-science) #:use-module (gnu packages python-web) #:use-module (gnu packages qt) #:use-module (gnu packages rdf) #:use-module (gnu packages readline) #:use-module (gnu packages sdl) #:use-module (gnu packages search) #:use-module (gnu packages shells) #:use-module (gnu packages sphinx) #:use-module (gnu packages ssh) #:use-module (gnu packages terminals) #:use-module (gnu packages tex) #:use-module (gnu packages texinfo) #:use-module (gnu packages textutils) #:use-module (gnu packages time) #:use-module (gnu packages tls) #:use-module (gnu packages version-control) #:use-module (gnu packages video) #:use-module (gnu packages web) #:use-module (gnu packages wxwidgets) #:use-module (gnu packages base) #:use-module (gnu packages xml) #:use-module (gnu packages xorg) #:use-module (gnu packages xdisorg) #:use-module (gnu packages tcl) #:use-module (gnu packages bdw-gc) #:use-module (gnu packages serialization) #:use-module (guix packages) #:use-module (guix download) #:use-module (guix git-download) #:use-module (guix hg-download) #:use-module (guix utils) #:use-module (guix build-system gnu) #:use-module (guix build-system cmake) #:use-module (guix build-system python) #:use-module (guix build-system trivial) #:use-module (gnu packages ruby) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26)) (define-public python-weblate-schemas (package (name "python-weblate-schemas") (version "0.4") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/WeblateOrg/weblate_schemas.git") (commit version))) (file-name (git-file-name name version)) (sha256 (base32 "0vc09skp257bv5hksv4rklm1s91km9d90808wyp4yfz6m4ykp65m")))) (build-system python-build-system) (propagated-inputs `(("python-jsonschema" ,python-jsonschema))) (home-page "https://weblate.org/") (synopsis "A collection of schemas used by Weblate") (description "A collection of schemas used by Weblate") (license #f))) (define-public python-translate-toolkit (package (name "python-translate-toolkit") (version "3.2.0") (source (origin (method url-fetch) (uri (pypi-uri "translate-toolkit" version ".tar.gz")) (sha256 (base32 "01zw59j7h1mhw7vlxbsgdw9b7lsp2jda82jh3f60qhmhhvp28d8g")))) (build-system python-build-system) (native-inputs `(("python-pytest" ,python-pytest) ("python-sphinx" ,python-sphinx))) (propagated-inputs `(("python-babel" ,python-babel) ("python-beautifulsoup4" ,python-beautifulsoup4) ("python-chardet" ,python-chardet) ("python-diff-match-patch" ,python-diff-match-patch) ("python-levenshtein" ,python-levenshtein) ("python-lxml" ,python-lxml) ("python-six" ,python-six) ("python-vobject" ,python-vobject) ("python-pyyaml" ,python-pyyaml))) (arguments ;; TODO: tests are not run, because they end with ;; TypeError: parse() missing 2 required positional arguments: 'tree' and ;; 'parse_funcs' ;; during test setup. `(#:tests? #f)) (home-page "https://toolkit.translatehouse.org") (synopsis "Tools and API for translation and localization engineering") (description "Tools and API for translation and localization engineering. It contains several utilities, as well as an API for building localization tools.") (license license:gpl2+))) (define-public python-weblate-language-data (package (name "python-weblate-language-data") (version "2020.13") (source (origin (method url-fetch) (uri (pypi-uri "weblate-language-data" version)) (sha256 (base32 "16a3qx5schf1cc466q36yjjaqjk9ivf0s4rrkwy0y1zhs8vfmwrp")))) (propagated-inputs `(("python-translate-toolkit" ,python-translate-toolkit))) (inputs `(("python-django" ,python-django))) (build-system python-build-system) (home-page "https://weblate.org/") (synopsis "Language definitions for Weblate") (description "Language definitions for Weblate") (license license:expat))) (define-public python-pkgconfig-1.5 (package (name "python-pkgconfig") (version "1.5.1") (source (origin (method url-fetch) (uri (pypi-uri "pkgconfig" version)) (sha256 (base32 "0krminx3qng8sicknzfvjwwcj6brbl25kwiyxbapbdmsh7cy7gwp")))) (build-system python-build-system) (native-inputs `(("python-nose" ,python-nose) ("python-pytest" ,python-pytest))) (inputs `(("pkg-config" ,pkg-config))) (arguments `(#:tests? #f #:phases (modify-phases %standard-phases (add-before 'build 'patch ;; Hard-code the path to pkg-config. (lambda _ (substitute* "pkgconfig/pkgconfig.py" (("cmd = 'pkg-config") (string-append "cmd = '" (which "pkg-config")))) #t))))) (home-page "https://github.com/matze/pkgconfig") (synopsis "Python interface for pkg-config") (description "This module provides a Python interface to pkg-config. It can be used to find all pkg-config packages, check if a package exists, check if a package meets certain version requirements, query CFLAGS and LDFLAGS and parse the output to build extensions with setup.py.") (license license:expat))) (define-public xmlsec-openssl (package (inherit xmlsec) (name "xmlsec-openssl") ;; (native-inputs ;; ;; For tests. ;; `(("openssl:bin" ,nss "bin") ; for certutil ;; ,@(package-native-inputs xmlsec))) (inputs `(("openssl" ,openssl) ("libltdl" ,libltdl))) (synopsis "XML Security Library (using OpenSSL instead of GnuTLS)"))) (define-public python-xmlsec (package (name "python-xmlsec") (version "1.3.9") (source (origin (method url-fetch) (uri (pypi-uri "xmlsec" version)) (sha256 (base32 "1c4k42zv3plm6v65p7z6l5rxyf50h40d02nhc16vq7cjrfvdf4rx")))) (build-system python-build-system) (arguments '(#:tests? #f)) (propagated-inputs `(("python-lxml" ,python-lxml) ("python-setuptools_scm" ,python-setuptools-scm) ("python-toml" ,python-toml) ("python-pkgconfig" ,python-pkgconfig-1.5))) (native-inputs `(("pkg-config" ,pkg-config))) (inputs `(("xmlsec" ,xmlsec-openssl) ("openssl" ,openssl) ("libltdl" ,libltdl))) (home-page "https://github.com/mehcode/python-xmlsec") (synopsis "Python bindings for the XML Security Library") (description "Python bindings for the XML Security Library") (license license:expat))) (define-public python-python3-saml (package (name "python-python3-saml") (version "1.9.0") (source (origin (method url-fetch) (uri (pypi-uri "python3-saml" version)) (sha256 (base32 "1ni38csisy0gymqh62zvi7f2v1f0yagpghdar63im6knj5ajxjk8")))) (build-system python-build-system) (arguments ;no module named tests `(#:tests? #f)) (propagated-inputs `(("python-defusedxml" ,python-defusedxml) ("python-isodate" ,python-isodate) ("python-xmlsec" ,python-xmlsec))) (native-inputs `(("python-coverage" ,python-coverage) ("python-coveralls" ,python-coveralls) ("python-flake8" ,python-flake8) ("python-freezegun" ,python-freezegun) ("python-pylint" ,python-pylint))) (home-page "https://github.com/onelogin/python3-saml") (synopsis "Onelogin Python Toolkit. Add SAML support to your Python software using this library") (description "Onelogin Python Toolkit. Add SAML support to your Python software using this library") (license license:expat))) (define-public python-social-auth-core (package (name "python-social-auth-core") (version "3.3.3") (source (origin (method url-fetch) (uri (pypi-uri "social-auth-core" version)) (sha256 (base32 "1h3zwzgf5q5i6kdl2samxs8z14j29rypyr3dp0vwrcn2ispy2v1g")))) (build-system python-build-system) (arguments '(#:tests? #f)) (propagated-inputs `(("python-cryptography" ,python-cryptography) ("python-defusedxml" ,python-defusedxml) ("python-oauthlib" ,python-oauthlib) ("python-openid" ,python-openid) ("python-pyjwt" ,python-pyjwt) ;; ("python-python3-openid" ,python-python3-openid) ("python-requests" ,python-requests) ("python-python3-saml" ,python-python3-saml) ("python-jose" ,python-jose) ("python-requests-oauthlib" ,python-requests-oauthlib) ("python-ecdsa" ,python-ecdsa) ("python-six" ,python-six))) (inputs `(("python-pytest" ,python-pytest) ("python-pytest-cov" ,python-pytest-cov) ("python-httpretty" ,python-httpretty) ("python-unittest2" ,python-unittest2))) (home-page "https://github.com/python-social-auth/social-core") (synopsis "Python social authentication made simple.") (description "Python social authentication made simple.") (license license:bsd-3))) (define-public python-social-auth-app-django (package (name "python-social-auth-app-django") (version "4.0.0") (source (origin (method url-fetch) (uri (pypi-uri "social-auth-app-django" version)) (sha256 (base32 "0h48f19ag4g08349azfwizwz7r6bj8cmz72i4cc9q35ky1yyas9c")))) (build-system python-build-system) ;; (inputs ;; `(("python-mock" ,python-mock))) (arguments ;; requested setting SOCIAL_AUTH_POSTGRES_JSONFIELD, but settings ;; are not configured. You must either define the environment ;; variable DJANGO_SETTINGS_MODULE or call settings.configure() ;; before accessing settings. '(#:tests? #f)) (propagated-inputs `(("python-six" ,python-six) ("python-translate-toolkit" ,python-translate-toolkit) ("python-social-auth-core" ,python-social-auth-core) ("python-django" ,python-django))) (home-page "https://github.com/python-social-auth/social-app-django") (synopsis "Python Social Authentication, Django integration.") (description "Python Social Authentication, Django integration.") (license license:bsd-3))) (define-public python-siphashc (package (name "python-siphashc") (version "2.1") (source (origin (method url-fetch) (uri (pypi-uri "siphashc" version)) (sha256 (base32 "14mrhzqlxkljr826079zqzcknzspsdhqn7syvg1i3570y5a28r21")))) (build-system python-build-system) (home-page "https://github.com/WeblateOrg/siphashc") (synopsis "Python module (in c) for siphash-2-4") (description "Python module (in c) for siphash-2-4") (license #f))) (define-public python-setuptools-44 (package (name "python-setuptools") (version "44.0.0") (source (origin (method url-fetch) (uri (pypi-uri "setuptools" version ".zip")) (sha256 (base32 "025h5cnxcmda1893l6i12hrwdvs1n8r31qs6q4pkif2v7rrggfp5")) (modules '((guix build utils))) (snippet '(begin ;; Remove included binaries which are used to build self-extracting ;; installers for Windows. ;; TODO: Find some way to build them ourself so we can include them. (for-each delete-file (find-files "setuptools" "^(cli|gui).*\\.exe$")) #t)))) (build-system python-build-system) ;; FIXME: Tests require pytest, which itself relies on setuptools. ;; One could bootstrap with an internal untested setuptools. (arguments `(#:tests? #f)) (home-page "https://pypi.org/project/setuptools/") (synopsis "Library designed to facilitate packaging Python projects") (description "Setuptools is a fully-featured, stable library designed to facilitate packaging Python projects, where packaging includes: Python package and module definitions, distribution package metadata, test hooks, project installation, platform-specific details, Python 3 support.") ;; TODO: setuptools now bundles the following libraries: ;; packaging, pyparsing, six and appdirs. How to unbundle? (license (list license:psfl ; setuptools itself license:expat ; six, appdirs, pyparsing license:asl2.0 ; packaging is dual ASL2/BSD-2 license:bsd-2)))) (define-public python-asttokens (package (name "python-asttokens") (version "2.0.4") (source (origin (method url-fetch) (uri (pypi-uri "asttokens" version)) (sha256 (base32 "0a2ixiz04aw4p0aivxh47k3fa9ql804l3y5iv5gcih9aizi5fbm4")))) (build-system python-build-system) (propagated-inputs `(("python-six" ,python-six))) (native-inputs `(("python-astroid" ,python-astroid) ("python-setuptools-scm" ,python-setuptools-scm) ("python-wheel" ,python-wheel) ("python-toml" ,python-toml) ("python-setuptools" ,python-setuptools-44) ("python-pytest" ,python-pytest))) (home-page "https://github.com/gristlabs/asttokens") (synopsis "Annotate AST trees with source code positions") (description "Annotate AST trees with source code positions") (license license:asl2.0))) (define-public python-executing (package (name "python-executing") (version "0.5.3") (source (origin (method url-fetch) (uri (pypi-uri "executing" version)) (sha256 (base32 "0yb3fy0zhk02hbjy7l5lg350wbvvd4127d3lfz56yq0b3s29q0qc")))) (inputs `(("python-setuptools-scm" ,python-setuptools-scm) ("python-wheel" ,python-wheel) ("python-toml" ,python-toml) ("python-asttokens" ,python-asttokens))) (build-system python-build-system) (home-page "https://github.com/alexmojaki/executing") (synopsis "Get the currently executing AST node of a frame, and other information") (description "Get the currently executing AST node of a frame, and other information") (license license:expat))) (define-public python-pure-eval (package (name "python-pure-eval") (version "0.1.1") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/alexmojaki/pure_eval.git") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "19q32wxw9zwy2dsm8ryajmx4fxr3bgymilcrvpq8c70ywb54cj1q")))) (arguments `(#:tests? #f #:phases (modify-phases %standard-phases (add-before 'build 'set-version (lambda _ (substitute* "pyproject.toml" ((".*tool\\.setuptools_scm.*" all) "") ((".*write_to.*" all) "")) (call-with-output-file "pure_eval/version.py" (lambda (port) (format port "__version__ = '~a'" version)))))))) (build-system python-build-system) (propagated-inputs `(("python-setuptools_scm" ,python-setuptools-scm) ("python-setuptools" ,python-setuptools-44) ("python-toml" ,python-toml) ("python-wheel" ,python-wheel))) (home-page "") (synopsis "") (description "") (license #f))) (define-public python-sentry-sdk (package (name "python-sentry-sdk") (version "0.19.4") (source (origin (method url-fetch) (uri (pypi-uri "sentry-sdk" version)) (sha256 (base32 "074cfrhkimavq333zfg8mr9030hdjqbscjryrdk2ylsf13nz0lhh")))) (build-system python-build-system) (arguments '(#:tests? #f)) (propagated-inputs `(("python-aiohttp" ,python-aiohttp) ("python-botocore" ,python-botocore) ("python-bottle" ,python-bottle) ("python-celery" ,python-celery) ("python-certifi" ,python-certifi) ("python-falcon" ,python-falcon) ("python-django" ,python-django) ("python-flask" ,python-flask) ("python-blinker" ,python-blinker) ("python-pure-eval" ,python-pure-eval) ("python-executing" ,python-executing) ("python-asttokens" ,python-asttokens) ("python-rq" ,python-rq) ("python-urllib3" ,python-urllib3))) (home-page "https://github.com/getsentry/sentry-python") (synopsis "Python client for Sentry (https://sentry.io)") (description "Python client for Sentry (https://sentry.io)") (license license:bsd-3))) (define-public python-redis-lock (package (name "python-redis-lock") (version "3.7.0") (source (origin (method url-fetch) (uri (pypi-uri "python-redis-lock" version)) (sha256 (base32 "0x437capjc2z36xp7kyn3cx5zis4bi46c9swry56liwxwdva8ra2")))) (build-system python-build-system) (propagated-inputs `(("python-redis" ,python-redis))) (home-page "https://github.com/ionelmc/python-redis-lock") (synopsis "Lock context manager implemented via redis SETNX/BLPOP.") (description "Lock context manager implemented via redis SETNX/BLPOP.") (license license:bsd-2))) (define-public python-wirerope (package (name "python-wirerope") (version "0.4.2") (source (origin (method url-fetch) (uri (pypi-uri "wirerope" version)) (sha256 (base32 "17dp3i85ik2d8f5x240a7h7rxqyymv35aakr11rk39m6ygfnjcwh")))) (build-system python-build-system) (propagated-inputs `(("python-six" ,python-six))) (native-inputs `(("python-pytest" ,python-pytest) ("python-pytest-cov" ,python-pytest-cov))) (home-page "https://github.com/youknowone/wirerope") (synopsis "'Turn functions and methods into fully controllable objects'") (description "'Turn functions and methods into fully controllable objects'") (license #f))) (define-public python-pycodestyle (package (name "python-pycodestyle") (version "2.6.0") (source (origin (method url-fetch) (uri (pypi-uri "pycodestyle" version)) (sha256 (base32 "0bhr6ia0hmgx3nhgibc9pmkzhlh1zcqk707i5fbxgs702ll7v2n5")))) (arguments ;; 'testsuite.test_all' has no attribute 'suite' '(#:tests? #f)) (build-system python-build-system) (home-page "https://pycodestyle.readthedocs.io/") (synopsis "Python style guide checker") (description "Python style guide checker") (license license:expat))) (define-public python-tox-pyenv (package (name "python-tox-pyenv") (version "1.1.0") (source (origin (method url-fetch) (uri (pypi-uri "tox-pyenv" version)) (sha256 (base32 "1r4r4pyg6zkxsldahl3g36iz6xyh5yrvziajahxhpv3saw9j4v4i")))) (build-system python-build-system) (propagated-inputs `(("python-tox" ,python-tox) ("python-pycodestyle" ,python-pycodestyle) ("python-mock" ,python-mock) ("python-pylint" ,python-pylint))) (home-page "https://github.com/samstav/tox-pyenv") (synopsis "tox plugin that makes tox use `pyenv which` to find python executables") (description "tox plugin that makes tox use `pyenv which` to find python executables") (license license:asl2.0))) (define-public python-methodtools (package (name "python-methodtools") (version "0.4.2") (source (origin (method url-fetch) (uri (pypi-uri "methodtools" version)) (sha256 (base32 "1ini66jcfmz7bx1w6383fmfbr0lynqq6vlxx5vnk0nxfjgfm0c30")))) (build-system python-build-system) (propagated-inputs `(("python-wirerope" ,python-wirerope))) (native-inputs `(("python-pytest" ,python-pytest) ("python-pytest-cov" ,python-pytest-cov) ("python-tox" ,python-tox) ("python-tox-pyenv" ,python-tox-pyenv) ("python-sphinx" ,python-sphinx))) (home-page "https://github.com/youknowone/methodtools") (synopsis "Expand standard functools to methods") (description "Expand standard functools to methods") (license #f))) (define-public python-borgbackup (package (name "python-borgbackup") (version "1.1.14") (source (origin (method url-fetch) (uri (pypi-uri "borgbackup" version)) (sha256 (base32 "1fpdj73cgp96xwasdcifxl7q2pr1my2f4vfdjpv771llri3hgfvx")))) (build-system python-build-system) (inputs `(("openssl" ,openssl) ("lz4" ,lz4) ("libb2" ,libb2) ("zstd" ,zstd) ("acl" ,acl))) (propagated-inputs `(("python-setuptools_scm" ,python-setuptools-scm))) (arguments `(#:phases (modify-phases %standard-phases (replace 'build (lambda* (#:key inputs #:allow-other-keys) (setenv "BORG_OPENSSL_PREFIX" (string-append (assoc-ref inputs "openssl"))) (setenv "BORG_LIBLZ4_PREFIX" (string-append (assoc-ref inputs "lz4"))) (setenv "BORG_LIBB2_PREFIX" (string-append (assoc-ref inputs "libb2"))) (setenv "BORG_LIBZSTD_PREFIX" (string-append (assoc-ref inputs "zstd"))) (invoke "python" "setup.py" "build")))))) (home-page "https://borgbackup.readthedocs.io/") (synopsis "Deduplicated, encrypted, authenticated and compressed backups") (description "Deduplicated, encrypted, authenticated and compressed backups") (license license:bsd-3))) (define-public python-user-agents (package (name "python-user-agents") (version "2.2.0") (source (origin (method url-fetch) (uri (pypi-uri "user-agents" version)) (sha256 (base32 "09mddriffm9rkwr30081fy9n3cn976ms8pwc8p8hhlxnilbjavfk")))) (build-system python-build-system) (arguments `(#:tests? #f)) ;missing devices.json test file in release (propagated-inputs `(("python-ua-parser" ,python-ua-parser))) (home-page "https://github.com/selwin/python-user-agents") (synopsis "User Agent strings parsing library") (description "A library to identify devices (phones, tablets) and their capabilities by parsing (browser/HTTP) user agent strings.") (license license:expat))) (define-public python-ua-parser (package (name "python-ua-parser") (version "0.10.0") (source (origin (method url-fetch) (uri (pypi-uri "ua-parser" version)) (sha256 (base32 "0csh307zfz666kkk5idrw3crj1x8q8vsqgwqil0r1n1hs4p7ica7")))) (build-system python-build-system) (arguments `(#:tests? #f)) (native-inputs `(("python-pyyaml" ,python-pyyaml))) (home-page "https://github.com/ua-parser/uap-python") (synopsis "User agent parser") (description "@code{ua-parser} is a Python port of Browserscope's user agent parser.") (license license:asl2.0))) (define-public python-translation-finder (package (name "python-translation-finder") (version "2.5") (source (origin (method url-fetch) (uri (pypi-uri "translation-finder" version)) (sha256 (base32 "1cmx0f38cl8g5wy16j5z1i1yqab1m4kvfj2lp9l91dcz8dasawmy")))) (build-system python-build-system) (arguments `(#:phases (modify-phases %standard-phases (add-before 'build 'remove-failing-test (lambda _ (delete-file "translation_finder/test_api.py") #t))))) (propagated-inputs `(("python-chardet" ,python-chardet) ("python-pathlib2" ,python-pathlib2) ("python-ruamel.yaml" ,python-ruamel.yaml) ("python-weblate-language-data" ,python-weblate-language-data) ("python-six" ,python-six))) (native-inputs `(("python-codecov" ,python-codecov) ("python-codacy-coverage" ,python-codacy-coverage) ("python-pytest-cov" ,python-pytest-cov) ("python-pytest-runner" ,python-pytest-runner) ("python-twine" ,python-twine))) (home-page "https://weblate.org/") (synopsis "Translation file finder for Weblate") (description "This package provides a function to find translation file in the source code of a project. It supports many translation file formats and is part of the Weblate translation platform.") (license license:gpl3+))) (define-public python-redis-lock (package (name "python-redis-lock") (version "3.6.0") (source (origin (method url-fetch) (uri (pypi-uri "python-redis-lock" version)) (sha256 (base32 "1xx8n35hh3jrg4xi564v3jbxgs94sdb619dyrsxlgkzg5xzvhybc")))) (build-system python-build-system) (propagated-inputs `(("python-redis" ,python-redis))) (home-page "https://github.com/ionelmc/python-redis-lock") (synopsis "Lock context manager implemented via redis SETNX/BLPOP.") (description "Lock context manager implemented via redis SETNX/BLPOP.") (license license:bsd-2))) (define-public python-jellyfish (package (name "python-jellyfish") (version "0.8.0") (source (origin (method url-fetch) (uri (pypi-uri "jellyfish" version)) (sha256 (base32 "1larbd0m1i60243y9w4gy6hx98zysx57xgwmi6rrxsjfpc6hjk6v")))) (build-system python-build-system) (native-inputs `(("python-pytest" ,python-pytest))) (home-page "https://github.com/jamesturk/jellyfish") (synopsis "Approximate and phonetic matching of strings") (description "Jellyfish uses a variety of string comparison and phonetic encoding algorithms to do fuzzy string matching.") (license license:bsd-2) (properties `((python2-variant . ,(delay python2-jellyfish)))))) (define-public python-hiredis (package (name "python-hiredis") (version "1.1.0") (source (origin (method url-fetch) (uri (pypi-uri "hiredis" version)) (sha256 (base32 "0cii3kfmv6kpiasp720sw9ymgr8g5915ysrdzybhpxg06gpj2q4r")))) (arguments '(#:tests? #f)) (build-system python-build-system) (home-page "https://github.com/redis/hiredis-py") (synopsis "Python wrapper for hiredis") (description "Python wrapper for hiredis") (license license:bsd-3))) (define-public python-diff-match-patch (package (name "python-diff-match-patch") (version "20200713") (source (origin (method url-fetch) (uri (pypi-uri "diff-match-patch" version)) (sha256 (base32 "063s8zcxz787xfg7d1wxpqh59fxg3iz85ww9zhyz4vaqm80mlvys")))) (arguments '(#:tests? #f)) (build-system python-build-system) (home-page "https://code.google.com/p/google-diff-match-patch") (synopsis "Synchronize plain text") (description "Diff Match and Patch libraries offer robust algorithms to perform the operations required for synchronizing plain text.") (license license:asl2.0))) (define-public python-pre-commit (package (name "python-pre-commit") (version "2.9.3") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/pre-commit/pre-commit") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "1dsvk7gnm53pcrqqra4gljw00pgbkjw82rarxfrvhvyy1l3s02nz")))) (build-system python-build-system) (arguments `(#:tests? #f ;FIXME! #:phases (modify-phases %standard-phases ;; open-fdes permission denied? (delete 'reset-gzip-timestamps)) ;; #:phases ;; (modify-phases %standard-phases ;; (replace 'check ;; (lambda _ ;; (invoke "pytest" "tests")))) )) (native-inputs `(("python-pytest" ,python-pytest) ("python-tox" ,python-tox) ("python-re-assert" ,python-re-assert) ;; required for tests ("which" ,which) ("gem" ,ruby) ("git" ,git))) (propagated-inputs `(("python-cfgv" ,python-cfgv) ("python-identify" ,python-identify) ("python-importlib-metadata" ,python-importlib-metadata) ("python-importlib-resources" ,python-importlib-resources) ("python-nodeenv" ,python-nodeenv) ("python-pyyaml" ,python-pyyaml) ("python-toml" ,python-toml) ("python-virtualenv" ,python-virtualenv))) (home-page "https://github.com/pre-commit/pre-commit") (synopsis "A framework for managing and maintaining multi-language pre-commit hooks.") (description "A framework for managing and maintaining multi-language pre-commit hooks.") (license license:expat))) (define-public python-aws-xray-sdk-0 (package (name "python-aws-xray-sdk") (version "0.95") (home-page "https://github.com/aws/aws-xray-sdk-python") (source (origin (method git-fetch) (uri (git-reference (url home-page) (commit version))) (file-name (git-file-name name version)) (sha256 (base32 "1mzr5n1k32ivsgi9bd5sfz70gy3gybpvh5qyvs9zi28xiin6i2yy")))) (build-system python-build-system) ;; (arguments ;; `(#:phases (modify-phases %standard-phases ;; (add-after 'unpack 'disable-tests ;; (lambda _ ;; (for-each delete-file ;; '(;; These tests require packages not yet in Guix. ;; "tests/ext/aiobotocore/test_aiobotocore.py" ;; "tests/ext/aiohttp/test_middleware.py" ;; "tests/ext/pg8000/test_pg8000.py" ;; "tests/ext/psycopg2/test_psycopg2.py" ;; "tests/ext/pymysql/test_pymysql.py" ;; "tests/ext/pynamodb/test_pynamodb.py" ;; "tests/test_async_recorder.py" ;; ;; FIXME: Why is this failing? ;; "tests/test_patcher.py" ;; ;; TODO: How to configure Django for these tests. ;; "tests/ext/django/test_db.py" ;; "tests/ext/django/test_middleware.py" ;; ;; These tests want to access httpbin.org. ;; "tests/ext/requests/test_requests.py" ;; "tests/ext/httplib/test_httplib.py" ;; "tests/ext/aiohttp/test_client.py")))) ;; (replace 'check ;; (lambda _ ;; (setenv "PYTHONPATH" ;; (string-append "./build/lib:.:" ;; (getenv "PYTHONPATH"))) ;; (invoke "pytest" "-vv" "tests")))))) (arguments `(#:tests? #f)) (native-inputs `( ;; These are required for the test suite. ("python-bottle" ,python-bottle) ("python-flask" ,python-flask) ("python-flask-sqlalchemy" ,python-flask-sqlalchemy) ("python-pymysql" ,python-pymysql) ("python-pytest" ,python-pytest) ("python-pytest-aiohttp" ,python-pytest-aiohttp) ("python-requests" ,python-requests) ("python-sqlalchemy" ,python-sqlalchemy) ("python-webtest" ,python-webtest))) (propagated-inputs `(("python-aiohttp" ,python-aiohttp) ("python-botocore" ,python-botocore) ("python-future" ,python-future) ("python-jsonpickle" ,python-jsonpickle) ("python-urllib3" ,python-urllib3) ("python-wrapt" ,python-wrapt))) (synopsis "Profile applications on AWS X-Ray") (description "The AWS X-Ray SDK for Python enables Python developers to record and emit information from within their applications to the AWS X-Ray service.") (license license:asl2.0))) (define-public python-nose-random (package (name "python-nose-random") ;; only tag existing, from 4 years ago (version "1.0.0") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/ZoomerAnalytics/nose-random") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "1dsvk7gnm53pcrqqra4gljw00pgbkjw82rarxfrvhvyy1l3s02na")))) (build-system python-build-system) (home-page "https://github.com/ZoomerAnalytics/nose-random") (synopsis "") (description "") (license #f))) (define-public python-jsondiff (package (name "python-jsondiff") ;; python-moto wants this exact version! (version "1.1.1") (source (origin (method url-fetch) (uri (pypi-uri "jsondiff" version)) (sha256 (base32 "14vqiyxdsrrq0qzpk6mxk4cdnyixyicsm5766kx8whg95mw3f11d")))) ;; should add nose random, see above (arguments `(#:tests? #f)) (build-system python-build-system) (home-page "https://github.com/ZoomerAnalytics/jsondiff") (synopsis "Diff JSON and JSON-like structures in Python") (description "Diff JSON and JSON-like structures in Python") (license #f))) (define-public python-moto-1.3.7 (package (name "python-moto") ;; XXX: Use a pre-release for compatibility with latest botocore & friends. (version "1.3.7") (source (origin (method url-fetch) (uri (pypi-uri "moto" version)) (sha256 (base32 "1igwndp6xhwy7sqfpd3ry5p45dfi5qayq8n7nbwdjl5j9khf578j")))) (build-system python-build-system) ;; (arguments ;; `(#:phases (modify-phases %standard-phases ;; (add-after 'unpack 'patch-hardcoded-executable-names ;; (lambda _ ;; (substitute* "moto/batch/models.py" ;; (("/bin/sh") ;; (which "sh"))) ;; (substitute* (find-files "tests" "\\.py$") ;; (("#!/bin/bash") ;; (string-append "#!" (which "bash")))) ;; #t)) ;; (replace 'check ;; (lambda _ ;; (setenv "PYTHONPATH" (string-append "./build/lib:" ;; (getenv "PYTHONPATH"))) ;; (invoke "pytest" "-vv" "-m" "not network" ;; ;; These tests require Docker. ;; "-k" "not test_terminate_job \ ;; and not test_invoke_function_from_sqs_exception")))))) (native-inputs `(("python-flask" ,python-flask) ("python-flask-cors" ,python-flask-cors) ("python-freezegun" ,python-freezegun) ("python-parameterized" ,python-parameterized) ("python-pytest" ,python-pytest) ("python-sure" ,python-sure))) (propagated-inputs `(("python-aws-xray-sdk" ,python-aws-xray-sdk-0) ("python-boto" ,python-boto) ("python-jsondiff" ,python-jsondiff) ("python-boto3" ,python-boto3) ("python-botocore" ,python-botocore) ("python-cfn-lint" ,python-cfn-lint) ("python-cryptography" ,python-cryptography) ("python-dateutil" ,python-dateutil) ("python-docker" ,python-docker) ("python-idna" ,python-idna) ("python-jinja2" ,python-jinja2) ("python-jose" ,python-jose) ("python-jsondiff" ,python-jsondiff) ("python-mock" ,python-mock) ("python-pytz" ,python-pytz) ("python-pyyaml" ,python-pyyaml) ("python-requests" ,python-requests) ("python-responses" ,python-responses) ("python-six" ,python-six) ("python-sshpubkeys" ,python-sshpubkeys) ("python-werkzeug" ,python-werkzeug) ("python-xmltodict" ,python-xmltodict))) (home-page "https://github.com/spulec/moto") (synopsis "Mock out the boto library") (description "@code{moto} is a library designed to easily mock out the @code{boto} library.") (license license:asl2.0))) (define-public python-celery (package (name "python-celery") (version "5.0.3") (source (origin (method url-fetch) (uri (pypi-uri "celery" version)) (sha256 (base32 "12x6xnljyp5j8dxpas1cag3jr83nqb27k2bfjhfc957wlvyb1g6p")))) (build-system python-build-system) ;; enabling tests I'm pulling in alot of old dependencies (arguments '(#:tests? #f)) (native-inputs `(("python-case" ,python-case) ("python-pytest" ,python-pytest))) (propagated-inputs `(("python-pytz" ,python-pytz) ("python-msgpack" ,python-msgpack) ("python-pre-commit" ,python-pre-commit) ("python-pyyaml" ,python-pyyaml) ("python-click-plugins" ,python-click-plugins) ("python-billiard" ,python-billiard) ("python-pygobject" ,python-pygobject) ("python-kombu" ,python-kombu))) (home-page "https://celeryproject.org") (synopsis "Distributed Task Queue") (description "Celery is an asynchronous task queue/job queue based on distributed message passing. It is focused on real-time operation, but supports scheduling as well. The execution units, called tasks, are executed concurrently on a single or more worker servers using multiprocessing, Eventlet, or gevent. Tasks can execute asynchronously (in the background) or synchronously (wait until ready).") (license license:bsd-3) (properties `((python2-variant . ,(delay python2-celery)))))) (define-public python-click-repl (package (name "python-click-repl") (version "0.1.6") (source (origin (method url-fetch) (uri (pypi-uri "click-repl" version)) (sha256 (base32 "1mcmz95595nrp4r58spy1ac993db26hk4q97isghbmn4md99vwmr")))) (build-system python-build-system) (propagated-inputs `(("python-click" ,python-click) ("python-prompt-toolkit" ,python-prompt-toolkit) ("python-six" ,python-six))) (home-page "https://github.com/untitaker/click-repl") (synopsis "REPL plugin for Click") (description "REPL plugin for Click") (license license:expat))) (define-public python-click-didyoumean (package (name "python-click-didyoumean") (version "0.0.3") (source (origin (method url-fetch) (uri (pypi-uri "click-didyoumean" version)) (sha256 (base32 "1svaza5lpvdbmyrx5xi0riqzq4hb9wnlpqrg6r8zy14pbi42j8hi")))) (build-system python-build-system) (propagated-inputs `(("python-click" ,python-click))) (home-page "https://github.com/timofurrer/click-didyoumean") (synopsis "Enable git-like did-you-mean feature in click.") (description "Enable git-like did-you-mean feature in click.") (license #f))) (define-public python-vine (package (name "python-vine") (version "5.0.0") (source (origin (method url-fetch) (uri (pypi-uri "vine" version)) (sha256 (base32 "0zk3pm0g7s4qfn0gk28lfmsyplvisaxi6826cgpq5njkm4j1cfvx")))) (build-system python-build-system) (native-inputs `(("python-pytest" ,python-pytest) ("python-case" ,python-case))) (home-page "https://github.com/celery/vine") (synopsis "Promises for Python") (description "@code{vine} provides a special implementation of promises in that it can be used both for \"promise of a value\" and lazy evaluation. The biggest upside for this is that everything in a promise can also be a promise, e.g. filters, callbacks and errbacks can all be promises.") (license license:bsd-3))) (define-public python-amqp (package (name "python-amqp") (version "5.0.2") (source (origin (method url-fetch) (uri (pypi-uri "amqp" version)) (sha256 (base32 "117pnbhwvlcmwvm9d4aw3yp417898c2x3xkg92rikz5pxsxb7mgw")))) (build-system python-build-system) (arguments '(#:tests? #f)) ;some tests requiring network (native-inputs `(("python-case" ,python-case) ("python-pytest-sugar" ,python-pytest-sugar) ("python-pytest-rerunfailures" ,python-pytest-rerunfailures) ("python-mock" ,python-mock))) (propagated-inputs `(("python-vine" ,python-vine))) (home-page "https://github.com/celery/py-amqp") (synopsis "Low-level AMQP client for Python (fork of amqplib)") (description "This is a fork of amqplib which was originally written by Barry Pederson. It is maintained by the Celery project, and used by kombu as a pure python alternative when librabbitmq is not available.") (license license:lgpl2.1+) (properties `((python2-variant . ,(delay python2-amqp)))))) (define-public python-kombu (package (name "python-kombu") (version "5.0.2") (source (origin (method url-fetch) (uri (pypi-uri "kombu" version)) (sha256 (base32 "0g5c0lg2abva1d8nrc824jk5fcvf8kbbbvhb8xyx86271ax5z5pl")))) (build-system python-build-system) (native-inputs `(("python-mock" ,python-mock) ("python-case" ,python-case) ("python-pyro4" ,python-pyro4) ("python-pytest-sugar" ,python-pytest-sugar) ("python-pytz" ,python-pytz))) (propagated-inputs `(("python-anyjson" ,python-anyjson) ("python-amqp" ,python-amqp) ("python-redis" ,python-redis))) (home-page "https://kombu.readthedocs.io") (synopsis "Message passing library for Python") (description "The aim of Kombu is to make messaging in Python as easy as possible by providing an idiomatic high-level interface for the AMQ protocol, and also provide proven and tested solutions to common messaging problems. AMQP is the Advanced Message Queuing Protocol, an open standard protocol for message orientation, queuing, routing, reliability and security, for which the RabbitMQ messaging server is the most popular implementation.") (license license:bsd-3) (properties `((python2-variant . ,(delay python2-kombu)))))) (define-public python-billiard (package (name "python-billiard") (version "3.6.3.0") (source (origin (method url-fetch) (uri (pypi-uri "billiard" version)) (sha256 (base32 "0spssl3byzqsplra166d59jx8iqfxyzvcbx7vybkmwr5ck72a5yr")))) (arguments '(#:tests? #f)) (build-system python-build-system) (native-inputs `(("python-case" ,python-case) ("python-pytest" ,python-pytest))) (home-page "https://github.com/celery/billiard") (synopsis "Python multiprocessing fork with improvements and bugfixes") (description "Billiard is a fork of the Python 2.7 multiprocessing package. The multiprocessing package itself is a renamed and updated version of R Oudkerk's pyprocessing package. This standalone variant is intended to be compatible with Python 2.4 and 2.5, and will draw its fixes/improvements from python-trunk.") (license license:bsd-3) (properties `((python2-variant . ,(delay python2-billiard)))))) (define-public python-pytest-rerunfailures (package (name "python-pytest-rerunfailures") (version "9.1.1") (source (origin (method url-fetch) (uri (pypi-uri "pytest-rerunfailures" version)) (sha256 (base32 "1wi711wn0xdzd8zwpirsd4p5ycpf2krymdaf84c3j6qjzhbimc8w")))) (build-system python-build-system) (propagated-inputs `(("python-pytest" ,python-pytest) ("python-setuptools" ,python-setuptools-44))) (home-page "https://github.com/pytest-dev/pytest-rerunfailures") (synopsis "pytest plugin to re-run tests to eliminate flaky failures") (description "pytest plugin to re-run tests to eliminate flaky failures") (license #f))) (define-public python-phply (package (name "python-phply") (version "1.2.5") (source (origin (method url-fetch) (uri (pypi-uri "phply" version)) (sha256 (base32 "0gwz4j0pp479bwg6iwk7kcdbr1s4x9fikqri0b4ddn7vi198fibx")))) (build-system python-build-system) (propagated-inputs `(("python-ply" ,python-ply) ("python-nose" ,python-nose))) (home-page "https://github.com/viraptor/phply") (synopsis "Lexer and parser for PHP source implemented using PLY") (description "Lexer and parser for PHP source implemented using PLY") (license license:bsd-3))) (define-public python-iniparse (package (name "python-iniparse") (version "0.5") (source (origin (method url-fetch) (uri (pypi-uri "iniparse" version)) (sha256 (base32 "0hm8784r25l5wrl274x65329l0b7pq3vfyq10jssrrr6slwm4blk")))) (build-system python-build-system) (propagated-inputs `(("python-six" ,python-six))) ;; FIXME: failing tests (arguments '(#:tests? #f)) (home-page "https://github.com/candlepin/python-iniparse") (synopsis "Accessing and Modifying INI files") (description "Accessing and Modifying INI files") (license license:expat))) (define-public python-aeidon (package (name "python-aeidon") (version "1.7.0") (source (origin (method url-fetch) (uri (pypi-uri "aeidon" version)) (sha256 (base32 "0mhkm3gihkvdznmxhlizzihziknjfb3jvlc0dy80zvjxwvf4hpcp")))) (build-system python-build-system) (propagated-inputs `(("python-chardet" ,python-chardet))) (home-page "https://otsaloma.io/gaupol/") (synopsis "aeidon is a Python package for reading, writing and manipulating text-based subtitle files. It is used by the gaupol package, which provides a subtitle editor with a GTK+ user interface.") (description "aeidon is a Python package for reading, writing and manipulating text-based subtitle files. It is used by the gaupol package, which provides a subtitle editor with a GTK+ user interface.") (license #f))) (define-public python-weblate (package (name "python-weblate") (version "4.3.2") (source (origin (method url-fetch) (uri (pypi-uri "Weblate" version)) (sha256 (base32 "0hmb5qvrjsspskf9fm71myyp9y03pql8rm6vksxw8jxhxnc27v82")))) (build-system python-build-system) (arguments `(#:tests? #f #:phases (modify-phases %standard-phases (add-after 'build 'fix-uwsgi-python-path (let* ((python-version ,(version-major+minor (package-version python))) (weblate-dir (string-append "/lib/python" python-version "/site-packages/"))) (lambda* (#:key inputs outputs #:allow-other-keys) (substitute* "weblate/examples/weblate.uwsgi.ini" (("\\[uwsgi\\]" all) (string-append all "\n" "plugins-dir = " (string-append (assoc-ref inputs "uwsgi-python")) "/lib/uwsgi/")) (("python3") "python") (("wsgi-file.*") (string-append "wsgi-file = " (assoc-ref outputs "out") weblate-dir "weblate/wsgi.py")) ((".*python-path.*") (string-join (map (lambda (path) (string-append "python-path = " path)) (append (list (string-append (assoc-ref outputs "out") weblate-dir)) ;; TODO: Use search-path-as-string->list (string-split (getenv "PYTHONPATH") #\:))) "\n")) (("virtualenv.*" all) (string-append "# " all)))))) (add-after 'build 'set-vcs-paths (lambda* (#:key inputs #:allow-other-keys) (substitute* "weblate/vcs/git.py" (("_cmd = \"git\"") (format #f "_cmd = ~s" (string-append (assoc-ref inputs "git") "/bin/git")))) (substitute* "weblate/gitexport/utils.py" (("\"git\"") (string-append "\"" (assoc-ref inputs "git") "/bin/git" "\"")) (("\"/usr/lib/git\"") (string-append "\"" (assoc-ref inputs "git") ;; path where git-http-backend lives "/libexec/git-core" "\""))) (substitute* "weblate/vcs/mercurial.py" (("_cmd = \"hg\"") (format #f "_cmd = ~s" (string-append (assoc-ref inputs "hg") "/bin/hg")))) (substitute* "weblate/vcs/ssh.py" (("exec ssh") (string-append "exec " (assoc-ref inputs "openssh") "/bin/ssh")) (("ssh-keyscan") (string-append (assoc-ref inputs "openssh") "/bin/ssh-keyscan")) (("ssh-keygen") (string-append (assoc-ref inputs "openssh") "/bin/ssh-keygen"))))) (add-after 'unpack 'fix-git-cacert-paths ;; Weblate runs git in a cleaned environment, in which only ;; env variables are kept. add GIT_SSL_CAINFO and GIT_EXEC_PATH ;; to the allowed ones (lambda _ (substitute* "weblate/trans/util.py" (("HTTPS_PROXY\"," all) (string-append all "\"GIT_SSL_CAINFO\", \"GIT_EXEC_PATH\",")))))))) (inputs `(("uwsgi-python" ,uwsgi "python") ("git" ,git) ("openssh" ,openssh) ("hg" ,mercurial))) (propagated-inputs `(("cairo" ,cairo) ("pango" ,pango) ("glib" ,glib) ("nss-certs" ,nss-certs) ("gobject-introspection" ,gobject-introspection) ("python-bleach" ,python-bleach) ("python-borgbackup" ,python-borgbackup) ("python-celery" ,python-celery) ("python-cssselect" ,python-cssselect) ("python-cython" ,python-cython) ("python-dateutil" ,python-dateutil) ("python-diff-match-patch" ,python-diff-match-patch) ("python-django" ,python-django) ("python-django-appconf" ,python-django-appconf) ("python-django-compressor" ,python-django-compressor) ("python-django-crispy-forms" ,python-django-crispy-forms) ("python-django-filter" ,python-django-filter) ("python-django-redis" ,python-django-redis) ("python-djangorestframework" ,python-djangorestframework) ("python-filelock" ,python-filelock) ("python-gitpython" ,python-gitpython) ("python-hiredis" ,python-hiredis) ("python-html2text" ,python-html2text) ("python-jellyfish" ,python-jellyfish) ("python-jsonschema" ,python-jsonschema) ("python-lxml" ,python-lxml) ("python-methodtools" ,python-methodtools) ("python-misaka" ,python-misaka) ("python-openpyxl" ,python-openpyxl) ("python-pillow" ,python-pillow) ("python-pycairo" ,python-pycairo) ("python-pygobject" ,python-pygobject) ("python-pyparsing" ,python-pyparsing) ("python-redis-lock" ,python-redis-lock) ("python-requests" ,python-requests) ("python-setuptools" ,python-setuptools-44) ("python-siphashc" ,python-siphashc) ("python-social-auth-app-django" ,python-social-auth-app-django) ("python-social-auth-core" ,python-social-auth-core) ("python-translate-toolkit" ,python-translate-toolkit) ("python-translation-finder" ,python-translation-finder) ("python-user-agents" ,python-user-agents) ("python-weblate-language-data" ,python-weblate-language-data) ("python-weblate-schemas" ,python-weblate-schemas) ("python-psycopg2" ,python-psycopg2) ("python-mysqlclient" ,python-mysqlclient) ("python-packaging" ,python-packaging) ("python-sentry-sdk" ,python-sentry-sdk) ("python-redis-lock" ,python-redis-lock) ("python-diff-match-patch" ,python-diff-match-patch) ("python-hiredis" ,python-hiredis) ("python-click-repl" ,python-click-repl) ("python-click-didyoumean" ,python-click-didyoumean) ("python-jellyfish" ,python-jellyfish) ("python-ua-parser" ,python-ua-parser) ("python-vine" ,python-vine) ("python-iniparse" ,python-iniparse) ("python-aeidon" ,python-aeidon) ("python-phply" ,python-phply) ("python-whoosh" ,python-whoosh))) (home-page "https://weblate.org/") (synopsis "A web-based continuous localization system with tight version control integration") (description "A web-based continuous localization system with tight version control integration") (license #f))) python-aeidon