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",