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.
@@ -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 inspect import getmembers
4
- from pathlib import Path
5
- from typing import Any, Dict, Optional
6
-
7
- import orjson
8
- from sanic import Blueprint, Request, Sanic
9
- from sanic.blueprint_group import BlueprintGroup
10
- from sanic.exceptions import ServerError as SanicServerError
11
-
12
-
13
- def getpath_by_root(path: str) -> Path:
14
- """
15
- 根据根目录获取路径
16
- 基于 os.getcwd() 的同级路径、父目录来获取
17
- Args:
18
- path: 相对server的子路径
19
-
20
- Returns:
21
- 完整路径
22
- """
23
- return (Path.cwd() / path).absolute()
24
-
25
-
26
- def json_dumps(data: dict, default=None) -> str:
27
- """
28
- 调用orjson进行dumps
29
- Args:
30
- data: 数据
31
- default: 数量处理方法
32
-
33
- Returns:
34
- 返回json字符串
35
- """
36
-
37
- def _default(item):
38
- if isinstance(item, Decimal):
39
- return float(item.to_eng_string())
40
-
41
- json_bytes = orjson.dumps(
42
- data,
43
- default=default or _default,
44
- option=orjson.OPT_APPEND_NEWLINE | orjson.OPT_INDENT_2,
45
- )
46
- return json_bytes.decode("utf-8")
47
-
48
-
49
- def get_current_request() -> Optional[Request]:
50
- """ "
51
- 获取当前请求
52
- """
53
- try:
54
- return Request.get_current()
55
- except SanicServerError:
56
- return None
57
-
58
-
59
- def auto_blueprint(sanic_app: Sanic, base_api_module_name):
60
- """
61
- 自动生成蓝图
62
- Args:
63
- sanic_app: app
64
- base_api_module_name: api层模块名称
65
-
66
- Returns:
67
-
68
- """
69
- # api层名称
70
- base_api_name: str = base_api_module_name.split(".")[-1]
71
- # api层模块
72
- base_api_module = import_module(base_api_module_name, sanic_app.__module__)
73
- # api层目录
74
- base_api_dir = Path(str(base_api_module.__file__)).parent
75
-
76
- # 所有路由组的字典
77
- blueprint_group: Dict[str, BlueprintGroup] = {base_api_name: BlueprintGroup(base_api_name)}
78
-
79
- # 遍历所有__init__文件找到所有蓝图
80
- for path in base_api_dir.rglob("__init__.py"):
81
- # 蓝图所在上层的模块
82
- modules = [p.name for p in path.parents if str(base_api_dir.parent) in str(p)]
83
- specmod = import_module(".".join(modules[::-1]), sanic_app.__module__)
84
-
85
- # 获取该模块下的所有蓝图
86
- blueprints = [m[1] for m in getmembers(specmod, lambda o: isinstance(o, Blueprint))]
87
-
88
- blueprint_modules = modules[:-1]
89
- for index, m in enumerate(blueprint_modules):
90
- blueprint_group[m] = blueprint_group.get(m, Blueprint.group())
91
- if index == 0:
92
- blueprint_group[m].extend(blueprints)
93
- else:
94
- prev_bg: Any = blueprint_group.get(blueprint_modules[index - 1])
95
- blueprint_group[m].append(prev_bg)
96
-
97
- sanic_app.blueprint(blueprint_group[base_api_name])
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.5
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.12
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,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: pdm-pep517 1.1.4
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -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,,
@@ -1,4 +0,0 @@
1
- Wheel-Version: 1.0
2
- Generator: pdm-pep517 1.1.3
3
- Root-Is-Purelib: True
4
- Tag: py3-none-any