sera-2 1.25.0__tar.gz → 1.26.0__tar.gz

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.
Files changed (53) hide show
  1. {sera_2-1.25.0 → sera_2-1.26.0}/PKG-INFO +1 -1
  2. {sera_2-1.25.0 → sera_2-1.26.0}/pyproject.toml +1 -1
  3. {sera_2-1.25.0 → sera_2-1.26.0}/sera/make/make_typescript_model.py +6 -45
  4. {sera_2-1.25.0 → sera_2-1.26.0}/sera/make/ts_frontend/make_enums.py +1 -20
  5. sera_2-1.26.0/sera/make/ts_frontend/make_query.py +146 -0
  6. {sera_2-1.25.0 → sera_2-1.26.0}/sera/make/ts_frontend/misc.py +2 -10
  7. {sera_2-1.25.0 → sera_2-1.26.0}/sera/models/_collection.py +5 -1
  8. {sera_2-1.25.0 → sera_2-1.26.0}/sera/models/_module.py +0 -1
  9. {sera_2-1.25.0 → sera_2-1.26.0}/README.md +0 -0
  10. {sera_2-1.25.0 → sera_2-1.26.0}/sera/__init__.py +0 -0
  11. {sera_2-1.25.0 → sera_2-1.26.0}/sera/constants.py +0 -0
  12. {sera_2-1.25.0 → sera_2-1.26.0}/sera/exports/__init__.py +0 -0
  13. {sera_2-1.25.0 → sera_2-1.26.0}/sera/exports/schema.py +0 -0
  14. {sera_2-1.25.0 → sera_2-1.26.0}/sera/exports/test.py +0 -0
  15. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/__init__.py +0 -0
  16. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/api_helper.py +0 -0
  17. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/api_test_helper.py +0 -0
  18. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/base_orm.py +0 -0
  19. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/base_service.py +0 -0
  20. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/directed_computing_graph/__init__.py +0 -0
  21. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/directed_computing_graph/_dcg.py +0 -0
  22. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/directed_computing_graph/_edge.py +0 -0
  23. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/directed_computing_graph/_flow.py +0 -0
  24. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/directed_computing_graph/_fn_signature.py +0 -0
  25. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/directed_computing_graph/_node.py +0 -0
  26. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/directed_computing_graph/_runtime.py +0 -0
  27. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/directed_computing_graph/_type_conversion.py +0 -0
  28. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/middlewares/__init__.py +0 -0
  29. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/middlewares/auth.py +0 -0
  30. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/middlewares/uscp.py +0 -0
  31. {sera_2-1.25.0 → sera_2-1.26.0}/sera/libs/search_helper.py +0 -0
  32. {sera_2-1.25.0 → sera_2-1.26.0}/sera/make/__init__.py +0 -0
  33. {sera_2-1.25.0 → sera_2-1.26.0}/sera/make/__main__.py +0 -0
  34. {sera_2-1.25.0 → sera_2-1.26.0}/sera/make/make_app.py +0 -0
  35. {sera_2-1.25.0 → sera_2-1.26.0}/sera/make/make_python_api.py +0 -0
  36. {sera_2-1.25.0 → sera_2-1.26.0}/sera/make/make_python_model.py +0 -0
  37. {sera_2-1.25.0 → sera_2-1.26.0}/sera/make/make_python_services.py +0 -0
  38. {sera_2-1.25.0 → sera_2-1.26.0}/sera/make/ts_frontend/__init__.py +0 -0
  39. {sera_2-1.25.0 → sera_2-1.26.0}/sera/make/ts_frontend/make_class_schema.py +0 -0
  40. {sera_2-1.25.0 → sera_2-1.26.0}/sera/misc/__init__.py +0 -0
  41. {sera_2-1.25.0 → sera_2-1.26.0}/sera/misc/_formatter.py +0 -0
  42. {sera_2-1.25.0 → sera_2-1.26.0}/sera/misc/_utils.py +0 -0
  43. {sera_2-1.25.0 → sera_2-1.26.0}/sera/models/__init__.py +0 -0
  44. {sera_2-1.25.0 → sera_2-1.26.0}/sera/models/_class.py +0 -0
  45. {sera_2-1.25.0 → sera_2-1.26.0}/sera/models/_constraints.py +0 -0
  46. {sera_2-1.25.0 → sera_2-1.26.0}/sera/models/_datatype.py +0 -0
  47. {sera_2-1.25.0 → sera_2-1.26.0}/sera/models/_default.py +0 -0
  48. {sera_2-1.25.0 → sera_2-1.26.0}/sera/models/_enum.py +0 -0
  49. {sera_2-1.25.0 → sera_2-1.26.0}/sera/models/_multi_lingual_string.py +0 -0
  50. {sera_2-1.25.0 → sera_2-1.26.0}/sera/models/_parse.py +0 -0
  51. {sera_2-1.25.0 → sera_2-1.26.0}/sera/models/_property.py +0 -0
  52. {sera_2-1.25.0 → sera_2-1.26.0}/sera/models/_schema.py +0 -0
  53. {sera_2-1.25.0 → sera_2-1.26.0}/sera/typing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sera-2
