fdc-shared-kernel 0.0.44__tar.gz → 0.0.46__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 (67) hide show
  1. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/PKG-INFO +1 -1
  2. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/fdc_shared_kernel.egg-info/PKG-INFO +1 -1
  3. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/fdc_shared_kernel.egg-info/SOURCES.txt +4 -0
  4. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/pyproject.toml +1 -1
  5. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/exceptions/custom_exceptions.py +6 -0
  6. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/logger/__init__.py +1 -0
  7. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/messaging/nats_databus.py +18 -25
  8. fdc_shared_kernel-0.0.46/shared_kernel/registries/__init__.py +1 -0
  9. fdc_shared_kernel-0.0.46/shared_kernel/registries/service_event_registry.py +21 -0
  10. fdc_shared_kernel-0.0.46/shared_kernel/status_tracker/__init__.py +1 -0
  11. fdc_shared_kernel-0.0.46/shared_kernel/status_tracker/status_tracker.py +89 -0
  12. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/README.md +0 -0
  13. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/README_pypi.md +0 -0
  14. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/fdc_shared_kernel.egg-info/dependency_links.txt +0 -0
  15. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/fdc_shared_kernel.egg-info/requires.txt +0 -0
  16. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/fdc_shared_kernel.egg-info/top_level.txt +0 -0
  17. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/requirements.txt +0 -0
  18. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/setup.cfg +0 -0
  19. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/__init__.py +0 -0
  20. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/async_task_executor/__init__.py +0 -0
  21. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/async_task_executor/async_task_executor.py +0 -0
  22. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/auth/__init__.py +0 -0
  23. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/auth/jwt_helper.py +0 -0
  24. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/auth/token_handler.py +0 -0
  25. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/config/__init__.py +0 -0
  26. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/database/__init__.py +0 -0
  27. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/enums/__init__.py +0 -0
  28. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/enums/async_task_status.py +0 -0
  29. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/exceptions/__init__.py +0 -0
  30. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/exceptions/configuration_exceptions.py +0 -0
  31. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/exceptions/data_validation_exceptions.py +0 -0
  32. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/exceptions/http_exceptions.py +0 -0
  33. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/exceptions/infrastructure_exceptions.py +0 -0
  34. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/exceptions/operational_exceptions.py +0 -0
  35. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/exceptions/security_exceptions.py +0 -0
  36. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/http/__init__.py +0 -0
  37. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/http/httpx_http_client.py +0 -0
  38. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/http/request_http_client.py +0 -0
  39. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/interfaces/__init__.py +0 -0
  40. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/interfaces/databus.py +0 -0
  41. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/interfaces/http.py +0 -0
  42. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/interfaces/keyvault.py +0 -0
  43. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/messaging/__init__.py +0 -0
  44. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/messaging/aws_databus.py +0 -0
  45. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/messaging/http_databus.py +0 -0
  46. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/metrics/__init__.py +0 -0
  47. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/metrics/status_tracker.py +0 -0
  48. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/models/__init__.py +0 -0
  49. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/security/__init__.py +0 -0
  50. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/security/key_vault/__init__.py +0 -0
  51. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/security/key_vault/aws_secret_manager.py +0 -0
  52. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/security/key_vault/azure_keyvault.py +0 -0
  53. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/tests/__init__.py +0 -0
  54. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/tests/config/__init__.py +0 -0
  55. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/tests/config/test_config.py +0 -0
  56. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/tests/logger/__init__.py +0 -0
  57. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/tests/logger/test_logger.py +0 -0
  58. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/tests/messaging/__init__.py +0 -0
  59. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/tests/messaging/test_nats_interface.py +0 -0
  60. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/tests/utils/__init__.py +0 -0
  61. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/tests/utils/test_data_validators.py +0 -0
  62. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/tests/utils/test_date_format_utils.py +0 -0
  63. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/tests/utils/test_string_utils.py +0 -0
  64. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/utils/__init__.py +0 -0
  65. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/utils/data_validators_utils.py +0 -0
  66. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/utils/date_format_utils.py +0 -0
  67. {fdc_shared_kernel-0.0.44 → fdc_shared_kernel-0.0.46}/shared_kernel/utils/string_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fdc_shared_kernel
3
- Version: 0.0.44
3
+ Version: 0.0.46
4
4
  Summary: Shared library for microservice
5
5
  Author-email: Shikhil S <shikhil.s@dbizsolution.com>, Ahammed Akdham N <ahammedakdham.n@dbizsolution.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fdc_shared_kernel
3
- Version: 0.0.44
3
+ Version: 0.0.46
4
4
  Summary: Shared library for microservice
5
5
  Author-email: Shikhil S <shikhil.s@dbizsolution.com>, Ahammed Akdham N <ahammedakdham.n@dbizsolution.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -40,10 +40,14 @@ shared_kernel/messaging/nats_databus.py
40
40
  shared_kernel/metrics/__init__.py
41
41
  shared_kernel/metrics/status_tracker.py
