sera-2 1.11.1__py3-none-any.whl → 1.11.3__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.
- sera/libs/base_service.py +1 -1
- sera/make/make_python_model.py +38 -15
- sera/make/make_typescript_model.py +82 -25
- sera/models/_datatype.py +24 -15
- {sera_2-1.11.1.dist-info → sera_2-1.11.3.dist-info}/METADATA +1 -1
- {sera_2-1.11.1.dist-info → sera_2-1.11.3.dist-info}/RECORD +7 -7
- {sera_2-1.11.1.dist-info → sera_2-1.11.3.dist-info}/WHEEL +0 -0
sera/libs/base_service.py
CHANGED
@@ -103,7 +103,7 @@ class BaseService(Generic[ID, R]):
|
|
103
103
|
|
104
104
|
cq = select(func.count()).select_from(q.subquery())
|
105
105
|
rq = q.limit(limit).offset(offset)
|
106
|
-
records = self._process_result(session.execute(
|
106
|
+
records = self._process_result(session.execute(rq)).scalars().all()
|
107
107
|
total = session.execute(cq).scalar_one()
|
108
108
|
return QueryResult(records, total)
|
109
109
|
|
sera/make/make_python_model.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
+
from operator import is_
|
3
4
|
from typing import Callable, Sequence
|
4
5
|
|
5
6
|
from codegen.models import AST, DeferredVar, PredefinedFn, Program, expr, stmt
|
@@ -234,8 +235,11 @@ def make_python_data_model(
|
|
234
235
|
|
235
236
|
if isinstance(prop, DataProperty):
|
236
237
|
pytype = prop.get_data_model_datatype().get_python_type()
|
237
|
-
if
|
238
|
-
|
238
|
+
if prop.is_optional:
|
239
|
+
pytype = pytype.as_optional_type()
|
240
|
+
|
241
|
+
for dep in pytype.deps:
|
242
|
+
program.import_(dep, True)
|
239
243
|
|
240
244
|
pytype_type = pytype.type
|
241
245
|
if len(prop.data.constraints) > 0:
|
@@ -288,14 +292,19 @@ def make_python_data_model(
|
|
288
292
|
else:
|
289
293
|
pytype = PyTypeWithDep(
|
290
294
|
f"Upsert{prop.target.name}",
|
291
|
-
|
295
|
+
[
|
296
|
+
f"{target_pkg.module(prop.target.get_pymodule_name()).path}.Upsert{prop.target.name}"
|
297
|
+
],
|
292
298
|
)
|
293
299
|
|
294
|
-
if pytype.dep is not None:
|
295
|
-
program.import_(pytype.dep, True)
|
296
|
-
|
297
300
|
if prop.cardinality.is_star_to_many():
|
298
301
|
pytype = pytype.as_list_type()
|
302
|
+
elif prop.is_optional:
|
303
|
+
pytype = pytype.as_optional_type()
|
304
|
+
|
305
|
+
for dep in pytype.deps:
|
306
|
+
program.import_(dep, True)
|
307
|
+
|
299
308
|
cls_ast(stmt.DefClassVarStatement(prop.name, pytype.type))
|
300
309
|
|
301
310
|
# has_to_db = True
|
@@ -426,8 +435,12 @@ def make_python_data_model(
|
|
426
435
|
|
427
436
|
if isinstance(prop, DataProperty):
|
428
437
|
pytype = prop.get_data_model_datatype().get_python_type()
|
429
|
-
if
|
430
|
-
|
438
|
+
if prop.is_optional:
|
439
|
+
pytype = pytype.as_optional_type()
|
440
|
+
|
441
|
+
for dep in pytype.deps:
|
442
|
+
program.import_(dep, True)
|
443
|
+
|
431
444
|
cls_ast(stmt.DefClassVarStatement(prop.name, pytype.type))
|
432
445
|
elif isinstance(prop, ObjectProperty):
|
433
446
|
if prop.target.db is not None:
|
@@ -439,14 +452,19 @@ def make_python_data_model(
|
|
439
452
|
else:
|
440
453
|
pytype = PyTypeWithDep(
|
441
454
|
prop.target.name,
|
442
|
-
|
455
|
+
[
|
456
|
+
f"{target_pkg.module(prop.target.get_pymodule_name()).path}.{prop.target.name}"
|
457
|
+
],
|
443
458
|
)
|
444
459
|
|
445
|
-
if pytype.dep is not None:
|
446
|
-
program.import_(pytype.dep, True)
|
447
|
-
|
448
460
|
if prop.cardinality.is_star_to_many():
|
449
461
|
pytype = pytype.as_list_type()
|
462
|
+
elif prop.is_optional:
|
463
|
+
pytype = pytype.as_optional_type()
|
464
|
+
|
465
|
+
for dep in pytype.deps:
|
466
|
+
program.import_(dep, True)
|
467
|
+
|
450
468
|
cls_ast(stmt.DefClassVarStatement(prop.name, pytype.type))
|
451
469
|
|
452
470
|
cls_ast(
|
@@ -679,7 +697,12 @@ def make_python_relational_model(
|
|
679
697
|
program.import_(dep, True)
|
680
698
|
|
681
699
|
propname = prop.name
|
682
|
-
|
700
|
+
|
701
|
+
if prop.is_optional:
|
702
|
+
program.import_("typing.Optional", True)
|
703
|
+
proptype = f"Mapped[Optional[{sqltype.mapped_pytype}]]"
|
704
|
+
else:
|
705
|
+
proptype = f"Mapped[{sqltype.mapped_pytype}]"
|
683
706
|
|
684
707
|
propvalargs: list[expr.Expr] = [expr.ExprIdent(sqltype.type)]
|
685
708
|
if prop.db.is_primary_key:
|
@@ -816,7 +839,7 @@ def make_python_relational_object_property(
|
|
816
839
|
expr.ExprFuncCall(
|
817
840
|
expr.ExprIdent("mapped_column"),
|
818
841
|
[
|
819
|
-
expr.
|
842
|
+
expr.ExprConstant(f"{prop.name}_{p.name}"),
|
820
843
|
expr.ExprIdent(
|
821
844
|
assert_isinstance(p, DataProperty)
|
822
845
|
.datatype.get_sqlalchemy_type()
|
@@ -824,7 +847,7 @@ def make_python_relational_object_property(
|
|
824
847
|
),
|
825
848
|
PredefinedFn.keyword_assignment(
|
826
849
|
"nullable",
|
827
|
-
expr.ExprConstant(prop.is_optional),
|
850
|
+
expr.ExprConstant(prop.is_optional or p.is_optional),
|
828
851
|
),
|
829
852
|
],
|
830
853
|
)
|
@@ -68,12 +68,16 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
68
68
|
|
69
69
|
if isinstance(prop, DataProperty):
|
70
70
|
tstype = prop.get_data_model_datatype().get_typescript_type()
|
71
|
-
|
72
|
-
program.import_(
|
71
|
+
for dep in tstype.deps:
|
72
|
+
program.import_(dep, True)
|
73
73
|
|
74
74
|
if idprop is not None and prop.name == idprop.name:
|
75
75
|
# use id type alias
|
76
76
|
tstype = TsTypeWithDep(f"{cls.name}Id")
|
77
|
+
|
78
|
+
if prop.is_optional:
|
79
|
+
# convert type to optional
|
80
|
+
tstype = tstype.as_optional_type()
|
77
81
|
|
78
82
|
deser_args.append(
|
79
83
|
(
|
@@ -89,10 +93,15 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
89
93
|
# this class is stored in the database, we store the id instead
|
90
94
|
tstype = TsTypeWithDep(
|
91
95
|
f"{prop.target.name}Id",
|
92
|
-
|
96
|
+
[
|
97
|
+
f"@.models.{prop.target.get_tsmodule_name()}.{prop.target.name}.{prop.target.name}Id"
|
98
|
+
],
|
93
99
|
)
|
94
100
|
if prop.cardinality.is_star_to_many():
|
95
101
|
tstype = tstype.as_list_type()
|
102
|
+
elif prop.is_optional:
|
103
|
+
# convert type to optional only if it isn't a list
|
104
|
+
tstype = tstype.as_optional_type()
|
96
105
|
deser_args.append(
|
97
106
|
(
|
98
107
|
expr.ExprIdent(propname),
|
@@ -105,7 +114,9 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
105
114
|
# we are going to store the whole object
|
106
115
|
tstype = TsTypeWithDep(
|
107
116
|
prop.target.name,
|
108
|
-
|
117
|
+
[
|
118
|
+
f"@.models.{prop.target.get_tsmodule_name()}.{prop.target.name}.{prop.target.name}"
|
119
|
+
],
|
109
120
|
)
|
110
121
|
if prop.cardinality.is_star_to_many():
|
111
122
|
tstype = tstype.as_list_type()
|
@@ -130,6 +141,9 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
130
141
|
)
|
131
142
|
)
|
132
143
|
else:
|
144
|
+
if prop.is_optional:
|
145
|
+
# convert type to optional only if it isn't a list
|
146
|
+
tstype = tstype.as_optional_type()
|
133
147
|
deser_args.append(
|
134
148
|
(
|
135
149
|
expr.ExprIdent(propname),
|
@@ -148,9 +162,9 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
148
162
|
)
|
149
163
|
)
|
150
164
|
|
151
|
-
|
165
|
+
for dep in tstype.deps:
|
152
166
|
program.import_(
|
153
|
-
|
167
|
+
dep,
|
154
168
|
True,
|
155
169
|
)
|
156
170
|
|
@@ -319,14 +333,18 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
319
333
|
# use id type alias
|
320
334
|
tstype = TsTypeWithDep(
|
321
335
|
f"{cls.name}Id",
|
322
|
-
|
336
|
+
deps=[f"@.models.{pkg.dir.name}.{cls.name}.{cls.name}Id"],
|
323
337
|
)
|
324
338
|
else:
|
325
339
|
# for none id properties, we need to include a type for "invalid" value
|
326
340
|
tstype = _inject_type_for_invalid_value(tstype)
|
327
341
|
|
328
|
-
if
|
329
|
-
|
342
|
+
if prop.is_optional:
|
343
|
+
# convert type to optional
|
344
|
+
tstype = tstype.as_optional_type()
|
345
|
+
|
346
|
+
for dep in tstype.deps:
|
347
|
+
program.import_(dep, True)
|
330
348
|
|
331
349
|
# however, if this is a primary key and auto-increment, we set a different default value
|
332
350
|
# to be -1 to avoid start from 0
|
@@ -426,12 +444,18 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
426
444
|
# this class is stored in the database, we store the id instead
|
427
445
|
tstype = TsTypeWithDep(
|
428
446
|
f"{prop.target.name}Id",
|
429
|
-
|
447
|
+
[
|
448
|
+
f"@.models.{prop.target.get_tsmodule_name()}.{prop.target.name}.{prop.target.name}Id"
|
449
|
+
],
|
430
450
|
)
|
431
451
|
if prop.cardinality.is_star_to_many():
|
432
452
|
tstype = tstype.as_list_type()
|
433
453
|
create_propvalue = expr.ExprConstant([])
|
434
454
|
else:
|
455
|
+
if prop.is_optional:
|
456
|
+
# convert type to optional - for list type, we don't need to do this
|
457
|
+
# as we will use empty list as no value
|
458
|
+
tstype = tstype.as_optional_type()
|
435
459
|
# if target class has an auto-increment primary key, we set a different default value
|
436
460
|
# to be -1 to avoid start from 0
|
437
461
|
target_idprop = prop.target.get_id_property()
|
@@ -461,7 +485,9 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
461
485
|
# we are going to store the whole object
|
462
486
|
tstype = TsTypeWithDep(
|
463
487
|
f"Draft{prop.target.name}",
|
464
|
-
|
488
|
+
[
|
489
|
+
f"@.models.{prop.target.get_tsmodule_name()}.Draft{prop.target.name}.Draft{prop.target.name}"
|
490
|
+
],
|
465
491
|
)
|
466
492
|
if prop.cardinality.is_star_to_many():
|
467
493
|
tstype = tstype.as_list_type()
|
@@ -488,6 +514,10 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
488
514
|
)
|
489
515
|
)
|
490
516
|
else:
|
517
|
+
if prop.is_optional:
|
518
|
+
# convert type to optional - for list type, we don't need to do this
|
519
|
+
# as we will use empty list as no value
|
520
|
+
tstype = tstype.as_optional_type()
|
491
521
|
create_propvalue = expr.ExprMethodCall(
|
492
522
|
expr.ExprIdent(tstype.type),
|
493
523
|
"create",
|
@@ -515,9 +545,9 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
515
545
|
)
|
516
546
|
)
|
517
547
|
|
518
|
-
|
548
|
+
for dep in tstype.deps:
|
519
549
|
program.import_(
|
520
|
-
|
550
|
+
dep,
|
521
551
|
True,
|
522
552
|
)
|
523
553
|
|
@@ -698,12 +728,16 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
698
728
|
comment="Check if the draft is valid (only check the required fields as the non-required fields if it's invalid will be set to undefined)",
|
699
729
|
)(
|
700
730
|
stmt.ReturnStatement(
|
701
|
-
|
731
|
+
expr.ExprRawTypescript(
|
702
732
|
" && ".join(
|
703
733
|
f"{draft_validators}.{prop2tsname[prop.name]}(this.{prop2tsname[prop.name]}).isValid"
|
704
734
|
for prop in cls.properties.values()
|
705
735
|
if not prop.is_optional
|
706
736
|
)
|
737
|
+
if any(
|
738
|
+
not prop.is_optional for prop in cls.properties.values()
|
739
|
+
)
|
740
|
+
else "true"
|
707
741
|
)
|
708
742
|
)
|
709
743
|
),
|
@@ -859,8 +893,8 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
859
893
|
# if prop.name == idprop.name:
|
860
894
|
# # use id type alias
|
861
895
|
# tstype = TsTypeWithDep(f"{cls.name}Id")
|
862
|
-
|
863
|
-
program.import_(
|
896
|
+
for dep in tstype.deps:
|
897
|
+
program.import_(dep, True)
|
864
898
|
tsprop = [
|
865
899
|
(expr.ExprIdent("datatype"), expr.ExprConstant(tstype.type)),
|
866
900
|
(
|
@@ -885,7 +919,9 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
885
919
|
# we are going to store the whole object
|
886
920
|
tstype = TsTypeWithDep(
|
887
921
|
prop.target.name,
|
888
|
-
|
922
|
+
[
|
923
|
+
f"@.models.{prop.target.get_tsmodule_name()}.{prop.target.name}.{prop.target.name}"
|
924
|
+
],
|
889
925
|
)
|
890
926
|
|
891
927
|
# we don't store the type itself, but just the name of the type
|
@@ -901,7 +937,12 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
901
937
|
expr.ExprIdent("targetClass"),
|
902
938
|
expr.ExprConstant(prop.target.name),
|
903
939
|
),
|
904
|
-
(
|
940
|
+
(
|
941
|
+
expr.ExprIdent("datatype"),
|
942
|
+
expr.ExprConstant(
|
943
|
+
tstype.type if prop.target.db is not None else "embedded"
|
944
|
+
),
|
945
|
+
),
|
905
946
|
(
|
906
947
|
expr.ExprIdent("cardinality"),
|
907
948
|
expr.ExprConstant(prop.cardinality.value),
|
@@ -957,24 +998,36 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
957
998
|
)
|
958
999
|
)
|
959
1000
|
|
960
|
-
for type in ["
|
1001
|
+
for type in ["ObjectProperty", "DataProperty"]:
|
961
1002
|
program.import_(f"sera-db.{type}", True)
|
1003
|
+
if cls.db is not None:
|
1004
|
+
program.import_(f"sera-db.Schema", True)
|
1005
|
+
else:
|
1006
|
+
program.import_(f"sera-db.EmbeddedSchema", True)
|
962
1007
|
|
963
1008
|
program.import_(f"@.models.{pkg.dir.name}.{cls.name}.{cls.name}", True)
|
964
|
-
program.import_(f"@.models.{pkg.dir.name}.{cls.name}.{cls.name}Id", True)
|
965
1009
|
program.import_(
|
966
1010
|
f"@.models.{pkg.dir.name}.Draft{cls.name}.Draft{cls.name}", True
|
967
1011
|
)
|
968
1012
|
program.import_(
|
969
1013
|
f"@.models.{pkg.dir.name}.Draft{cls.name}.draft{cls.name}Validators", True
|
970
1014
|
)
|
1015
|
+
if cls.db is not None:
|
1016
|
+
program.import_(f"@.models.{pkg.dir.name}.{cls.name}.{cls.name}Id", True)
|
1017
|
+
|
971
1018
|
program.root(
|
972
1019
|
stmt.LineBreak(),
|
973
1020
|
stmt.TypescriptStatement(
|
974
1021
|
f"export type {cls.name}SchemaType = "
|
975
1022
|
+ PredefinedFn.dict(
|
976
|
-
|
977
|
-
|
1023
|
+
(
|
1024
|
+
[
|
1025
|
+
(expr.ExprIdent("id"), expr.ExprIdent(f"{cls.name}Id")),
|
1026
|
+
]
|
1027
|
+
if cls.db is not None
|
1028
|
+
else []
|
1029
|
+
)
|
1030
|
+
+ [
|
978
1031
|
(
|
979
1032
|
expr.ExprIdent("publicProperties"),
|
980
1033
|
expr.ExprIdent(
|
@@ -1038,7 +1091,11 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
|
|
1038
1091
|
),
|
1039
1092
|
stmt.LineBreak(),
|
1040
1093
|
stmt.TypescriptStatement(
|
1041
|
-
|
1094
|
+
(
|
1095
|
+
f"export const {cls.name}Schema: Schema<{cls.name}SchemaType['id'], {cls.name}SchemaType['cls'], {cls.name}SchemaType['draftCls'], {cls.name}SchemaType['publicProperties'], {cls.name}SchemaType['allProperties'], {cls.name}SchemaType> = "
|
1096
|
+
if cls.db is not None
|
1097
|
+
else f"export const {cls.name}Schema: EmbeddedSchema<{cls.name}SchemaType['cls'], {cls.name}SchemaType['draftCls'], {cls.name}SchemaType['publicProperties'], {cls.name}SchemaType['allProperties']> = "
|
1098
|
+
)
|
1042
1099
|
+ PredefinedFn.dict(
|
1043
1100
|
[
|
1044
1101
|
(
|
@@ -1211,7 +1268,7 @@ def _inject_type_for_invalid_value(tstype: TsTypeWithDep) -> TsTypeWithDep:
|
|
1211
1268
|
else:
|
1212
1269
|
# Need to add parentheses
|
1213
1270
|
inner_type = f"({inner_type} | string)"
|
1214
|
-
return TsTypeWithDep(inner_type + "[]", tstype.
|
1271
|
+
return TsTypeWithDep(inner_type + "[]", tstype.deps)
|
1215
1272
|
|
1216
1273
|
m = re.match(r"^\(?[a-zA-Z \|]+\)?$", tstype.type)
|
1217
1274
|
if m is not None:
|
@@ -1222,7 +1279,7 @@ def _inject_type_for_invalid_value(tstype: TsTypeWithDep) -> TsTypeWithDep:
|
|
1222
1279
|
else:
|
1223
1280
|
# Needs parentheses for clarity
|
1224
1281
|
new_type = f"({tstype.type} | string)"
|
1225
|
-
return TsTypeWithDep(new_type, tstype.
|
1282
|
+
return TsTypeWithDep(new_type, tstype.deps)
|
1226
1283
|
return tstype
|
1227
1284
|
|
1228
1285
|
raise NotImplementedError(tstype.type)
|
sera/models/_datatype.py
CHANGED
@@ -24,7 +24,7 @@ SQLAlchemyDataType = Literal[
|
|
24
24
|
@dataclass
|
25
25
|
class PyTypeWithDep:
|
26
26
|
type: str
|
27
|
-
|
27
|
+
deps: list[str] = field(default_factory=list)
|
28
28
|
|
29
29
|
def get_python_type(self) -> type:
|
30
30
|
"""Get the Python type from the type string for typing annotation in Python."""
|
@@ -50,13 +50,25 @@ class PyTypeWithDep:
|
|
50
50
|
|
51
51
|
def as_list_type(self) -> PyTypeWithDep:
|
52
52
|
"""Convert the type to a list type."""
|
53
|
-
return PyTypeWithDep(type=f"list[{self.type}]",
|
53
|
+
return PyTypeWithDep(type=f"list[{self.type}]", deps=self.deps)
|
54
|
+
|
55
|
+
def as_optional_type(self) -> PyTypeWithDep:
|
56
|
+
"""Convert the type to an optional type."""
|
57
|
+
if "typing.Optional" not in self.deps:
|
58
|
+
deps = self.deps + ["typing.Optional"]
|
59
|
+
else:
|
60
|
+
deps = self.deps
|
61
|
+
if "Optional[" in self.type:
|
62
|
+
raise NotImplementedError(
|
63
|
+
f"Have not handle nested optional yet: {self.type}"
|
64
|
+
)
|
65
|
+
return PyTypeWithDep(type=f"Optional[{self.type}]", deps=deps)
|
54
66
|
|
55
67
|
|
56
68
|
@dataclass
|
57
69
|
class TsTypeWithDep:
|
58
70
|
type: str
|
59
|
-
|
71
|
+
deps: list[str] = field(default_factory=list)
|
60
72
|
|
61
73
|
def get_default(self) -> expr.ExprConstant:
|
62
74
|
if self.type.endswith("[]"):
|
@@ -83,7 +95,14 @@ class TsTypeWithDep:
|
|
83
95
|
list_type = f"({self.type})[]"
|
84
96
|
else:
|
85
97
|
list_type = f"{self.type}[]"
|
86
|
-
return TsTypeWithDep(type=list_type,
|
98
|
+
return TsTypeWithDep(type=list_type, deps=self.deps)
|
99
|
+
|
100
|
+
def as_optional_type(self) -> TsTypeWithDep:
|
101
|
+
if "undefined" in self.type:
|
102
|
+
raise NotImplementedError(
|
103
|
+
f"Have not handle nested optional yet: {self.type}"
|
104
|
+
)
|
105
|
+
return TsTypeWithDep(type=f"{self.type} | undefined", deps=self.deps)
|
87
106
|
|
88
107
|
|
89
108
|
@dataclass
|
@@ -137,16 +156,6 @@ predefined_datatypes = {
|
|
137
156
|
tstype=TsTypeWithDep(type="string"),
|
138
157
|
is_list=False,
|
139
158
|
),
|
140
|
-
"optional[string]": DataType(
|
141
|
-
pytype=PyTypeWithDep(type="Optional[str]", dep="typing.Optional"),
|
142
|
-
sqltype=SQLTypeWithDep(
|
143
|
-
type="String",
|
144
|
-
mapped_pytype="Optional[str]",
|
145
|
-
deps=["sqlalchemy.String", "typing.Optional"],
|
146
|
-
),
|
147
|
-
tstype=TsTypeWithDep(type="string | undefined"),
|
148
|
-
is_list=False,
|
149
|
-
),
|
150
159
|
"integer": DataType(
|
151
160
|
pytype=PyTypeWithDep(type="int"),
|
152
161
|
sqltype=SQLTypeWithDep(
|
@@ -156,7 +165,7 @@ predefined_datatypes = {
|
|
156
165
|
is_list=False,
|
157
166
|
),
|
158
167
|
"datetime": DataType(
|
159
|
-
pytype=PyTypeWithDep(type="datetime",
|
168
|
+
pytype=PyTypeWithDep(type="datetime", deps=["datetime.datetime"]),
|
160
169
|
sqltype=SQLTypeWithDep(
|
161
170
|
type="DateTime",
|
162
171
|
mapped_pytype="datetime",
|
@@ -3,7 +3,7 @@ sera/constants.py,sha256=mzAaMyIx8TJK0-RYYJ5I24C4s0Uvj26OLMJmBo0pxHI,123
|
|
3
3
|
sera/libs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
4
|
sera/libs/api_helper.py,sha256=47y1kcwk3Xd2ZEMnUj_0OwCuUmgwOs5kYrE95BDVUn4,5411
|
5
5
|
sera/libs/base_orm.py,sha256=dyh0OT2sbHku5qPJXvRzYAHRTSXvvbQaS-Qwg65Bw04,2918
|
6
|
-
sera/libs/base_service.py,sha256=
|
6
|
+
sera/libs/base_service.py,sha256=8uKMaIicLc8LbN5vyaK9dGWoCLf_wuaaOw9ooSiqSWM,4614
|
7
7
|
sera/libs/dag/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
8
|
sera/libs/dag/_dag.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
9
|
sera/libs/middlewares/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -13,9 +13,9 @@ sera/make/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
sera/make/__main__.py,sha256=G5O7s6135-708honwqMFn2yPTs06WbGQTHpupID0eZ4,1417
|
14
14
|
sera/make/make_app.py,sha256=n9NtW73O3s_5Q31VHIRmnd-jEIcpDO7ksAsOdovde2s,5999
|
15
15
|
sera/make/make_python_api.py,sha256=kq5DClmEeeNgg-a3Bb_8GN9jxvjnhjmW3RfBHNzynO8,25407
|
16
|
-
sera/make/make_python_model.py,sha256=
|
16
|
+
sera/make/make_python_model.py,sha256=AlNJyyovb99TWocS2jtfTxy0C5YaFizx-Bhwdw1mUNw,41923
|
17
17
|
sera/make/make_python_services.py,sha256=RsinYZdfkrTlTn9CT50VgqGs9w6IZawsJx-KEmqfnEY,2062
|
18
|
-
sera/make/make_typescript_model.py,sha256=
|
18
|
+
sera/make/make_typescript_model.py,sha256=Mv6vXhvwQYzbKCMudzymxN_FH1utqaGGJB2dgyB5sIM,52601
|
19
19
|
sera/misc/__init__.py,sha256=Dh4uDq0D4N53h3zhvmwfa5a0TPVRSUvLzb0hkFuPirk,411
|
20
20
|
sera/misc/_formatter.py,sha256=aCGYL08l8f3aLODHxSocxBBwkRYEo3K1QzCDEn3suj0,1685
|
21
21
|
sera/misc/_utils.py,sha256=V5g4oLGHOhUCR75Kkcn1w01pAvGvaepK-T8Z3pIgHjI,1450
|
@@ -23,7 +23,7 @@ sera/models/__init__.py,sha256=vJC5Kzo_N7wd16ocNPy1VvAZDGNiWeiAhWJ4ihATKvA,780
|
|
23
23
|
sera/models/_class.py,sha256=Wf0e8x6-szG9TzoFkAlqj7_dG0SCICMBw_333n3paxk,2514
|
24
24
|
sera/models/_collection.py,sha256=ZnQEriKC4X88Zz48Kn1AVZKH-1_l8OgWa-zf2kcQOOE,1414
|
25
25
|
sera/models/_constraints.py,sha256=L6QwKL3hRJ5DvvIB4JNgLoyvTKbE9FrpYRzezM4CweE,1484
|
26
|
-
sera/models/_datatype.py,sha256=
|
26
|
+
sera/models/_datatype.py,sha256=RDn0lDl_b0O_PwRqobcD1O903owEAEoMzRf4dyRcgBk,6819
|
27
27
|
sera/models/_default.py,sha256=ABggW6qdPR4ZDqIPJdJ0GCGQ-7kfsfZmQ_DchgZEa-I,137
|
28
28
|
sera/models/_enum.py,sha256=sy0q7E646F-APsqrVQ52r1fAQ_DCAeaNq5YM5QN3zIk,2070
|
29
29
|
sera/models/_module.py,sha256=8QRSCubZmdDP9rL58rGAS6X5VCrkc1ZHvuMu1I1KrWk,5043
|
@@ -32,6 +32,6 @@ sera/models/_parse.py,sha256=uw6fvvh1ucGqE2jFTCCr-e6_qMfZfSVpaPolNxmrHww,9897
|
|
32
32
|
sera/models/_property.py,sha256=SJSm5fZJimd2rQuL4UH_aZuNyp9v7x64xMbEVbtYx8Q,5633
|
33
33
|
sera/models/_schema.py,sha256=r-Gqg9Lb_wR3UrbNvfXXgt_qs5bts0t2Ve7aquuF_OI,1155
|
34
34
|
sera/typing.py,sha256=Q4QMfbtfrCjC9tFfsZPhsAnbNX4lm4NHQ9lmjNXYdV0,772
|
35
|
-
sera_2-1.11.
|
36
|
-
sera_2-1.11.
|
37
|
-
sera_2-1.11.
|
35
|
+
sera_2-1.11.3.dist-info/METADATA,sha256=Rw99XGPK9fkwo5e278P34cjeiLdiEq41e-jl7N269hI,857
|
36
|
+
sera_2-1.11.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
37
|
+
sera_2-1.11.3.dist-info/RECORD,,
|
File without changes
|