3
- Version: 1.25.0
3
+ Version: 1.26.0
4
4
  Summary:
5
5
  Author: Binh Vu
6
6
  Author-email: bvu687@gmail.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "sera-2"
3
- version = "1.25.0"
3
+ version = "1.26.0"
4
4
  description = ""
5
5
  authors = ["Binh Vu <bvu687@gmail.com>"]
6
6
  readme = "README.md"
@@ -8,6 +8,7 @@ from codegen.models.var import DeferredVar
8
8
  from loguru import logger
9
9
 
10
10
  from sera.make.ts_frontend.make_class_schema import make_class_schema
11
+ from sera.make.ts_frontend.make_query import make_query
11
12
  from sera.make.ts_frontend.misc import TS_GLOBAL_IDENTS, get_normalizer
12
13
  from sera.misc import (
13
14
  assert_isinstance,
@@ -1144,50 +1145,6 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
1144
1145
 
1145
1146
  outmod.write(program)
1146
1147
 
1147
- def make_query_processor(cls: Class, pkg: Package):
1148
- if not cls.is_public:
1149
- # skip classes that are not public
1150
- return
1151
-
1152
- outmod = pkg.module(cls.name + "Query")
1153
-
1154
- program = Program()
1155
- program.import_(f"@.models.{pkg.dir.name}.{cls.name}.{cls.name}", True)
1156
- program.import_(f"sera-db.QueryProcessor", True)
1157
-
1158
- query_args = []
1159
- for prop in cls.properties.values():
1160
- pypropname = prop.name
1161
- tspropname = to_camel_case(prop.name)
1162
-
1163
- if isinstance(prop, ObjectProperty) and prop.target.db is not None:
1164
- tspropname = tspropname + "Id"
1165
- pypropname = prop.name + "_id"
1166
-
1167
- if tspropname != pypropname:
1168
- query_args.append(
1169
- (
1170
- expr.ExprIdent(tspropname),
1171
- expr.ExprConstant(pypropname),
1172
- )
1173
- )
1174
-
1175
- program.root(
1176
- stmt.LineBreak(),
1177
- stmt.TypescriptStatement(
1178
- f"export const query = "
1179
- + expr.ExprNewInstance(
1180
- expr.ExprIdent(f"QueryProcessor<{cls.name}>"),
1181
- [
1182
- PredefinedFn.dict(query_args),
1183
- ],
1184
- ).to_typescript()
1185
- + ";",
1186
- ),
1187
- )
1188
-
1189
- outmod.write(program)
1190
-
1191
1148
  def make_index(pkg: Package):
1192
1149
  outmod = pkg.module("index")
1193
1150
  if outmod.exists():
@@ -1209,7 +1166,11 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
1209
1166
  program.import_(
1210
1167
  f"@.models.{pkg.dir.name}.{cls.name}Schema.{cls.name}Schema", True
1211
1168
  )
1169
+ program.import_(
1170
+ f"@.models.{pkg.dir.name}.{cls.name}Query.{cls.name}Query", True
1171
+ )
1212
1172
  export_types.append(f"{cls.name}Schema")
1173
+ export_iso_types.append(f"{cls.name}Query")
1213
1174
  program.import_(
1214
1175
  f"@.models.{pkg.dir.name}.{cls.name}Schema.{cls.name}SchemaType", True
1215
1176
  )
@@ -1241,7 +1202,7 @@ def make_typescript_data_model(schema: Schema, target_pkg: Package):
1241
1202
  pkg = target_pkg.pkg(cls.get_tsmodule_name())
1242
1203
  make_normal(cls, pkg)
1243
1204
  make_draft(cls, pkg)
1244
- make_query_processor(cls, pkg)
1205
+ make_query(schema, cls, pkg)
1245
1206
  make_table(cls, pkg)
1246
1207
  make_class_schema(schema, cls, pkg)
1247
1208
 
@@ -1,32 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
- import re
4
- from typing import Any, Callable
5
3
 
6
- from codegen.models import AST, ImportHelper, PredefinedFn, Program, expr, stmt
7
- from codegen.models.var import DeferredVar
8
- from loguru import logger
4
+ from codegen.models import PredefinedFn, Program, expr, stmt
9
5
 
10
- from sera.make.ts_frontend.make_class_schema import make_class_schema
11
- from sera.make.ts_frontend.misc import TS_GLOBAL_IDENTS, get_normalizer
12
- from sera.misc import (
13
- assert_isinstance,
14
- assert_not_null,
15
- identity,
16
- to_camel_case,
17
- to_pascal_case,
18
- to_snake_case,
19
- )
20
6
  from sera.models import (
21
- Class,
22
- DataProperty,
23
7
  Enum,
24
- ObjectProperty,
25
8
  Package,
26
9
  Schema,
27
- TsTypeWithDep,
28
10
  )
29
- from sera.typing import is_set
30
11
 
31
12
 
32
13
  def make_typescript_enums(schema: Schema, target_pkg: Package):
@@ -0,0 +1,146 @@
1
+ from __future__ import annotations
2
+
3
+ from codegen.models import AST, ImportHelper, PredefinedFn, Program, expr, stmt
4
+ from codegen.models.var import DeferredVar
5
+ from loguru import logger
6
+
7
+ from sera.misc import (
8
+ assert_isinstance,
9
+ assert_not_null,
10
+ identity,
11
+ to_camel_case,
12
+ to_pascal_case,
13
+ to_snake_case,
14
+ )
15
+ from sera.models import (
16
+ Class,
17
+ DataProperty,
18
+ Enum,
19
+ ObjectProperty,
20
+ Package,
21
+ Schema,
22
+ TsTypeWithDep,
23
+ )
24
+
25
+
26
+ def make_query(schema: Schema, cls: Class, pkg: Package):
27
+ """Make query processor and query schema.
28
+
29
+ Args:
30
+ schema: The overall schema of the application, which contains all classes & enums
31
+ cls: The class that we want to generate the query processor and schema
32
+ pkg: The output package (directory) for the class in the `@.models` package. For example, if the
33
+ class is `User`, then the package would be `src/models/user`.
34
+
35
+ Returns:
36
+ This function do not return anything as it writes the query helper directly to a file.
37
+ """
38
+ if not cls.is_public:
39
+ # skip classes that are not public
40
+ return
41
+
42
+ outmod = pkg.module(cls.name + "Query")
43
+
44
+ program = Program()
45
+ program.import_(f"@.models.{pkg.dir.name}.{cls.name}.{cls.name}", True)
46
+ program.import_(f"sera-db.QueryProcessor", True)
47
+ program.import_(f"sera-db.Query", True)
48
+
49
+ query_args = []
50
+ for prop in cls.properties.values():
51
+ pypropname = prop.name
52
+ tspropname = to_camel_case(prop.name)
53
+
54
+ if isinstance(prop, ObjectProperty) and prop.target.db is not None:
55
+ tspropname = tspropname + "Id"
56
+ pypropname = prop.name + "_id"
57
+
58
+ if tspropname != pypropname:
59
+ query_args.append(
60
+ (
61
+ expr.ExprIdent(tspropname),
62
+ expr.ExprConstant(pypropname),
63
+ )
64
+ )
65
+
66
+ query_condition_args = []
67
+ for prop in cls.properties.values():
68
+ if prop.db is None or prop.data.is_private:
69
+ # This property is not stored in the database or it's private, so we skip it
70
+ continue
71
+ if (
72
+ isinstance(prop, DataProperty)
73
+ and prop.db is not None
74
+ and not prop.db.is_indexed
75
+ ):
76
+ # This property is not indexed, so we skip it
77
+ continue
78
+ if isinstance(prop, ObjectProperty) and prop.target.db is None:
79
+ # TODO: Implement this! This property is an embedded object property, we need to figure out
80
+ # which necessary properties are queryable and add them to the field names
81
+ continue
82
+
83
+ tspropname = to_camel_case(prop.name)
84
+ if isinstance(prop, ObjectProperty) and prop.target.db is not None:
85
+ # This property is an object property stored in the database, "Id" is added to the property name
86
+ tspropname = tspropname + "Id"
87
+
88
+ if isinstance(prop, DataProperty):
89
+ tstype = prop.datatype.get_typescript_type()
90
+ else:
91
+ assert isinstance(prop, ObjectProperty)
92
+ tstype = assert_not_null(
93
+ prop.target.get_id_property()
94
+ ).datatype.get_typescript_type()
95
+
96
+ for dep in tstype.deps:
97
+ program.import_(dep, is_import_attr=True)
98
+
99
+ if tstype.type == "string":
100
+ op = '"fuzzy"'
101
+ elif tstype.type in "number" or tstype.type == "Date":
102
+ op = '"eq" | "ne" | "lt" | "lte" | "gt" | "gte"'
103
+ elif tstype.is_enum_type():
104
+ op = '"eq" | "ne"'
105
+ else:
106
+ raise NotImplementedError(tstype.type)
107
+
108
+ if tstype.type == "Date":
109
+ # for date type, we use timestamp (number) for comparison
110
+ value = "number"
111
+ else:
112
+ value = tstype.type
113
+
114
+ query_condition_args.append(
115
+ (
116
+ expr.ExprIdent(tspropname + "?"),
117
+ PredefinedFn.dict(
118
+ [
119
+ (expr.ExprIdent("op"), expr.ExprIdent(op)),
120
+ (expr.ExprIdent("value"), expr.ExprIdent(value)),
121
+ ]
122
+ ),
123
+ )
124
+ )
125
+
126
+ program.root(
127
+ stmt.LineBreak(),
128
+ stmt.TypescriptStatement(
129
+ f"export const query = "
130
+ + expr.ExprNewInstance(
131
+ expr.ExprIdent(f"QueryProcessor<{cls.name}>"),
132
+ [
133
+ PredefinedFn.dict(query_args),
134
+ ],
135
+ ).to_typescript()
136
+ + ";",
137
+ ),
138
+ stmt.LineBreak(),
139
+ stmt.TypescriptStatement(
140
+ f"export type {cls.name}Query = Query<{cls.name}, "
141
+ + PredefinedFn.dict(query_condition_args).to_typescript()
142
+ + ">;"
143
+ ),
144
+ )
145
+
146
+ outmod.write(program)
@@ -2,17 +2,9 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Optional
4
4
 
5
- from codegen.models import AST, ImportHelper, PredefinedFn, Program, expr, stmt
5
+ from codegen.models import ImportHelper, expr
6
6
 
7
- from sera.models import (
8
- Class,
9
- DataProperty,
10
- Enum,
11
- ObjectProperty,
12
- Package,
13
- Schema,
14
- TsTypeWithDep,
15
- )
7
+ from sera.models import TsTypeWithDep
16
8
 
17
9
  TS_GLOBAL_IDENTS = {
18
10
  "normalizers.normalizeNumber": "sera-db.normalizers",
@@ -55,7 +55,11 @@ class DataCollection:
55
55
  """Get the fields of this collection that can be used in join queries."""
56
56
  output = {}
57
57
  for prop in self.cls.properties.values():
58
- if isinstance(prop, DataProperty) and prop.db.foreign_key is not None:
58
+ if (
59
+ isinstance(prop, DataProperty)
60
+ and prop.db is not None
61
+ and prop.db.foreign_key is not None
62
+ ):
59
63
  # This property is a foreign key, so we add it to the output
60
64
  output[prop.name] = DataCollection(
61
65
  prop.db.foreign_key
@@ -183,4 +183,3 @@ class App:
183
183
  def name(self) -> str:
184
184
  """Get the name of the application"""
185
185
  return self.root.dir.name
186
- return self.root.dir.name
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes