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.
@@ -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
- if not entity_model.abstract:
48
- compiler_result = self._compile_model(entity_model, entity_models)
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
- dependency_entity_model = EntityModel(**dependency_edl)
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: EntityModel,
70
- dependencies_models: list[EntityModel],
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
- f"{dependency_entity_model.escopo}/{dependency_entity_model.id}"
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], EntityModel]:
315
- entity_model = EntityModel(**edl_json)
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: EntityModel) -> list[str]:
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
- entity_model = EntityModel(**edl)
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.entity_model_base import EntityModelBase
7
+ from nsj_rest_lib2.compiler.edl_model.entity_model_root import EntityModelRoot
8
8
 
9
9
 
10
- class EntityModel(EntityModelBase):
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
  )
@@ -0,0 +1,7 @@
1
+ from pydantic import Field
2
+
3
+ from nsj_rest_lib2.compiler.edl_model.entity_model_base import EntityModelBase
4
+
5
+
6
+ class EntityModelRoot(EntityModelBase):
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).", alias="minLength"
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(props_pk[0]) not in default_order_fields:
73
- default_order_fields.append(CompilerStrUtil.to_snake_case(props_pk[0]))
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(props_pk[0])
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 len(pk_keys) > 1:
68
- raise Exception(
69
- f"Entidade '{entity_model.id}' possui mais de uma chave primária (ainda não suportado): {pk_keys}"
70
- )
71
- elif len(pk_keys) == 0:
72
- raise Exception(
73
- f"Entidade '{entity_model.id}' não tem nenhuma chave primária (ainda não suportado)"
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(relation_column, PrimitiveTypes.UUID)
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.14
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=zyHaP2Vi-ONkfc6F59DXtVDgdQ_EOFcWAURUPdJBfx4,15171
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=7LypMMlgXnUIkpO7rEYtc2V1sKi9Nv1IxlXkgObX25s,4453
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=EP-EnszasIKaCgz-_HzBliNA5L7cilixwnhrJD68iJI,35720
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=tkx76ldDS5iFr3CbPi4mmq6y5F55LcgAhqCsrqfdzkc,936
18
- nsj_rest_lib2/compiler/edl_model/entity_model_base.py,sha256=cUpbNUat7GJgJv14-8R2XYPc0vrcLXC6KPoVaXYZZ5A,3291
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=x2SApvI-5MZTErAHeOXnR6qfjflhSs8r6Y9KMtCykV0,3960
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=cv34rNuSOOz4_l5ouW_X-IIDiRtEkN44Dn3quNBDZJE,15372
32
- nsj_rest_lib2-0.0.14.dist-info/METADATA,sha256=aYvlmJGdy6qZxzyAij9JKvOYIBNawhmVY3SeX8kwkSE,1361
33
- nsj_rest_lib2-0.0.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
34
- nsj_rest_lib2-0.0.14.dist-info/top_level.txt,sha256=L6zh0EfH8_rur7OJ8_V-El-XEMf4qg3bkF8ADgqLVIA,14
35
- nsj_rest_lib2-0.0.14.dist-info/RECORD,,
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,,