fdc-shared-kernel 0.0.63__tar.gz → 0.0.65__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 (78) hide show
  1. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/PKG-INFO +1 -1
  2. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/fdc_shared_kernel.egg-info/PKG-INFO +1 -1
  3. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/pyproject.toml +1 -1
  4. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/enums/status_tracker.py +3 -1
  5. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/event_executor/event_executor.py +4 -1
  6. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/messaging/aws_databus.py +12 -1
  7. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/messaging/utils/aws_utility.py +8 -5
  8. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/messaging/utils/event_messages.py +14 -7
  9. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/README.md +0 -0
  10. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/README_pypi.md +0 -0
  11. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/fdc_shared_kernel.egg-info/SOURCES.txt +0 -0
  12. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/fdc_shared_kernel.egg-info/dependency_links.txt +0 -0
  13. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/fdc_shared_kernel.egg-info/requires.txt +0 -0
  14. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/fdc_shared_kernel.egg-info/top_level.txt +0 -0
  15. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/requirements.txt +0 -0
  16. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/setup.cfg +0 -0
  17. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/__init__.py +0 -0
  18. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/async_task_executor/__init__.py +0 -0
  19. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/async_task_executor/async_task_executor.py +0 -0
  20. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/auth/__init__.py +0 -0
  21. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/auth/jwt_helper.py +0 -0
  22. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/auth/token_handler.py +0 -0
  23. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/config/__init__.py +0 -0
  24. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/database/__init__.py +0 -0
  25. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/enums/__init__.py +0 -0
  26. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/enums/async_task_executor.py +0 -0
  27. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/event_executor/__init__.py +0 -0
  28. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/event_executor/utils.py +0 -0
  29. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/exceptions/__init__.py +0 -0
  30. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/exceptions/configuration_exceptions.py +0 -0
  31. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/exceptions/custom_exceptions.py +0 -0
  32. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/exceptions/data_validation_exceptions.py +0 -0
  33. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/exceptions/http_exceptions.py +0 -0
  34. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/exceptions/infrastructure_exceptions.py +0 -0
  35. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/exceptions/operational_exceptions.py +0 -0
  36. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/exceptions/security_exceptions.py +0 -0
  37. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/http/__init__.py +0 -0
  38. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/http/httpx_http_client.py +0 -0
  39. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/http/request_http_client.py +0 -0
  40. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/interfaces/__init__.py +0 -0
  41. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/interfaces/databus.py +0 -0
  42. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/interfaces/http.py +0 -0
  43. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/interfaces/keyvault.py +0 -0
  44. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/logger/__init__.py +0 -0
  45. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/messaging/__init__.py +0 -0
  46. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/messaging/http_databus.py +0 -0
  47. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/messaging/nats_databus.py +0 -0
  48. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/messaging/nats_publisher.py +0 -0
  49. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/messaging/nats_test.py +0 -0
  50. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/metrics/__init__.py +0 -0
  51. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/metrics/status_tracker.py +0 -0
  52. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/models/__init__.py +0 -0
  53. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/registries/__init__.py +0 -0
  54. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/registries/service_event_registry.py +0 -0
  55. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/security/__init__.py +0 -0
  56. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/security/key_vault/__init__.py +0 -0
  57. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/security/key_vault/aws_secret_manager.py +0 -0
  58. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/security/key_vault/azure_keyvault.py +0 -0
  59. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/status_tracker/__init__.py +0 -0
  60. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/status_tracker/status_tracker.py +0 -0
  61. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/__init__.py +0 -0
  62. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/config/__init__.py +0 -0
  63. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/config/test_config.py +0 -0
  64. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/logger/__init__.py +0 -0
  65. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/logger/test_logger.py +0 -0
  66. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/messaging/__init__.py +0 -0
  67. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/messaging/test_aws_databus.py +0 -0
  68. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/messaging/test_event_executor.py +0 -0
  69. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/messaging/test_nats_interface.py +0 -0
  70. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/utils/__init__.py +0 -0
  71. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/utils/test_data_validators.py +0 -0
  72. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/utils/test_date_format_utils.py +0 -0
  73. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/tests/utils/test_string_utils.py +0 -0
  74. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/utils/__init__.py +0 -0
  75. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/utils/data_validators_utils.py +0 -0
  76. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/utils/date_format_utils.py +0 -0
  77. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/utils/string_utils.py +0 -0
  78. {fdc_shared_kernel-0.0.63 → fdc_shared_kernel-0.0.65}/shared_kernel/utils/template_renderer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fdc_shared_kernel
