import flask import flask_apispec from flask_apispec.extension import FlaskApiSpec from flask_apispec.apidoc import ViewConverter, ResourceConverter class CoreApiSpec(FlaskApiSpec): def __init__( self, app=None, document_options=True, spec=None, version=None, swagger_url=None, swagger_ui_url=None, blueprints=None, ): self._deferred = [] self.app = app self.view_converter = None self.resource_converter = None self.document_options = document_options self.spec = spec self.version = version self.swagger_url = swagger_url self.swagger_ui_url = swagger_ui_url self.blueprints = blueprints if app: self.init_app(app) def init_app(self, app): self.app = app self.add_swagger_routes() self.resource_converter = ResourceConverter( self.app, self.spec, self.document_options ) self.view_converter = ViewConverter( self.app, self.spec, self.document_options ) for deferred in self._deferred: deferred() def add_swagger_routes(self): blueprint = flask.Blueprint( f"flask-apispec-{self.version}", __name__, static_folder=f"{flask_apispec.__path__[0]}/static", template_folder="./templates", static_url_path="/flask-apispec/static", ) blueprint.add_url_rule( self.swagger_url, f"swagger-json-{self.version}", self.swagger_json ) blueprint.add_url_rule( self.swagger_ui_url, "swagger-ui", self.swagger_ui ) self.app.register_blueprint(blueprint) def swagger_ui(self): return flask.render_template("swagger-ui.html", version=self.version) def register_blueprints(self): for blueprint in self.blueprints: self.register_blueprint(blueprint) def register_blueprint(self, blueprint): for path, view_function in self.app.view_functions.items(): if blueprint.name in path: self.register(view_function, blueprint=blueprint.name)