sanic-api 0.2.5__py3-none-any.whl → 0.2.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- example/__main__.py +19 -19
- example/api/__init__.py +1 -1
- example/api/t1/__init__.py +2 -1
- example/api/t1/{t1.py → t1_1.py} +22 -22
- example/api/t1/t1_2.py +9 -0
- example/api/t2/__init__.py +1 -1
- example/api/t2/t2.py +9 -9
- example/api/t2/t3/__init__.py +1 -1
- example/api/t2/t3/t3.py +9 -9
- example/api/user.py +89 -89
- example/api/validator.py +97 -97
- example/app.py +62 -62
- example/settings.py +10 -10
- sanic_api/__init__.py +21 -21
- sanic_api/api/__init__.py +2 -2
- sanic_api/api/api.py +177 -177
- sanic_api/api/exception.py +46 -46
- sanic_api/api/extend.py +25 -25
- sanic_api/api/handle_exception.py +61 -61
- sanic_api/api/model.py +45 -45
- sanic_api/api/validators.py +76 -76
- sanic_api/config/__init__.py +2 -2
- sanic_api/config/base.py +110 -110
- sanic_api/config/sanic.py +19 -21
- sanic_api/config/sanic_api.py +11 -13
- sanic_api/config/setting.py +30 -30
- sanic_api/enum.py +88 -88
- sanic_api/logger/__init__.py +1 -1
- sanic_api/logger/config.py +77 -77
- sanic_api/logger/extend.py +71 -71
- sanic_api/logger/sanic_http.py +68 -68
- sanic_api/openapi/__init__.py +7 -7
- sanic_api/openapi/openapi.py +102 -102
- sanic_api/utils.py +112 -97
- {sanic_api-0.2.5.dist-info → sanic_api-0.2.7.dist-info}/METADATA +4 -3
- sanic_api-0.2.7.dist-info/RECORD +39 -0
- sanic_api-0.2.7.dist-info/WHEEL +4 -0
- sanic_api-0.2.5.dist-info/RECORD +0 -38
- sanic_api-0.2.5.dist-info/WHEEL +0 -4
- {sanic_api-0.2.5.dist-info → sanic_api-0.2.7.dist-info}/licenses/LICENSE.txt +0 -0
sanic_api/openapi/openapi.py
CHANGED
@@ -1,102 +1,102 @@
|
|
1
|
-
from pydantic import BaseModel
|
2
|
-
from sanic import Sanic
|
3
|
-
from sanic_ext.extensions.openapi.builders import (
|
4
|
-
OperationBuilder,
|
5
|
-
OperationStore,
|
6
|
-
SpecificationBuilder,
|
7
|
-
)
|
8
|
-
from sanic_ext.extensions.openapi.definitions import Schema
|
9
|
-
from sanic_ext.extensions.openapi.types import Array, Object
|
10
|
-
from sanic_ext.utils.route import get_all_routes
|
11
|
-
|
12
|
-
from sanic_api.api import API
|
13
|
-
from sanic_api.api.model import ListRespModel
|
14
|
-
from sanic_api.api.validators import get_handler_param
|
15
|
-
|
16
|
-
|
17
|
-
# noinspection PyProtectedMember
|
18
|
-
def auto_doc(app: Sanic):
|
19
|
-
config = app.config
|
20
|
-
specification = SpecificationBuilder()
|
21
|
-
|
22
|
-
for (
|
23
|
-
uri,
|
24
|
-
route_name,
|
25
|
-
_route_parameters,
|
26
|
-
method_handlers,
|
27
|
-
_host,
|
28
|
-
) in get_all_routes(app, config.OAS_URL_PREFIX):
|
29
|
-
uri = uri if uri == "/" else uri.rstrip("/")
|
30
|
-
|
31
|
-
for method, _handler in method_handlers:
|
32
|
-
if (
|
33
|
-
(method == "OPTIONS" and app.config.OAS_IGNORE_OPTIONS)
|
34
|
-
or (method == "HEAD" and app.config.OAS_IGNORE_HEAD)
|
35
|
-
or method == "TRACE"
|
36
|
-
):
|
37
|
-
continue
|
38
|
-
|
39
|
-
if hasattr(_handler, "view_class"):
|
40
|
-
_handler = getattr(_handler.view_class, method.lower())
|
41
|
-
operation: OperationBuilder = OperationStore()[_handler]
|
42
|
-
|
43
|
-
if operation._exclude or "openapi" in operation.tags:
|
44
|
-
continue
|
45
|
-
|
46
|
-
api_cls = get_handler_param(_handler)
|
47
|
-
if not api_cls:
|
48
|
-
continue
|
49
|
-
|
50
|
-
api: API = api_cls()
|
51
|
-
|
52
|
-
# 读取蓝图上面的 blueprint.ctx.desc 属性来代替name设置中文tag名
|
53
|
-
if len(route_name.split(".")) > 1:
|
54
|
-
blueprint = app.blueprints[route_name.split(".")[0]]
|
55
|
-
blueprint.ctx.desc = blueprint.ctx.desc or blueprint.name
|
56
|
-
api.tags.insert(0, blueprint.ctx.desc)
|
57
|
-
|
58
|
-
# 设置接口的标签和描述
|
59
|
-
tags = set(api.tags)
|
60
|
-
operation.tag(*tags)
|
61
|
-
tags_str = " ".join([f"[{tag}](/docs#tag/{tag})" for tag in tags])
|
62
|
-
operation.describe(description=f"### 标签: {tags_str}\n{api.description}")
|
63
|
-
|
64
|
-
if api.json_req_type:
|
65
|
-
body_type = api.json_req_type
|
66
|
-
mine_type = "application/json"
|
67
|
-
elif api.form_req_type:
|
68
|
-
body_type = api.form_req_type
|
69
|
-
mine_type = "application/x-www-form-urlencoded"
|
70
|
-
else:
|
71
|
-
body_type, mine_type, body_dict = ["", "", {}]
|
72
|
-
|
73
|
-
if body_type:
|
74
|
-
body_schema: dict = body_type.schema(ref_template="#/components/schemas/{model}")
|
75
|
-
body_dict = {
|
76
|
-
mine_type: Object(body_schema["properties"]),
|
77
|
-
}
|
78
|
-
for model_name, schema_model in body_schema.get("definitions", {}).items():
|
79
|
-
specification.add_component("schemas", model_name, schema_model)
|
80
|
-
body_dict[mine_type]._fields["required"] = body_schema.get("required", [])
|
81
|
-
operation.body(body_dict)
|
82
|
-
|
83
|
-
if api.query_req_type:
|
84
|
-
for k, v in api.query_req_type.schema()["properties"].items(): # type: (str, dict)
|
85
|
-
operation.parameter(k, Schema(**v))
|
86
|
-
|
87
|
-
if api.response_type and issubclass(api.response_type, BaseModel):
|
88
|
-
resp_schema = api.response_type.schema(ref_template="#/components/schemas/{model}")
|
89
|
-
schema: Schema = Object(resp_schema["properties"])
|
90
|
-
if issubclass(api.response_type, ListRespModel):
|
91
|
-
schema = Array(schema)
|
92
|
-
for model_name, schema_model in resp_schema.get("definitions", {}).items():
|
93
|
-
specification.add_component("schemas", model_name, schema_model)
|
94
|
-
operation.response(
|
95
|
-
status=200,
|
96
|
-
content={"application/json": schema},
|
97
|
-
description="成功",
|
98
|
-
)
|
99
|
-
specification.add_component("schemas", api.response_type.__name__, schema)
|
100
|
-
|
101
|
-
operation._app = app
|
102
|
-
specification.operation(uri, method, operation)
|
1
|
+
from pydantic import BaseModel
|
2
|
+
from sanic import Sanic
|
3
|
+
from sanic_ext.extensions.openapi.builders import (
|
4
|
+
OperationBuilder,
|
5
|
+
OperationStore,
|
6
|
+
SpecificationBuilder,
|
7
|
+
)
|
8
|
+
from sanic_ext.extensions.openapi.definitions import Schema
|
9
|
+
from sanic_ext.extensions.openapi.types import Array, Object
|
10
|
+
from sanic_ext.utils.route import get_all_routes
|
11
|
+
|
12
|
+
from sanic_api.api import API
|
13
|
+
from sanic_api.api.model import ListRespModel
|
14
|
+
from sanic_api.api.validators import get_handler_param
|
15
|
+
|
16
|
+
|
17
|
+
# noinspection PyProtectedMember
|
18
|
+
def auto_doc(app: Sanic):
|
19
|
+
config = app.config
|
20
|
+
specification = SpecificationBuilder()
|
21
|
+
|
22
|
+
for (
|
23
|
+
uri,
|
24
|
+
route_name,
|
25
|
+
_route_parameters,
|
26
|
+
method_handlers,
|
27
|
+
_host,
|
28
|
+
) in get_all_routes(app, config.OAS_URL_PREFIX):
|
29
|
+
uri = uri if uri == "/" else uri.rstrip("/")
|
30
|
+
|
31
|
+
for method, _handler in method_handlers:
|
32
|
+
if (
|
33
|
+
(method == "OPTIONS" and app.config.OAS_IGNORE_OPTIONS)
|
34
|
+
or (method == "HEAD" and app.config.OAS_IGNORE_HEAD)
|
35
|
+
or method == "TRACE"
|
36
|
+
):
|
37
|
+
continue
|
38
|
+
|
39
|
+
if hasattr(_handler, "view_class"):
|
40
|
+
_handler = getattr(_handler.view_class, method.lower())
|
41
|
+
operation: OperationBuilder = OperationStore()[_handler]
|
42
|
+
|
43
|
+
if operation._exclude or "openapi" in operation.tags:
|
44
|
+
continue
|
45
|
+
|
46
|
+
api_cls = get_handler_param(_handler)
|
47
|
+
if not api_cls:
|
48
|
+
continue
|
49
|
+
|
50
|
+
api: API = api_cls()
|
51
|
+
|
52
|
+
# 读取蓝图上面的 blueprint.ctx.desc 属性来代替name设置中文tag名
|
53
|
+
if len(route_name.split(".")) > 1:
|
54
|
+
blueprint = app.blueprints[route_name.split(".")[0]]
|
55
|
+
blueprint.ctx.desc = blueprint.ctx.desc or blueprint.name
|
56
|
+
api.tags.insert(0, blueprint.ctx.desc)
|
57
|
+
|
58
|
+
# 设置接口的标签和描述
|
59
|
+
tags = set(api.tags)
|
60
|
+
operation.tag(*tags)
|
61
|
+
tags_str = " ".join([f"[{tag}](/docs#tag/{tag})" for tag in tags])
|
62
|
+
operation.describe(description=f"### 标签: {tags_str}\n{api.description}")
|
63
|
+
|
64
|
+
if api.json_req_type:
|
65
|
+
body_type = api.json_req_type
|
66
|
+
mine_type = "application/json"
|
67
|
+
elif api.form_req_type:
|
68
|
+
body_type = api.form_req_type
|
69
|
+
mine_type = "application/x-www-form-urlencoded"
|
70
|
+
else:
|
71
|
+
body_type, mine_type, body_dict = ["", "", {}]
|
72
|
+
|
73
|
+
if body_type:
|
74
|
+
body_schema: dict = body_type.schema(ref_template="#/components/schemas/{model}")
|
75
|
+
body_dict = {
|
76
|
+
mine_type: Object(body_schema["properties"]),
|
77
|
+
}
|
78
|
+
for model_name, schema_model in body_schema.get("definitions", {}).items():
|
79
|
+
specification.add_component("schemas", model_name, schema_model)
|
80
|
+
body_dict[mine_type]._fields["required"] = body_schema.get("required", [])
|
81
|
+
operation.body(body_dict)
|
82
|
+
|
83
|
+
if api.query_req_type:
|
84
|
+
for k, v in api.query_req_type.schema()["properties"].items(): # type: (str, dict)
|
85
|
+
operation.parameter(k, Schema(**v))
|
86
|
+
|
87
|
+
if api.response_type and issubclass(api.response_type, BaseModel):
|
88
|
+
resp_schema = api.response_type.schema(ref_template="#/components/schemas/{model}")
|
89
|
+
schema: Schema = Object(resp_schema["properties"])
|
90
|
+
if issubclass(api.response_type, ListRespModel):
|
91
|
+
schema = Array(schema)
|
92
|
+
for model_name, schema_model in resp_schema.get("definitions", {}).items():
|
93
|
+
specification.add_component("schemas", model_name, schema_model)
|
94
|
+
operation.response(
|
95
|
+
status=200,
|
96
|
+
content={"application/json": schema},
|
97
|
+
description="成功",
|
98
|
+
)
|
99
|
+
specification.add_component("schemas", api.response_type.__name__, schema)
|
100
|
+
|
101
|
+
operation._app = app
|
102
|
+
specification.operation(uri, method, operation)
|
sanic_api/utils.py
CHANGED
@@ -1,97 +1,112 @@
|
|
1
|
-
from decimal import Decimal
|
2
|
-
from importlib import import_module
|
3
|
-
from
|
4
|
-
from
|
5
|
-
|
6
|
-
|
7
|
-
import
|
8
|
-
from sanic import
|
9
|
-
from sanic.
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
)
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
#
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
#
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
#
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
#
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
for
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
blueprint_group
|
96
|
-
|
97
|
-
|
1
|
+
from decimal import Decimal
|
2
|
+
from importlib import import_module
|
3
|
+
from pathlib import Path
|
4
|
+
from typing import Dict, List, Optional
|
5
|
+
|
6
|
+
import orjson
|
7
|
+
from sanic import Blueprint, Request, Sanic
|
8
|
+
from sanic.blueprint_group import BlueprintGroup
|
9
|
+
from sanic.exceptions import ServerError as SanicServerError
|
10
|
+
|
11
|
+
|
12
|
+
def getpath_by_root(path: str) -> Path:
|
13
|
+
"""
|
14
|
+
根据根目录获取路径
|
15
|
+
基于 os.getcwd() 的同级路径、父目录来获取
|
16
|
+
Args:
|
17
|
+
path: 相对server的子路径
|
18
|
+
|
19
|
+
Returns:
|
20
|
+
完整路径
|
21
|
+
"""
|
22
|
+
return (Path.cwd() / path).absolute()
|
23
|
+
|
24
|
+
|
25
|
+
def json_dumps(data: dict, default=None) -> str:
|
26
|
+
"""
|
27
|
+
调用orjson进行dumps
|
28
|
+
Args:
|
29
|
+
data: 数据
|
30
|
+
default: 数量处理方法
|
31
|
+
|
32
|
+
Returns:
|
33
|
+
返回json字符串
|
34
|
+
"""
|
35
|
+
|
36
|
+
def _default(item):
|
37
|
+
if isinstance(item, Decimal):
|
38
|
+
return float(item.to_eng_string())
|
39
|
+
|
40
|
+
json_bytes = orjson.dumps(
|
41
|
+
data,
|
42
|
+
default=default or _default,
|
43
|
+
option=orjson.OPT_APPEND_NEWLINE | orjson.OPT_INDENT_2,
|
44
|
+
)
|
45
|
+
return json_bytes.decode("utf-8")
|
46
|
+
|
47
|
+
|
48
|
+
def get_current_request() -> Optional[Request]:
|
49
|
+
""" "
|
50
|
+
获取当前请求
|
51
|
+
"""
|
52
|
+
try:
|
53
|
+
return Request.get_current()
|
54
|
+
except SanicServerError:
|
55
|
+
return None
|
56
|
+
|
57
|
+
|
58
|
+
def auto_blueprint(sanic_app: Sanic, base_api_module_name: str) -> None:
|
59
|
+
"""
|
60
|
+
自动生成蓝图
|
61
|
+
Args:
|
62
|
+
sanic_app: app
|
63
|
+
base_api_module_name: api层模块名称
|
64
|
+
|
65
|
+
Returns:
|
66
|
+
|
67
|
+
"""
|
68
|
+
# 导入base_api_module_name模块并获取其文件夹路径
|
69
|
+
base_api_dir: Path = Path.cwd() / base_api_module_name
|
70
|
+
|
71
|
+
# 创建根API蓝图组
|
72
|
+
root_group: BlueprintGroup = BlueprintGroup(base_api_module_name)
|
73
|
+
|
74
|
+
blueprint_group_map: Dict[str, BlueprintGroup] = {}
|
75
|
+
|
76
|
+
# 遍历所有__init__.py文件,查找蓝图并创建对应的蓝图组
|
77
|
+
init_files: List[Path] = list(base_api_dir.glob("**/__init__.py"))
|
78
|
+
for init_file in reversed(init_files):
|
79
|
+
# 忽略__init__.py
|
80
|
+
init_file: Path = init_file.parent
|
81
|
+
# 获取该蓝图所在的模块路径和名称
|
82
|
+
module_path: str = init_file.relative_to(base_api_dir.parent).with_suffix("").as_posix()
|
83
|
+
module_name: str = module_path.replace("/", ".")
|
84
|
+
|
85
|
+
# 导入蓝图所在的模块,并获取该模块下的所有蓝图
|
86
|
+
module = import_module(module_name, base_api_module_name)
|
87
|
+
blueprints = [getattr(module, attr) for attr in dir(module) if isinstance(getattr(module, attr), Blueprint)]
|
88
|
+
# 拆分模块路径,创建对应的蓝图组并添加到父级蓝图组中
|
89
|
+
parts = [path for path in module_path.split("/") if path not in [base_api_module_name, init_file.name]]
|
90
|
+
|
91
|
+
if len(blueprints) == 1:
|
92
|
+
blueprint = blueprints[0]
|
93
|
+
if not parts:
|
94
|
+
blueprint_group = blueprint_group_map.get(init_file.name)
|
95
|
+
if blueprint_group:
|
96
|
+
blueprint.url_prefix = ""
|
97
|
+
blueprint_group.append(blueprint)
|
98
|
+
root_group.append(blueprint_group)
|
99
|
+
else:
|
100
|
+
root_group.append(blueprint)
|
101
|
+
else:
|
102
|
+
for part in parts:
|
103
|
+
group = blueprint_group_map.get(part, BlueprintGroup(part))
|
104
|
+
group.append(blueprint)
|
105
|
+
blueprint_group_map[part] = group
|
106
|
+
else:
|
107
|
+
group = BlueprintGroup(init_file.name)
|
108
|
+
group.extend(blueprints)
|
109
|
+
root_group.append(group)
|
110
|
+
|
111
|
+
# 将根API蓝图组添加到应用中
|
112
|
+
sanic_app.blueprint(root_group)
|
@@ -1,16 +1,17 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: sanic-api
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.7
|
4
4
|
Summary: Sanic 框架实用API工具集,拥有自动生成文档、参数校验、配置的导入、日志功能的优化等功能,更好的助力接口的开发
|
5
5
|
License: MIT
|
6
6
|
Author-email: 昊色居士 <xhrtxh@gmail.com>
|
7
7
|
Requires-Python: >=3.8
|
8
8
|
Requires-Dist: loguru>=0.6.0
|
9
9
|
Requires-Dist: orjson>=3.8.6
|
10
|
-
Requires-Dist: pydantic>=1.10.2
|
10
|
+
Requires-Dist: pydantic[dotenv]>=1.10.2
|
11
11
|
Requires-Dist: pygments>=2.13.0
|
12
12
|
Requires-Dist: sanic-ext>=22.12
|
13
|
-
Requires-Dist: sanic>=22.
|
13
|
+
Requires-Dist: sanic>=22.3
|
14
|
+
Requires-Dist: setuptools>=68.0.0
|
14
15
|
Requires-Dist: ujson>=5.7.0
|
15
16
|
Description-Content-Type: text/markdown
|
16
17
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
+
example/__main__.py,sha256=shOhgu0-e98nRuhXGzhi3rWsiZmpXZ9SDBLhgwvsFIY,605
|
3
|
+
example/api/__init__.py,sha256=itThNDyCx_NwzUqClx_8igf1FHakygEz9y2v8tJamkE,34
|
4
|
+
example/api/t1/__init__.py,sha256=KJ90I8L3UhOgUXA_uyoD06Rqz01mzhPeDqA7lpZXY38,66
|
5
|
+
example/api/t1/t1_1.py,sha256=78QCk_BwCs_6s9nnkuWPGoHaNosujvUcJVsCjvn_Xhg,634
|
6
|
+
example/api/t1/t1_2.py,sha256=071pQz-611GuY_DSKnZkRKdSh0J15fVPphTMvodexqc,233
|
7
|
+
example/api/t2/__init__.py,sha256=Ni_NSedOlsH73KmeW5nW4J26MhBmbHg_1NbrJ3d72Co,29
|
8
|
+
example/api/t2/t2.py,sha256=NqXZOKKZUmuLd2ce8TwtbBdIEkScbma8ngK5d_xxWXc,248
|
9
|
+
example/api/t2/t3/__init__.py,sha256=2PBSrojyYILtU7rVFTBh-ULIFmboXQTbBr1vJ7h7c50,29
|
10
|
+
example/api/t2/t3/t3.py,sha256=Kw7h0I43CMpan3tSmlecFHcQTao_X9dXVmYJUSd-Wz0,248
|
11
|
+
example/api/user.py,sha256=BwAKVaaCylu_RfwcmIs2459ojgI9_hjg5fA9Whytcog,1844
|
12
|
+
example/api/validator.py,sha256=-eZcXOIhaB-N-MlhVyHFzK6u6CnNBALKJsfC2nOyNho,1722
|
13
|
+
example/app.py,sha256=_MJrYtVxcUz2a_ULYlXmqwPzRwaDyx3OF3QIZhJDaL0,1202
|
14
|
+
example/settings.py,sha256=0HkZcxc7ArZfP_x31A9amL-cOw98XVjAxszOMj0PHII,134
|
15
|
+
sanic_api/__init__.py,sha256=U2PtA7oaz_UtUqNg40fnpTAwroxxUle4XaEfi1EqDJY,348
|
16
|
+
sanic_api/api/__init__.py,sha256=0Tb6LsOFscOqYCzgiZbR7UqP_cPGOOE-5is8YclWhI4,51
|
17
|
+
sanic_api/api/api.py,sha256=SmGoSS7bnhVNH_RYMLXS3dCUuZD2rWy7ZXXVbi_9MBc,5486
|
18
|
+
sanic_api/api/exception.py,sha256=hs4SpDLQjqGCKgQOa1WNocbTqheoIulr5Bplpm0Mc0w,1216
|
19
|
+
sanic_api/api/extend.py,sha256=So_X0KgkYeOhDwFIziU1Q8qkeoPeIRisBU5nOMpJaUw,706
|
20
|
+
sanic_api/api/handle_exception.py,sha256=Opq18Y1loRfBKtr_UTAyLMLT-C4vORnHFRhHKFNKX0o,1206
|
21
|
+
sanic_api/api/model.py,sha256=Sd9B1YHHHlmL11xvJuqbDoMvpL7h6qKj82qrAjhbZFk,1032
|
22
|
+
sanic_api/api/validators.py,sha256=TCb0eRfKfTt11HN-x6u7Ci2j6cpH6UKDKGceaKU2TxE,2078
|
23
|
+
sanic_api/config/__init__.py,sha256=O4wPd23Hbm4-i8q0z6k0_BvAPMkCByDByAvJITxYhSk,68
|
24
|
+
sanic_api/config/base.py,sha256=Il3a5UMmZ9o2uPHssdEfce3BAm0vAmbQ6yCrNLNYnb4,3228
|
25
|
+
sanic_api/config/sanic.py,sha256=BLKJgwsLVJvT1YlmW21FQXEwxSIHAhngu9Zwqe8Qh6M,636
|
26
|
+
sanic_api/config/sanic_api.py,sha256=jIgrlOizjh3eXxiUhQ9RFiG5noAuvjTju27a4mL-xgU,373
|
27
|
+
sanic_api/config/setting.py,sha256=5U4tpYIrsTUpxPi0_-E8jKHhewgvMJ1vfgmrPfqyB2s,735
|
28
|
+
sanic_api/enum.py,sha256=bBbYeys4CHI22sD_My8EIewOOznXb0nQmuIPKzZn-EM,2040
|
29
|
+
sanic_api/logger/__init__.py,sha256=HPUhYmmzI-NHOo6uf8NGmMlSSN3gkGrmUN6TB5Qhxmc,33
|
30
|
+
sanic_api/logger/config.py,sha256=1eEEp3YpoTCywgOeE8OZp4X0ghF4E9W52FBEAlTCVfw,2511
|
31
|
+
sanic_api/logger/extend.py,sha256=rD7NxUFZE2esPUbpOlYul5ZNnDTjepPsu9iLgZ9JA00,1911
|
32
|
+
sanic_api/logger/sanic_http.py,sha256=Nl1dM54XLTRO99rmzUbpR_vi-wSN_eK_9pei1kNJ7UE,2102
|
33
|
+
sanic_api/openapi/__init__.py,sha256=_n-pklcQHcaor8WrJMGxc4HYNggZBfe3mmbkCN57fVI,146
|
34
|
+
sanic_api/openapi/openapi.py,sha256=2Y3J8CJeT5LTLJGsQoCS98QGAZcyE3HgRTKWT2LKoao,4147
|
35
|
+
sanic_api/utils.py,sha256=8n3iak6pMJbz0fKvKIH1uAUnFut_Q49DZZU0ReI6TyU,3574
|
36
|
+
sanic_api-0.2.7.dist-info/WHEEL,sha256=B19PGBCYhWaz2p_UjAoRVh767nYQfk14Sn4TpIZ-nfU,87
|
37
|
+
sanic_api-0.2.7.dist-info/METADATA,sha256=7IXTOjuD43ZFU8qBH4ZNEs_eoHxScd-ZWeEXo5ZUR0A,2339
|
38
|
+
sanic_api-0.2.7.dist-info/licenses/LICENSE.txt,sha256=T20w-F8AfuFO9CHy2mSk_An6T9eV4X4rGA01i-gp4M4,1090
|
39
|
+
sanic_api-0.2.7.dist-info/RECORD,,
|
sanic_api-0.2.5.dist-info/RECORD
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
example/__main__.py,sha256=3C1HgCGPKpneepJcpsTnOvY4ak8CkBx2BKLNWGZ8qpY,624
|
3
|
-
example/api/__init__.py,sha256=MzvZXTcjT4jfqyavo1rwxttZcSXf5aDAz2SA13XJJg0,35
|
4
|
-
example/api/t1/__init__.py,sha256=SKGKpX5dn3MuR22Pau_7Q572of3vaQd96fiMVr1Bq48,30
|
5
|
-
example/api/t1/t1.py,sha256=JdDzQ7KqzfJh76OzXIv-01aQh6Ue5kWD72CzaV9MStQ,640
|
6
|
-
example/api/t2/__init__.py,sha256=Rgt55nGgZB8C3-6VyJF4ghxWBAU7jfkXgjP3nYT8PiM,30
|
7
|
-
example/api/t2/t2.py,sha256=8hMzPOtGeNgecNWhFPqJ-g8WDc7PmLj4OJw2Kqt9MiQ,257
|
8
|
-
example/api/t2/t3/__init__.py,sha256=8QZdMzmXLyTpXuZ_g-XSAqh4UaCAC6ma6EZwRHeGrCs,30
|
9
|
-
example/api/t2/t3/t3.py,sha256=TMcGo3L3oTXuhxrvtI-nOJaKrPk7i3tF8G-gXNXqofY,257
|
10
|
-
example/api/user.py,sha256=7-e7hAi8eXuyNmUb_10LVcAvIMV9e75An17zAxeD7Ts,1933
|
11
|
-
example/api/validator.py,sha256=CmC8l2uhk9_dB_y40nZsFUrkwq_RuyeGapCZApiDU0I,1819
|
12
|
-
example/app.py,sha256=37J9gGqOjEJCcHuhJXzVOBpXvI7DH1sla1WldIWA7Q0,1272
|
13
|
-
example/settings.py,sha256=D1pjeqCHx4tTK2p1AcRVCDNtdI_7DNwfpy6uC5zCgYA,144
|
14
|
-
sanic_api/__init__.py,sha256=TOKuviEEx0dkJE7LLijg11jrM8W0tnK6gq1q9INDfdc,369
|
15
|
-
sanic_api/api/__init__.py,sha256=dGGDANzIYT2d1-PXsi1ZZbvSQqdBqO7zF_RJWw6_YH0,53
|
16
|
-
sanic_api/api/api.py,sha256=lDBRlI2kdFqFQaUXaJ2P2_Mm7GEoHUmGaKXAJlIU4LY,5663
|
17
|
-
sanic_api/api/exception.py,sha256=bSf9-qjOvAvfLZ4xywziC6EXWMonKGeqAenIBnthfqQ,1262
|
18
|
-
sanic_api/api/extend.py,sha256=2MAZtUbSjgcWAGn6swExN4llszfeM1g34l5NIe5qJFY,731
|
19
|
-
sanic_api/api/handle_exception.py,sha256=4dV98ZBw0w90WUyh-Eu8V23jmZnv05Ee6-N7wlbS8l8,1267
|
20
|
-
sanic_api/api/model.py,sha256=Wdn4eEmevc04t9D3TcZ6cYHVCkP8MOJ3c5LKBPzypkE,1077
|
21
|
-
sanic_api/api/validators.py,sha256=wLVgxqrOkN422TQvhwFXM3-PQBpzKD4syHulqSEC5FM,2154
|
22
|
-
sanic_api/config/__init__.py,sha256=86cwB1QpmsAWNWgaibrowYiUHGSjt3xwgq7OwAKAelU,70
|
23
|
-
sanic_api/config/base.py,sha256=Ut5RuUYyaoLkFWEp9sqDvwegwVlQybOmTEiyBJWUhYQ,3339
|
24
|
-
sanic_api/config/sanic.py,sha256=ab5HqJmVZRy3Am4qy46LOpNDCwIGNuQlbSQfE-ipRbU,681
|
25
|
-
sanic_api/config/sanic_api.py,sha256=-z8ArvNt78R_1-5YZEhsoBVk_KP63dgBG9XaDyETFLA,410
|
26
|
-
sanic_api/config/setting.py,sha256=GB_An0OQudxyseggQP3jfrfEZ3p-SCOhLAzOC_9SBq4,765
|
27
|
-
sanic_api/enum.py,sha256=tCF-hdsngc7UaddU1lBB6nDrHHyflKzUnr1I12Pgp6w,2128
|
28
|
-
sanic_api/logger/__init__.py,sha256=mi7FoTfcpBtpySzNBpwzsdyHMNMGzU0_HlsJ7xXu_kc,34
|
29
|
-
sanic_api/logger/config.py,sha256=VWpOvNYqP6xSZOaOMIqzH21D64Quvnq3hH1VBoKM3oQ,2588
|
30
|
-
sanic_api/logger/extend.py,sha256=1aH4mX5JTUa-cOm9aVt8E0PX902uK-vSkofYbo5nQtc,1982
|
31
|
-
sanic_api/logger/sanic_http.py,sha256=SceMIR6OEA9eyW2wUkSOlecccECTaFjoccqYf-u9gj8,2170
|
32
|
-
sanic_api/openapi/__init__.py,sha256=Pa0KGB3lEbRc2g6LIes3k2CavYyWpT9wpZ-8dp1EPvM,153
|
33
|
-
sanic_api/openapi/openapi.py,sha256=Z9W43nq-x_dFk50Np-yVIrT8Pn8v3s8btLGfrb0N3Bo,4249
|
34
|
-
sanic_api/utils.py,sha256=VrB39ioW__hjztuHw_QUr1QPk3gGNvVcvxMlM2UmeAo,2882
|
35
|
-
sanic_api-0.2.5.dist-info/WHEEL,sha256=lsei1NEk3eJVaxXEuOSSqU002B_yCocFbsEPxBs2x2s,87
|
36
|
-
sanic_api-0.2.5.dist-info/METADATA,sha256=slX6iYbQRQeWCPU5pNxyvqOMVJ3n-mxN-_qABZSScas,2298
|
37
|
-
sanic_api-0.2.5.dist-info/licenses/LICENSE.txt,sha256=T20w-F8AfuFO9CHy2mSk_An6T9eV4X4rGA01i-gp4M4,1090
|
38
|
-
sanic_api-0.2.5.dist-info/RECORD,,
|
sanic_api-0.2.5.dist-info/WHEEL
DELETED
File without changes
|