3
- Version: 0.0.63
3
+ Version: 0.0.65
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.63
3
+ Version: 0.0.65
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "fdc_shared_kernel"
7
- version = "0.0.63"
7
+ version = "0.0.65"
8
8
  requires-python = ">=3.7"
9
9
  readme = "README_pypi.md"
10
10
  description = "Shared library for microservice"
@@ -2,6 +2,8 @@ from enum import Enum
2
2
 
3
3
 
4
4
  class TaskStatus(Enum):
5
+ QUEUED = "Queued"
5
6
  PROCESSING = "Processing"
6
7
  COMPLETED = "Completed"
7
- FAILED = "Failed"
8
+ FAILED = "Failed"
9
+ SKIPPED = "Skipped"
@@ -219,6 +219,8 @@ class EventExecutor:
219
219
  if message:
220
220
  logger.info(f"Received message for event {event_name}: {message}")
221
221
  future = executor.submit(self._callback_wrapper, callback, message)
222
+ # adding a callback to the future object to ensure that its removed from
223
+ # _active_futures upon its successful completion
222
224
  future.add_done_callback(lambda f: self._active_futures[event_name].discard(f))
223
225
  self._active_futures[event_name].add(future)
224
226
  except Exception as e:
@@ -266,7 +268,8 @@ class EventExecutor:
266
268
  },
267
269
  "events": {
268
270
  "successful": event_stats.successful_events,
269
- "failed": event_stats.failed_events
271
+ "failed": event_stats.failed_events,
272
+ "total": event_stats.total_events
270
273
  }
271
274
  }
272
275
 
@@ -6,6 +6,8 @@ from shared_kernel.interfaces.databus import DataBus
6
6
  from shared_kernel.logger import Logger
7
7
  from shared_kernel.messaging.utils.aws_utility import AWSMessagingUtility, AWSQueue
8
8
  from shared_kernel.messaging.utils.event_messages import AWSEventMessage
9
+ from shared_kernel.status_tracker.status_tracker import StatusTracker
10
+ from shared_kernel.enums import TaskStatus
9
11
 
10
12
  app_config = Config()
11
13
  logger = Logger(app_config.get("APP_NAME"))
@@ -34,6 +36,7 @@ class AWSDataBus(DataBus):
34
36
  super().__init__()
35
37
  self.aws_utility = AWSMessagingUtility()
36
38
  self.event_queue_mapper = {}
39
+ self.status_tracker = StatusTracker()
37
40
  self.initialized = True
38
41
 
39
42
  def make_connection(self):
@@ -56,7 +59,15 @@ class AWSDataBus(DataBus):
56
59
  Returns:
57
60
  bool: True if the event was published successfully, False otherwise.
58
61
  """
59
- return self.aws_utility.publish_event(event_name, event_payload)
62
+ is_success, validated_event_dict = self.aws_utility.publish_event(event_name, event_payload)
63
+ if is_success:
64
+ self.status_tracker.create_task(
65
+ span_id=validated_event_dict["event_meta"]["span_id"],
66
+ trace_id=validated_event_dict["event_meta"]["trace_id"],
67
+ task=validated_event_dict["event_name"],
68
+ status=TaskStatus.QUEUED.value,
69
+ task_id=validated_event_dict["event_meta"]["job_id"],
70
+ )
60
71
 
61
72
  def subscribe_sync_event(self, event_name: str, callback: Callable[[Any], None]):
62
73
  """
@@ -1,5 +1,5 @@
1
1
  import json
2
- from typing import Dict
2
+ from typing import Dict, Optional, Union
3
3
 
4
4
  import boto3
5
5
  from botocore.exceptions import ClientError
@@ -216,7 +216,7 @@ class AWSMessagingUtility:
216
216
  f"Message deleted from queue with receipt handle '{receipt_handle}'."
217
217
  )
218
218
 
