nsj-rest-lib2 0.0.15__py3-none-any.whl → 0.0.17__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.
- nsj_rest_lib2/compiler/compiler.py +85 -33
- nsj_rest_lib2/compiler/compiler_structures.py +2 -0
- nsj_rest_lib2/compiler/edl_model/entity_model.py +2 -2
- nsj_rest_lib2/compiler/edl_model/entity_model_base.py +12 -4
- nsj_rest_lib2/compiler/edl_model/{entity_model_mixin.py → entity_model_root.py} +1 -1
- nsj_rest_lib2/compiler/edl_model/property_meta_model.py +1 -2
- nsj_rest_lib2/compiler/edl_model/trait_property_meta_model.py +3 -0
- nsj_rest_lib2/compiler/entity_compiler.py +12 -3
- nsj_rest_lib2/compiler/property_compiler.py +30 -3
- {nsj_rest_lib2-0.0.15.dist-info → nsj_rest_lib2-0.0.17.dist-info}/METADATA +8 -2
- {nsj_rest_lib2-0.0.15.dist-info → nsj_rest_lib2-0.0.17.dist-info}/RECORD +13 -13
- {nsj_rest_lib2-0.0.15.dist-info → nsj_rest_lib2-0.0.17.dist-info}/WHEEL +0 -0
- {nsj_rest_lib2-0.0.15.dist-info → nsj_rest_lib2-0.0.17.dist-info}/top_level.txt +0 -0
|
@@ -9,7 +9,7 @@ from nsj_rest_lib2.compiler.compiler_structures import (
|
|
|
9
9
|
)
|
|
10
10
|
from nsj_rest_lib2.compiler.dto_compiler import DTOCompiler
|
|
11
11
|
from nsj_rest_lib2.compiler.edl_model.entity_model_base import EntityModelBase
|
|
12
|
-
from nsj_rest_lib2.compiler.edl_model.
|
|
12
|
+
from nsj_rest_lib2.compiler.edl_model.entity_model_root import EntityModelRoot
|
|
13
13
|
from nsj_rest_lib2.compiler.edl_model.primitives import REGEX_EXTERNAL_REF
|
|
14
14
|
from nsj_rest_lib2.compiler.entity_compiler import EntityCompiler
|
|
15
15
|
from nsj_rest_lib2.compiler.model import CompilerResult
|
|
@@ -19,6 +19,7 @@ from nsj_rest_lib2.compiler.edl_model.entity_model import EntityModel
|
|
|
19
19
|
|
|
20
20
|
from nsj_rest_lib2.settings import get_logger
|
|
21
21
|
|
|
22
|
+
# TODO GET e POST de relacionamentos 1X1
|
|
22
23
|
# TODO Revisar compilação de valores default (sensível a tipos)
|
|
23
24
|
# TODO Implementar suporte a conjuntos
|
|
24
25
|
# TODO Autenticação nas rotas
|
|
@@ -60,7 +61,7 @@ class EDLCompiler:
|
|
|
60
61
|
entity_models = []
|
|
61
62
|
for dependency_edl in dependencies_edls:
|
|
62
63
|
if "mixin" in dependency_edl and dependency_edl["mixin"]:
|
|
63
|
-
dependency_entity_model =
|
|
64
|
+
dependency_entity_model = EntityModelRoot(**dependency_edl)
|
|
64
65
|
else:
|
|
65
66
|
dependency_entity_model = EntityModel(**dependency_edl)
|
|
66
67
|
entity_models.append(dependency_entity_model)
|
|
@@ -220,6 +221,16 @@ class EDLCompiler:
|
|
|
220
221
|
if not entity_model:
|
|
221
222
|
return
|
|
222
223
|
|
|
224
|
+
# Populando com os components da superclasse (extends)
|
|
225
|
+
if entity_model.extends:
|
|
226
|
+
super_model = entity_models[entity_model.extends]
|
|
227
|
+
|
|
228
|
+
self._make_components_structures(
|
|
229
|
+
components_structure,
|
|
230
|
+
super_model,
|
|
231
|
+
entity_models,
|
|
232
|
+
)
|
|
233
|
+
|
|
223
234
|
# Populando com os components do trait
|
|
224
235
|
if entity_model.trait_from:
|
|
225
236
|
trait_model = entity_models[entity_model.trait_from]
|
|
@@ -243,6 +254,29 @@ class EDLCompiler:
|
|
|
243
254
|
if not entity_model:
|
|
244
255
|
return
|
|
245
256
|
|
|
257
|
+
# Populando com as propriedades dos mixins
|
|
258
|
+
if entity_model.mixins:
|
|
259
|
+
for mixin_id in entity_model.mixins:
|
|
260
|
+
if mixin_id not in entity_models:
|
|
261
|
+
raise Exception(f"Mixin '{mixin_id}' não encontrado.")
|
|
262
|
+
|
|
263
|
+
mixin_model = entity_models[mixin_id]
|
|
264
|
+
self._make_properties_structures(
|
|
265
|
+
properties_structure,
|
|
266
|
+
mixin_model,
|
|
267
|
+
entity_models,
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
# Populando com as propriedades da superclasse (extends)
|
|
271
|
+
if entity_model.extends:
|
|
272
|
+
super_model = entity_models[entity_model.extends]
|
|
273
|
+
|
|
274
|
+
self._make_properties_structures(
|
|
275
|
+
properties_structure,
|
|
276
|
+
super_model,
|
|
277
|
+
entity_models,
|
|
278
|
+
)
|
|
279
|
+
|
|
246
280
|
# Populando com as propriedades do trait
|
|
247
281
|
if entity_model.trait_from:
|
|
248
282
|
trait_model = entity_models[entity_model.trait_from]
|
|
@@ -271,24 +305,16 @@ class EDLCompiler:
|
|
|
271
305
|
if entity_model.trait_properties:
|
|
272
306
|
properties_structure.trait_properties.update(entity_model.trait_properties)
|
|
273
307
|
|
|
308
|
+
if entity_model.extends_properties:
|
|
309
|
+
properties_structure.extends_properties.update(
|
|
310
|
+
entity_model.extends_properties
|
|
311
|
+
)
|
|
312
|
+
|
|
274
313
|
if entity_model.repository.properties:
|
|
275
314
|
properties_structure.entity_properties.update(
|
|
276
315
|
entity_model.repository.properties
|
|
277
316
|
)
|
|
278
317
|
|
|
279
|
-
# Populando com as propriedades dos mixins
|
|
280
|
-
if entity_model.mixins:
|
|
281
|
-
for mixin_id in entity_model.mixins:
|
|
282
|
-
if mixin_id not in entity_models:
|
|
283
|
-
raise Exception(f"Mixin '{mixin_id}' não encontrado.")
|
|
284
|
-
|
|
285
|
-
mixin_model = entity_models[mixin_id]
|
|
286
|
-
self._make_properties_structures(
|
|
287
|
-
properties_structure,
|
|
288
|
-
mixin_model,
|
|
289
|
-
entity_models,
|
|
290
|
-
)
|
|
291
|
-
|
|
292
318
|
def _make_unique_map_by_property(
|
|
293
319
|
self,
|
|
294
320
|
map_indexes_by_property: dict[str, list[IndexCompilerStructure]],
|
|
@@ -301,6 +327,30 @@ class EDLCompiler:
|
|
|
301
327
|
if not entity_model:
|
|
302
328
|
return
|
|
303
329
|
|
|
330
|
+
# Populando com as uniques da superclasse (extends)
|
|
331
|
+
if entity_model.extends:
|
|
332
|
+
super_model = entity_models[entity_model.extends]
|
|
333
|
+
|
|
334
|
+
self._make_unique_map_by_property(
|
|
335
|
+
map_indexes_by_property,
|
|
336
|
+
map_unique_by_property,
|
|
337
|
+
super_model,
|
|
338
|
+
entity_models,
|
|
339
|
+
deep=deep + 1,
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
# Populando com as uniques do trait
|
|
343
|
+
if entity_model.trait_from:
|
|
344
|
+
trait_model = entity_models[entity_model.trait_from]
|
|
345
|
+
|
|
346
|
+
self._make_unique_map_by_property(
|
|
347
|
+
map_indexes_by_property,
|
|
348
|
+
map_unique_by_property,
|
|
349
|
+
trait_model,
|
|
350
|
+
entity_models,
|
|
351
|
+
deep=deep + 1,
|
|
352
|
+
)
|
|
353
|
+
|
|
304
354
|
# Varrendo e organizando os índices
|
|
305
355
|
if entity_model.repository.indexes:
|
|
306
356
|
for index in entity_model.repository.indexes:
|
|
@@ -324,23 +374,11 @@ class EDLCompiler:
|
|
|
324
374
|
list_index = map_indexes_by_property.setdefault(pkey, [])
|
|
325
375
|
list_index.append(IndexCompilerStructure(index, deep > 1))
|
|
326
376
|
|
|
327
|
-
# Populando com as propriedades do trait
|
|
328
|
-
if entity_model.trait_from:
|
|
329
|
-
trait_model = entity_models[entity_model.trait_from]
|
|
330
|
-
|
|
331
|
-
self._make_unique_map_by_property(
|
|
332
|
-
map_indexes_by_property,
|
|
333
|
-
map_unique_by_property,
|
|
334
|
-
trait_model,
|
|
335
|
-
entity_models,
|
|
336
|
-
deep=deep + 1,
|
|
337
|
-
)
|
|
338
|
-
|
|
339
377
|
def list_dependencies(
|
|
340
378
|
self, edl_json: dict[str, Any]
|
|
341
379
|
) -> tuple[list[str], EntityModelBase]:
|
|
342
380
|
if edl_json.get("mixin", False):
|
|
343
|
-
entity_model =
|
|
381
|
+
entity_model = EntityModelRoot(**edl_json)
|
|
344
382
|
else:
|
|
345
383
|
entity_model = EntityModel(**edl_json)
|
|
346
384
|
|
|
@@ -349,16 +387,30 @@ class EDLCompiler:
|
|
|
349
387
|
def _list_dependencies(self, entity_model: EntityModelBase) -> list[str]:
|
|
350
388
|
entities: list[str] = []
|
|
351
389
|
|
|
352
|
-
# Adicionando dependências por traits
|
|
353
|
-
if entity_model.trait_from:
|
|
354
|
-
entities.append(entity_model.trait_from)
|
|
355
|
-
|
|
356
390
|
# Adicionando dependências por mixins
|
|
357
391
|
if entity_model.mixins:
|
|
358
392
|
entities.extend(entity_model.mixins)
|
|
359
393
|
|
|
394
|
+
# Adicionando dependências por traits
|
|
395
|
+
if entity_model.extends:
|
|
396
|
+
entities.append(entity_model.extends)
|
|
397
|
+
|
|
398
|
+
# Adicionando dependências por traits
|
|
399
|
+
if entity_model.trait_from:
|
|
400
|
+
entities.append(entity_model.trait_from)
|
|
401
|
+
|
|
360
402
|
# Populando com as dependências de propriedades de relacionamento
|
|
361
403
|
relations = self._list_dependencies_relations(entity_model)
|
|
404
|
+
|
|
405
|
+
components_dependency_list = []
|
|
406
|
+
if entity_model.components is not None:
|
|
407
|
+
for component in entity_model.components:
|
|
408
|
+
components_dependency_list.extend(
|
|
409
|
+
self._list_dependencies(entity_model.components[component])
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
relations.extend(components_dependency_list)
|
|
413
|
+
|
|
362
414
|
entities.extend(relations)
|
|
363
415
|
|
|
364
416
|
return entities
|
|
@@ -419,7 +471,7 @@ if __name__ == "__main__":
|
|
|
419
471
|
# e já realizando as validações básicas de tipo e estrutura.
|
|
420
472
|
print(f"Validando arquivo: {file}")
|
|
421
473
|
if edl.get("mixin", False):
|
|
422
|
-
entity_model =
|
|
474
|
+
entity_model = EntityModelRoot(**edl)
|
|
423
475
|
else:
|
|
424
476
|
entity_model = EntityModel(**edl)
|
|
425
477
|
|
|
@@ -3,6 +3,7 @@ from nsj_rest_lib2.compiler.edl_model.entity_model_base import EntityModelBase
|
|
|
3
3
|
from nsj_rest_lib2.compiler.edl_model.index_model import IndexModel
|
|
4
4
|
from nsj_rest_lib2.compiler.edl_model.property_meta_model import PropertyMetaModel
|
|
5
5
|
from nsj_rest_lib2.compiler.edl_model.trait_property_meta_model import (
|
|
6
|
+
ExtendsPropertyMetaModel,
|
|
6
7
|
TraitPropertyMetaModel,
|
|
7
8
|
)
|
|
8
9
|
|
|
@@ -23,6 +24,7 @@ class PropertiesCompilerStructure:
|
|
|
23
24
|
self.metric_label: list[str] = []
|
|
24
25
|
self.entity_properties: dict[str, ColumnMetaModel] = {}
|
|
25
26
|
self.trait_properties: dict[str, TraitPropertyMetaModel] = {}
|
|
27
|
+
self.extends_properties: dict[str, ExtendsPropertyMetaModel] = {}
|
|
26
28
|
|
|
27
29
|
|
|
28
30
|
class ComponentsCompilerStructure:
|
|
@@ -4,10 +4,10 @@ from pydantic import Field
|
|
|
4
4
|
from typing import Optional
|
|
5
5
|
|
|
6
6
|
from nsj_rest_lib2.compiler.edl_model.api_model import APIModel
|
|
7
|
-
from nsj_rest_lib2.compiler.edl_model.
|
|
7
|
+
from nsj_rest_lib2.compiler.edl_model.entity_model_root import EntityModelRoot
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
class EntityModel(
|
|
10
|
+
class EntityModel(EntityModelRoot):
|
|
11
11
|
edl_version: Optional[str] = Field(default="1.0", description="Versão do EDL")
|
|
12
12
|
version: Optional[str] = Field(
|
|
13
13
|
default="1.0", description="Versão da entidade (padrão: 1.0)."
|
|
@@ -8,6 +8,7 @@ from typing import Dict, List, Optional
|
|
|
8
8
|
from nsj_rest_lib2.compiler.edl_model.property_meta_model import PropertyMetaModel
|
|
9
9
|
from nsj_rest_lib2.compiler.edl_model.repository_model import RepositoryModel
|
|
10
10
|
from nsj_rest_lib2.compiler.edl_model.trait_property_meta_model import (
|
|
11
|
+
ExtendsPropertyMetaModel,
|
|
11
12
|
TraitPropertyMetaModel,
|
|
12
13
|
)
|
|
13
14
|
|
|
@@ -18,6 +19,13 @@ class EntityModelBase(BaseModel):
|
|
|
18
19
|
...,
|
|
19
20
|
description="Identificador único da entidade, dentro de um determinado escopo (podendo ser sobreescrito para um tenant ou grupo _empresarial).",
|
|
20
21
|
)
|
|
22
|
+
mixin: Optional[bool] = Field(
|
|
23
|
+
False,
|
|
24
|
+
description="Indica se o modelo é um mixin (bloco reutilizável, que não gera contém tabela própria no banco).",
|
|
25
|
+
)
|
|
26
|
+
extends: Optional[str] = Field(
|
|
27
|
+
None, description="Identificador da entidade estendida por esta."
|
|
28
|
+
)
|
|
21
29
|
trait_from: Optional[str] = Field(
|
|
22
30
|
None, description="Identificador da entidade que a trait estende."
|
|
23
31
|
)
|
|
@@ -28,10 +36,6 @@ class EntityModelBase(BaseModel):
|
|
|
28
36
|
required: Optional[List[str]] = Field(
|
|
29
37
|
None, description="Lista de campos obrigatórios no modelo."
|
|
30
38
|
)
|
|
31
|
-
mixin: Optional[bool] = Field(
|
|
32
|
-
False,
|
|
33
|
-
description="Indica se o modelo é um mixin (bloco reutilizável, que não gera contém tabela própria no banco).",
|
|
34
|
-
)
|
|
35
39
|
partition_data: Optional[List[str]] = Field(
|
|
36
40
|
None,
|
|
37
41
|
description="Lista de propriedades da entidade, que serã usadas para particionamento dos dados no banco (sendo obrigatórias em todas as chamadas, inclusive como um tipo de filtro obrigatório).",
|
|
@@ -52,6 +56,10 @@ class EntityModelBase(BaseModel):
|
|
|
52
56
|
None,
|
|
53
57
|
description="Dicionário de propriedades condicionais da trait (isso é, especifica propriedades, e seus valores fixos, que serão usados como um tipo de filtro fixo usado como condição para que a propridade principal assum o papel daquele tipo de trait).",
|
|
54
58
|
)
|
|
59
|
+
extends_properties: Optional[Dict[str, ExtendsPropertyMetaModel]] = Field(
|
|
60
|
+
None,
|
|
61
|
+
description="Dicionário de propriedades condicionais associadas ao uso de extends (especifica propriedades e seus valores fixos, usados como filtros quando a entidade é uma especialização via extends).",
|
|
62
|
+
)
|
|
55
63
|
properties: Dict[str, PropertyMetaModel] = Field(
|
|
56
64
|
..., description="Dicionário de propriedades do modelo."
|
|
57
65
|
)
|
|
@@ -3,5 +3,5 @@ from pydantic import Field
|
|
|
3
3
|
from nsj_rest_lib2.compiler.edl_model.entity_model_base import EntityModelBase
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
class
|
|
6
|
+
class EntityModelRoot(EntityModelBase):
|
|
7
7
|
escopo: str = Field(..., description="Escopo do EDL (define a aplicação).")
|
|
@@ -26,7 +26,6 @@ class PropertyMetaModel(BaseModel):
|
|
|
26
26
|
key_alternative: Optional[bool] = Field(
|
|
27
27
|
default=False,
|
|
28
28
|
description="Indica se a propriedade é parte de uma chave alternativa (chave natural).",
|
|
29
|
-
alias="keyAlternative",
|
|
30
29
|
)
|
|
31
30
|
cardinality: Optional[CardinalityTypes] = Field(
|
|
32
31
|
None,
|
|
@@ -39,7 +38,7 @@ class PropertyMetaModel(BaseModel):
|
|
|
39
38
|
|
|
40
39
|
## TODO Sugestões de validação
|
|
41
40
|
min_length: Optional[int] = Field(
|
|
42
|
-
None, description="Comprimento mínimo (para strings)."
|
|
41
|
+
None, description="Comprimento mínimo (para strings)."
|
|
43
42
|
)
|
|
44
43
|
pattern: Optional[str] = Field(
|
|
45
44
|
None,
|
|
@@ -50,6 +50,15 @@ class EntityCompiler:
|
|
|
50
50
|
)
|
|
51
51
|
|
|
52
52
|
default_order_props = []
|
|
53
|
+
|
|
54
|
+
key_field = props_pk[0]
|
|
55
|
+
if entity_model.repository.properties:
|
|
56
|
+
if (
|
|
57
|
+
key_field in entity_model.repository.properties
|
|
58
|
+
and entity_model.repository.properties[key_field].column
|
|
59
|
+
):
|
|
60
|
+
key_field = entity_model.repository.properties[props_pk[0]].column
|
|
61
|
+
|
|
53
62
|
if (
|
|
54
63
|
isinstance(entity_model, EntityModel)
|
|
55
64
|
and entity_model.api
|
|
@@ -69,8 +78,8 @@ class EntityCompiler:
|
|
|
69
78
|
|
|
70
79
|
default_order_fields.append(CompilerStrUtil.to_snake_case(field))
|
|
71
80
|
|
|
72
|
-
if CompilerStrUtil.to_snake_case(
|
|
73
|
-
default_order_fields.append(CompilerStrUtil.to_snake_case(
|
|
81
|
+
if CompilerStrUtil.to_snake_case(key_field) not in default_order_fields:
|
|
82
|
+
default_order_fields.append(CompilerStrUtil.to_snake_case(key_field))
|
|
74
83
|
|
|
75
84
|
class_name = compile_entity_class_name(entity_model.id, prefix_class_name)
|
|
76
85
|
ast_class = ast.ClassDef(
|
|
@@ -89,7 +98,7 @@ class EntityCompiler:
|
|
|
89
98
|
ast.keyword(
|
|
90
99
|
arg="pk_field",
|
|
91
100
|
value=ast.Constant(
|
|
92
|
-
value=CompilerStrUtil.to_snake_case(
|
|
101
|
+
value=CompilerStrUtil.to_snake_case(key_field)
|
|
93
102
|
),
|
|
94
103
|
),
|
|
95
104
|
ast.keyword(
|
|
@@ -153,7 +153,24 @@ class EDLPropertyCompiler:
|
|
|
153
153
|
for pkey in properties_structure.trait_properties:
|
|
154
154
|
prop = properties_structure.trait_properties[pkey]
|
|
155
155
|
|
|
156
|
-
self.
|
|
156
|
+
self._compile_trait_extends_property(
|
|
157
|
+
properties_structure,
|
|
158
|
+
map_unique_by_property,
|
|
159
|
+
pkey,
|
|
160
|
+
prop,
|
|
161
|
+
ast_dto_attributes,
|
|
162
|
+
ast_entity_attributes,
|
|
163
|
+
fixed_filters,
|
|
164
|
+
escopo,
|
|
165
|
+
entity_model,
|
|
166
|
+
enum_classes,
|
|
167
|
+
prefx_class_name,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
for pkey in properties_structure.extends_properties:
|
|
171
|
+
prop = properties_structure.extends_properties[pkey]
|
|
172
|
+
|
|
173
|
+
self._compile_trait_extends_property(
|
|
157
174
|
properties_structure,
|
|
158
175
|
map_unique_by_property,
|
|
159
176
|
pkey,
|
|
@@ -177,7 +194,7 @@ class EDLPropertyCompiler:
|
|
|
177
194
|
fixed_filters,
|
|
178
195
|
)
|
|
179
196
|
|
|
180
|
-
def
|
|
197
|
+
def _compile_trait_extends_property(
|
|
181
198
|
self,
|
|
182
199
|
properties_structure: PropertiesCompilerStructure,
|
|
183
200
|
map_unique_by_property: dict[str, IndexCompilerStructure],
|
|
@@ -665,9 +682,19 @@ class EDLPropertyCompiler:
|
|
|
665
682
|
)
|
|
666
683
|
)
|
|
667
684
|
else:
|
|
685
|
+
dto_property_name = f"relation_1_1_self_column_{relation_column}"
|
|
668
686
|
# Adicionando propriedade, para o campo de relação, no DTO (quando for o dono da relação)
|
|
669
687
|
ast_dto_attributes.append(
|
|
670
|
-
self._build_dto_property_ast(
|
|
688
|
+
self._build_dto_property_ast(
|
|
689
|
+
dto_property_name,
|
|
690
|
+
PrimitiveTypes.UUID,
|
|
691
|
+
keywords=[
|
|
692
|
+
ast.keyword(
|
|
693
|
+
arg="entity_field",
|
|
694
|
+
value=ast.Constant(value=relation_column),
|
|
695
|
+
),
|
|
696
|
+
],
|
|
697
|
+
)
|
|
671
698
|
)
|
|
672
699
|
|
|
673
700
|
# Adicionando propriedade, para o campo de relação, no Entity (quando for o dono da relação)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nsj_rest_lib2
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.17
|
|
4
4
|
Summary: Biblioteca para permitir a distribuição de rotas dinâmicas numa API, configuradas por meio de EDLs declarativos (em formato JSON).
|
|
5
5
|
Home-page: https://github.com/Nasajon/nsj_rest_lib2
|
|
6
6
|
Author: Nasajon Sistemas
|
|
@@ -23,8 +23,14 @@ Requires-Dist: pyyaml<7.0.0,>=6.0.3
|
|
|
23
23
|
|
|
24
24
|
Biblioteca para permitir a distribuição de rotas dinâmicas numa API, configuradas por meio de EDLs declarativos (em formato JSON).
|
|
25
25
|
|
|
26
|
+
[ESPECIFICAÇÃO DO MODELO DE ENTIDADES](docs/especificacao.md)
|
|
27
|
+
|
|
26
28
|
## TODO
|
|
27
|
-
* Colocar tempo para recarregamento das entidades (para checar, no redis, se mudou o hash.)
|
|
28
29
|
* Unificar o arquivo redis_config.py
|
|
29
30
|
* Usar pydantic, ou similar, para transformar a configuração das entidades, no redis, num objeto
|
|
30
31
|
* Rever modo de usar o InjectFactory (talvez dando ciência, ao RestLib, do padrão multibanco)
|
|
32
|
+
* Implementar e documentar campos join
|
|
33
|
+
* Implementar e documentar conjuntos
|
|
34
|
+
* Dar erro ao haver conflito de nomes das propriedades (por qualquer tipo de herança)
|
|
35
|
+
* Rotas para o inline
|
|
36
|
+
* inline será para composição (arquivo externo é agregação)
|
|
@@ -4,24 +4,24 @@ nsj_rest_lib2/redis_config.py,sha256=4KLcvYS3nJO7PMQgF6F9_j6r-TyqcS7TBbd3LEQuKDU
|
|
|
4
4
|
nsj_rest_lib2/settings.py,sha256=Hn_o1HZmievnYb8D1kNT2Nq-OEjxbyNjOiOpbnFsMwE,367
|
|
5
5
|
nsj_rest_lib2/compiler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
nsj_rest_lib2/compiler/ai_compiler.py,sha256=shAtN4T0ai_52qh15L3mK1QbeC6glHOR6C3J3gj14II,9029
|
|
7
|
-
nsj_rest_lib2/compiler/compiler.py,sha256=
|
|
8
|
-
nsj_rest_lib2/compiler/compiler_structures.py,sha256=
|
|
7
|
+
nsj_rest_lib2/compiler/compiler.py,sha256=J5ggkuYi-wQDra8t2R9riP3rqaKl2AQgnRqXZMX1QXE,18470
|
|
8
|
+
nsj_rest_lib2/compiler/compiler_structures.py,sha256=2rLC21vMsLWURlRlQP4XGW51TRajmYY_guE6OBcoGBA,1318
|
|
9
9
|
nsj_rest_lib2/compiler/dto_compiler.py,sha256=KDdfzoghbsO0RpWAhuhZ4gsb11aoxgci-93dwxWNMuY,5400
|
|
10
|
-
nsj_rest_lib2/compiler/entity_compiler.py,sha256=
|
|
10
|
+
nsj_rest_lib2/compiler/entity_compiler.py,sha256=A0fiLFF7dGXM2uH5cknmAX-cQ-9nu4Ubujp-m5NmgYE,4780
|
|
11
11
|
nsj_rest_lib2/compiler/model.py,sha256=QDBoM26qoZdiNcykl1nvXCrFDhg-6Q__QzVq6uY1QzE,1460
|
|
12
|
-
nsj_rest_lib2/compiler/property_compiler.py,sha256=
|
|
12
|
+
nsj_rest_lib2/compiler/property_compiler.py,sha256=OOXEXGxXsEkvGcE_QKcasCoAkQ7qRUkWvPhd0c7yFuA,36717
|
|
13
13
|
nsj_rest_lib2/compiler/edl_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
14
|
nsj_rest_lib2/compiler/edl_model/ai_entity_edl.py,sha256=664QBDcOgVnyfwtUOXO1W7AKaZhueBG335x5DuogruY,7644
|
|
15
15
|
nsj_rest_lib2/compiler/edl_model/api_model.py,sha256=pH0Uiq_64AGvkHqwY44TrulWWZXbi6M0EKJWUhSqKj0,837
|
|
16
16
|
nsj_rest_lib2/compiler/edl_model/column_meta_model.py,sha256=s0sEVkoW1hV2_hto1mws4XhzKGH_b4NzhaOiwFH25Ks,694
|
|
17
|
-
nsj_rest_lib2/compiler/edl_model/entity_model.py,sha256
|
|
18
|
-
nsj_rest_lib2/compiler/edl_model/entity_model_base.py,sha256=
|
|
19
|
-
nsj_rest_lib2/compiler/edl_model/
|
|
17
|
+
nsj_rest_lib2/compiler/edl_model/entity_model.py,sha256=Yc6wvjsiwacmz796mZIU-i9hxzNV9yuLPdULGKYHNbM,854
|
|
18
|
+
nsj_rest_lib2/compiler/edl_model/entity_model_base.py,sha256=ICZ0m3t-_Wv8Di5Grb5UJIN7-3belcBf4IUYsceWX1I,3933
|
|
19
|
+
nsj_rest_lib2/compiler/edl_model/entity_model_root.py,sha256=VinsxFlNyCaKKk37ZzcbmWaWgoUP2-dZBG61Ke7NvVs,231
|
|
20
20
|
nsj_rest_lib2/compiler/edl_model/index_model.py,sha256=cXWlu0hxtro5vvYoirkDW4R3PCnBW5oCCWjRJ6AX5zE,508
|
|
21
21
|
nsj_rest_lib2/compiler/edl_model/primitives.py,sha256=GTo8e1mf9munvl_J1-fmaXgSJ8yQvGX56f2rwS85M1Y,1459
|
|
22
|
-
nsj_rest_lib2/compiler/edl_model/property_meta_model.py,sha256=
|
|
22
|
+
nsj_rest_lib2/compiler/edl_model/property_meta_model.py,sha256=ie3roNZAqYTwz7q0TTdceMjY5khnBiED2yp0XBqqk7E,3909
|
|
23
23
|
nsj_rest_lib2/compiler/edl_model/repository_model.py,sha256=Vt1HxlaoifP4w5ij1laKDkD1-COBihE8EX1HkdEDUSo,977
|
|
24
|
-
nsj_rest_lib2/compiler/edl_model/trait_property_meta_model.py,sha256=
|
|
24
|
+
nsj_rest_lib2/compiler/edl_model/trait_property_meta_model.py,sha256=NtMVZeOPu3LJwXI-8tCOLVuQiGua_0t7kL1h9gL7HuM,657
|
|
25
25
|
nsj_rest_lib2/compiler/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
26
|
nsj_rest_lib2/compiler/util/str_util.py,sha256=lVP1yHhj1pOd6ULtTnkcfX6Gqrpe4yCBratHUhBNGcI,843
|
|
27
27
|
nsj_rest_lib2/compiler/util/type_naming_util.py,sha256=wTfxPCezCTt-ltSg_hkaYNH7Z05k-mlJKZd-9AMA9ac,768
|
|
@@ -30,7 +30,7 @@ nsj_rest_lib2/controller/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
|
|
|
30
30
|
nsj_rest_lib2/controller/dynamic_controller.py,sha256=XMqxe1NW-NE5XwomXb4pSNdALQHpP74Hc26R4fnmXqg,15194
|
|
31
31
|
nsj_rest_lib2/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
32
32
|
nsj_rest_lib2/service/entity_loader.py,sha256=uB0xXih9Px2jSTMdZNIu6_3dngE37K7adKX03cYSRug,15660
|
|
33
|
-
nsj_rest_lib2-0.0.
|
|
34
|
-
nsj_rest_lib2-0.0.
|
|
35
|
-
nsj_rest_lib2-0.0.
|
|
36
|
-
nsj_rest_lib2-0.0.
|
|
33
|
+
nsj_rest_lib2-0.0.17.dist-info/METADATA,sha256=cesW5YRcvKWDcfyVo9yIzPnYL7sAG_0-BF57Ww_LMEs,1585
|
|
34
|
+
nsj_rest_lib2-0.0.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
35
|
+
nsj_rest_lib2-0.0.17.dist-info/top_level.txt,sha256=L6zh0EfH8_rur7OJ8_V-El-XEMf4qg3bkF8ADgqLVIA,14
|
|
36
|
+
nsj_rest_lib2-0.0.17.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|