42
42
  shared_kernel/models/__init__.py
43
+ shared_kernel/registries/__init__.py
44
+ shared_kernel/registries/service_event_registry.py
43
45
  shared_kernel/security/__init__.py
44
46
  shared_kernel/security/key_vault/__init__.py
45
47
  shared_kernel/security/key_vault/aws_secret_manager.py
46
48
  shared_kernel/security/key_vault/azure_keyvault.py
49
+ shared_kernel/status_tracker/__init__.py
50
+ shared_kernel/status_tracker/status_tracker.py
47
51
  shared_kernel/tests/__init__.py
48
52
  shared_kernel/tests/config/__init__.py
49
53
  shared_kernel/tests/config/test_config.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "fdc_shared_kernel"
7
- version = "0.0.44"
7
+ version = "0.0.46"
8
8
  requires-python = ">=3.7"
9
9
  readme = "README_pypi.md"
10
10
  description = "Shared library for microservice"
@@ -12,3 +12,9 @@ class UnsupportedProfiling(BaseCustomException):
12
12
  """Raised when an unsupported data profiling method is requested."""
13
13
  def __init__(self, message: str = "The profiling method is not supported.", details: str = "") -> None:
14
14
  super().__init__(message=message, details=details)
15
+
16
+
17
+ class StatusTrackerException(BaseCustomException):
18
+ """Raised when an error occurs during status tracker operations."""
19
+ def __init__(self, message: str = "An error occurred during status tracking.") -> None:
20
+ super().__init__(message=message)
@@ -45,6 +45,7 @@ class Logger:
45
45
 
46
46
  self.logger = logging.getLogger(name if name else __name__)
47
47
  self.logger.setLevel(logging.DEBUG)
48
+ self.logger.propagate = False
48
49
  self.formatter = logging.Formatter(
49
50
  "%(asctime)s - %(name)s - %(filename)s - %(module)s - %(levelname)s - %(message)s"
50
51
  )
@@ -23,13 +23,6 @@ class NATSDataBus(DataBus):
23
23
  A NATS interface class to handle both standard NATS and JetStream operations.
24
24
  """
25
25
 
26
- _instance = None
27
-
28
- def __new__(cls, *args, **kwargs):
29
- if cls._instance is None:
30
- cls._instance = super(NATSDataBus, cls).__new__(cls)
31
- return cls._instance
32
-
33
26
  def __init__(self, config: Dict = None):
34
27
  """
35
28
  Initialize the NATSDataBus.
@@ -37,16 +30,14 @@ class NATSDataBus(DataBus):
37
30
  Args:
38
31
  config (Dict): A dictionary containing the NATS configuration.
39
32
  """
40
- if not hasattr(self, "initialized"): # Prevent reinitialization
41
- super().__init__()
42
- self.nats_client = NATS()
43
- self.servers = config.get("servers")
44
- self.user = config.get("user")
45
- self.password = config.get("password")
46
- self.connected = False
47
- self.nats_jet_stream_context = None # JetStream context
48
- self.initialized = True
49
- self.max_delivery_count = app_config.get("MAX_DELIVERY_COUNT")
33
+ super().__init__()
34
+ self.nats_client = NATS()
35
+ self.servers = config.get("servers")
36
+ self.user = config.get("user")
37
+ self.password = config.get("password")
38
+ self.connected = False
39
+ self.nats_jet_stream_context = None # JetStream context
40
+ self.max_delivery_count = app_config.get("MAX_DELIVERY_COUNT")
50
41
 
51
42
  async def _connection_error_callback(self, e: Exception) -> None:
52
43
  """
@@ -74,6 +65,7 @@ class NATSDataBus(DataBus):
74
65
  ack_policy=AckPolicy.EXPLICIT,
75
66
  deliver_policy=DeliverPolicy.ALL,
76
67
  filter_subject=subject,
68
+ ack_wait=3600,
77
69
  max_ack_pending=5,
78
70
  )
