mirror of
https://github.com/pds-nest/nest.git
synced 2024-11-22 04:54:18 +00:00
Started documentation port to Swagger.
This commit is contained in:
parent
54b7fc29cd
commit
30dccec243
14 changed files with 519 additions and 45 deletions
|
@ -10,6 +10,8 @@ from .gestione import *
|
|||
from flask_cors import CORS
|
||||
from flask_jwt_extended import *
|
||||
from .app import app
|
||||
from api_spec import spec
|
||||
from swagger import swagger_ui_blueprint, SWAGGER_URL
|
||||
|
||||
Base.init_app(app=app)
|
||||
jwt = JWTManager(app)
|
||||
|
@ -25,9 +27,27 @@ app.add_url_rule("/api/v1/users", view_func=page_users, methods=["GET", "POST"])
|
|||
app.add_url_rule("/api/v1/users/<string:email>", view_func=page_user, methods=["GET", "PATCH", "DELETE"])
|
||||
app.add_url_rule("/api/v1/repositories/", view_func=page_repositories, methods=["GET", "POST"])
|
||||
app.add_url_rule("/api/v1/repositories/<int:rid>", view_func=page_repository, methods=["GET", "PATCH", "DELETE"])
|
||||
app.add_url_rule("/api/v1/repositories/<int:rid>/conditions", view_func=page_repository_conditions, methods=["GET", "POST"])
|
||||
app.add_url_rule("/api/v1/repositories/<int:rid>/conditions", view_func=page_repository_conditions,
|
||||
methods=["GET", "POST"])
|
||||
|
||||
app.register_error_handler(Exception, error_handler)
|
||||
app.register_blueprint(swagger_ui_blueprint, url_prefix=SWAGGER_URL)
|
||||
|
||||
|
||||
with app.test_request_context():
|
||||
# register all swagger documented functions here
|
||||
for fn_name in app.view_functions:
|
||||
if fn_name == 'static':
|
||||
continue
|
||||
print(f"Loading swagger docs for function: {fn_name}")
|
||||
view_fn = app.view_functions[fn_name]
|
||||
spec.path(view=view_fn)
|
||||
|
||||
|
||||
@app.route("/api/v1/swagger.json")
|
||||
def create_swagger_doc():
|
||||
return jsonify(spec.to_dict())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
with app.app_context():
|
||||
|
|
38
code/backend/nest_backend/api_schemas.py
Normal file
38
code/backend/nest_backend/api_schemas.py
Normal file
|
@ -0,0 +1,38 @@
|
|||
from marshmallow import Schema, fields
|
||||
|
||||
|
||||
class UserSchema(Schema):
|
||||
email = fields.String(description="The user's email.")
|
||||
username = fields.String(description="The user's username.")
|
||||
isAdmin = fields.Boolean(description="True if the user is an administrator.")
|
||||
|
||||
|
||||
class LoginSchema(Schema):
|
||||
access_token = fields.String(description="The access token that authorizes the user to proceed.")
|
||||
expiration = fields.DateTime(description="The expiration date of the authorization code.")
|
||||
user = fields.Nested(UserSchema)
|
||||
|
||||
|
||||
class InputLoginSchema(Schema):
|
||||
email = fields.String(description="The user's email.")
|
||||
password = fields.String(description="The user's password.")
|
||||
|
||||
|
||||
class ErrorSchema(Schema):
|
||||
result = fields.String(description="Contains a string that informs if the procedure was successful.")
|
||||
msg = fields.String(description="Contains a description of the error.")
|
||||
|
||||
|
||||
class SuccesSchema(Schema):
|
||||
result = fields.String(description="Contains a string that informs if the procedure was successful.")
|
||||
data = fields.String(description="The content of the response.")
|
||||
|
||||
|
||||
class EmailParameterSchema(Schema):
|
||||
email = fields.String(description="The target user's email.")
|
||||
|
||||
|
||||
class CreateUser(Schema):
|
||||
email = fields.String(description="The new user's email.")
|
||||
username = fields.String(description="The new user's username.")
|
||||
password = fields.String(description="The new user's password.")
|
43
code/backend/nest_backend/api_spec.py
Normal file
43
code/backend/nest_backend/api_spec.py
Normal file
|
@ -0,0 +1,43 @@
|
|||
"""OpenAPI v3 Specification"""
|
||||
|
||||
# apispec via OpenAPI
|
||||
from apispec import APISpec
|
||||
from apispec.ext.marshmallow import MarshmallowPlugin
|
||||
from apispec_webframeworks.flask import FlaskPlugin
|
||||
from api_schemas import *
|
||||
|
||||
# Create an APISpec
|
||||
spec = APISpec(
|
||||
title="N.E.S.T.",
|
||||
version="S2-1",
|
||||
openapi_version="3.0.2",
|
||||
plugins=[FlaskPlugin(), MarshmallowPlugin()],
|
||||
)
|
||||
|
||||
|
||||
# register schemas with spec
|
||||
spec.components.schema("Login", schema=LoginSchema)
|
||||
spec.components.schema("Error", schema=ErrorSchema)
|
||||
spec.components.schema("I_Login", schema=InputLoginSchema)
|
||||
spec.components.schema("Success", schema=SuccesSchema)
|
||||
spec.components.schema("EmailParameter", schema=EmailParameterSchema)
|
||||
spec.components.schema("CreateUser", schema=CreateUser)
|
||||
|
||||
# add swagger tags that are used for endpoint annotation
|
||||
tags = [
|
||||
{'name': 'user-related',
|
||||
'description': 'User related calls of the API.'
|
||||
},
|
||||
{'name': 'repository-related',
|
||||
'description': 'Repository related calls of the API.'
|
||||
},
|
||||
{'name': 'admin-only',
|
||||
'description': 'Admin only calls of the API.'
|
||||
},
|
||||
{'name': 'debug',
|
||||
'description': 'Debug only calls of the API.'
|
||||
},
|
||||
]
|
||||
|
||||
for tag in tags:
|
||||
spec.tag(tag)
|
|
@ -3,13 +3,16 @@ Page that displays a message if the server is on
|
|||
"""
|
||||
|
||||
from flask import render_template, abort, jsonify, request
|
||||
from ..database import *
|
||||
from nest_backend.database import *
|
||||
|
||||
|
||||
def page_doa():
|
||||
"""
|
||||
Dead or Alive page. If a client sees this, the server is probably fine.
|
||||
:return: A friendly and calming message, that makes you happy that the server is not on fire.
|
||||
---
|
||||
get:
|
||||
description: Test endpoint. If this page works, the server is fine.
|
||||
tags:
|
||||
- debug
|
||||
"""
|
||||
if request.method == "GET":
|
||||
return "If you see this, the server is fine."
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from flask import render_template, abort, jsonify, request
|
||||
from ...database import *
|
||||
from nest_backend.database import *
|
||||
from flask_jwt_extended import jwt_required
|
||||
from ...gestione import *
|
||||
from nest_backend.gestione import *
|
||||
import datetime
|
||||
from flask_cors import cross_origin
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from flask import render_template, abort, jsonify, request
|
||||
from ...database import *
|
||||
from nest_backend.database import *
|
||||
from flask_jwt_extended import jwt_required
|
||||
from ...gestione import *
|
||||
from nest_backend.gestione import *
|
||||
from flask_cors import cross_origin
|
||||
import datetime
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from flask import render_template, abort, jsonify, request
|
||||
from ...database import *
|
||||
from nest_backend.database import *
|
||||
from flask_jwt_extended import jwt_required
|
||||
from ...gestione import *
|
||||
from nest_backend.gestione import *
|
||||
from flask_cors import cross_origin
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from flask import render_template, abort, jsonify, request
|
||||
from ...database import *
|
||||
from ...gestione import *
|
||||
from nest_backend.database import *
|
||||
from nest_backend.gestione import *
|
||||
from flask_jwt_extended import create_access_token
|
||||
from flask_cors import cross_origin
|
||||
from datetime import timedelta, datetime
|
||||
|
@ -9,8 +9,27 @@ from datetime import timedelta, datetime
|
|||
@cross_origin()
|
||||
def page_login():
|
||||
"""
|
||||
Login:
|
||||
+ POST: email, password -> Sends a response containing the JWT token
|
||||
---
|
||||
post:
|
||||
description: Attempt login.
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema: I_Login
|
||||
responses:
|
||||
'201':
|
||||
description: Login successful, user authorized. The schema is incapsulated in Success.
|
||||
content:
|
||||
application/json:
|
||||
schema: Login
|
||||
'401':
|
||||
description: User not authorized.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
tags:
|
||||
- user-related
|
||||
"""
|
||||
email = request.json.get("email", None)
|
||||
password = request.json.get("password", None)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from flask import render_template, abort, jsonify, request
|
||||
from ...database import *
|
||||
from nest_backend.database import *
|
||||
from flask_jwt_extended import jwt_required
|
||||
from ...gestione import *
|
||||
from nest_backend.gestione import *
|
||||
from flask_cors import cross_origin
|
||||
|
||||
|
||||
|
@ -9,10 +9,107 @@ from flask_cors import cross_origin
|
|||
@jwt_required()
|
||||
def page_user(email):
|
||||
"""
|
||||
User <email>:
|
||||
+ GET: gets info about the specified user.
|
||||
+ PATCH: password, username -> Updates data about the user, returns the updated user.
|
||||
+ DELETE: deletes the specified user.
|
||||
---
|
||||
get:
|
||||
description: Get details about a user.
|
||||
parameters:
|
||||
- in: path
|
||||
schema: EmailParameterSchema
|
||||
|
||||
responses:
|
||||
'200':
|
||||
description: The details about the requested user. The schema is incapsulated in Success.
|
||||
content:
|
||||
application/json:
|
||||
schema: User
|
||||
'404':
|
||||
description: Could not find the requested user.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
'403':
|
||||
description: The user is not authorized.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
'401':
|
||||
description: The user is not logged in.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
tags:
|
||||
- user-related
|
||||
delete:
|
||||
description: Deletes a user.
|
||||
parameters:
|
||||
- in: path
|
||||
schema: EmailParameterSchema
|
||||
|
||||
responses:
|
||||
'200':
|
||||
description: The user has been deleted successfully.
|
||||
'404':
|
||||
description: Could not find the requested user.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
'403':
|
||||
description: The user is not authorized.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
'406':
|
||||
description: The user tried to delete himself.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
'500':
|
||||
description: Something went wrong while trying to delete the user.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
'401':
|
||||
description: The user is not logged in.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
tags:
|
||||
- user-related
|
||||
- admin-only
|
||||
patch:
|
||||
description: Updates a user.
|
||||
parameters:
|
||||
- in: path
|
||||
schema: EmailParameterSchema
|
||||
|
||||
responses:
|
||||
'200':
|
||||
description: The user has been updated successfully.
|
||||
content:
|
||||
application/json:
|
||||
schema: User
|
||||
'404':
|
||||
description: Could not find the requested user.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
'403':
|
||||
description: The user is not authorized.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
'406':
|
||||
description: The user tried to delete himself.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
'401':
|
||||
description: The user is not logged in.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
tags:
|
||||
- user-related
|
||||
"""
|
||||
user = find_user(get_jwt_identity())
|
||||
target = find_user(email)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from flask import render_template, abort, jsonify, request
|
||||
from ...database import *
|
||||
from nest_backend.database import *
|
||||
from flask_jwt_extended import jwt_required
|
||||
from ...gestione import *
|
||||
from nest_backend.gestione import *
|
||||
from flask_cors import cross_origin
|
||||
|
||||
|
||||
|
@ -9,9 +9,51 @@ from flask_cors import cross_origin
|
|||
@jwt_required()
|
||||
def page_users():
|
||||
"""
|
||||
Users:
|
||||
+ GET: gets info about all the users of the platform. Requires the user to be admin.
|
||||
+ POST: email, password, username -> Creates a new user and returns it. Requires the user to be admin.
|
||||
---
|
||||
get:
|
||||
description: Get a list of users.
|
||||
responses:
|
||||
'200':
|
||||
description: A list of User schemas, incapsulated in Success.
|
||||
'403':
|
||||
description: The user is not authorized.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
'401':
|
||||
description: The user is not logged in.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
tags:
|
||||
- user-related
|
||||
- admin-only
|
||||
post:
|
||||
description: Creates a user.
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema: CreateUser
|
||||
responses:
|
||||
'200':
|
||||
description: The user has been created successfully.
|
||||
content:
|
||||
application/json:
|
||||
schema: User
|
||||
'403':
|
||||
description: The user is not authorized.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
'401':
|
||||
description: The user is not logged in.
|
||||
content:
|
||||
application/json:
|
||||
schema: Error
|
||||
tags:
|
||||
- user-related
|
||||
- admin-only
|
||||
"""
|
||||
user = find_user(get_jwt_identity())
|
||||
if request.method == "GET":
|
||||
|
|
15
code/backend/nest_backend/swagger.py
Normal file
15
code/backend/nest_backend/swagger.py
Normal file
|
@ -0,0 +1,15 @@
|
|||
"""Definition of the Swagger UI Blueprint."""
|
||||
|
||||
from flask_swagger_ui import get_swaggerui_blueprint
|
||||
|
||||
SWAGGER_URL = '/api/v1/docs'
|
||||
API_URL = "/api/v1/swagger.json"
|
||||
|
||||
# Call factory function to create our blueprint
|
||||
swagger_ui_blueprint = get_swaggerui_blueprint(
|
||||
SWAGGER_URL,
|
||||
API_URL,
|
||||
config={
|
||||
'app_name': "N.E.S.T."
|
||||
}
|
||||
)
|
|
@ -0,0 +1,4 @@
|
|||
from openapi_spec_validator import validate_spec_url
|
||||
import os
|
||||
|
||||
validate_spec_url("http://localhost:5000/api/v1/swagger.json")
|
228
code/backend/poetry.lock
generated
228
code/backend/poetry.lock
generated
|
@ -6,6 +6,41 @@ category = "main"
|
|||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "apispec"
|
||||
version = "4.4.0"
|
||||
description = "A pluggable API specification generator. Currently supports the OpenAPI Specification (f.k.a. the Swagger specification)."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
PyYAML = {version = ">=3.10", optional = true, markers = "extra == \"yaml\""}
|
||||
|
||||
[package.extras]
|
||||
dev = ["PyYAML (>=3.10)", "prance[osv] (>=0.11)", "marshmallow (>=3.0.0)", "pytest", "mock", "flake8 (==3.9.0)", "flake8-bugbear (==21.3.2)", "pre-commit (>=2.4,<3.0)", "tox"]
|
||||
docs = ["marshmallow (>=3.0.0)", "pyyaml (==5.4.1)", "sphinx (==3.5.3)", "sphinx-issues (==1.2.0)", "sphinx-rtd-theme (==0.5.1)"]
|
||||
lint = ["flake8 (==3.9.0)", "flake8-bugbear (==21.3.2)", "pre-commit (>=2.4,<3.0)"]
|
||||
tests = ["PyYAML (>=3.10)", "prance[osv] (>=0.11)", "marshmallow (>=3.0.0)", "pytest", "mock"]
|
||||
validation = ["prance[osv] (>=0.11)"]
|
||||
yaml = ["PyYAML (>=3.10)"]
|
||||
|
||||
[[package]]
|
||||
name = "apispec-webframeworks"
|
||||
version = "0.5.2"
|
||||
description = "Web framework plugins for apispec."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
apispec = {version = ">=2.0.0", extras = ["yaml"]}
|
||||
|
||||
[package.extras]
|
||||
dev = ["pytest", "mock", "Flask (==1.1.1)", "tornado", "bottle (==0.12.17)", "flake8 (==3.7.9)", "flake8-bugbear (==19.8.0)", "pre-commit (>=1.18,<2.0)", "tox"]
|
||||
lint = ["flake8 (==3.7.9)", "flake8-bugbear (==19.8.0)", "pre-commit (>=1.18,<2.0)"]
|
||||
tests = ["pytest", "mock", "Flask (==1.1.1)", "tornado", "bottle (==0.12.17)"]
|
||||
|
||||
[[package]]
|
||||
name = "atomicwrites"
|
||||
version = "1.4.0"
|
||||
|
@ -165,6 +200,17 @@ python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*"
|
|||
Flask = ">=0.10"
|
||||
SQLAlchemy = ">=0.8.0"
|
||||
|
||||
[[package]]
|
||||
name = "flask-swagger-ui"
|
||||
version = "3.36.0"
|
||||
description = "Swagger UI blueprint for Flask"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[package.dependencies]
|
||||
flask = "*"
|
||||
|
||||
[[package]]
|
||||
name = "greenlet"
|
||||
version = "1.0.0"
|
||||
|
@ -200,6 +246,17 @@ category = "main"
|
|||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "isodate"
|
||||
version = "0.6.0"
|
||||
description = "An ISO 8601 date/time/duration parser and formatter"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[package.dependencies]
|
||||
six = "*"
|
||||
|
||||
[[package]]
|
||||
name = "itsdangerous"
|
||||
version = "1.1.0"
|
||||
|
@ -222,6 +279,23 @@ MarkupSafe = ">=0.23"
|
|||
[package.extras]
|
||||
i18n = ["Babel (>=0.8)"]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema"
|
||||
version = "3.2.0"
|
||||
description = "An implementation of JSON Schema validation for Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[package.dependencies]
|
||||
attrs = ">=17.4.0"
|
||||
pyrsistent = ">=0.14.0"
|
||||
six = ">=1.11.0"
|
||||
|
||||
[package.extras]
|
||||
format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"]
|
||||
format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"]
|
||||
|
||||
[[package]]
|
||||
name = "markupsafe"
|
||||
version = "1.1.1"
|
||||
|
@ -230,6 +304,56 @@ category = "main"
|
|||
optional = false
|
||||
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
|
||||
|
||||
[[package]]
|
||||
name = "marshmallow"
|
||||
version = "3.11.1"
|
||||
description = "A lightweight library for converting complex datatypes to and from native Python datatypes."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
|
||||
[package.extras]
|
||||
dev = ["pytest", "pytz", "simplejson", "mypy (==0.812)", "flake8 (==3.9.0)", "flake8-bugbear (==21.3.2)", "pre-commit (>=2.4,<3.0)", "tox"]
|
||||
docs = ["sphinx (==3.4.3)", "sphinx-issues (==1.2.0)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.2)"]
|
||||
lint = ["mypy (==0.812)", "flake8 (==3.9.0)", "flake8-bugbear (==21.3.2)", "pre-commit (>=2.4,<3.0)"]
|
||||
tests = ["pytest", "pytz", "simplejson"]
|
||||
|
||||
[[package]]
|
||||
name = "openapi-schema-validator"
|
||||
version = "0.1.5"
|
||||
description = "OpenAPI schema validation for Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*, != 3.4.*"
|
||||
|
||||
[package.dependencies]
|
||||
isodate = "*"
|
||||
jsonschema = ">=3.0.0"
|
||||
six = "*"
|
||||
|
||||
[package.extras]
|
||||
isodate = ["isodate"]
|
||||
rfc3339_validator = ["rfc3339-validator"]
|
||||
strict_rfc3339 = ["strict-rfc3339"]
|
||||
|
||||
[[package]]
|
||||
name = "openapi-spec-validator"
|
||||
version = "0.3.0"
|
||||
description = "OpenAPI 2.0 (aka Swagger) and OpenAPI 3.0.0 spec validator"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*, != 3.4.*"
|
||||
|
||||
[package.dependencies]
|
||||
jsonschema = "*"
|
||||
openapi-schema-validator = "*"
|
||||
PyYAML = ">=5.1"
|
||||
six = "*"
|
||||
|
||||
[package.extras]
|
||||
dev = ["pre-commit"]
|
||||
requests = ["requests"]
|
||||
|
||||
[[package]]
|
||||
name = "packaging"
|
||||
version = "20.9"
|
||||
|
@ -306,6 +430,14 @@ category = "main"
|
|||
optional = false
|
||||
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||
|
||||
[[package]]
|
||||
name = "pyrsistent"
|
||||
version = "0.17.3"
|
||||
description = "Persistent/Functional/Immutable data structures"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
|
||||
[[package]]
|
||||
name = "pytest"
|
||||
version = "6.2.3"
|
||||
|
@ -335,6 +467,14 @@ category = "main"
|
|||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "pyyaml"
|
||||
version = "5.4.1"
|
||||
description = "YAML parser and emitter for Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
|
||||
|
||||
[[package]]
|
||||
name = "requests"
|
||||
version = "2.25.1"
|
||||
|
@ -538,13 +678,21 @@ watchdog = ["watchdog"]
|
|||
[metadata]
|
||||
lock-version = "1.1"
|
||||
python-versions = "^3.8.5"
|
||||
content-hash = "fa0a1f052a315def10757e0cec6bb2d820303516b897dc06ef9ea642b59a8868"
|
||||
content-hash = "5586fec5bac7bcbab72701dad5dd9a3df035093c3f590e1ffa96d254421e0a68"
|
||||
|
||||
[metadata.files]
|
||||
alabaster = [
|
||||
{file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"},
|
||||
{file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"},
|
||||
]
|
||||
apispec = [
|
||||
{file = "apispec-4.4.0-py2.py3-none-any.whl", hash = "sha256:042096b2e7e1cc15548497e46691718e762296429672d6d68c13389b3c10bfaf"},
|
||||
{file = "apispec-4.4.0.tar.gz", hash = "sha256:6288b62bf35930fbe33049dc3242a0c48a09f214a196331cae4585af8f5bc95c"},
|
||||
]
|
||||
apispec-webframeworks = [
|
||||
{file = "apispec-webframeworks-0.5.2.tar.gz", hash = "sha256:0db35b267914b3f8c562aca0261957dbcb4176f255eacc22520277010818dcf3"},
|
||||
{file = "apispec_webframeworks-0.5.2-py2.py3-none-any.whl", hash = "sha256:482c563abbcc2a261439476cb3f1a7c7284cc997c322c574d48c111643e9c04e"},
|
||||
]
|
||||
atomicwrites = [
|
||||
{file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
|
||||
{file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
|
||||
|
@ -641,6 +789,9 @@ flask-sqlalchemy = [
|
|||
{file = "Flask-SQLAlchemy-2.5.1.tar.gz", hash = "sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912"},
|
||||
{file = "Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl", hash = "sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390"},
|
||||
]
|
||||
flask-swagger-ui = [
|
||||
{file = "flask-swagger-ui-3.36.0.tar.gz", hash = "sha256:f329752a65b2940ada8eeb57bce613f7c0a12856a9c31063bb9e33798554c9ed"},
|
||||
]
|
||||
greenlet = [
|
||||
{file = "greenlet-1.0.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:1d1d4473ecb1c1d31ce8fd8d91e4da1b1f64d425c1dc965edc4ed2a63cfa67b2"},
|
||||
{file = "greenlet-1.0.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:cfd06e0f0cc8db2a854137bd79154b61ecd940dce96fad0cba23fe31de0b793c"},
|
||||
|
@ -698,6 +849,10 @@ iniconfig = [
|
|||
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
||||
{file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
|
||||
]
|
||||
isodate = [
|
||||
{file = "isodate-0.6.0-py2.py3-none-any.whl", hash = "sha256:aa4d33c06640f5352aca96e4b81afd8ab3b47337cc12089822d6f322ac772c81"},
|
||||
{file = "isodate-0.6.0.tar.gz", hash = "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8"},
|
||||
]
|
||||
itsdangerous = [
|
||||
{file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"},
|
||||
{file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"},
|
||||
|
@ -706,6 +861,10 @@ jinja2 = [
|
|||
{file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"},
|
||||
{file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"},
|
||||
]
|
||||
jsonschema = [
|
||||
{file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"},
|
||||
{file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"},
|
||||
]
|
||||
markupsafe = [
|
||||
{file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"},
|
||||
{file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"},
|
||||
|
@ -725,41 +884,36 @@ markupsafe = [
|
|||
{file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"},
|
||||
{file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"},
|
||||
{file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"},
|
||||
{file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"},
|
||||
{file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"},
|
||||
{file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"},
|
||||
{file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"},
|
||||
{file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"},
|
||||
{file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"},
|
||||
{file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"},
|
||||
{file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"},
|
||||
{file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"},
|
||||
{file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"},
|
||||
{file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"},
|
||||
{file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"},
|
||||
{file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"},
|
||||
{file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"},
|
||||
{file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"},
|
||||
{file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"},
|
||||
{file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"},
|
||||
{file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"},
|
||||
{file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"},
|
||||
{file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"},
|
||||
{file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"},
|
||||
{file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"},
|
||||
{file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"},
|
||||
{file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"},
|
||||
{file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"},
|
||||
{file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"},
|
||||
{file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"},
|
||||
{file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"},
|
||||
{file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"},
|
||||
{file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"},
|
||||
{file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"},
|
||||
{file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"},
|
||||
{file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"},
|
||||
{file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"},
|
||||
]
|
||||
marshmallow = [
|
||||
{file = "marshmallow-3.11.1-py2.py3-none-any.whl", hash = "sha256:0dd42891a5ef288217ed6410917f3c6048f585f8692075a0052c24f9bfff9dfd"},
|
||||
{file = "marshmallow-3.11.1.tar.gz", hash = "sha256:16e99cb7f630c0ef4d7d364ed0109ac194268dde123966076ab3dafb9ae3906b"},
|
||||
]
|
||||
openapi-schema-validator = [
|
||||
{file = "openapi-schema-validator-0.1.5.tar.gz", hash = "sha256:a4b2712020284cee880b4c55faa513fbc2f8f07f365deda6098f8ab943c9f0df"},
|
||||
{file = "openapi_schema_validator-0.1.5-py2-none-any.whl", hash = "sha256:215b516d0942f4e8e2446cf3f7d4ff2ed71d102ebddcc30526d8a3f706ab1df6"},
|
||||
{file = "openapi_schema_validator-0.1.5-py3-none-any.whl", hash = "sha256:b65d6c2242620bfe76d4c749b61cd9657e4528895a8f4fb6f916085b508ebd24"},
|
||||
]
|
||||
openapi-spec-validator = [
|
||||
{file = "openapi-spec-validator-0.3.0.tar.gz", hash = "sha256:53ba3d884e98ff2062d5ada025aa590541dcd665b8f81067dc82dd61c0923759"},
|
||||
{file = "openapi_spec_validator-0.3.0-py2-none-any.whl", hash = "sha256:e11df7c559339027bd04f2399bc82474983129a6a7a6a0421eaa95e2c844d686"},
|
||||
{file = "openapi_spec_validator-0.3.0-py3-none-any.whl", hash = "sha256:4083fc5aac3e9f751c2a82d4ec5cf3adad5f967d0faf31495d8b56a0b0f9705c"},
|
||||
]
|
||||
packaging = [
|
||||
{file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"},
|
||||
{file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"},
|
||||
|
@ -825,6 +979,9 @@ pyparsing = [
|
|||
{file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
|
||||
{file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
|
||||
]
|
||||
pyrsistent = [
|
||||
{file = "pyrsistent-0.17.3.tar.gz", hash = "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e"},
|
||||
]
|
||||
pytest = [
|
||||
{file = "pytest-6.2.3-py3-none-any.whl", hash = "sha256:6ad9c7bdf517a808242b998ac20063c41532a570d088d77eec1ee12b0b5574bc"},
|
||||
{file = "pytest-6.2.3.tar.gz", hash = "sha256:671238a46e4df0f3498d1c3270e5deb9b32d25134c99b7d75370a68cfbe9b634"},
|
||||
|
@ -833,6 +990,37 @@ pytz = [
|
|||
{file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"},
|
||||
{file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"},
|
||||
]
|
||||
pyyaml = [
|
||||
{file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"},
|
||||
{file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"},
|
||||
{file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"},
|
||||
{file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"},
|
||||
{file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"},
|
||||
{file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"},
|
||||
{file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"},
|
||||
{file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"},
|
||||
{file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"},
|
||||
{file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"},
|
||||
{file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"},
|
||||
{file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"},
|
||||
{file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"},
|
||||
{file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"},
|
||||
{file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"},
|
||||
{file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"},
|
||||
{file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"},
|
||||
{file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"},
|
||||
{file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"},
|
||||
{file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"},
|
||||
{file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"},
|
||||
{file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"},
|
||||
{file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"},
|
||||
{file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"},
|
||||
{file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"},
|
||||
{file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"},
|
||||
{file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"},
|
||||
{file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"},
|
||||
{file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"},
|
||||
]
|
||||
requests = [
|
||||
{file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"},
|
||||
{file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"},
|
||||
|
|
|
@ -15,6 +15,11 @@ Flask-Cors = "^3.0.10"
|
|||
pytest = "^6.2.3"
|
||||
requests = "^2.25.1"
|
||||
Sphinx = "^3.5.4"
|
||||
apispec = "^4.4.0"
|
||||
apispec-webframeworks = "^0.5.2"
|
||||
marshmallow = "^3.11.1"
|
||||
openapi-spec-validator = "^0.3.0"
|
||||
flask-swagger-ui = "^3.36.0"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
|
||||
|
|
Loading…
Reference in a new issue