219
- def publish_event(self, event_name: str, event_payload: dict):
219
+ def publish_event(self, event_name: str, event_payload: dict) -> Union[bool, Optional[dict]]:
220
220
  """
221
221
  Publish an event to EventBridge.
222
222
  Args:
@@ -243,13 +243,16 @@ class AWSMessagingUtility:
243
243
  logger.error(
244
244
  f"Failed to publish event '{event_name}': {response['Entries'][0].get('ErrorMessage', 'Unknown error while publishing event')}"
245
245
  )
246
- return False
246
+ return False, None
247
247
  else:
248
248
  event_id = response["Entries"][0].get("EventId")
249
249
  logger.info(
250
250
  f"Successfully published event '{event_name}' with EventId: {event_id}"
251
251
  )
252
- return True
252
+ return True, publish_message.event_dict
253
253
  except ClientError as e:
254
254
  logger.error(f"Failed to publish event: {e}")
255
- return False
255
+ return False, None
256
+ except Exception as e:
257
+ logger.error(f"Failed to publish event: {e}")
258
+ return False, None
@@ -13,12 +13,15 @@ class EventMeta:
13
13
  span_id (str): Unique identifier for this specific operation within the trace.
14
14
  job_id (str): Identifier for the job associated with this event.
15
15
  """
16
+ ALLOWED_TRIGGER_BY_VALUES = {"SCHEDULER", "PROVISION", "MANUAL", "EVENT"}
17
+
16
18
  def __init__(self, meta_data: Dict):
17
19
  self.trace_id: str = meta_data.get("trace_id")
18
20
  self.job_id: str = meta_data.get("job_id")
21
+ self.trigger = meta_data.get("trigger")
19
22
 
20
- # entity_name is specific to entity related events
21
- self.entity_name = meta_data.get("entity_name")
23
+ if self.trigger and self.trigger not in self.ALLOWED_TRIGGER_BY_VALUES:
24
+ raise ValueError(f"Invalid trigger value: {self.trigger}. Must be one of {self.ALLOWED_TRIGGER_BY_VALUES}.")
22
25
 
23
26
  # time taken for the entire execution of the event
24
27
  self.start_time: str = None
@@ -28,8 +31,10 @@ class EventMeta:
28
31
  # failure reason if any
29
32
  self.failure_reason: str = None
30
33
 
31
- # generate a new span_id for each event
32
- self.span_id: str = str(uuid.uuid4())
34
+ # generate a new span_id for each event if not present already
35
+ self.span_id: str = meta_data.get("span_id", str(uuid.uuid4()))
36
+
37
+ self.additional_fields: Dict[str, Any] = {k: v for k, v in meta_data.items() if k not in {"trace_id", "job_id"}}
33
38
 
34
39
  def start_event(self):
35
40
  """Sets the start time of the event."""
@@ -62,15 +67,16 @@ class EventMeta:
62
67
 
63
68
  def to_dict(self) -> Dict:
64
69
  """Returns a dictionary representation of the event metadata."""
65
- return {
70
+ base_dict = {
66
71
  "trace_id": self.trace_id,
67
72
  "span_id": self.span_id,
68
73
  "job_id": self.job_id,
69
74
  "start_time": self.start_time or "",
70
75
  "end_time": self.end_time or "",
71
76
  "time_taken": self.time_taken if self.time_taken else "",
72
- "entity_name": self.entity_name if self.entity_name else ""
73
77
  }
78
+ # merge core fields with additional fields
79
+ return {**base_dict, **self.additional_fields}
74
80
 
75
81
 
76
82
  class PublishEventMessage:
@@ -114,8 +120,9 @@ class PublishEventMessage:
114
120
  if "event_meta" not in self.event_dict or not self.event_dict["event_meta"]["trace_id"]:
115
121
  raise Exception("Message metdata or trace_id not found.")
116
122
 
117
- # always generate a new job_id
123
+ # always generate a new job id and span id
118
124
  self.event_dict["event_meta"]["job_id"] = str(uuid.uuid4())
125
+ self.event_dict["event_meta"]["span_id"] = str(uuid.uuid4())
119
126
 
120
127
  def to_dict(self) -> dict:
121
128
  """Convert the event to a dictionary format"""