nsj-rest-lib2 0.0.2__tar.gz → 0.0.3__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nsj_rest_lib2
3
- Version: 0.0.2
3
+ Version: 0.0.3
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
@@ -1,3 +1,4 @@
1
+ import datetime
1
2
  import json
2
3
  import sys
3
4
  import threading
@@ -7,13 +8,15 @@ from nsj_rest_lib.settings import get_logger
7
8
 
8
9
  from nsj_rest_lib2.exception import MissingEntityConfigException
9
10
  from nsj_rest_lib2.redis_config import get_redis
10
- from nsj_rest_lib2.settings import ESCOPO_RESTLIB2
11
+ from nsj_rest_lib2.settings import ESCOPO_RESTLIB2, MIN_TIME_SOURCE_REFRESH
11
12
 
12
13
 
13
14
  class LoadedEntity:
14
- dto_class_name: str = ""
15
- entity_class_name: str = ""
16
- entity_hash: str = ""
15
+ def __init__(self):
16
+ self.dto_class_name: str = ""
17
+ self.entity_class_name: str = ""
18
+ self.entity_hash: str = ""
19
+ self.loaded_at: datetime.datetime = datetime.datetime.now()
17
20
 
18
21
 
19
22
  class Namespace:
@@ -24,7 +27,7 @@ class Namespace:
24
27
  self.module: types.ModuleType = None
25
28
 
26
29
 
27
- namespaces_dict = {}
30
+ namespaces_dict: dict[str, Namespace] = {}
28
31
 
29
32
 
30
33
  class EntityLoader:
@@ -48,34 +51,51 @@ class EntityLoader:
48
51
 
49
52
  # Se conseguiu carregar da memória, verifica se houve alteração no hash, em relação ao redis
50
53
  if result is not None:
51
- # Desempacotando o result
52
- dto_class_name, entity_class_name, entities_dict, entity_config_key = result
54
+ # Desempacotando o result e recuperando informações do namespace
55
+ (
56
+ entity_config_key,
57
+ namespace,
58
+ ) = result
53
59
 
54
- # Recuperando do Redis direto pela key (faz uma só chamada ao redis)
55
- loaded_config = self._load_entity_config_from_redis(
56
- entity_id, grupo_key, tenant_key, default_key, entity_config_key
57
- )
60
+ loaded_entity = namespace.loaded_entities[entity_id]
61
+ dto_class_name = loaded_entity.dto_class_name
62
+ entity_class_name = loaded_entity.entity_class_name
63
+ entities_dict = namespace.entities_dict
58
64
 
59
- # Se não achar no redis, usa o que estava em memória
60
- if not loaded_config:
61
- return (dto_class_name, entity_class_name, entities_dict)
65
+ # Se o tempo entre o carregamento e agora for maior do que MIN_TIME_SOURCE_REFRESH minutos,
66
+ # verifica se precisa de refresh
67
+ time_diff = datetime.datetime.now() - loaded_entity.loaded_at
62
68
 
63
- # Desempacotando resultado
64
- entity_config_key, entity_config_str = loaded_config
69
+ if time_diff.total_seconds() >= MIN_TIME_SOURCE_REFRESH * 60:
70
+ # Recuperando do Redis direto pela key (faz uma só chamada ao redis)
71
+ loaded_config = self._load_entity_config_from_redis(
72
+ entity_id, grupo_key, tenant_key, default_key, entity_config_key
73
+ )
65
74
 
66
- # Executando o código da entidade, se houver mudança no hash
67
- result_execute = self._execute_entity_source(
68
- entity_config_str,
69
- entity_config_key,
70
- entity_id,
71
- check_refresh=True,
72
- )
75
+ # Se não achar no redis, usa o que estava em memória
76
+ if not loaded_config:
77
+ return (dto_class_name, entity_class_name, entities_dict)
73
78
 
74
- if result_execute is None:
75
- return (dto_class_name, entity_class_name, entities_dict)
79
+ # Desempacotando resultado
80
+ entity_config_key, entity_config_str = loaded_config
81
+
82
+ # Executando o código da entidade, só se houver mudança no hash
83
+ result_execute = self._execute_entity_source(
84
+ entity_config_str,
85
+ entity_config_key,
86
+ entity_id,
87
+ check_refresh=True,
88
+ )
89
+
90
+ # Se não carregou novo código, usa o que estava em memória
91
+ if result_execute is None:
92
+ return (dto_class_name, entity_class_name, entities_dict)
93
+ else:
94
+ dto_class_name, entity_class_name, namespace = result_execute
95
+ return (dto_class_name, entity_class_name, namespace.entities_dict)
76
96
  else:
77
- dto_class_name, entity_class_name, namespace = result_execute
78
- return (dto_class_name, entity_class_name, namespace.entities_dict)
97
+ # Se não deu o intervalo de verificação do refresh, retorna o que está em memória
98
+ return (dto_class_name, entity_class_name, entities_dict)
79
99
 
80
100
  # Se não conseguir recuperar a entidade, procura no redis:
81
101
  loaded_config = self._load_entity_config_from_redis(
@@ -236,7 +256,7 @@ class EntityLoader:
236
256
  grupo_key: str,
237
257
  tenant_key: str,
238
258
  default_key: str,
239
- ) -> tuple[str, str, dict, str] | None:
259
+ ) -> tuple[str, Namespace] | None:
240
260
  namespace = None
241
261
  entity_config_key = None
242
262
 
@@ -258,11 +278,7 @@ class EntityLoader:
258
278
  entity_config_key = default_key
259
279
  namespace = default_namespace
260
280
 
261
- if namespace:
262
- loaded_entity = namespace.loaded_entities[entity_id]
263
- dto_class_name = loaded_entity.dto_class_name
264
- entity_class_name = loaded_entity.entity_class_name
265
- entities_dict = namespace.entities_dict
266
- return (dto_class_name, entity_class_name, entities_dict, entity_config_key)
281
+ if namespace and entity_config_key:
282
+ return (entity_config_key, namespace)
267
283
  else:
268
284
  return None
@@ -0,0 +1,10 @@
1
+ import os
2
+
3
+ ESCOPO_RESTLIB2 = os.environ["ESCOPO_RESTLIB2"]
4
+
5
+ ENV = os.getenv("ENV", "dev").lower()
6
+
7
+ if ENV in ("dev", "local"):
8
+ MIN_TIME_SOURCE_REFRESH = 0
9
+ else:
10
+ MIN_TIME_SOURCE_REFRESH = int(os.getenv("MIN_TIME_SOURCE_REFRESH", "15"))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nsj_rest_lib2
3
- Version: 0.0.2
3
+ Version: 0.0.3
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
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = nsj_rest_lib2
3
- version = 0.0.2
3
+ version = 0.0.3
4
4
  author = Nasajon Sistemas
5
5
  author_email = contact.dev@nasajon.com.br
6
6
  description = Biblioteca para permitir a distribuição de rotas dinâmicas numa API, configuradas por meio de EDLs declarativos (em formato JSON).
@@ -1,3 +0,0 @@
1
- import os
2
-
3
- ESCOPO_RESTLIB2 = os.environ["ESCOPO_RESTLIB2"]
File without changes