nsj-rest-lib2 0.0.14__py3-none-any.whl → 0.0.16__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 +114 -30
- nsj_rest_lib2/compiler/edl_model/entity_model.py +2 -3
- nsj_rest_lib2/compiler/edl_model/entity_model_base.py +7 -0
- nsj_rest_lib2/compiler/edl_model/entity_model_root.py +7 -0
- nsj_rest_lib2/compiler/edl_model/property_meta_model.py +1 -2
- nsj_rest_lib2/compiler/entity_compiler.py +12 -3
- nsj_rest_lib2/compiler/property_compiler.py +20 -9
- nsj_rest_lib2/service/entity_loader.py +6 -0
- {nsj_rest_lib2-0.0.14.dist-info → nsj_rest_lib2-0.0.16.dist-info}/METADATA +5 -2
- {nsj_rest_lib2-0.0.14.dist-info → nsj_rest_lib2-0.0.16.dist-info}/RECORD +12 -11
- {nsj_rest_lib2-0.0.14.dist-info → nsj_rest_lib2-0.0.16.dist-info}/WHEEL +0 -0
- {nsj_rest_lib2-0.0.14.dist-info → nsj_rest_lib2-0.0.16.dist-info}/top_level.txt +0 -0
|
@@ -9,6 +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.entity_model_root import EntityModelRoot
|
|
12
13
|
from nsj_rest_lib2.compiler.edl_model.primitives import REGEX_EXTERNAL_REF
|
|
13
14
|
from nsj_rest_lib2.compiler.entity_compiler import EntityCompiler
|
|
14
15
|
from nsj_rest_lib2.compiler.model import CompilerResult
|
|
@@ -18,11 +19,11 @@ from nsj_rest_lib2.compiler.edl_model.entity_model import EntityModel
|
|
|
18
19
|
|
|
19
20
|
from nsj_rest_lib2.settings import get_logger
|
|
20
21
|
|
|
22
|
+
# TODO GET e POST de relacionamentos 1X1
|
|
21
23
|
# TODO Revisar compilação de valores default (sensível a tipos)
|
|
22
24
|
# TODO Implementar suporte a conjuntos
|
|
23
25
|
# TODO Autenticação nas rotas
|
|
24
26
|
# TODO Atualizar o status da entidade pelo worker de compilação (e talvez parar uma compilação, quando se delete uma entidade)
|
|
25
|
-
# TODO Mixins
|
|
26
27
|
# TODO Classes Abstratas
|
|
27
28
|
# TODO Partial Classes
|
|
28
29
|
# TODO Migrations
|
|
@@ -44,8 +45,8 @@ class EDLCompiler:
|
|
|
44
45
|
compiler_results = []
|
|
45
46
|
for entity_model_id in entity_models:
|
|
46
47
|
entity_model = entity_models[entity_model_id]
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
compiler_result = self._compile_model(entity_model, entity_models)
|
|
49
|
+
if compiler_result:
|
|
49
50
|
compiler_results.append(compiler_result)
|
|
50
51
|
|
|
51
52
|
return compiler_results
|
|
@@ -54,27 +55,28 @@ class EDLCompiler:
|
|
|
54
55
|
self,
|
|
55
56
|
edl_json: dict[str, Any],
|
|
56
57
|
dependencies_edls: list[dict[str, Any]],
|
|
57
|
-
) -> CompilerResult:
|
|
58
|
+
) -> CompilerResult | None:
|
|
58
59
|
entity_model = EntityModel(**edl_json)
|
|
59
60
|
|
|
60
61
|
entity_models = []
|
|
61
62
|
for dependency_edl in dependencies_edls:
|
|
62
|
-
|
|
63
|
+
if "mixin" in dependency_edl and dependency_edl["mixin"]:
|
|
64
|
+
dependency_entity_model = EntityModelRoot(**dependency_edl)
|
|
65
|
+
else:
|
|
66
|
+
dependency_entity_model = EntityModel(**dependency_edl)
|
|
63
67
|
entity_models.append(dependency_entity_model)
|
|
64
68
|
|
|
65
69
|
return self.compile_model(entity_model, entity_models)
|
|
66
70
|
|
|
67
71
|
def compile_model(
|
|
68
72
|
self,
|
|
69
|
-
entity_model:
|
|
70
|
-
dependencies_models: list[
|
|
71
|
-
) -> CompilerResult:
|
|
73
|
+
entity_model: EntityModelBase,
|
|
74
|
+
dependencies_models: list[tuple[str, EntityModelBase]],
|
|
75
|
+
) -> CompilerResult | None:
|
|
72
76
|
entity_models = {}
|
|
73
77
|
for dependency_entity_model in dependencies_models:
|
|
74
|
-
complete_entity_id =
|
|
75
|
-
|
|
76
|
-
)
|
|
77
|
-
entity_models[complete_entity_id] = dependency_entity_model
|
|
78
|
+
complete_entity_id = dependency_entity_model[0]
|
|
79
|
+
entity_models[complete_entity_id] = dependency_entity_model[1]
|
|
78
80
|
|
|
79
81
|
return self._compile_model(entity_model, entity_models)
|
|
80
82
|
|
|
@@ -84,9 +86,11 @@ class EDLCompiler:
|
|
|
84
86
|
entity_models: dict[str, EntityModel],
|
|
85
87
|
escopo: str | None = None,
|
|
86
88
|
prefx_class_name: str = "",
|
|
87
|
-
) -> CompilerResult:
|
|
89
|
+
) -> CompilerResult | None:
|
|
90
|
+
if entity_model.mixin:
|
|
91
|
+
return None
|
|
88
92
|
|
|
89
|
-
if escopo is None and isinstance(entity_model, EntityModel):
|
|
93
|
+
if escopo is None and (isinstance(entity_model, EntityModel)):
|
|
90
94
|
escopo = entity_model.escopo
|
|
91
95
|
|
|
92
96
|
if not escopo:
|
|
@@ -148,6 +152,11 @@ class EDLCompiler:
|
|
|
148
152
|
prefx_class_name=f"{prefx_class_name}_{entity_model.id}",
|
|
149
153
|
)
|
|
150
154
|
|
|
155
|
+
if not component_compiled:
|
|
156
|
+
raise Exception(
|
|
157
|
+
f"Erro ao compilar o component '{component_key}' da entidade '{entity_model.id}'. Gerou saída None, como se fosse um mixin."
|
|
158
|
+
)
|
|
159
|
+
|
|
151
160
|
# Guardando o código gerado no buffer
|
|
152
161
|
if component_compiled.dto_code:
|
|
153
162
|
dto_code += component_compiled.dto_code + "\n\n"
|
|
@@ -195,6 +204,12 @@ class EDLCompiler:
|
|
|
195
204
|
compiler_result.api_verbs = entity_model.api.verbs
|
|
196
205
|
compiler_result.relations_dependencies = relations_dependencies_complete
|
|
197
206
|
|
|
207
|
+
get_logger().debug(f"código gerado para a entidade: {entity_model.id}")
|
|
208
|
+
get_logger().debug("DTO Code:")
|
|
209
|
+
get_logger().debug(f"\n{dto_code}")
|
|
210
|
+
get_logger().debug("Entity Code:")
|
|
211
|
+
get_logger().debug(f"\n{entity_code}")
|
|
212
|
+
|
|
198
213
|
return compiler_result
|
|
199
214
|
|
|
200
215
|
def _make_components_structures(
|
|
@@ -206,6 +221,16 @@ class EDLCompiler:
|
|
|
206
221
|
if not entity_model:
|
|
207
222
|
return
|
|
208
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
|
+
|
|
209
234
|
# Populando com os components do trait
|
|
210
235
|
if entity_model.trait_from:
|
|
211
236
|
trait_model = entity_models[entity_model.trait_from]
|
|
@@ -229,6 +254,29 @@ class EDLCompiler:
|
|
|
229
254
|
if not entity_model:
|
|
230
255
|
return
|
|
231
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
|
+
|
|
232
280
|
# Populando com as propriedades do trait
|
|
233
281
|
if entity_model.trait_from:
|
|
234
282
|
trait_model = entity_models[entity_model.trait_from]
|
|
@@ -274,6 +322,30 @@ class EDLCompiler:
|
|
|
274
322
|
if not entity_model:
|
|
275
323
|
return
|
|
276
324
|
|
|
325
|
+
# Populando com as uniques da superclasse (extends)
|
|
326
|
+
if entity_model.extends:
|
|
327
|
+
super_model = entity_models[entity_model.extends]
|
|
328
|
+
|
|
329
|
+
self._make_unique_map_by_property(
|
|
330
|
+
map_indexes_by_property,
|
|
331
|
+
map_unique_by_property,
|
|
332
|
+
super_model,
|
|
333
|
+
entity_models,
|
|
334
|
+
deep=deep + 1,
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
# Populando com as uniques do trait
|
|
338
|
+
if entity_model.trait_from:
|
|
339
|
+
trait_model = entity_models[entity_model.trait_from]
|
|
340
|
+
|
|
341
|
+
self._make_unique_map_by_property(
|
|
342
|
+
map_indexes_by_property,
|
|
343
|
+
map_unique_by_property,
|
|
344
|
+
trait_model,
|
|
345
|
+
entity_models,
|
|
346
|
+
deep=deep + 1,
|
|
347
|
+
)
|
|
348
|
+
|
|
277
349
|
# Varrendo e organizando os índices
|
|
278
350
|
if entity_model.repository.indexes:
|
|
279
351
|
for index in entity_model.repository.indexes:
|
|
@@ -297,34 +369,43 @@ class EDLCompiler:
|
|
|
297
369
|
list_index = map_indexes_by_property.setdefault(pkey, [])
|
|
298
370
|
list_index.append(IndexCompilerStructure(index, deep > 1))
|
|
299
371
|
|
|
300
|
-
# Populando com as propriedades do trait
|
|
301
|
-
if entity_model.trait_from:
|
|
302
|
-
trait_model = entity_models[entity_model.trait_from]
|
|
303
|
-
|
|
304
|
-
self._make_unique_map_by_property(
|
|
305
|
-
map_indexes_by_property,
|
|
306
|
-
map_unique_by_property,
|
|
307
|
-
trait_model,
|
|
308
|
-
entity_models,
|
|
309
|
-
deep=deep + 1,
|
|
310
|
-
)
|
|
311
|
-
|
|
312
372
|
def list_dependencies(
|
|
313
373
|
self, edl_json: dict[str, Any]
|
|
314
|
-
) -> tuple[list[str],
|
|
315
|
-
|
|
374
|
+
) -> tuple[list[str], EntityModelBase]:
|
|
375
|
+
if edl_json.get("mixin", False):
|
|
376
|
+
entity_model = EntityModelRoot(**edl_json)
|
|
377
|
+
else:
|
|
378
|
+
entity_model = EntityModel(**edl_json)
|
|
316
379
|
|
|
317
380
|
return (self._list_dependencies(entity_model), entity_model)
|
|
318
381
|
|
|
319
|
-
def _list_dependencies(self, entity_model:
|
|
382
|
+
def _list_dependencies(self, entity_model: EntityModelBase) -> list[str]:
|
|
320
383
|
entities: list[str] = []
|
|
321
384
|
|
|
385
|
+
# Adicionando dependências por mixins
|
|
386
|
+
if entity_model.mixins:
|
|
387
|
+
entities.extend(entity_model.mixins)
|
|
388
|
+
|
|
389
|
+
# Adicionando dependências por traits
|
|
390
|
+
if entity_model.extends:
|
|
391
|
+
entities.append(entity_model.extends)
|
|
392
|
+
|
|
322
393
|
# Adicionando dependências por traits
|
|
323
394
|
if entity_model.trait_from:
|
|
324
395
|
entities.append(entity_model.trait_from)
|
|
325
396
|
|
|
326
397
|
# Populando com as dependências de propriedades de relacionamento
|
|
327
398
|
relations = self._list_dependencies_relations(entity_model)
|
|
399
|
+
|
|
400
|
+
components_dependency_list = []
|
|
401
|
+
if entity_model.components is not None:
|
|
402
|
+
for component in entity_model.components:
|
|
403
|
+
components_dependency_list.extend(
|
|
404
|
+
self._list_dependencies(entity_model.components[component])
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
relations.extend(components_dependency_list)
|
|
408
|
+
|
|
328
409
|
entities.extend(relations)
|
|
329
410
|
|
|
330
411
|
return entities
|
|
@@ -384,7 +465,10 @@ if __name__ == "__main__":
|
|
|
384
465
|
# Instanciando o objeto de modelo de entidade a partir do JSON,
|
|
385
466
|
# e já realizando as validações básicas de tipo e estrutura.
|
|
386
467
|
print(f"Validando arquivo: {file}")
|
|
387
|
-
|
|
468
|
+
if edl.get("mixin", False):
|
|
469
|
+
entity_model = EntityModelRoot(**edl)
|
|
470
|
+
else:
|
|
471
|
+
entity_model = EntityModel(**edl)
|
|
388
472
|
|
|
389
473
|
complete_entity_id = f"{entity_model.escopo}/{entity_model.id}"
|
|
390
474
|
entities[complete_entity_id] = entity_model
|
|
@@ -4,12 +4,11 @@ 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
|
-
escopo: str = Field(..., description="Escopo do EDL (define a aplicação).")
|
|
13
12
|
version: Optional[str] = Field(
|
|
14
13
|
default="1.0", description="Versão da entidade (padrão: 1.0)."
|
|
15
14
|
)
|
|
@@ -18,6 +18,13 @@ class EntityModelBase(BaseModel):
|
|
|
18
18
|
...,
|
|
19
19
|
description="Identificador único da entidade, dentro de um determinado escopo (podendo ser sobreescrito para um tenant ou grupo _empresarial).",
|
|
20
20
|
)
|
|
21
|
+
mixin: Optional[bool] = Field(
|
|
22
|
+
False,
|
|
23
|
+
description="Indica se o modelo é um mixin (bloco reutilizável, que não gera contém tabela própria no banco).",
|
|
24
|
+
)
|
|
25
|
+
extends: Optional[str] = Field(
|
|
26
|
+
None, description="Identificador da entidade estendida por esta."
|
|
27
|
+
)
|
|
21
28
|
trait_from: Optional[str] = Field(
|
|
22
29
|
None, description="Identificador da entidade que a trait estende."
|
|
23
30
|
)
|
|
@@ -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(
|
|
@@ -64,14 +64,15 @@ class EDLPropertyCompiler:
|
|
|
64
64
|
if prop.pk:
|
|
65
65
|
pk_keys.append(pkey)
|
|
66
66
|
|
|
67
|
-
if
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
67
|
+
if not entity_model.mixin:
|
|
68
|
+
if len(pk_keys) > 1:
|
|
69
|
+
raise Exception(
|
|
70
|
+
f"Entidade '{entity_model.id}' possui mais de uma chave primária (ainda não suportado): {pk_keys}"
|
|
71
|
+
)
|
|
72
|
+
elif len(pk_keys) == 0:
|
|
73
|
+
raise Exception(
|
|
74
|
+
f"Entidade '{entity_model.id}' não tem nenhuma chave primária (ainda não suportado)"
|
|
75
|
+
)
|
|
75
76
|
|
|
76
77
|
# pk_key = pk_keys[0]
|
|
77
78
|
|
|
@@ -664,9 +665,19 @@ class EDLPropertyCompiler:
|
|
|
664
665
|
)
|
|
665
666
|
)
|
|
666
667
|
else:
|
|
668
|
+
dto_property_name = f"relation_1_1_self_column_{relation_column}"
|
|
667
669
|
# Adicionando propriedade, para o campo de relação, no DTO (quando for o dono da relação)
|
|
668
670
|
ast_dto_attributes.append(
|
|
669
|
-
self._build_dto_property_ast(
|
|
671
|
+
self._build_dto_property_ast(
|
|
672
|
+
dto_property_name,
|
|
673
|
+
PrimitiveTypes.UUID,
|
|
674
|
+
keywords=[
|
|
675
|
+
ast.keyword(
|
|
676
|
+
arg="entity_field",
|
|
677
|
+
value=ast.Constant(value=relation_column),
|
|
678
|
+
),
|
|
679
|
+
],
|
|
680
|
+
)
|
|
670
681
|
)
|
|
671
682
|
|
|
672
683
|
# Adicionando propriedade, para o campo de relação, no Entity (quando for o dono da relação)
|
|
@@ -317,6 +317,12 @@ class EntityLoader:
|
|
|
317
317
|
namespace.module = module
|
|
318
318
|
namespace.entities_dict = module.__dict__
|
|
319
319
|
|
|
320
|
+
get_logger().debug(
|
|
321
|
+
f"Executando o código da entidade {entity_resource} no namespace {entity_config_key}. Código:"
|
|
322
|
+
)
|
|
323
|
+
get_logger().debug(f"Entity source:\n{source_entity}")
|
|
324
|
+
get_logger().debug(f"DTO source:\n{source_dto}")
|
|
325
|
+
|
|
320
326
|
self._safe_exec(source_entity, namespace.entities_dict, "Entity source")
|
|
321
327
|
self._safe_exec(source_dto, namespace.entities_dict, "DTO source")
|
|
322
328
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nsj_rest_lib2
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.16
|
|
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,11 @@ 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
|
|
@@ -4,21 +4,22 @@ 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=
|
|
7
|
+
nsj_rest_lib2/compiler/compiler.py,sha256=mZVZlFF5Na1w4p-MMytIvk2jt1gOFrEEJu4V6TL3PP4,18303
|
|
8
8
|
nsj_rest_lib2/compiler/compiler_structures.py,sha256=ZUeWnO-23f3JHq4bOfTcqszMDDXwuFEtMRhqMN7GeWQ,1214
|
|
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=0EbjI2quxE8fD7vn8UjF8FkeCuTAeCKA8Mz__WgLGOA,36163
|
|
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=
|
|
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=A1HLuG1Z5SOUMpINZDkJA7kuPmevJcj28QQl4KgwX8c,3588
|
|
19
|
+
nsj_rest_lib2/compiler/edl_model/entity_model_root.py,sha256=VinsxFlNyCaKKk37ZzcbmWaWgoUP2-dZBG61Ke7NvVs,231
|
|
19
20
|
nsj_rest_lib2/compiler/edl_model/index_model.py,sha256=cXWlu0hxtro5vvYoirkDW4R3PCnBW5oCCWjRJ6AX5zE,508
|
|
20
21
|
nsj_rest_lib2/compiler/edl_model/primitives.py,sha256=GTo8e1mf9munvl_J1-fmaXgSJ8yQvGX56f2rwS85M1Y,1459
|
|
21
|
-
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
|
|
22
23
|
nsj_rest_lib2/compiler/edl_model/repository_model.py,sha256=Vt1HxlaoifP4w5ij1laKDkD1-COBihE8EX1HkdEDUSo,977
|
|
23
24
|
nsj_rest_lib2/compiler/edl_model/trait_property_meta_model.py,sha256=SBSfiu4v0PMsWRsGDySR3P2tkabLbDZxx_FFy_3rGXA,605
|
|
24
25
|
nsj_rest_lib2/compiler/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -28,8 +29,8 @@ nsj_rest_lib2/compiler/util/type_util.py,sha256=HTKOH4uRTOY0YgoM8oUv_6cEcReE_bgK
|
|
|
28
29
|
nsj_rest_lib2/controller/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
29
30
|
nsj_rest_lib2/controller/dynamic_controller.py,sha256=XMqxe1NW-NE5XwomXb4pSNdALQHpP74Hc26R4fnmXqg,15194
|
|
30
31
|
nsj_rest_lib2/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
|
-
nsj_rest_lib2/service/entity_loader.py,sha256=
|
|
32
|
-
nsj_rest_lib2-0.0.
|
|
33
|
-
nsj_rest_lib2-0.0.
|
|
34
|
-
nsj_rest_lib2-0.0.
|
|
35
|
-
nsj_rest_lib2-0.0.
|
|
32
|
+
nsj_rest_lib2/service/entity_loader.py,sha256=uB0xXih9Px2jSTMdZNIu6_3dngE37K7adKX03cYSRug,15660
|
|
33
|
+
nsj_rest_lib2-0.0.16.dist-info/METADATA,sha256=ImDS5PybQMuExp4Wn1DCNS9cbFPUUN1qDdYBC9Gd0yE,1410
|
|
34
|
+
nsj_rest_lib2-0.0.16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
35
|
+
nsj_rest_lib2-0.0.16.dist-info/top_level.txt,sha256=L6zh0EfH8_rur7OJ8_V-El-XEMf4qg3bkF8ADgqLVIA,14
|
|
36
|
+
nsj_rest_lib2-0.0.16.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|