ergon-framework-python 0.1.0__py3-none-any.whl
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.
- ergon/__init__.py +13 -0
- ergon/bootstrap/src/__project__/__init__.py +0 -0
- ergon/bootstrap/src/__project__/_observability/docker-compose.telemetry.yml +124 -0
- ergon/bootstrap/src/__project__/_observability/grafana.yaml +17 -0
- ergon/bootstrap/src/__project__/_observability/loki.yaml +48 -0
- ergon/bootstrap/src/__project__/_observability/otel-collector-config.yaml +53 -0
- ergon/bootstrap/src/__project__/_observability/prometheus.yaml +11 -0
- ergon/bootstrap/src/__project__/_observability/tempo.yaml +24 -0
- ergon/bootstrap/src/__project__/connectors/__init__.py +0 -0
- ergon/bootstrap/src/__project__/main.py +9 -0
- ergon/bootstrap/src/__project__/tasks/__init__.py +0 -0
- ergon/bootstrap/src/__project__/tasks/constants.py +13 -0
- ergon/bootstrap/src/__project__/tasks/example_task/__init__.py +0 -0
- ergon/bootstrap/src/__project__/tasks/example_task/config.py +4 -0
- ergon/bootstrap/src/__project__/tasks/example_task/exceptions.py +4 -0
- ergon/bootstrap/src/__project__/tasks/example_task/helpers.py +4 -0
- ergon/bootstrap/src/__project__/tasks/example_task/schemas.py +5 -0
- ergon/bootstrap/src/__project__/tasks/example_task/task.py +1 -0
- ergon/bootstrap/src/__project__/tasks/exceptions.py +0 -0
- ergon/bootstrap/src/__project__/tasks/helpers.py +0 -0
- ergon/bootstrap/src/__project__/tasks/schemas.py +0 -0
- ergon/bootstrap/src/__project__/tasks/settings.py +5 -0
- ergon/cli.py +174 -0
- ergon/connector/__init__.py +64 -0
- ergon/connector/connector.py +97 -0
- ergon/connector/excel/__init__.py +18 -0
- ergon/connector/excel/connector.py +175 -0
- ergon/connector/excel/models.py +24 -0
- ergon/connector/excel/service.py +98 -0
- ergon/connector/pipefy/__init__.py +21 -0
- ergon/connector/pipefy/async_connector.py +48 -0
- ergon/connector/pipefy/async_service.py +907 -0
- ergon/connector/pipefy/connector.py +36 -0
- ergon/connector/pipefy/models.py +48 -0
- ergon/connector/pipefy/service.py +1016 -0
- ergon/connector/pipefy/version.py +1 -0
- ergon/connector/postgres/__init__.py +11 -0
- ergon/connector/postgres/async_connector.py +119 -0
- ergon/connector/postgres/async_service.py +116 -0
- ergon/connector/postgres/models.py +34 -0
- ergon/connector/rabbitmq/__init__.py +25 -0
- ergon/connector/rabbitmq/async_connector.py +120 -0
- ergon/connector/rabbitmq/async_service.py +417 -0
- ergon/connector/rabbitmq/connector.py +54 -0
- ergon/connector/rabbitmq/helper.py +14 -0
- ergon/connector/rabbitmq/models.py +92 -0
- ergon/connector/rabbitmq/service.py +199 -0
- ergon/connector/sqs/__init__.py +15 -0
- ergon/connector/sqs/async_connector.py +120 -0
- ergon/connector/sqs/async_service.py +246 -0
- ergon/connector/sqs/connector.py +120 -0
- ergon/connector/sqs/models.py +36 -0
- ergon/connector/sqs/service.py +219 -0
- ergon/connector/transaction.py +14 -0
- ergon/py.typed +0 -0
- ergon/service/__init__.py +5 -0
- ergon/service/service.py +17 -0
- ergon/task/__init__.py +13 -0
- ergon/task/base.py +222 -0
- ergon/task/exceptions.py +217 -0
- ergon/task/helpers.py +691 -0
- ergon/task/manager.py +85 -0
- ergon/task/mixins/__init__.py +13 -0
- ergon/task/mixins/consumer.py +858 -0
- ergon/task/mixins/metrics.py +457 -0
- ergon/task/mixins/producer.py +486 -0
- ergon/task/policies.py +229 -0
- ergon/task/runner.py +386 -0
- ergon/task/utils.py +64 -0
- ergon/telemetry/__init__.py +7 -0
- ergon/telemetry/_resource.py +13 -0
- ergon/telemetry/logging.py +370 -0
- ergon/telemetry/metrics.py +101 -0
- ergon/telemetry/tracing.py +152 -0
- ergon/utils/__init__.py +5 -0
- ergon/utils/env.py +26 -0
- ergon_framework_python-0.1.0.dist-info/METADATA +449 -0
- ergon_framework_python-0.1.0.dist-info/RECORD +82 -0
- ergon_framework_python-0.1.0.dist-info/WHEEL +5 -0
- ergon_framework_python-0.1.0.dist-info/entry_points.txt +2 -0
- ergon_framework_python-0.1.0.dist-info/licenses/LICENSE +21 -0
- ergon_framework_python-0.1.0.dist-info/top_level.txt +1 -0
ergon/task/manager.py
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import sys
|
|
3
|
+
from typing import Dict, List
|
|
4
|
+
|
|
5
|
+
from ..connector import Transaction
|
|
6
|
+
from .base import BaseAsyncTask, BaseTask, TaskConfig
|
|
7
|
+
from .runner import run_task
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TaskManager:
|
|
13
|
+
"""
|
|
14
|
+
Global registry and orchestrator for Ergon tasks.
|
|
15
|
+
Supports both synchronous (BaseTask) and asynchronous (BaseAsyncTask).
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(self):
|
|
19
|
+
self._registry: Dict[str, TaskConfig] = {}
|
|
20
|
+
|
|
21
|
+
# -------------------------------------------------------------
|
|
22
|
+
# REGISTER TASK
|
|
23
|
+
# -------------------------------------------------------------
|
|
24
|
+
def register(self, config: TaskConfig) -> None:
|
|
25
|
+
"""
|
|
26
|
+
Register a task by its name inside TaskConfig.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
# Validate task inheritance
|
|
30
|
+
if not issubclass(config.task, (BaseTask, BaseAsyncTask)): # type: ignore[arg-type]
|
|
31
|
+
raise TypeError(f"Task '{config.name}' must inherit from BaseTask or BaseAsyncTask. Got: {config.task}")
|
|
32
|
+
|
|
33
|
+
# Duplicate check
|
|
34
|
+
if config.name in self._registry:
|
|
35
|
+
logger.warning(f"Task name '{config.name}' already registered.")
|
|
36
|
+
|
|
37
|
+
self._registry[config.name] = config
|
|
38
|
+
|
|
39
|
+
# -------------------------------------------------------------
|
|
40
|
+
# RUN TASK BY NAME
|
|
41
|
+
# -------------------------------------------------------------
|
|
42
|
+
def run(self, name: str, debug: bool = False, *args, **kwargs) -> None:
|
|
43
|
+
if name not in self._registry:
|
|
44
|
+
raise ValueError(f"Task '{name}' is not registered.")
|
|
45
|
+
|
|
46
|
+
config = self._registry[name]
|
|
47
|
+
sys.exit(run_task(config=config, debug=debug, mode="task", *args, **kwargs))
|
|
48
|
+
|
|
49
|
+
def process_transaction(self, task: str, policy: str, transaction: Transaction, *args, **kwargs):
|
|
50
|
+
if task not in self._registry:
|
|
51
|
+
raise ValueError(f"Task '{task}' is not registered.")
|
|
52
|
+
config = self._registry[task]
|
|
53
|
+
sys.exit(
|
|
54
|
+
run_task(
|
|
55
|
+
config=config, debug=True, mode="transaction", transaction=transaction, policy=policy, *args, **kwargs
|
|
56
|
+
)
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
def process_transaction_by_id(self, task: str, policy: str, transaction_id: str, *args, **kwargs) -> None:
|
|
60
|
+
if task not in self._registry:
|
|
61
|
+
raise ValueError(f"Task '{task}' is not registered.")
|
|
62
|
+
config = self._registry[task]
|
|
63
|
+
sys.exit(
|
|
64
|
+
run_task(
|
|
65
|
+
config=config,
|
|
66
|
+
debug=True,
|
|
67
|
+
mode="transaction",
|
|
68
|
+
transaction_id=transaction_id,
|
|
69
|
+
policy=policy,
|
|
70
|
+
*args,
|
|
71
|
+
**kwargs,
|
|
72
|
+
)
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# -------------------------------------------------------------
|
|
76
|
+
# LIST / GET
|
|
77
|
+
# -------------------------------------------------------------
|
|
78
|
+
def list_tasks(self) -> List[str]:
|
|
79
|
+
return list(self._registry.keys())
|
|
80
|
+
|
|
81
|
+
def get(self, name: str) -> TaskConfig | None:
|
|
82
|
+
return self._registry.get(name)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
manager = TaskManager()
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from . import metrics
|
|
2
|
+
from .consumer import AsyncConsumerTask, AsyncHybridTask, ConsumerTask, HybridTask
|
|
3
|
+
from .producer import AsyncProducerTask, ProducerTask
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"ConsumerTask",
|
|
7
|
+
"ProducerTask",
|
|
8
|
+
"AsyncConsumerTask",
|
|
9
|
+
"AsyncProducerTask",
|
|
10
|
+
"HybridTask",
|
|
11
|
+
"AsyncHybridTask",
|
|
12
|
+
"metrics",
|
|
13
|
+
]
|