Encryptors 2.59__tar.gz → 2.60__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 (87) hide show
  1. {encryptors-2.59 → encryptors-2.60}/PKG-INFO +1 -1
  2. {encryptors-2.59 → encryptors-2.60}/setup.py +1 -1
  3. {encryptors-2.59 → encryptors-2.60}/src/Encryptors.egg-info/PKG-INFO +1 -1
  4. {encryptors-2.59 → encryptors-2.60}/src/Encryptors.egg-info/SOURCES.txt +1 -0
  5. encryptors-2.60/src/Osdental/Helpers/AuditQueue.py +45 -0
  6. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Http/APIClient.py +8 -10
  7. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Services/ServiceBusAuditEmitter.py +6 -2
  8. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Services/__init__.py +1 -1
  9. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Storage/__init__.py +2 -2
  10. {encryptors-2.59 → encryptors-2.60}/README.md +0 -0
  11. {encryptors-2.59 → encryptors-2.60}/setup.cfg +0 -0
  12. {encryptors-2.59 → encryptors-2.60}/src/Encryptors.egg-info/dependency_links.txt +0 -0
  13. {encryptors-2.59 → encryptors-2.60}/src/Encryptors.egg-info/entry_points.txt +0 -0
  14. {encryptors-2.59 → encryptors-2.60}/src/Encryptors.egg-info/requires.txt +0 -0
  15. {encryptors-2.59 → encryptors-2.60}/src/Encryptors.egg-info/top_level.txt +0 -0
  16. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Cache/Redis.py +0 -0
  17. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Cache/__init__.py +0 -0
  18. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Cli/__init__.py +0 -0
  19. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Constants/Constant.py +0 -0
  20. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Constants/Message.py +0 -0
  21. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Constants/__init__.py +0 -0
  22. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Context/__init__.py +0 -0
  23. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Database/BaseRepository.py +0 -0
  24. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Database/Connection.py +0 -0
  25. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Database/__init__.py +0 -0
  26. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Decorators/Grpc.py +0 -0
  27. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Decorators/Retry.py +0 -0
  28. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Decorators/SecureResolver.py +0 -0
  29. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Decorators/__init__.py +0 -0
  30. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Encryptor/Aes.py +0 -0
  31. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Encryptor/Argon2.py +0 -0
  32. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Encryptor/Bcrypt.py +0 -0
  33. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Encryptor/Jwt.py +0 -0
  34. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Encryptor/Rsa.py +0 -0
  35. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Encryptor/Sha512.py +0 -0
  36. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Encryptor/__init__.py +0 -0
  37. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Enums/AuditType.py +0 -0
  38. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Enums/ErrorSource.py +0 -0
  39. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Enums/FileType.py +0 -0
  40. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Enums/GrahpqlOperation.py +0 -0
  41. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Enums/Profile.py +0 -0
  42. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Enums/ResultType.py +0 -0
  43. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Enums/StatusCode.py +0 -0
  44. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Enums/__init__.py +0 -0
  45. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Exception/ControlledException.py +0 -0
  46. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Exception/__init__.py +0 -0
  47. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Helpers/AuditHelper.py +0 -0
  48. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Helpers/AzureClassifier.py +0 -0
  49. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Helpers/GrpcConnection.py +0 -0
  50. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Helpers/JwtTokenHelper.py +0 -0
  51. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Helpers/Resilience.py +0 -0
  52. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Helpers/ResponseDecryptor.py +0 -0
  53. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Helpers/_AuthTokenProcessor.py +0 -0
  54. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Helpers/__init__.py +0 -0
  55. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Http/__init__.py +0 -0
  56. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Messaging/AzureServiceBus.py +0 -0
  57. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Messaging/Kafka.py +0 -0
  58. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Messaging/RabbitMQ.py +0 -0
  59. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Messaging/__init__.py +0 -0
  60. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Models/ApiResponse.py +0 -0
  61. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Models/AuditContext.py +0 -0
  62. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Models/Graphql.py +0 -0
  63. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Models/Notification.py +0 -0
  64. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Models/Response.py +0 -0
  65. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Models/Token.py +0 -0
  66. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Models/TokenClaims.py +0 -0
  67. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Models/__init__.py +0 -0
  68. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Secrets/AzureKeyVaultProvider.py +0 -0
  69. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Secrets/__init__.py +0 -0
  70. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Services/JwtAuthTokenService.py +0 -0
  71. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Services/WebsocketClient.py +0 -0
  72. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Storage/AzureBlobStorage.py +0 -0
  73. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Storage/S3Storage.py +0 -0
  74. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/CaseConverter.py +0 -0
  75. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/CodeGenerator.py +0 -0
  76. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/DataNormalizer.py +0 -0
  77. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/DataUtils.py +0 -0
  78. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/DateUtils.py +0 -0
  79. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/FileMetaData.py +0 -0
  80. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/HashValidator.py +0 -0
  81. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/Mapper.py +0 -0
  82. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/PasswordGenerator.py +0 -0
  83. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/QueryGenerator.py +0 -0
  84. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/RsaUtils.py +0 -0
  85. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/TextProcessor.py +0 -0
  86. {encryptors-2.59 → encryptors-2.60}/src/Osdental/Utils/__init__.py +0 -0
  87. {encryptors-2.59 → encryptors-2.60}/src/Osdental/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Encryptors
