ergon-framework-python 0.2.1__py3-none-any.whl → 0.2.2__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 +1 -1
- ergon/connector/__init__.py +20 -0
- ergon/connector/ergon_platform/__init__.py +78 -11
- ergon/connector/ergon_platform/async_connector.py +3 -221
- ergon/connector/ergon_platform/channels/__init__.py +54 -0
- ergon/connector/ergon_platform/channels/adapters.py +230 -0
- ergon/connector/ergon_platform/channels/async_connector.py +327 -0
- ergon/connector/ergon_platform/channels/connector.py +294 -0
- ergon/connector/ergon_platform/channels/models.py +460 -0
- ergon/connector/ergon_platform/channels/services/__init__.py +39 -0
- ergon/connector/ergon_platform/channels/services/activity.py +300 -0
- ergon/connector/ergon_platform/channels/services/addresses.py +325 -0
- ergon/connector/ergon_platform/channels/services/attachments.py +283 -0
- ergon/connector/ergon_platform/channels/services/messages.py +127 -0
- ergon/connector/ergon_platform/channels/services/records.py +75 -0
- ergon/connector/ergon_platform/channels/services/service.py +34 -0
- ergon/connector/ergon_platform/connector.py +3 -198
- ergon/connector/ergon_platform/models.py +1 -73
- ergon/connector/ergon_platform/utils.py +39 -248
- ergon/connector/ergon_platform/workflows/__init__.py +52 -0
- ergon/connector/ergon_platform/{_operations.py → workflows/_operations.py} +8 -3
- ergon/connector/ergon_platform/workflows/async_connector.py +224 -0
- ergon/connector/ergon_platform/workflows/connector.py +201 -0
- ergon/connector/ergon_platform/workflows/models.py +90 -0
- ergon/connector/ergon_platform/workflows/utils.py +250 -0
- ergon/task/mixins/consumer.py +0 -2
- {ergon_framework_python-0.2.1.dist-info → ergon_framework_python-0.2.2.dist-info}/METADATA +3 -3
- {ergon_framework_python-0.2.1.dist-info → ergon_framework_python-0.2.2.dist-info}/RECORD +32 -15
- {ergon_framework_python-0.2.1.dist-info → ergon_framework_python-0.2.2.dist-info}/WHEEL +0 -0
- {ergon_framework_python-0.2.1.dist-info → ergon_framework_python-0.2.2.dist-info}/entry_points.txt +0 -0
- {ergon_framework_python-0.2.1.dist-info → ergon_framework_python-0.2.2.dist-info}/licenses/LICENSE +0 -0
- {ergon_framework_python-0.2.1.dist-info → ergon_framework_python-0.2.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
import json
|
|
3
|
+
from typing import Any, Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
from ...transaction import Transaction
|
|
6
|
+
from .models import (
|
|
7
|
+
FAILURE_STATUSES,
|
|
8
|
+
PROCESSING_STATUSES,
|
|
9
|
+
SUCCESS_STATUSES,
|
|
10
|
+
CreateItemInput,
|
|
11
|
+
CreateItemPayload,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def get_value(obj: Any, key: str, default: Any = None) -> Any:
|
|
16
|
+
"""Read a key from a dict or an attribute from an object, tolerating both shapes."""
|
|
17
|
+
if isinstance(obj, dict):
|
|
18
|
+
return obj.get(key, default)
|
|
19
|
+
return getattr(obj, key, default)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def as_payload(obj: Any) -> Any:
|
|
23
|
+
"""Convert SDK models to JSON-friendly payloads while leaving plain data untouched."""
|
|
24
|
+
if hasattr(obj, "model_dump"):
|
|
25
|
+
return obj.model_dump(mode="json")
|
|
26
|
+
return obj
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def serialize_object(obj: Any) -> Any:
|
|
30
|
+
if obj is None:
|
|
31
|
+
return None
|
|
32
|
+
if isinstance(obj, (str, int, float, bool, bytes)):
|
|
33
|
+
return obj
|
|
34
|
+
if isinstance(obj, dict):
|
|
35
|
+
return {k: serialize_object(v) for k, v in obj.items()}
|
|
36
|
+
if isinstance(obj, (list, tuple)):
|
|
37
|
+
return [serialize_object(item) for item in obj]
|
|
38
|
+
if hasattr(obj, "model_dump"):
|
|
39
|
+
return obj.model_dump(mode="json")
|
|
40
|
+
if hasattr(obj, "to_dict"):
|
|
41
|
+
return obj.to_dict()
|
|
42
|
+
if hasattr(obj, "__dict__"):
|
|
43
|
+
return {k: serialize_object(v) for k, v in obj.__dict__.items() if not k.startswith("_")}
|
|
44
|
+
return obj
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def classify_status(raw_status: str) -> str:
|
|
48
|
+
"""Map a raw pipeline status string to a coarse state."""
|
|
49
|
+
status = (raw_status or "").lower()
|
|
50
|
+
if status in SUCCESS_STATUSES:
|
|
51
|
+
return "success"
|
|
52
|
+
if status in FAILURE_STATUSES:
|
|
53
|
+
return "failed"
|
|
54
|
+
if status in PROCESSING_STATUSES:
|
|
55
|
+
return "processing"
|
|
56
|
+
return "unknown"
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def find_status_entry(statuses: Any, buckets_file_id: str) -> Any:
|
|
60
|
+
for status in extract_status_entries(statuses):
|
|
61
|
+
if extract_status_file_id(status) == str(buckets_file_id):
|
|
62
|
+
return status
|
|
63
|
+
return {}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def extract_status_entries(statuses: Any) -> List[Any]:
|
|
67
|
+
"""Normalize SDK attachment status responses to a list of status entries."""
|
|
68
|
+
if statuses is None:
|
|
69
|
+
return []
|
|
70
|
+
if isinstance(statuses, list):
|
|
71
|
+
return statuses
|
|
72
|
+
if isinstance(statuses, tuple):
|
|
73
|
+
return list(statuses)
|
|
74
|
+
if isinstance(statuses, dict):
|
|
75
|
+
for key in ("items", "data", "results", "statuses", "attachments", "files"):
|
|
76
|
+
value = statuses.get(key)
|
|
77
|
+
if isinstance(value, list):
|
|
78
|
+
return value
|
|
79
|
+
if get_value(statuses, "status") is not None or extract_status_file_id(statuses):
|
|
80
|
+
return [statuses]
|
|
81
|
+
return []
|
|
82
|
+
for key in ("items", "data", "results", "statuses", "attachments", "files"):
|
|
83
|
+
value = getattr(statuses, key, None)
|
|
84
|
+
if isinstance(value, (list, tuple)):
|
|
85
|
+
return list(value)
|
|
86
|
+
if get_value(statuses, "status") is not None or extract_status_file_id(statuses):
|
|
87
|
+
return [statuses]
|
|
88
|
+
return []
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def extract_status_file_id(status: Any) -> Optional[str]:
|
|
92
|
+
for key in ("buckets_file_id", "bucketsFileId", "file_id", "fileId"):
|
|
93
|
+
value = get_value(status, key)
|
|
94
|
+
if value:
|
|
95
|
+
return str(value)
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def latest_status_entry(statuses: Any) -> Any:
|
|
100
|
+
entries = extract_status_entries(statuses)
|
|
101
|
+
return entries[-1] if entries else {}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def extract_buckets_file_id(item: Any, field_id: str) -> Optional[str]:
|
|
105
|
+
field_values = get_value(item, "field_values", []) or []
|
|
106
|
+
if isinstance(field_values, dict):
|
|
107
|
+
return extract_buckets_file_id_from_attachments(field_values.get(field_id))
|
|
108
|
+
|
|
109
|
+
for field_value in field_values:
|
|
110
|
+
if str(get_value(field_value, "field_id")) != str(field_id):
|
|
111
|
+
continue
|
|
112
|
+
buckets_file_id = extract_buckets_file_id_from_attachments(get_value(field_value, "value", []))
|
|
113
|
+
if buckets_file_id:
|
|
114
|
+
return buckets_file_id
|
|
115
|
+
return None
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def extract_buckets_file_id_from_attachments(value: Any) -> Optional[str]:
|
|
119
|
+
attachments = value or []
|
|
120
|
+
if isinstance(attachments, dict):
|
|
121
|
+
for key in ("attachments", "files", "items", "data", "results", "value"):
|
|
122
|
+
nested = attachments.get(key)
|
|
123
|
+
if isinstance(nested, list):
|
|
124
|
+
attachments = nested
|
|
125
|
+
break
|
|
126
|
+
else:
|
|
127
|
+
attachments = [attachments]
|
|
128
|
+
if not isinstance(attachments, list):
|
|
129
|
+
return None
|
|
130
|
+
for attachment in reversed(attachments):
|
|
131
|
+
buckets_file_id = get_value(attachment, "buckets_file_id")
|
|
132
|
+
if buckets_file_id:
|
|
133
|
+
return str(buckets_file_id)
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def item_to_transaction(item: Any, workflow_id: str) -> Transaction:
|
|
138
|
+
payload = serialize_object(item)
|
|
139
|
+
payload = payload if isinstance(payload, dict) else {"value": payload}
|
|
140
|
+
return Transaction(
|
|
141
|
+
id=str(payload.get("id", "")),
|
|
142
|
+
payload=payload,
|
|
143
|
+
metadata={
|
|
144
|
+
"workflow_id": workflow_id,
|
|
145
|
+
"phase_id": payload.get("phase_id"),
|
|
146
|
+
"company_id": payload.get("company_id"),
|
|
147
|
+
"title": payload.get("title"),
|
|
148
|
+
},
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def normalize_create_payload(payload: CreateItemPayload) -> Dict[str, Any]:
|
|
153
|
+
"""Flatten a CreateItemInput/dict into kwargs accepted by the service create_item."""
|
|
154
|
+
if isinstance(payload, CreateItemInput):
|
|
155
|
+
data: Dict[str, Any] = {
|
|
156
|
+
"title": payload.title,
|
|
157
|
+
"workflow_id": payload.workflow_id,
|
|
158
|
+
"phase_id": payload.phase_id,
|
|
159
|
+
"parent_item_id": payload.parent_item_id,
|
|
160
|
+
"field_values": payload.field_values,
|
|
161
|
+
"attachment": payload.attachment,
|
|
162
|
+
"attachment_field_id": payload.attachment_field_id,
|
|
163
|
+
"content_type": payload.content_type,
|
|
164
|
+
"fields": dict(payload.extra_fields),
|
|
165
|
+
}
|
|
166
|
+
return data
|
|
167
|
+
if isinstance(payload, dict):
|
|
168
|
+
data = dict(payload)
|
|
169
|
+
data.setdefault("fields", {})
|
|
170
|
+
return data
|
|
171
|
+
raise TypeError(f"Unsupported create payload type: {type(payload)}")
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def requeue(transaction: Transaction) -> CreateItemInput:
|
|
175
|
+
"""Build a CreateItemInput from a transaction payload for re-dispatch."""
|
|
176
|
+
data = normalize_create_payload(transaction.payload)
|
|
177
|
+
workflow_id = data.get("workflow_id") or transaction.metadata.get("workflow_id")
|
|
178
|
+
phase_id = data.get("phase_id") or transaction.metadata.get("phase_id")
|
|
179
|
+
title = data.get("title")
|
|
180
|
+
if not isinstance(title, str) or not title.strip():
|
|
181
|
+
raise ValueError("title is required to requeue a transaction")
|
|
182
|
+
|
|
183
|
+
return CreateItemInput(
|
|
184
|
+
title=title,
|
|
185
|
+
workflow_id=workflow_id,
|
|
186
|
+
phase_id=phase_id,
|
|
187
|
+
parent_item_id=data.get("parent_item_id"),
|
|
188
|
+
field_values=data.get("field_values"),
|
|
189
|
+
attachment=data.get("attachment"),
|
|
190
|
+
attachment_field_id=data.get("attachment_field_id"),
|
|
191
|
+
content_type=data.get("content_type"),
|
|
192
|
+
extra_fields=dict(data.get("fields") or {}),
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def build_redispatch_transaction(transaction: Transaction) -> Transaction:
|
|
197
|
+
"""Prepare a transaction payload suitable for re-dispatch."""
|
|
198
|
+
return Transaction(
|
|
199
|
+
id=transaction.id,
|
|
200
|
+
payload=requeue(transaction),
|
|
201
|
+
metadata=dict(transaction.metadata or {}),
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def decode_jwt_claims(jwt_token: str) -> Dict[str, Any]:
|
|
206
|
+
"""Decode JWT payload claims without signature validation.
|
|
207
|
+
|
|
208
|
+
Raises:
|
|
209
|
+
ValueError: When the token shape or payload encoding is invalid.
|
|
210
|
+
"""
|
|
211
|
+
parts = jwt_token.split(".")
|
|
212
|
+
if len(parts) < 2 or not parts[1]:
|
|
213
|
+
raise ValueError("Invalid JWT format: payload segment is missing")
|
|
214
|
+
|
|
215
|
+
payload = parts[1]
|
|
216
|
+
payload += "=" * (-len(payload) % 4)
|
|
217
|
+
try:
|
|
218
|
+
decoded = base64.urlsafe_b64decode(payload.encode("ascii"))
|
|
219
|
+
claims = json.loads(decoded.decode("utf-8"))
|
|
220
|
+
except Exception as exc: # noqa: BLE001
|
|
221
|
+
raise ValueError("Invalid JWT payload encoding") from exc
|
|
222
|
+
|
|
223
|
+
if not isinstance(claims, dict):
|
|
224
|
+
raise ValueError("Invalid JWT payload: expected a JSON object")
|
|
225
|
+
return claims
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def extract_items(response: Any) -> List[Any]:
|
|
229
|
+
"""Pull the item list out of a Page, dict, or raw list response."""
|
|
230
|
+
if isinstance(response, list):
|
|
231
|
+
return response
|
|
232
|
+
if isinstance(response, dict):
|
|
233
|
+
for key in ("items", "data", "results"):
|
|
234
|
+
value = response.get(key)
|
|
235
|
+
if isinstance(value, list):
|
|
236
|
+
return value
|
|
237
|
+
return []
|
|
238
|
+
items = getattr(response, "items", None)
|
|
239
|
+
if isinstance(items, (list, tuple)):
|
|
240
|
+
return list(items)
|
|
241
|
+
return []
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def extract_total(response: Any) -> int:
|
|
245
|
+
"""Read total count from a paginated Page, dict, or SDK response."""
|
|
246
|
+
for key in ("total", "total_count", "count"):
|
|
247
|
+
value = get_value(response, key)
|
|
248
|
+
if value is not None:
|
|
249
|
+
return int(value)
|
|
250
|
+
return 0
|
ergon/task/mixins/consumer.py
CHANGED
|
@@ -136,7 +136,6 @@ class ConsumerMixin(ABC):
|
|
|
136
136
|
# -----------------------
|
|
137
137
|
# 3) SUCCESS HANDLER
|
|
138
138
|
# -----------------------
|
|
139
|
-
logger.info(f"Invoking success handler for transaction {transaction.id} with outcome: '{process_result}'")
|
|
140
139
|
success_ok, success_result = self._handle_success(transaction, process_result, policy.success.retry)
|
|
141
140
|
|
|
142
141
|
if not success_ok:
|
|
@@ -679,7 +678,6 @@ class AsyncConsumerMixin(ABC):
|
|
|
679
678
|
# -----------------------
|
|
680
679
|
# 3) SUCCESS HANDLER
|
|
681
680
|
# -----------------------
|
|
682
|
-
logger.info(f"Invoking success handler for transaction {transaction.id} with outcome: '{process_result}'")
|
|
683
681
|
success_ok, success_result = await self._handle_success(transaction, process_result, policy.success.retry)
|
|
684
682
|
|
|
685
683
|
if not success_ok:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ergon-framework-python
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Ergon internal task-oriented project bootstrapper
|
|
5
5
|
Author-email: Ergondata Technologies <anza.vossos@protonmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -29,14 +29,14 @@ Requires-Dist: aio-pika>=9.0.0; extra == "all"
|
|
|
29
29
|
Requires-Dist: aiobotocore>=2.13.0; extra == "all"
|
|
30
30
|
Requires-Dist: asyncpg>=0.29.0; extra == "all"
|
|
31
31
|
Requires-Dist: boto3>=1.35.0; extra == "all"
|
|
32
|
-
Requires-Dist: ergon-platform-sdk>=0.
|
|
32
|
+
Requires-Dist: ergon-platform-sdk>=0.2.0; extra == "all"
|
|
33
33
|
Requires-Dist: httpx>=0.28.0; extra == "all"
|
|
34
34
|
Requires-Dist: nylas>=6.0.0; extra == "all"
|
|
35
35
|
Requires-Dist: openpyxl>=3.1.5; extra == "all"
|
|
36
36
|
Requires-Dist: pika>=1.3.0; extra == "all"
|
|
37
37
|
Requires-Dist: requests>=2.32.5; extra == "all"
|
|
38
38
|
Provides-Extra: ergon-platform
|
|
39
|
-
Requires-Dist: ergon-platform-sdk>=0.
|
|
39
|
+
Requires-Dist: ergon-platform-sdk>=0.2.0; extra == "ergon-platform"
|
|
40
40
|
Requires-Dist: httpx>=0.28.0; extra == "ergon-platform"
|
|
41
41
|
Provides-Extra: excel
|
|
42
42
|
Requires-Dist: openpyxl>=3.1.5; extra == "excel"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
ergon/__init__.py,sha256=
|
|
1
|
+
ergon/__init__.py,sha256=o88UpQYh3RcjogyA8PsDjekDAK6Xfth93UCFdDWixyo,218
|
|
2
2
|
ergon/cli.py,sha256=CF8PvOjIguR18a657aEBEyhFXUoSVtSRVXv5PfnuWtA,6021
|
|
3
3
|
ergon/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
ergon/bootstrap/src/__project__/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -22,17 +22,34 @@ ergon/bootstrap/src/__project__/tasks/example_task/exceptions.py,sha256=LTWwquhM
|
|
|
22
22
|
ergon/bootstrap/src/__project__/tasks/example_task/helpers.py,sha256=uR_XZEtxR6JzbJloi7OhJb77f7Wc6pnOe1W3CHvl8vE,122
|
|
23
23
|
ergon/bootstrap/src/__project__/tasks/example_task/schemas.py,sha256=3_qANKlJIQ90gaRNrDuBAM42UNzfDbLI4-F0kkjjWHc,155
|
|
24
24
|
ergon/bootstrap/src/__project__/tasks/example_task/task.py,sha256=XnmVg-B0N8Ld48FMLJgGfTTJLjmpy5Nog_Gaj1ruVEQ,36
|
|
25
|
-
ergon/connector/__init__.py,sha256=
|
|
25
|
+
ergon/connector/__init__.py,sha256=qBgpM6yArVb-ns7l09RN6hYU84Rxx1_3aD4ZZiCFTRE,6648
|
|
26
26
|
ergon/connector/_lazy.py,sha256=ANsKY3JTtmVo8Z8p3ey3LwkQGVVYITKO1eEK66IvA3U,1690
|
|
27
27
|
ergon/connector/connector.py,sha256=jaF1iXKALE1IHHfcP54mTD5mvj-wzk5iNaLo96IOcDI,3944
|
|
28
28
|
ergon/connector/transaction.py,sha256=LMGEFfisdjGGCPrWps3nYJ-SRBKa-P2pOFmwbSgDN-E,291
|
|
29
|
-
ergon/connector/ergon_platform/__init__.py,sha256=
|
|
29
|
+
ergon/connector/ergon_platform/__init__.py,sha256=BYp8roDI5JyKdwLaVGeE9Qnx3VWt4gpPdAdb258YKuw,3807
|
|
30
30
|
ergon/connector/ergon_platform/_client.py,sha256=RQbTRanK0pF_JzJi7EF9_6d4veCC4_xfXHk5A0nL5jE,812
|
|
31
|
-
ergon/connector/ergon_platform/
|
|
32
|
-
ergon/connector/ergon_platform/
|
|
33
|
-
ergon/connector/ergon_platform/
|
|
34
|
-
ergon/connector/ergon_platform/
|
|
35
|
-
ergon/connector/ergon_platform/
|
|
31
|
+
ergon/connector/ergon_platform/async_connector.py,sha256=Is4wpMO9dtPNJoj1Y8WeyZg8bpskHbcpApdVYl45OYM,184
|
|
32
|
+
ergon/connector/ergon_platform/connector.py,sha256=pIRBPoWTLs8q_5_2Dby7fNEMQJWsnVOrt7dTJdFZdMo,162
|
|
33
|
+
ergon/connector/ergon_platform/models.py,sha256=ydrowIUaMhiZ08iJPKynkJU19RvqmogIreQFeJKhCuw,1248
|
|
34
|
+
ergon/connector/ergon_platform/utils.py,sha256=eZU8PHwarpz--EWgz74MkfPLD2AbKp5pmNveijd13oc,987
|
|
35
|
+
ergon/connector/ergon_platform/channels/__init__.py,sha256=wEpy-8p1mwQNZmosO17hOZ3DIPisX3P14T6WVbyMeBo,1480
|
|
36
|
+
ergon/connector/ergon_platform/channels/adapters.py,sha256=LoylPshBCMi5R32Ms-IHe_H2rCO4QFrUWMvscRWkmQ8,8123
|
|
37
|
+
ergon/connector/ergon_platform/channels/async_connector.py,sha256=iKqj-I_2k6DPRd-r0FZ7li659L0Rf3k5--lT3VCBd-8,12853
|
|
38
|
+
ergon/connector/ergon_platform/channels/connector.py,sha256=UEgT7so-CWEVPUmxhBzkX4WnxC5PJVlhs-fDd1o1qYk,11637
|
|
39
|
+
ergon/connector/ergon_platform/channels/models.py,sha256=00WTLbYdputWd9FHy9D5h3X4AAiAIBeYlBeH5cGY6vA,18292
|
|
40
|
+
ergon/connector/ergon_platform/channels/services/__init__.py,sha256=EQBc2Sc2mL3gwitd1cPL2wpYnio7C7nHzAA1ml45UzQ,1091
|
|
41
|
+
ergon/connector/ergon_platform/channels/services/activity.py,sha256=SxN3y2VZDulPxiqy6XNDipVvhCk9uDzsIeSXs9Hd6WA,9756
|
|
42
|
+
ergon/connector/ergon_platform/channels/services/addresses.py,sha256=YNjMTqZidfqo5aOXa32F_rXIukVKxE04ULrdBBm2L4k,11288
|
|
43
|
+
ergon/connector/ergon_platform/channels/services/attachments.py,sha256=IT9bU8p3X93StRFpQAofcf2nuBTpqfpqEuabAccj05M,10216
|
|
44
|
+
ergon/connector/ergon_platform/channels/services/messages.py,sha256=us0gemfUAk3GKdC7-mXW0V7r7oCIbD73qIYXgy6W9Oc,4474
|
|
45
|
+
ergon/connector/ergon_platform/channels/services/records.py,sha256=yv_xl0lFhksk0baHpHkFlqA8X3YaoEOQ9jpOUT5guk0,2483
|
|
46
|
+
ergon/connector/ergon_platform/channels/services/service.py,sha256=BjqRYeLUZtzXpPeOLjgNdlq7TJXFc28SJtMH-Uha2DY,1160
|
|
47
|
+
ergon/connector/ergon_platform/workflows/__init__.py,sha256=W5TDhYmldZqfQRJ4G8siFis7AAasIAuZhtqrwlR5QFk,1315
|
|
48
|
+
ergon/connector/ergon_platform/workflows/_operations.py,sha256=IJPsiCEo27UvRKhGTrxn1HqCxbaPfVLwV0mFGgs0sOw,9750
|
|
49
|
+
ergon/connector/ergon_platform/workflows/async_connector.py,sha256=PYqLxDAw1M0T6dR9SckohT1nhibPyRoBhdu9JFJ2r90,8463
|
|
50
|
+
ergon/connector/ergon_platform/workflows/connector.py,sha256=gooEFbkzVB0ig-a29sD__hZJeNEQ9JfDi2mxBuLQGB0,7576
|
|
51
|
+
ergon/connector/ergon_platform/workflows/models.py,sha256=_a2qH9Bkx5f2IqWb0LdqML0D088aH7AwApe204REoEE,3591
|
|
52
|
+
ergon/connector/ergon_platform/workflows/utils.py,sha256=---WoYGjyAqKLl-OWOqpkvFDK8HCeiApmz47nJ3z958,8779
|
|
36
53
|
ergon/connector/excel/__init__.py,sha256=YHrcMRwW96DtvRs2CNpKK5GW3lJXZSdClLUWCDMgzsA,1013
|
|
37
54
|
ergon/connector/excel/connector.py,sha256=Tx2T9Ggo8pPAaSmua4j_PMu_QiiiezWm1Nru3Jr0E94,5327
|
|
38
55
|
ergon/connector/excel/models.py,sha256=9RSCaFJAaFTTI0BMZ8S87SWvRqpEsMA50Mw7Gc47_dE,905
|
|
@@ -82,7 +99,7 @@ ergon/task/policies.py,sha256=3x1SV-yt3FXNgmnATdQdpRtsDtlskjx582SpbC6UH6A,7358
|
|
|
82
99
|
ergon/task/runner.py,sha256=xUaMSO6V_iOq6QJdiyW1IA5kfWuwQjh1IJl6HUh06hY,20344
|
|
83
100
|
ergon/task/utils.py,sha256=OmlP2AhLM32V8O9OMky6DdSvxwmMNn9x2LTguf0y-M0,2501
|
|
84
101
|
ergon/task/mixins/__init__.py,sha256=6A8vNgdjaQYNJvymWNF-kBN2oTaQBYRLctS3Sq1w_-Y,320
|
|
85
|
-
ergon/task/mixins/consumer.py,sha256=
|
|
102
|
+
ergon/task/mixins/consumer.py,sha256=DhN2qBtNtB6xdKEdCokw1Z5ic2W8QfoUCm1QH_YPIFA,52270
|
|
86
103
|
ergon/task/mixins/metrics.py,sha256=4bavwo8koWiN5ADD8t5qd2BVeVcgxo6ddzq-xOybeTg,13159
|
|
87
104
|
ergon/task/mixins/producer.py,sha256=xENTZdZ7t0dpw5YsreQT20iTycSaj1EA4ny-60u-SWM,20427
|
|
88
105
|
ergon/telemetry/__init__.py,sha256=8waeIAHEx6tMXWfw-zOEKgjrg7V8S1poG070MdAmi_8,100
|
|
@@ -92,9 +109,9 @@ ergon/telemetry/metrics.py,sha256=0T_CuNw9P5AG1U9k1-bNp1g7McyiNLUIt_zKyLOtrnA,28
|
|
|
92
109
|
ergon/telemetry/tracing.py,sha256=_ktiZWAgB1DU-uN91Mzr0iYNXxbCN21LnKiRo5SOJxY,4454
|
|
93
110
|
ergon/utils/__init__.py,sha256=M0_VCjMN7jvSPlRZLZHeFKTHAl1zu3BnAhjrzJjDfiI,57
|
|
94
111
|
ergon/utils/env.py,sha256=lji4xENvfHqg2GTGnzG95VKpxxM4f3DHIKKP61xQG08,621
|
|
95
|
-
ergon_framework_python-0.2.
|
|
96
|
-
ergon_framework_python-0.2.
|
|
97
|
-
ergon_framework_python-0.2.
|
|
98
|
-
ergon_framework_python-0.2.
|
|
99
|
-
ergon_framework_python-0.2.
|
|
100
|
-
ergon_framework_python-0.2.
|
|
112
|
+
ergon_framework_python-0.2.2.dist-info/licenses/LICENSE,sha256=bWCIhHzaadz_ecLdCdtwyMafeQ17s2d7_FSSuSuEcDs,1079
|
|
113
|
+
ergon_framework_python-0.2.2.dist-info/METADATA,sha256=VNSh11YTgbAxLcsXPSj44s5pvfEniE9QST6-JEmsK1w,16914
|
|
114
|
+
ergon_framework_python-0.2.2.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
115
|
+
ergon_framework_python-0.2.2.dist-info/entry_points.txt,sha256=reZ934txb5OrtcNBgTGqCsXa1biUDQWubD2a9fGZynE,42
|
|
116
|
+
ergon_framework_python-0.2.2.dist-info/top_level.txt,sha256=KSPt6N7RzsjU7PRAalWQ9Cul7YTUxbo84yAJ-y2vLm8,6
|
|
117
|
+
ergon_framework_python-0.2.2.dist-info/RECORD,,
|
|
File without changes
|
{ergon_framework_python-0.2.1.dist-info → ergon_framework_python-0.2.2.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{ergon_framework_python-0.2.1.dist-info → ergon_framework_python-0.2.2.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{ergon_framework_python-0.2.1.dist-info → ergon_framework_python-0.2.2.dist-info}/top_level.txt
RENAMED
|
File without changes
|