79
71
  await self.nats_jet_stream_context.add_consumer(
@@ -200,7 +192,7 @@ class NATSDataBus(DataBus):
200
192
  """
201
193
  Connect to the NATS server.
202
194
  """
203
- if not self.connected:
195
+ if not self.nats_client.is_connected:
204
196
  await self.nats_client.connect(
205
197
  servers=self.servers,
206
198
  user=self.user,
@@ -296,19 +288,20 @@ class NATSDataBus(DataBus):
296
288
  event_data: dict = json.loads(message_object.data.decode())
297
289
  has_job_failed = False
298
290
  try:
299
- callback(event_data)
291
+ await callback(event_data)
292
+ # acknowledge the message after processing and finishing the job
293
+ await message_object.ack()
294
+ logger.info(f"Acknowledged job: {event_data}")
300
295
  except Exception as e:
301
296
  logger.error(
302
297
  f"Invoking callback during execution of [{event_name}] failed due to {str(e)}"
303
298
  )
304
299
  has_job_failed = True
305
300
 
306
- if not has_job_failed:
307
- # acknowledge the message after processing and finishing the job successfully
308
- await message_object.ack()
309
- logger.info(f"Acknowledged job: {event_data}")
310
- elif message_object.metadata.num_delivered == self.max_delivery_count:
311
- # move to DLQ if max retries have been reached
301
+ if (
302
+ has_job_failed
303
+ and message_object.metadata.num_delivered == self.max_delivery_count
304
+ ):
312
305
  logger.warning("Moving event to the dead letter topic after max retries")
313
306
  await self._create_dlq_stream()
314
307
  await self._move_to_dlq(event_name, event_data)
@@ -0,0 +1 @@
1
+ from shared_kernel.registries.service_event_registry import ServiceEventRegistry # noqa
@@ -0,0 +1,21 @@
1
+ from shared_kernel.config import Config
2
+
3
+ config = Config()
4
+
5
+
6
+ class ServiceEventRegistry:
7
+ # Sync events to master service to create/update status tracker
8
+ CREATE_TASK = (
9
+ config.get("MASTER_SERVICE_BASE_ENDPOINT")
10
+ + "/event/subscribe-sync-event/CREATE_TASK/"
11
+ )
12
+
13
+ UPDATE_TASK = (
14
+ config.get("MASTER_SERVICE_BASE_ENDPOINT")
15
+ + "/event/subscribe-sync-event/UPDATE_TASK/"
16
+ )
17
+
18
+ MARK_TASK_AS_FAILURE = (
19
+ config.get("MASTER_SERVICE_BASE_ENDPOINT")
20
+ + "/event/subscribe-sync-event/MARK_TASK_AS_FAILURE/"
21
+ )
@@ -0,0 +1 @@
1
+ from shared_kernel.status_tracker.status_tracker import StatusTracker # noqa
@@ -0,0 +1,89 @@
1
+ from shared_kernel.exceptions.custom_exceptions import StatusTrackerException
2
+ from shared_kernel.interfaces.databus import DataBus
3
+ from shared_kernel.messaging import DataBusFactory
4
+ from shared_kernel.registries.service_event_registry import ServiceEventRegistry
5
+
6
+ service_event_registry = ServiceEventRegistry()
7
+
8
+
9
+ class StatusTracker:
10
+ """
11
+ A singleton StatusTracker class that ensures only one StatusTracker instance is created.
12
+
13
+ Attributes:
14
+ _instance (Optional[StatusTracker]): The single instance of the StatusTracker.
15
+ """
16
+
17
+ _instance = None
18
+
19
+ def __new__(cls, name=None):
20
+ """
21
+ override __new__ to ensure singleton pattern.
22
+ """
23
+ if cls._instance is None:
24
+ cls._instance = super(StatusTracker, cls).__new__(cls)
25
+ cls._instance._initialize(name=name)
26
+ return cls._instance
27
+
28
+
29
+ def _initialize(self):
30
+ self.databus: DataBus = DataBusFactory.create_data_bus(
31
+ bus_type="HTTP", config={}
32
+ )
33
+
34
+
35
+ def create_task(self, span_id, trace_id, entity_id, task, status):
36
+ """Publishes a synchronous event to create a task"""
37
+ try:
38
+ payload = {
39
+ "span_id": span_id,
40
+ "trace_id": trace_id,
41
+ "entity_id": entity_id,
42
+ "task": task,
43
+ "status": status,
44
+ }
45
+ response = self.databus.request_event(
46
+ getattr(service_event_registry, "CREATE_TASK"), payload
47
+ )
48
+ return response
49
+
50
+ except Exception as e:
51
+ raise StatusTrackerException(e)
52
+
53
+
54
+ def update_task(self, span_id, trace_id, entity_id, task, status):
55
+ """Publishes a synchronous event to update a task"""
56
+ try:
57
+ payload = {
58
+ "span_id": span_id,
59
+ "trace_id": trace_id,
60
+ "entity_id": entity_id,
61
+ "task": task,
62
+ "status": status,
63
+ }
64
+ response = self.databus.request_event(
65
+ getattr(service_event_registry, "UPDATE_TASK"), payload
66
+ )
67
+ return response
68
+
69
+ except Exception as e:
70
+ raise StatusTrackerException(e)
71
+
72
+
73
+ def mark_task_as_failure(self, span_id, trace_id, entity_id, task, failure_reason):
74
+ """Publishes a synchronous event to mark a task as failure"""
75
+ try:
76
+ payload = {
77
+ "span_id": span_id,
78
+ "trace_id": trace_id,
79
+ "entity_id": entity_id,
80
+ "task": task,
81
+ "failure_reason": failure_reason,
82
+ }
83
+ response = self.databus.request_event(
84
+ getattr(service_event_registry, "MARK_TASK_AS_FAILURE"), payload
85
+ )
86
+ return response
87
+
88
+ except Exception as e:
89
+ raise StatusTrackerException(e)