3
- Version: 2.59
3
+ Version: 2.60
4
4
  Summary: End-to-end algorithm library
5
5
  Author: OSDental LLC
6
6
  Author-email: support@osdental.ai
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
  # ANDERSON REVISAR EL CACHE LOCAL DEL KEYVAULT PARA VALIDAR SI FUNCIONA
3
3
  setup(
4
4
  name="Encryptors",
5
- version="2.59",
5
+ version="2.60",
6
6
  author="OSDental LLC",
7
7
  author_email="support@osdental.ai",
8
8
  description="End-to-end algorithm library",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Encryptors
3
- Version: 2.59
3
+ Version: 2.60
4
4
  Summary: End-to-end algorithm library
5
5
  Author: OSDental LLC
6
6
  Author-email: support@osdental.ai
@@ -39,6 +39,7 @@ src/Osdental/Enums/__init__.py
39
39
  src/Osdental/Exception/ControlledException.py
40
40
  src/Osdental/Exception/__init__.py
41
41
  src/Osdental/Helpers/AuditHelper.py
42
+ src/Osdental/Helpers/AuditQueue.py
42
43
  src/Osdental/Helpers/AzureClassifier.py
43
44
  src/Osdental/Helpers/GrpcConnection.py
44
45
  src/Osdental/Helpers/JwtTokenHelper.py
@@ -0,0 +1,45 @@
1
+ import asyncio
2
+ import logging
3
+
4
+ logger = logging.getLogger(__name__)
5
+
6
+
7
+ class AuditQueue:
8
+
9
+ def __init__(
10
+ self,
11
+ worker,
12
+ maxsize: int = 1000,
13
+ workers: int = 5
14
+ ):
15
+ self._worker = worker
16
+ self._queue = asyncio.Queue(maxsize=maxsize)
17
+ self._workers = workers
18
+ self._tasks: list[asyncio.Task] = []
19
+
20
+ async def emit(self, payload):
21
+ await self._queue.put(payload)
22
+
23
+ def start(self):
24
+ for _ in range(self._workers):
25
+ task = asyncio.create_task(self._consume())
26
+ self._tasks.append(task)
27
+
28
+ async def _consume(self):
29
+ while True:
30
+ payload = await self._queue.get()
31
+
32
+ try:
33
+ await self._worker(payload)
34
+
35
+ except Exception:
36
+ logger.exception("Error processing audit")
37
+
38
+ finally:
39
+ self._queue.task_done()
40
+
41
+ async def stop(self):
42
+ await self._queue.join()
43
+
44
+ for task in self._tasks:
45
+ task.cancel()
@@ -20,11 +20,11 @@ class APIClient:
20
20
 
21
21
  def __init__(
22
22
  self,
23
- audit: Optional[IAuditEmitter] = None,
23
+ audit_emit: Optional[IAuditEmitter] = None,
24
24
  timeout: Optional[httpx.Timeout] = None,
25
25
  limits: Optional[httpx.Limits] = None
26
26
  ):
27
- self._audit = audit
27
+ self._audit_emit = audit_emit
28
28
 
29
29
  self._client = httpx.AsyncClient(
30
30
  follow_redirects=True,
@@ -41,6 +41,9 @@ class APIClient:
41
41
  @rest_retry
42
42
  async def _request(self, method: HTTPMethod, url: str, **kwargs) -> httpx.Response:
43
43
 
44
+ audit_ctx = _ctx.get()
45
+ audit_ctx.headers = kwargs.get("headers") or {}
46
+
44
47
  try:
45
48
 
46
49
  response = await self._client.request(
@@ -49,10 +52,6 @@ class APIClient:
49
52
  **kwargs
50
53
  )
51
54
 
52
- audit_ctx = _ctx.get()
53
-
54
- audit_ctx.headers = kwargs["headers"] or {}
55
-
56
55
  response.raise_for_status()
57
56
 
58
57
  api_res = ApiResponse(
@@ -125,6 +124,9 @@ class APIClient:
125
124
  headers: Optional[Dict[str, str]] = None
126
125
  ) -> Dict[str, Any]:
127
126
 
127
+ audit_ctx = _ctx.get()
128
+ audit_ctx.headers = headers or {}
129
+
128
130
  payload = {
129
131
  "query": query,
130
132
  "variables": variables
@@ -139,10 +141,6 @@ class APIClient:
139
141
 
140
142
  data = response.json()
141
143
 
142
- audit_ctx = _ctx.get()
143
-
144
- audit_ctx.headers = headers or {}
145
-
146
144
  _build_success_graphql_payload(audit_ctx, data)
147
145
 
148
146
  if "errors" in data:
@@ -8,10 +8,14 @@ class ServiceBusAuditEmitter:
8
8
  def __init__(self, messaging: IMessageQueue, storage: IStorageService):
9
9
  self._messaging = messaging
10
10
  self._storage = storage
11
+
11
12
 
12
- async def emit(self, payload: Dict[str, Any]) -> None:
13
+ async def process(self, payload: Dict[str, Any]) -> None:
13
14
  message_log_id = payload.get("idMessageLog")
14
15
  data = json.dumps(payload)
15
16
  blob_name = f"audits/{message_log_id}.text"
16
- await self._storage.upload(blob_name, data)
17
+ url = await self._storage.upload(blob_name, data)
18
+ if not url:
19
+ return
20
+
17
21
  await self._messaging.send_message(blob_name)
@@ -49,5 +49,5 @@ class IAuthTokenService(ABC):
49
49
 
50
50
 
51
51
  class IAuditEmitter(Protocol):
52
- async def emit(self, payload: Dict[str, Any]) -> None:
52
+ async def process(self, payload: Dict[str, Any]) -> None:
53
53
  ...
@@ -6,13 +6,13 @@ from azure.storage.blob import BlobSasPermissions
6
6
  class IStorageService(ABC):
7
7
 
8
8
  @abstractmethod
9
- async def upload(self, blob_name: str, data: bytes | str) -> str | bool:
9
+ async def upload(self, blob_name: str, data: bytes | str) -> str:
10
10
  """ Upload a file to blob storage """
11
11
  pass
12
12
 
13
13
 
14
14
  @abstractmethod
15
- async def download(self, blob_name: str) -> bytes | None:
15
+ async def download(self, blob_name: str) -> bytes:
16
16
  """ Download a file from blob storage """
17
17
  pass
18
18
 
File without changes
File without changes