fdc-shared-kernel 0.0.30__tar.gz → 0.0.32__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 (62) hide show
  1. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/PKG-INFO +1 -1
  2. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/PKG-INFO +1 -1
  3. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/SOURCES.txt +4 -0
  4. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/pyproject.toml +1 -1
  5. fdc_shared_kernel-0.0.32/shared_kernel/async_task_executor/__init__.py +1 -0
  6. fdc_shared_kernel-0.0.32/shared_kernel/async_task_executor/async_task_executor.py +119 -0
  7. fdc_shared_kernel-0.0.32/shared_kernel/enums/__init__.py +1 -0
  8. fdc_shared_kernel-0.0.32/shared_kernel/enums/async_task_status.py +9 -0
  9. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/README.md +0 -0
  10. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/README_pypi.md +0 -0
  11. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/dependency_links.txt +0 -0
  12. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/requires.txt +0 -0
  13. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/top_level.txt +0 -0
  14. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/requirements.txt +0 -0
  15. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/setup.cfg +0 -0
  16. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/__init__.py +0 -0
  17. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/auth/__init__.py +0 -0
  18. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/auth/jwt_helper.py +0 -0
  19. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/auth/token_handler.py +0 -0
  20. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/config/__init__.py +0 -0
  21. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/database/__init__.py +0 -0
  22. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/__init__.py +0 -0
  23. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/configuration_exceptions.py +0 -0
  24. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/custom_exceptions.py +0 -0
  25. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/data_validation_exceptions.py +0 -0
  26. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/http_exceptions.py +0 -0
  27. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/infrastructure_exceptions.py +0 -0
  28. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/operational_exceptions.py +0 -0
  29. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/security_exceptions.py +0 -0
  30. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/http/__init__.py +0 -0
  31. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/http/httpx_http_client.py +0 -0
  32. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/http/request_http_client.py +0 -0
  33. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/interfaces/__init__.py +0 -0
  34. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/interfaces/databus.py +0 -0
  35. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/interfaces/http.py +0 -0
  36. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/interfaces/keyvault.py +0 -0
  37. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/logger/__init__.py +0 -0
  38. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/messaging/__init__.py +0 -0
  39. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/messaging/http_databus.py +0 -0
  40. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/messaging/nats_databus.py +0 -0
  41. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/metrics/__init__.py +0 -0
  42. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/metrics/status_tracker.py +0 -0
  43. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/models/__init__.py +0 -0
  44. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/security/__init__.py +0 -0
  45. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/security/key_vault/__init__.py +0 -0
  46. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/security/key_vault/aws_secret_manager.py +0 -0
  47. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/security/key_vault/azure_keyvault.py +0 -0
  48. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/__init__.py +0 -0
  49. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/config/__init__.py +0 -0
  50. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/config/test_config.py +0 -0
  51. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/logger/__init__.py +0 -0
  52. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/logger/test_logger.py +0 -0
  53. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/messaging/__init__.py +0 -0
  54. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/messaging/test_nats_interface.py +0 -0
  55. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/utils/__init__.py +0 -0
  56. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/utils/test_data_validators.py +0 -0
  57. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/utils/test_date_format_utils.py +0 -0
  58. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/utils/test_string_utils.py +0 -0
  59. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/utils/__init__.py +0 -0
  60. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/utils/data_validators_utils.py +0 -0
  61. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/utils/date_format_utils.py +0 -0
  62. {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/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.30
3
+ Version: 0.0.32
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.30
3
+ Version: 0.0.32
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
@@ -8,11 +8,15 @@ fdc_shared_kernel.egg-info/dependency_links.txt
8
8
  fdc_shared_kernel.egg-info/requires.txt
9
9
  fdc_shared_kernel.egg-info/top_level.txt
10
10
  shared_kernel/__init__.py
11
+ shared_kernel/async_task_executor/__init__.py
12
+ shared_kernel/async_task_executor/async_task_executor.py
11
13
  shared_kernel/auth/__init__.py
12
14
  shared_kernel/auth/jwt_helper.py
13
15
  shared_kernel/auth/token_handler.py
14
16
  shared_kernel/config/__init__.py
15
17
  shared_kernel/database/__init__.py
18
+ shared_kernel/enums/__init__.py
19
+ shared_kernel/enums/async_task_status.py
16
20
  shared_kernel/exceptions/__init__.py
17
21
  shared_kernel/exceptions/configuration_exceptions.py
18
22
  shared_kernel/exceptions/custom_exceptions.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.30"
7
+ version = "0.0.32"
8
8
  requires-python = ">=3.7"
9
9
  readme = "README_pypi.md"
10
10
  description = "Shared library for microservice"
@@ -0,0 +1 @@
1
+ from shared_kernel.async_task_executor.async_task_executor import AsyncTaskExecutor # noqa
@@ -0,0 +1,119 @@
1
+ import uuid
2
+ from concurrent.futures import ThreadPoolExecutor
3
+ from threading import Lock
4
+ from shared_kernel.enums.async_task_status import AsyncTaskStatus
5
+ from shared_kernel.logger import Logger
6
+ from shared_kernel.config import Config
7
+
8
+
9
+ config = Config()
10
+ logger = Logger(config.get("APP_NAME"))
11
+
12
+
13
+ class AsyncTaskExecutor:
14
+ """
15
+ Singleton class for managing the execution of asynchronous tasks.
16
+ It uses a thread pool to manage concurrency and a status tracker to monitor task execution.
17
+ """
18
+
19
+ _instance = None
20
+ # lock to ensure thread safety
21
+ _lock = Lock()
22
+
23
+ def __new__(self, concurrency: int):
24
+ """
25
+ Singleton method that ensures only one instance of AsyncTaskExecutor is created.
26
+ Uses double-checked locking to ensure thread safety.
27
+
28
+ Args:
29
+ concurrency (int): The maximum number of threads allowed to run concurrently.
30
+
31
+ Returns:
32
+ AsyncTaskExecutor: A single instance of AsyncTaskExecutor.
33
+ """
34
+ if self._instance is None:
35
+ with self._lock:
36
+ if self._instance is None:
37
+ self._instance = super(AsyncTaskExecutor, self).__new__(self)
38
+ self._instance._initialized = False
39
+ return self._instance
40
+
41
+ def __init__(self, concurrency: int):
42
+ """
43
+ Initializes the AsyncTaskExecutor. This method will only run once for the singleton instance.
44
+
45
+ Args:
46
+ concurrency (int): The number of threads that can be run concurrently in the pool.
47
+ """
48
+ if self._initialized:
49
+ return
50
+ # dictionary to track the status of tasks
51
+ self.status_tracker: dict = {}
52
+ self.queue = ThreadPoolExecutor(max_workers=int(concurrency))
53
+ # mark as initialized to prevent re-initialization
54
+ self._initialized = True
55
+ logger.debug(
56
+ f"AsyncTaskExecutor initialized with concurrency level: {concurrency}"
57
+ )
58
+
59
+ def task_execute_wrapper(self, task_to_execute, job_payload: dict):
60
+ """
61
+ Wrapper method to execute a task and handle its status updates.
62
+ Updates the task's status to STARTED, SUCCESS, or FAILURE depending on the outcome.
63
+
64
+ Args:
65
+ task_to_execute (callable): The function representing the task to be executed.
66
+ job_payload (dict): The payload containing job-related information, including the execution ID.
67
+ """
68
+ execution_id = job_payload["execution_id"]
69
+ self.status_tracker[execution_id]["status"] = AsyncTaskStatus.STARTED.value
70
+ logger.debug(f"Task started for execution ID: {execution_id}")
71
+ try:
72
+ result = task_to_execute(job_payload)
73
+ self.status_tracker[execution_id]["status"] = AsyncTaskStatus.SUCCESS.value
74
+ self.status_tracker[execution_id]["data"] = result
75
+ logger.debug(
76
+ f"Task completed successfully for execution ID: {execution_id}"
77
+ )
78
+ except Exception as e:
79
+ self.status_tracker[execution_id]["status"] = AsyncTaskStatus.FAILURE.value
80
+ self.status_tracker[execution_id]["reason"] = str(e)
81
+ logger.error(
82
+ f"Task failed for execution ID: {execution_id}, Reason: {str(e)}"
83
+ )
84
+
85
+ def submit_job(self, task_to_execute, job_payload: dict):
86
+ """
87
+ Submits a new task to be executed asynchronously. Generates a unique execution ID and tracks the job status.
88
+
89
+ Args:
90
+ task_to_execute (callable): The function to be executed asynchronously.
91
+ job_payload (dict): The payload to pass to the task, excluding the execution ID.
92
+
93
+ Returns:
94
+ str: The unique execution ID of the submitted job.
95
+ """
96
+ execution_id = str(uuid.uuid4())
97
+ job_payload["execution_id"] = execution_id
98
+ self.status_tracker[execution_id] = {"status": AsyncTaskStatus.QUEUED.value}
99
+ logger.info(f"Job submitted with execution ID: {execution_id}")
100
+ self.queue.submit(self.task_execute_wrapper, task_to_execute, job_payload)
101
+ return execution_id
102
+
103
+ def track_status(self, execution_id: str) -> dict:
104
+ """
105
+ Polls the current status of a task using its execution ID.
106
+
107
+ Args:
108
+ execution_id (str): The unique identifier for the task to track.
109
+
110
+ Returns:
111
+ dict: The current status of the task (QUEUED, STARTED, SUCCESS, FAILURE, or NA).
112
+ """
113
+ status = self.status_tracker.get(
114
+ execution_id, {"status": AsyncTaskStatus.NA.value}
115
+ )
116
+ logger.debug(
117
+ f"Tracking status for task with execution ID: {execution_id}, Status: {status['status']}"
118
+ )
119
+ return status
@@ -0,0 +1 @@
1
+ from shared_kernel.enums.async_task_status import * # noqa
@@ -0,0 +1,9 @@
1
+ from enum import Enum
2
+
3
+
4
+ class AsyncTaskStatus(Enum):
5
+ QUEUED = "Queued"
6
+ STARTED = "Started"
7
+ SUCCESS = "Success"
8
+ FAILURE = "Failure"
9
+ NA = "NA"