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.
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/PKG-INFO +1 -1
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/PKG-INFO +1 -1
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/SOURCES.txt +4 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/pyproject.toml +1 -1
- fdc_shared_kernel-0.0.32/shared_kernel/async_task_executor/__init__.py +1 -0
- fdc_shared_kernel-0.0.32/shared_kernel/async_task_executor/async_task_executor.py +119 -0
- fdc_shared_kernel-0.0.32/shared_kernel/enums/__init__.py +1 -0
- fdc_shared_kernel-0.0.32/shared_kernel/enums/async_task_status.py +9 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/README.md +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/README_pypi.md +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/dependency_links.txt +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/requires.txt +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/top_level.txt +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/requirements.txt +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/setup.cfg +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/auth/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/auth/jwt_helper.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/auth/token_handler.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/config/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/database/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/configuration_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/custom_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/data_validation_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/http_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/infrastructure_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/operational_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/security_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/http/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/http/httpx_http_client.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/http/request_http_client.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/interfaces/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/interfaces/databus.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/interfaces/http.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/interfaces/keyvault.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/logger/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/messaging/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/messaging/http_databus.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/messaging/nats_databus.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/metrics/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/metrics/status_tracker.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/models/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/security/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/security/key_vault/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/security/key_vault/aws_secret_manager.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/security/key_vault/azure_keyvault.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/config/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/config/test_config.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/logger/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/logger/test_logger.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/messaging/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/messaging/test_nats_interface.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/utils/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/utils/test_data_validators.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/utils/test_date_format_utils.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/utils/test_string_utils.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/utils/__init__.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/utils/data_validators_utils.py +0 -0
- {fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/utils/date_format_utils.py +0 -0
- {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.
|
|
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.
|
|
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
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/SOURCES.txt
RENAMED
|
@@ -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
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/requires.txt
RENAMED
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/fdc_shared_kernel.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/custom_exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/exceptions/http_exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/http/httpx_http_client.py
RENAMED
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/http/request_http_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/messaging/http_databus.py
RENAMED
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/messaging/nats_databus.py
RENAMED
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/metrics/status_tracker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/security/key_vault/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/config/__init__.py
RENAMED
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/config/test_config.py
RENAMED
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/logger/__init__.py
RENAMED
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/logger/test_logger.py
RENAMED
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/messaging/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/tests/utils/test_string_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/utils/data_validators_utils.py
RENAMED
|
File without changes
|
{fdc_shared_kernel-0.0.30 → fdc_shared_kernel-0.0.32}/shared_kernel/utils/date_format_utils.py
RENAMED
|
File without changes
|
|
File without changes
|