polyapi-python 0.3.17.dev1__py3-none-any.whl → 0.3.18__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.
- polyapi/cli.py +14 -2
- polyapi/generate.py +30 -5
- polyapi/poly_schemas.py +42 -3
- polyapi/poly_tables.py +19 -2
- polyapi/schema.py +16 -0
- polyapi/server.py +17 -3
- polyapi/utils.py +58 -4
- {polyapi_python-0.3.17.dev1.dist-info → polyapi_python-0.3.18.dist-info}/METADATA +8 -8
- {polyapi_python-0.3.17.dev1.dist-info → polyapi_python-0.3.18.dist-info}/RECORD +12 -12
- {polyapi_python-0.3.17.dev1.dist-info → polyapi_python-0.3.18.dist-info}/WHEEL +0 -0
- {polyapi_python-0.3.17.dev1.dist-info → polyapi_python-0.3.18.dist-info}/licenses/LICENSE +0 -0
- {polyapi_python-0.3.17.dev1.dist-info → polyapi_python-0.3.18.dist-info}/top_level.txt +0 -0
polyapi/cli.py
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import os
|
|
2
|
+
import sys
|
|
3
|
+
import tempfile
|
|
2
4
|
import argparse
|
|
3
5
|
|
|
4
6
|
from polyapi.utils import print_green, print_red
|
|
@@ -23,6 +25,16 @@ def _get_version_string():
|
|
|
23
25
|
|
|
24
26
|
|
|
25
27
|
def execute_from_cli():
|
|
28
|
+
# Redirect __pycache__ out of generated dirs to avoid window file-locking
|
|
29
|
+
# failures when rmtree dels on generate.
|
|
30
|
+
if 'PYTHONPYCACHEPREFIX' not in os.environ:
|
|
31
|
+
cache_dir = os.path.join(tempfile.gettempdir(), 'polyapi_pycache')
|
|
32
|
+
os.makedirs(cache_dir, exist_ok=True)
|
|
33
|
+
# here for children just in case
|
|
34
|
+
os.environ['PYTHONPYCACHEPREFIX'] = cache_dir
|
|
35
|
+
# For the startup py_initialize issue
|
|
36
|
+
sys.pycache_prefix = cache_dir
|
|
37
|
+
|
|
26
38
|
# First we setup all our argument parsing logic
|
|
27
39
|
# Then we parse the arguments (waaay at the bottom)
|
|
28
40
|
parser = argparse.ArgumentParser(
|
|
@@ -114,7 +126,7 @@ def execute_from_cli():
|
|
|
114
126
|
fn_add_parser.add_argument("--client", action="store_true", help="Marks the function as a client function")
|
|
115
127
|
fn_add_parser.add_argument("--logs", choices=["enabled", "disabled"], default=None, help="Enable or disable logs for the function.")
|
|
116
128
|
fn_add_parser.add_argument("--execution-api-key", required=False, default="", help="API key for execution (for server functions only).")
|
|
117
|
-
fn_add_parser.add_argument("--
|
|
129
|
+
fn_add_parser.add_argument("--skip-generate", action="store_true", help="Skip running generate after function add command, especially useful if you are deploying a bunch of functions at once. Run generate manually at the end!")
|
|
118
130
|
fn_add_parser.add_argument("--generate-contexts", type=str, help="Server function only – only include certain contexts to speed up function execution")
|
|
119
131
|
fn_add_parser.add_argument("--visibility", type=str, default="environment", help="Specifies the visibility of a function. Options: PUBLIC, TENANT, ENVIRONMENT. Case insensitive")
|
|
120
132
|
|
|
@@ -147,7 +159,7 @@ def execute_from_cli():
|
|
|
147
159
|
client=args.client,
|
|
148
160
|
server=args.server,
|
|
149
161
|
logs_enabled=logs_enabled,
|
|
150
|
-
generate=not args.
|
|
162
|
+
generate=not args.skip_generate,
|
|
151
163
|
execution_api_key=args.execution_api_key,
|
|
152
164
|
generate_contexts=args.generate_contexts,
|
|
153
165
|
visibility=visibility
|
polyapi/generate.py
CHANGED
|
@@ -4,6 +4,7 @@ import uuid
|
|
|
4
4
|
import shutil
|
|
5
5
|
import logging
|
|
6
6
|
import tempfile
|
|
7
|
+
import stat
|
|
7
8
|
|
|
8
9
|
from copy import deepcopy
|
|
9
10
|
from typing import Any, List, Optional, Tuple, cast
|
|
@@ -209,23 +210,33 @@ def get_tables(specs: List[SpecificationDto]) -> List[TableSpecDto]:
|
|
|
209
210
|
return [cast(TableSpecDto, spec) for spec in specs if spec["type"] == "table"]
|
|
210
211
|
|
|
211
212
|
|
|
213
|
+
def _rmtree_readonly_handler(func, path, exc):
|
|
214
|
+
# Windows marks __pycache__ .pyc files read-only; clear the bit and retry.
|
|
215
|
+
os.chmod(path, stat.S_IWRITE)
|
|
216
|
+
func(path)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _rmtree(path):
|
|
220
|
+
shutil.rmtree(path, onerror=_rmtree_readonly_handler)
|
|
221
|
+
|
|
222
|
+
|
|
212
223
|
def remove_old_library():
|
|
213
224
|
currdir = os.path.dirname(os.path.abspath(__file__))
|
|
214
225
|
path = os.path.join(currdir, "poly")
|
|
215
226
|
if os.path.exists(path):
|
|
216
|
-
|
|
227
|
+
_rmtree(path)
|
|
217
228
|
|
|
218
229
|
path = os.path.join(currdir, "vari")
|
|
219
230
|
if os.path.exists(path):
|
|
220
|
-
|
|
231
|
+
_rmtree(path)
|
|
221
232
|
|
|
222
233
|
path = os.path.join(currdir, "schemas")
|
|
223
234
|
if os.path.exists(path):
|
|
224
|
-
|
|
235
|
+
_rmtree(path)
|
|
225
236
|
|
|
226
237
|
path = os.path.join(currdir, "tabi")
|
|
227
238
|
if os.path.exists(path):
|
|
228
|
-
|
|
239
|
+
_rmtree(path)
|
|
229
240
|
|
|
230
241
|
|
|
231
242
|
def create_empty_schemas_module():
|
|
@@ -399,7 +410,21 @@ def clear() -> None:
|
|
|
399
410
|
|
|
400
411
|
def render_spec(spec: SpecificationDto) -> Tuple[str, str]:
|
|
401
412
|
function_type = spec["type"]
|
|
402
|
-
|
|
413
|
+
raw_description = spec.get("description", "")
|
|
414
|
+
def _flatten_description(value: Any) -> List[str]:
|
|
415
|
+
if value is None:
|
|
416
|
+
return []
|
|
417
|
+
if isinstance(value, list):
|
|
418
|
+
flat: List[str] = []
|
|
419
|
+
for item in value:
|
|
420
|
+
flat.extend(_flatten_description(item))
|
|
421
|
+
return flat
|
|
422
|
+
return [str(value)]
|
|
423
|
+
|
|
424
|
+
if isinstance(raw_description, str):
|
|
425
|
+
function_description = raw_description
|
|
426
|
+
else:
|
|
427
|
+
function_description = "\n".join(_flatten_description(raw_description))
|
|
403
428
|
function_name = spec["name"]
|
|
404
429
|
function_context = spec["context"]
|
|
405
430
|
function_id = spec["id"]
|
polyapi/poly_schemas.py
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import os
|
|
2
|
+
import re
|
|
2
3
|
import logging
|
|
3
4
|
import tempfile
|
|
4
5
|
import shutil
|
|
5
|
-
from typing import Any, Dict, List, Tuple
|
|
6
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
6
7
|
|
|
7
8
|
from polyapi.schema import wrapped_generate_schema_types
|
|
8
9
|
from polyapi.utils import add_import_to_init, init_the_init, to_func_namespace
|
|
@@ -23,7 +24,7 @@ FALLBACK_SPEC_TEMPLATE = """class {name}(TypedDict, total=False):
|
|
|
23
24
|
"""
|
|
24
25
|
|
|
25
26
|
|
|
26
|
-
def generate_schemas(specs: List[SchemaSpecDto], limit_ids: List[str] = None):
|
|
27
|
+
def generate_schemas(specs: List[SchemaSpecDto], limit_ids: Optional[List[str]] = None):
|
|
27
28
|
failed_schemas = []
|
|
28
29
|
successful_schemas = []
|
|
29
30
|
if limit_ids:
|
|
@@ -209,6 +210,44 @@ def add_schema_to_init(full_path: str, spec: SchemaSpecDto):
|
|
|
209
210
|
f.write(render_poly_schema(spec) + "\n\n")
|
|
210
211
|
|
|
211
212
|
|
|
213
|
+
def _fix_typed_dict_imports(code: str) -> str:
|
|
214
|
+
"""Move TypedDict/NotRequired from `typing` to `typing_extensions` in generated code.
|
|
215
|
+
|
|
216
|
+
jsonschema_gentypes spits out `from typing import ..., TypedDict, ...` which makes
|
|
217
|
+
typing._TypedDictMeta instances. The deploy validator wants typing_extensions.TypedDict,
|
|
218
|
+
so let's rewrite the imports here before writing schema files to disk.
|
|
219
|
+
"""
|
|
220
|
+
lines = code.split('\n')
|
|
221
|
+
new_lines = []
|
|
222
|
+
has_te_import = False
|
|
223
|
+
|
|
224
|
+
for line in lines:
|
|
225
|
+
if re.match(r'from\s+typing_extensions\s+import', line):
|
|
226
|
+
has_te_import = True
|
|
227
|
+
# Ensure TypedDict and NotRequired are in the existing typing_extensions line
|
|
228
|
+
name_set = {n.strip() for n in line.split('import', 1)[1].split(',')}
|
|
229
|
+
name_set |= {'TypedDict', 'NotRequired'}
|
|
230
|
+
new_lines.append(f"from typing_extensions import {', '.join(sorted(name_set))}")
|
|
231
|
+
continue
|
|
232
|
+
|
|
233
|
+
if re.match(r'from\s+typing\s+import', line):
|
|
234
|
+
# Strip TypedDict and NotRequired from the typing import
|
|
235
|
+
names_str = line.split('import', 1)[1]
|
|
236
|
+
names: list[str] = [n.strip() for n in names_str.split(',')]
|
|
237
|
+
names = [n for n in names if n not in ('TypedDict', 'NotRequired', '')]
|
|
238
|
+
if names:
|
|
239
|
+
new_lines.append(f"from typing import {', '.join(names)}")
|
|
240
|
+
# drop the line entirely if nothing is left
|
|
241
|
+
continue
|
|
242
|
+
|
|
243
|
+
new_lines.append(line)
|
|
244
|
+
|
|
245
|
+
result = '\n'.join(new_lines)
|
|
246
|
+
if not has_te_import:
|
|
247
|
+
result = 'from typing_extensions import NotRequired, TypedDict\n' + result
|
|
248
|
+
return result
|
|
249
|
+
|
|
250
|
+
|
|
212
251
|
def render_poly_schema(spec: SchemaSpecDto) -> str:
|
|
213
252
|
definition = spec["definition"]
|
|
214
253
|
if not definition.get("type"):
|
|
@@ -216,5 +255,5 @@ def render_poly_schema(spec: SchemaSpecDto) -> str:
|
|
|
216
255
|
root, schema_types = wrapped_generate_schema_types(
|
|
217
256
|
definition, root=spec["name"], fallback_type=Dict
|
|
218
257
|
)
|
|
219
|
-
return schema_types
|
|
258
|
+
return _fix_typed_dict_imports(schema_types)
|
|
220
259
|
# return FALLBACK_SPEC_TEMPLATE.format(name=spec["name"])
|
polyapi/poly_tables.py
CHANGED
|
@@ -531,10 +531,27 @@ def _render_table(table: TableSpecDto) -> str:
|
|
|
531
531
|
table_where_class = _render_table_where_class(
|
|
532
532
|
table["name"], columns, required_columns
|
|
533
533
|
)
|
|
534
|
-
|
|
534
|
+
raw_description = table.get("description", "")
|
|
535
|
+
|
|
536
|
+
def _flatten_description(value: Any) -> List[str]:
|
|
537
|
+
if value is None:
|
|
538
|
+
return []
|
|
539
|
+
if isinstance(value, list):
|
|
540
|
+
flat: List[str] = []
|
|
541
|
+
for item in value:
|
|
542
|
+
flat.extend(_flatten_description(item))
|
|
543
|
+
return flat
|
|
544
|
+
return [str(value)]
|
|
545
|
+
|
|
546
|
+
if isinstance(raw_description, str):
|
|
547
|
+
normalized_description = raw_description
|
|
548
|
+
else:
|
|
549
|
+
normalized_description = "\n".join(_flatten_description(raw_description))
|
|
550
|
+
|
|
551
|
+
if normalized_description:
|
|
535
552
|
table_description = '\n """'
|
|
536
553
|
table_description += "\n ".join(
|
|
537
|
-
|
|
554
|
+
normalized_description.replace('"', "'").split("\n")
|
|
538
555
|
)
|
|
539
556
|
table_description += '\n """'
|
|
540
557
|
else:
|
polyapi/schema.py
CHANGED
|
@@ -50,6 +50,13 @@ def wrapped_generate_schema_types(type_spec: dict, root, fallback_type):
|
|
|
50
50
|
# if we have no root, just add "My"
|
|
51
51
|
root = "My" + root
|
|
52
52
|
|
|
53
|
+
if isinstance(root, list):
|
|
54
|
+
root = "_".join([str(x) for x in root if x is not None]) or fallback_type
|
|
55
|
+
elif root is None:
|
|
56
|
+
root = fallback_type
|
|
57
|
+
elif not isinstance(root, str):
|
|
58
|
+
root = str(root)
|
|
59
|
+
|
|
53
60
|
root = clean_title(root)
|
|
54
61
|
|
|
55
62
|
try:
|
|
@@ -150,10 +157,19 @@ def clean_title(title: str) -> str:
|
|
|
150
157
|
""" used by library generation, sometimes functions can be added with spaces in the title
|
|
151
158
|
or other nonsense. fix them!
|
|
152
159
|
"""
|
|
160
|
+
if isinstance(title, list):
|
|
161
|
+
title = "_".join([str(x) for x in title if x is not None])
|
|
162
|
+
elif title is None:
|
|
163
|
+
title = ""
|
|
164
|
+
elif not isinstance(title, str):
|
|
165
|
+
title = str(title)
|
|
166
|
+
|
|
153
167
|
title = title.replace(" ", "")
|
|
154
168
|
# certain reserved words cant be titles, let's replace them
|
|
155
169
|
if title == "List":
|
|
156
170
|
title = "List_"
|
|
171
|
+
if not title:
|
|
172
|
+
title = "Dict"
|
|
157
173
|
return title
|
|
158
174
|
|
|
159
175
|
|
polyapi/server.py
CHANGED
|
@@ -62,7 +62,7 @@ def render_server_function(
|
|
|
62
62
|
return_type_def=return_type_def,
|
|
63
63
|
)
|
|
64
64
|
func_str = SERVER_FUNCTION_TEMPLATE.format(
|
|
65
|
-
return_type_name=
|
|
65
|
+
return_type_name=_normalize_return_type_for_annotation(function_name, return_type_name),
|
|
66
66
|
function_type="server",
|
|
67
67
|
function_name=function_name,
|
|
68
68
|
function_id=function_id,
|
|
@@ -74,9 +74,23 @@ def render_server_function(
|
|
|
74
74
|
return func_str, func_type_defs
|
|
75
75
|
|
|
76
76
|
|
|
77
|
+
def _normalize_return_type_for_annotation(function_name: str, return_type_name: str) -> str:
|
|
78
|
+
if return_type_name == "ReturnType":
|
|
79
|
+
return "ReturnType"
|
|
80
|
+
return add_type_import_path(function_name, return_type_name)
|
|
81
|
+
|
|
82
|
+
|
|
77
83
|
def _get_server_return_action(return_type_name: str) -> str:
|
|
78
|
-
|
|
84
|
+
normalized_type = return_type_name.replace(" ", "")
|
|
85
|
+
|
|
86
|
+
if normalized_type in {"str", "Optional[str]"}:
|
|
79
87
|
return_action = "resp.text"
|
|
88
|
+
elif "|" in normalized_type:
|
|
89
|
+
union_parts = {part for part in normalized_type.split("|") if part}
|
|
90
|
+
if union_parts == {"str", "None"}:
|
|
91
|
+
return_action = "resp.text"
|
|
92
|
+
else:
|
|
93
|
+
return_action = "resp.json()"
|
|
80
94
|
else:
|
|
81
95
|
return_action = "resp.json()"
|
|
82
|
-
return return_action
|
|
96
|
+
return return_action
|
polyapi/utils.py
CHANGED
|
@@ -71,6 +71,43 @@ def print_red(s: str):
|
|
|
71
71
|
print(Fore.RED + s + Style.RESET_ALL)
|
|
72
72
|
|
|
73
73
|
|
|
74
|
+
def normalize_cross_language_type(type_name: str) -> str:
|
|
75
|
+
value = (type_name or "").strip()
|
|
76
|
+
if not value:
|
|
77
|
+
return "Any"
|
|
78
|
+
|
|
79
|
+
primitive_map = {
|
|
80
|
+
"string": "str",
|
|
81
|
+
"number": "float",
|
|
82
|
+
"integer": "int",
|
|
83
|
+
"boolean": "bool",
|
|
84
|
+
"null": "None",
|
|
85
|
+
"void": "None",
|
|
86
|
+
"any": "Any",
|
|
87
|
+
"object": "Dict",
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if value.startswith("Promise<") and value.endswith(">"):
|
|
91
|
+
return normalize_cross_language_type(value[len("Promise<"):-1])
|
|
92
|
+
|
|
93
|
+
if value.startswith("Awaited<") and value.endswith(">"):
|
|
94
|
+
return normalize_cross_language_type(value[len("Awaited<"):-1])
|
|
95
|
+
|
|
96
|
+
if value.endswith("[]"):
|
|
97
|
+
item_type = normalize_cross_language_type(value[:-2])
|
|
98
|
+
return f"List[{item_type}]"
|
|
99
|
+
|
|
100
|
+
if "|" in value:
|
|
101
|
+
parts = [p.strip() for p in value.split("|") if p.strip()]
|
|
102
|
+
normalized = [normalize_cross_language_type(part) for part in parts]
|
|
103
|
+
return " | ".join(normalized) if normalized else "Any"
|
|
104
|
+
|
|
105
|
+
if value == "ReturnType" or value.startswith("ReturnType<") or "typeof" in value:
|
|
106
|
+
return "Any"
|
|
107
|
+
|
|
108
|
+
return primitive_map.get(value, value)
|
|
109
|
+
|
|
110
|
+
|
|
74
111
|
def to_type_module_alias(function_name: str) -> str:
|
|
75
112
|
"""Return the internal alias used for a function's generated type module."""
|
|
76
113
|
return f"_{to_func_namespace(function_name)}_types"
|
|
@@ -81,6 +118,14 @@ def add_type_import_path(function_name: str, arg: str) -> str:
|
|
|
81
118
|
# from now, we start qualifying non-basic types :))
|
|
82
119
|
# e.g. Callable[[EmailAddress, Dict, Dict, Dict], None]
|
|
83
120
|
# becomes Callable[[Set_profile_email.EmailAddress, Dict, Dict, Dict], None]
|
|
121
|
+
arg = normalize_cross_language_type(arg)
|
|
122
|
+
|
|
123
|
+
if "|" in arg:
|
|
124
|
+
return " | ".join(
|
|
125
|
+
add_type_import_path(function_name, token.strip())
|
|
126
|
+
for token in arg.split("|")
|
|
127
|
+
if token.strip()
|
|
128
|
+
)
|
|
84
129
|
type_module_alias = to_type_module_alias(function_name)
|
|
85
130
|
|
|
86
131
|
if arg.startswith("Callable"):
|
|
@@ -96,7 +141,7 @@ def add_type_import_path(function_name: str, arg: str) -> str:
|
|
|
96
141
|
return "Callable[" + ",".join(qualified) + "]"
|
|
97
142
|
# return arg
|
|
98
143
|
|
|
99
|
-
if arg in BASIC_PYTHON_TYPES:
|
|
144
|
+
if arg == "Any" or arg in BASIC_PYTHON_TYPES:
|
|
100
145
|
return arg
|
|
101
146
|
|
|
102
147
|
if arg.startswith("List["):
|
|
@@ -127,14 +172,23 @@ def get_type_and_def(
|
|
|
127
172
|
return "Any", ""
|
|
128
173
|
|
|
129
174
|
if type_spec["kind"] == "plain":
|
|
130
|
-
value = type_spec.get("value", "")
|
|
175
|
+
value = normalize_cross_language_type(type_spec.get("value", ""))
|
|
176
|
+
|
|
177
|
+
if "|" in value or value in BASIC_PYTHON_TYPES:
|
|
178
|
+
return value, ""
|
|
179
|
+
|
|
131
180
|
if value.endswith("[]"):
|
|
132
|
-
primitive =
|
|
181
|
+
primitive = normalize_cross_language_type(value[:-2])
|
|
182
|
+
if primitive not in BASIC_PYTHON_TYPES:
|
|
183
|
+
primitive = map_primitive_types(primitive)
|
|
133
184
|
return f"List[{primitive}]", ""
|
|
134
185
|
else:
|
|
135
186
|
return map_primitive_types(value), ""
|
|
136
187
|
elif type_spec["kind"] == "primitive":
|
|
137
|
-
|
|
188
|
+
primitive = normalize_cross_language_type(type_spec.get("type", "any"))
|
|
189
|
+
if primitive in BASIC_PYTHON_TYPES:
|
|
190
|
+
return primitive, ""
|
|
191
|
+
return map_primitive_types(primitive), ""
|
|
138
192
|
elif type_spec["kind"] == "array":
|
|
139
193
|
if type_spec.get("items"):
|
|
140
194
|
items = type_spec["items"]
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: polyapi-python
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.18
|
|
4
4
|
Summary: The Python Client for PolyAPI, the IPaaS by Developers for Developers
|
|
5
|
-
Author-email:
|
|
5
|
+
Author-email: PolyAPI <support@polyapi.io>
|
|
6
6
|
License: MIT License
|
|
7
7
|
|
|
8
8
|
Copyright (c) 2025 PolyAPI Inc.
|
|
@@ -28,15 +28,15 @@ Project-URL: Homepage, https://github.com/polyapi/polyapi-python
|
|
|
28
28
|
Requires-Python: >=3.10
|
|
29
29
|
Description-Content-Type: text/markdown
|
|
30
30
|
License-File: LICENSE
|
|
31
|
-
Requires-Dist: requests
|
|
32
|
-
Requires-Dist: typing_extensions
|
|
31
|
+
Requires-Dist: requests==2.32.3
|
|
32
|
+
Requires-Dist: typing_extensions==4.12.2
|
|
33
33
|
Requires-Dist: jsonschema-gentypes==2.10.0
|
|
34
|
-
Requires-Dist: pydantic
|
|
35
|
-
Requires-Dist: stdlib_list
|
|
34
|
+
Requires-Dist: pydantic==2.8.0
|
|
35
|
+
Requires-Dist: stdlib_list==0.11.1
|
|
36
36
|
Requires-Dist: colorama==0.4.4
|
|
37
37
|
Requires-Dist: python-socketio[asyncio_client]==5.11.1
|
|
38
|
-
Requires-Dist: truststore
|
|
39
|
-
Requires-Dist: httpx
|
|
38
|
+
Requires-Dist: truststore==0.9.1
|
|
39
|
+
Requires-Dist: httpx==0.28.1
|
|
40
40
|
Dynamic: license-file
|
|
41
41
|
|
|
42
42
|
# PolyAPI Python Library
|
|
@@ -2,7 +2,7 @@ polyapi/__init__.py,sha256=vV1N9xtIMtpi4o-2jAI3775LkzRbC9JUo87MAnW9zgo,5201
|
|
|
2
2
|
polyapi/__main__.py,sha256=V4zhAh_YGxno5f_KSrlkELxcuDh9bR3WSd0n-2r-qQQ,93
|
|
3
3
|
polyapi/api.py,sha256=CzqX99GekhQJVqAAWlL03hUenIi_5iTln9cWgQzz6Ko,2784
|
|
4
4
|
polyapi/auth.py,sha256=l0pGAoYvEWqa2TMsrM9GS8imXu3GsWvpn4eFPy1vksI,6195
|
|
5
|
-
polyapi/cli.py,sha256=
|
|
5
|
+
polyapi/cli.py,sha256=wrBmpyieCqXnKPfpX2asL_0ApSYWze9p3wlCwJrtfRM,11635
|
|
6
6
|
polyapi/cli_constants.py,sha256=eZnAqAo8HLxHH3cdAoGWbrsALAtEWJFXRdSS2lvQvzE,144
|
|
7
7
|
polyapi/client.py,sha256=DW6ljG_xCwAo2yz23A9QfLooE6ZUDvSpdA4e_dCQjiQ,1418
|
|
8
8
|
polyapi/config.py,sha256=dnowfPKEau5sA4zwBzLK_dYAHA-Wi3AOnMtDNsYwUmM,7520
|
|
@@ -12,23 +12,23 @@ polyapi/error_handler.py,sha256=I_e0iz6VM23FLVQWJljxs2NGcl_OODbi43OcbnqBlp8,2398
|
|
|
12
12
|
polyapi/exceptions.py,sha256=Zh7i7eCUhDuXEdUYjatkLFTeZkrx1BJ1P5ePgbJ9eIY,89
|
|
13
13
|
polyapi/execute.py,sha256=MeAmc5qsMQfnQPiHJK9Khkn_wrBxMoyMYYqmuFFPsRg,8779
|
|
14
14
|
polyapi/function_cli.py,sha256=kKrecKCDNMmYtcOOCVF2KKOGjFUfWD2TbiVsyYQ84y8,4323
|
|
15
|
-
polyapi/generate.py,sha256=
|
|
15
|
+
polyapi/generate.py,sha256=3AtJcqZj2oybZmQVzrQ8XQyvwEz51PztWvSNKXdNre0,22008
|
|
16
16
|
polyapi/http_client.py,sha256=Pd6FYHGB6plWlBbwZD9LPP6FEicdp0wyLWHd_9jxsaY,2273
|
|
17
17
|
polyapi/parser.py,sha256=pAkeuwp1Kn6bHXiIoj-DuXQ518PztQThIa8vztgsKLQ,21525
|
|
18
|
-
polyapi/poly_schemas.py,sha256=
|
|
19
|
-
polyapi/poly_tables.py,sha256=
|
|
18
|
+
polyapi/poly_schemas.py,sha256=JGMQbELPFw4V_0nA0o71WJKFTdxjCGoKqJvIid_Y-a4,10759
|
|
19
|
+
polyapi/poly_tables.py,sha256=xFxR69dZNmePT9mUz3DvsoreQK7huIa07evEmOSixA0,20271
|
|
20
20
|
polyapi/prepare.py,sha256=DBlrQu_A0PqdaQ3KlMs-C6PkV3qncatkAiBlC7j2hnk,7441
|
|
21
21
|
polyapi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
22
|
polyapi/rendered_spec.py,sha256=J2Num7MXnW_mKAe2MSVIL1coWopNYZ-6nNNwQRfseV0,2262
|
|
23
|
-
polyapi/schema.py,sha256=
|
|
24
|
-
polyapi/server.py,sha256=
|
|
23
|
+
polyapi/schema.py,sha256=PuLvu29rWWyN_DV6QLWHR5PNopfW2vpRsJ6mOTx7wao,6396
|
|
24
|
+
polyapi/server.py,sha256=_14lP4_BmRYMBXwaqXVWmiSTHH3h7ecCHxSalM9UiSc,3049
|
|
25
25
|
polyapi/sync.py,sha256=t0Khh8B5GylxB7KWRP_xvkrvkuyVarSLCOvtmaz7lcc,6766
|
|
26
26
|
polyapi/typedefs.py,sha256=mfll-KrngOW0wzbvDNiIDaDkFMwbsT-MY5y5hzWj9RE,5642
|
|
27
|
-
polyapi/utils.py,sha256=
|
|
27
|
+
polyapi/utils.py,sha256=SfzK86nhg1wuGzbI53DEFKJ3JkxZ0yU-CZBd_caKbrQ,15313
|
|
28
28
|
polyapi/variables.py,sha256=hfSDPGQK6YphNCa9MqE0W88WIFfqCQWgpBDWkExMq-A,7582
|
|
29
29
|
polyapi/webhook.py,sha256=0ceLwHNjNd2Yx_8MX5jOIxiQ5Lwhy2pe81ProAuKon0,5108
|
|
30
|
-
polyapi_python-0.3.
|
|
31
|
-
polyapi_python-0.3.
|
|
32
|
-
polyapi_python-0.3.
|
|
33
|
-
polyapi_python-0.3.
|
|
34
|
-
polyapi_python-0.3.
|
|
30
|
+
polyapi_python-0.3.18.dist-info/licenses/LICENSE,sha256=6b_I7aPVp8JXhqQwdw7_B84Ca0S4JGjHj0sr_1VOdB4,1068
|
|
31
|
+
polyapi_python-0.3.18.dist-info/METADATA,sha256=wzN8aRuae1galj_UKGxMXOQLQD4spT79UeLjKYoV9N8,5910
|
|
32
|
+
polyapi_python-0.3.18.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
33
|
+
polyapi_python-0.3.18.dist-info/top_level.txt,sha256=CEFllOnzowci_50RYJac-M54KD2IdAptFsayVVF_f04,8
|
|
34
|
+
polyapi_python-0.3.18.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|