summaryrefslogtreecommitdiff
path: root/gnu/packages
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages')
-rw-r--r--gnu/packages/machine-learning.scm59
-rw-r--r--gnu/packages/patches/libretranslate-use-flasgger.patch79
2 files changed, 138 insertions, 0 deletions
diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
index 54b4704be8c..fc4a506c3db 100644
--- a/gnu/packages/machine-learning.scm
+++ b/gnu/packages/machine-learning.scm
@@ -111,6 +111,7 @@
#:use-module (gnu packages llvm)
#:use-module (gnu packages logging)
#:use-module (gnu packages maths)
+ #:use-module (gnu packages monitoring)
#:use-module (gnu packages mpi)
#:use-module (gnu packages ninja)
#:use-module (gnu packages ocaml)
@@ -6344,6 +6345,64 @@ a Qt interface for Argos Translate.")
for translating plain- and rich-text documents with Argos Translate.")
(license license:agpl3)))
+(define-public libretranslate
+ (package
+ (name "libretranslate")
+ (version "1.9.3")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/LibreTranslate/LibreTranslate")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256 (base32 "14zdcknv7bra41ananqz6b9dmyq46cmbd8a8s00grzli4qkv5xn1"))
+ (patches (search-patches "libretranslate-use-flasgger.patch"))))
+ (build-system pyproject-build-system)
+ (arguments
+ (list
+ #:tests? #f ;all tests depend on Argos models
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'unpin-dependencies
+ (lambda _
+ (substitute* "pyproject.toml"
+ ;; Unpin numpy for transitive dependencies.
+ (("^ \"numpy .+") "")
+ ;; Unpin dependencies.
+ (("^( \"[[:alnum:]-]+) ==.+((;.+)?\",)" all left right)
+ (string-append left right))
+ (("argos-translate-lt") "argostranslate"))))
+ (add-before 'build 'set-home-env
+ (lambda _
+ (setenv "HOME" "/tmp"))))))
+ (inputs (list python-apscheduler
+ python-argostranslate
+ python-argos-translate-files
+ python-expiringdict
+ python-flasgger
+ python-flask
+ python-flask-babel
+ python-flask-limiter
+ python-flask-session
+ python-itsdangerous
+ python-langdetect
+ python-lexilang
+ python-packaging
+ python-polib
+ python-prometheus-client
+ python-redis
+ python-requests
+ python-waitress
+ python-werkzeug))
+ (native-inputs (list python-hatchling))
+ (home-page "https://docs.libretranslate.com")
+ (synopsis "Machine translation API and web interface")
+ (description
+ "LibreTranslate is a machine translation API and web interface,
+powered by the Argos Translate library.")
+ (license license:agpl3)))
+
(define-public python-hmmlearn
(package
(name "python-hmmlearn")
diff --git a/gnu/packages/patches/libretranslate-use-flasgger.patch b/gnu/packages/patches/libretranslate-use-flasgger.patch
new file mode 100644
index 00000000000..c048d29eb27
--- /dev/null
+++ b/gnu/packages/patches/libretranslate-use-flasgger.patch
@@ -0,0 +1,79 @@
+Migrate to Flasgger, as flask-swagger is no longer maintained
+
+Upstream-Status: https://github.com/LibreTranslate/LibreTranslate/pull/943
+
+diff --git a/libretranslate/app.py b/libretranslate/app.py
+index 9793a918b971..9511f2ceea80 100644
+--- a/libretranslate/app.py
++++ b/libretranslate/app.py
+@@ -15,8 +15,7 @@ import argostranslatefiles
+ from argostranslatefiles import get_supported_formats
+ from flask import Blueprint, Flask, Response, abort, jsonify, render_template, request, send_file, url_for, make_response
+ from flask_babel import Babel
+-from flask_swagger import swagger
+-from flask_swagger_ui import get_swaggerui_blueprint
++from flasgger import Swagger
+ from argostranslatefiles.translatehtml import translate_html
+ from werkzeug.exceptions import HTTPException
+ from werkzeug.http import http_date
+@@ -1310,17 +1309,25 @@ def create_app(args):
+
+ limiter.init_app(app)
+
+- swag = swagger(app)
+- swag["basePath"] = args.url_prefix if args.url_prefix != "" else "/"
+- swag["info"]["version"] = get_version()
+- swag["info"]["title"] = "LibreTranslate"
+- swag["info"]["description"] = "Free and Open Source Machine Translation API."
+- swag["info"]["license"] = {"name": "AGPL-3.0"}
++ swagger_config = Swagger.DEFAULT_CONFIG | {
++ "specs": [{"endpoint": "spec", "route": api_url}],
++ "specs_route": "/docs/",
++ }
++ swagger_template = {
++ "basePath": args.url_prefix if args.url_prefix != "" else "/",
++ "info": {
++ "version": get_version(),
++ "title": "LibreTranslate",
++ "description": "Free and Open Source Machine Translation API.",
++ "license": {"name": "AGPL-3.0"},
++ },
++ }
++ swag = Swagger(app, config=swagger_config, template=swagger_template)
+
+ @app.route(api_url)
+ @limiter.exempt
+ def spec():
+- return jsonify(lazy_swag(swag))
++ return jsonify(lazy_swag(swag.get_apispecs()))
+
+ app.config["BABEL_TRANSLATION_DIRECTORIES"] = 'locales'
+
+@@ -1343,12 +1350,6 @@ def create_app(args):
+
+ app.jinja_env.globals.update(_e=gettext_escaped, _h=gettext_html)
+
+- # Call factory function to create our blueprint
+- # The Blueprint is not using url_for which means the middleware does not work properly and we need to manually fix things
+- swaggerui_blueprint = get_swaggerui_blueprint(swagger_url, args.url_prefix + api_url)
+- swaggerui_blueprint.url_prefix = "/docs"
+- app.register_blueprint(swaggerui_blueprint)
+-
+ if os.environ.get("LT_POWERCYCLE") is not None:
+ print("Power cycling...")
+ sys.exit(0)
+diff --git a/pyproject.toml b/pyproject.toml
+index ff1a0a4be8a4..f5f18207365d 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -37,9 +37,8 @@ dynamic = ["version"]
+
+ dependencies = [
+ "argos-translate-lt ==1.12.1",
++ "flasgger ==0.9.7.1",
+ "Flask ==2.2.5",
+- "flask-swagger ==0.2.14",
+- "flask-swagger-ui ==4.11.1",
+ "Flask-Limiter ==2.6.3",
+ "Flask-Babel ==3.1.0",
+ "waitress ==2.1.2",