dotflow 0.15.0.dev4__py3-none-any.whl → 0.15.0.dev6__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.
- dotflow/__init__.py +1 -1
- dotflow/core/serializers/task.py +23 -7
- dotflow/core/task.py +1 -1
- dotflow/providers/server_default.py +6 -95
- {dotflow-0.15.0.dev4.dist-info → dotflow-0.15.0.dev6.dist-info}/METADATA +2 -2
- {dotflow-0.15.0.dev4.dist-info → dotflow-0.15.0.dev6.dist-info}/RECORD +9 -9
- {dotflow-0.15.0.dev4.dist-info → dotflow-0.15.0.dev6.dist-info}/WHEEL +0 -0
- {dotflow-0.15.0.dev4.dist-info → dotflow-0.15.0.dev6.dist-info}/entry_points.txt +0 -0
- {dotflow-0.15.0.dev4.dist-info → dotflow-0.15.0.dev6.dist-info}/licenses/LICENSE +0 -0
dotflow/__init__.py
CHANGED
dotflow/core/serializers/task.py
CHANGED
|
@@ -93,20 +93,28 @@ class SerializerTask(BaseModel):
|
|
|
93
93
|
)
|
|
94
94
|
@classmethod
|
|
95
95
|
def context_validator(cls, value: Any) -> Any:
|
|
96
|
-
if value
|
|
97
|
-
return
|
|
98
|
-
|
|
96
|
+
if value is None:
|
|
97
|
+
return None
|
|
98
|
+
if not isinstance(value, Context):
|
|
99
|
+
return None
|
|
100
|
+
if value.storage is None:
|
|
101
|
+
return None
|
|
102
|
+
return cls._serialize_context(value)
|
|
99
103
|
|
|
100
104
|
@classmethod
|
|
101
105
|
def _serialize_context(cls, ctx: Context) -> Any:
|
|
102
106
|
"""Serialize a Context to its storage value."""
|
|
103
|
-
if isinstance(ctx.storage, list):
|
|
107
|
+
if isinstance(ctx.storage, (list, tuple)):
|
|
104
108
|
contexts = {}
|
|
105
|
-
for item in ctx.storage:
|
|
109
|
+
for index, item in enumerate(ctx.storage):
|
|
106
110
|
if isinstance(item, Context):
|
|
107
|
-
|
|
111
|
+
if item.task_id is not None:
|
|
112
|
+
key = item.task_id
|
|
113
|
+
else:
|
|
114
|
+
key = f"ctx:{index}"
|
|
115
|
+
contexts[key] = cls._serialize_context(item)
|
|
108
116
|
else:
|
|
109
|
-
contexts[
|
|
117
|
+
contexts[f"raw:{index}"] = cls._format_raw(item)
|
|
110
118
|
return contexts
|
|
111
119
|
return cls._format_storage(ctx)
|
|
112
120
|
|
|
@@ -117,3 +125,11 @@ class SerializerTask(BaseModel):
|
|
|
117
125
|
return json.dumps(ctx.storage)
|
|
118
126
|
except TypeError:
|
|
119
127
|
return str(ctx.storage)
|
|
128
|
+
|
|
129
|
+
@staticmethod
|
|
130
|
+
def _format_raw(value: Any) -> Any:
|
|
131
|
+
"""Format a raw (non-Context) value as JSON string."""
|
|
132
|
+
try:
|
|
133
|
+
return json.dumps(value)
|
|
134
|
+
except TypeError:
|
|
135
|
+
return str(value)
|
dotflow/core/task.py
CHANGED
|
@@ -1,112 +1,23 @@
|
|
|
1
|
-
"""ServerDefault
|
|
2
|
-
|
|
3
|
-
Default implementation that communicates with a
|
|
4
|
-
dotflow-api server.
|
|
5
|
-
|
|
6
|
-
Args:
|
|
7
|
-
base_url (str): Base URL of the API.
|
|
8
|
-
user_token (str): API token (X-User-Token header).
|
|
9
|
-
timeout (float): HTTP request timeout in seconds.
|
|
10
|
-
"""
|
|
1
|
+
"""ServerDefault — no-op server provider."""
|
|
11
2
|
|
|
12
3
|
from __future__ import annotations
|
|
13
4
|
|
|
14
5
|
from typing import Any
|
|
15
6
|
|
|
16
|
-
from requests import patch as http_patch
|
|
17
|
-
from requests import post as http_post
|
|
18
|
-
|
|
19
7
|
from dotflow.abc.server import Server
|
|
20
|
-
from dotflow.logging import logger
|
|
21
8
|
|
|
22
9
|
|
|
23
10
|
class ServerDefault(Server):
|
|
24
|
-
"""Default Server implementation (
|
|
25
|
-
|
|
26
|
-
def __init__(
|
|
27
|
-
self,
|
|
28
|
-
base_url: str = "",
|
|
29
|
-
user_token: str = "",
|
|
30
|
-
timeout: float = 5.0,
|
|
31
|
-
) -> None:
|
|
32
|
-
self.base_url = base_url.rstrip("/")
|
|
33
|
-
self.user_token = user_token
|
|
34
|
-
self.timeout = timeout
|
|
35
|
-
self.enabled = bool(self.base_url and self.user_token)
|
|
36
|
-
|
|
37
|
-
def _headers(self) -> dict[str, str]:
|
|
38
|
-
return {
|
|
39
|
-
"Content-Type": "application/json",
|
|
40
|
-
"X-User-Token": self.user_token,
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
def _request(self, method, url, payload=None):
|
|
44
|
-
try:
|
|
45
|
-
response = method(
|
|
46
|
-
url=url,
|
|
47
|
-
headers=self._headers(),
|
|
48
|
-
json=payload or {},
|
|
49
|
-
timeout=self.timeout,
|
|
50
|
-
)
|
|
51
|
-
response.raise_for_status()
|
|
52
|
-
except Exception as error:
|
|
53
|
-
logger.error(
|
|
54
|
-
"Server %s failed: %s",
|
|
55
|
-
url,
|
|
56
|
-
str(error),
|
|
57
|
-
)
|
|
11
|
+
"""Default Server implementation (no-op)."""
|
|
58
12
|
|
|
59
13
|
def create_workflow(self, workflow: Any) -> None:
|
|
60
|
-
|
|
61
|
-
if not self.enabled:
|
|
62
|
-
return
|
|
63
|
-
|
|
64
|
-
self._request(
|
|
65
|
-
http_post,
|
|
66
|
-
f"{self.base_url}/workflows",
|
|
67
|
-
{
|
|
68
|
-
"id": f"{workflow}",
|
|
69
|
-
"execution_mode": "sequential",
|
|
70
|
-
"keep_going": False,
|
|
71
|
-
},
|
|
72
|
-
)
|
|
14
|
+
pass
|
|
73
15
|
|
|
74
16
|
def update_workflow(self, workflow: Any, status: str = "") -> None:
|
|
75
|
-
|
|
76
|
-
if not self.enabled:
|
|
77
|
-
return
|
|
78
|
-
|
|
79
|
-
self._request(
|
|
80
|
-
http_patch,
|
|
81
|
-
f"{self.base_url}/workflows/{workflow}",
|
|
82
|
-
{"status": status},
|
|
83
|
-
)
|
|
17
|
+
pass
|
|
84
18
|
|
|
85
19
|
def create_task(self, task: Any) -> None:
|
|
86
|
-
|
|
87
|
-
if not self.enabled:
|
|
88
|
-
return
|
|
89
|
-
|
|
90
|
-
payload = {
|
|
91
|
-
"id": task.task_id,
|
|
92
|
-
"initial_context": (task.initial_context.storage),
|
|
93
|
-
"group_name": (task.group_name or "default"),
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
self._request(
|
|
97
|
-
http_post,
|
|
98
|
-
f"{self.base_url}/workflows/{task.workflow_id}/tasks",
|
|
99
|
-
payload,
|
|
100
|
-
)
|
|
20
|
+
pass
|
|
101
21
|
|
|
102
22
|
def update_task(self, task: Any) -> None:
|
|
103
|
-
|
|
104
|
-
if not self.enabled:
|
|
105
|
-
return
|
|
106
|
-
|
|
107
|
-
self._request(
|
|
108
|
-
http_patch,
|
|
109
|
-
f"{self.base_url}/workflows/"
|
|
110
|
-
f"{task.workflow_id}/tasks/{task.task_id}",
|
|
111
|
-
task.result(),
|
|
112
|
-
)
|
|
23
|
+
pass
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dotflow
|
|
3
|
-
Version: 0.15.0.
|
|
3
|
+
Version: 0.15.0.dev6
|
|
4
4
|
Summary: 🎲 Dotflow turns an idea into flow! Lightweight Python library for execution pipelines with retry, parallel, cron and async support.
|
|
5
5
|
License: MIT License
|
|
6
6
|
|
|
@@ -90,7 +90,7 @@ Description-Content-Type: text/markdown
|
|
|
90
90
|
[](https://pypi.org/project/dotflow/)
|
|
91
91
|
[](https://github.com/dotflow-io/dotflow)
|
|
92
92
|
|
|
93
|
-
[Website](https://dotflow.io) · [Documentation](https://dotflow-io.github.io/dotflow/) · [PyPI](https://pypi.org/project/dotflow/)
|
|
93
|
+
[Website](https://www.cloud.dotflow.io) · [Documentation](https://dotflow-io.github.io/dotflow/) · [PyPI](https://pypi.org/project/dotflow/)
|
|
94
94
|
|
|
95
95
|
</div>
|
|
96
96
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
dotflow/__init__.py,sha256=
|
|
1
|
+
dotflow/__init__.py,sha256=U1261f8QEJvbdet2fmKSSDNLk9UPLbU9hoo69-BwogA,351
|
|
2
2
|
dotflow/abc/__init__.py,sha256=UIk84jCJYoHAk4In_eVXAaFAnNE63lI3dVP5qunyBJs,32
|
|
3
3
|
dotflow/abc/file.py,sha256=QEDIS-AXaW3GK5q5ckhNdoC5A3p8oOFE7VyNGSvx540,296
|
|
4
4
|
dotflow/abc/flow.py,sha256=j6m9u13UXgBCIhgrUwzvBBYHTDul_DfERD4DWA1BQBw,1436
|
|
@@ -72,10 +72,10 @@ dotflow/core/engine.py,sha256=kqDW-fsh4H_TRfeupCHfgRzBY4_JJcSiMx7shzXF-ug,9045
|
|
|
72
72
|
dotflow/core/exception.py,sha256=wxNLcDE3n2HjRsSioNo86Fd9V4K7oZZDL-FD0mcZxDg,2242
|
|
73
73
|
dotflow/core/module.py,sha256=5-19cKMa-BW3TVD1XVxiB_mPLTaeTIHfvVAvkkK3lmU,760
|
|
74
74
|
dotflow/core/serializers/__init__.py,sha256=2b2vyCuXmvS8N_K-ePuCrWC9yvMqLPBMeORjAWS5U70,35
|
|
75
|
-
dotflow/core/serializers/task.py,sha256=
|
|
75
|
+
dotflow/core/serializers/task.py,sha256=DlKatju4tmhmv6O7U2vejaBiIVyCczwI2Klr1C82Iuw,4286
|
|
76
76
|
dotflow/core/serializers/transport.py,sha256=gRlMTmyJrZrOS6fq7MUVtBqoerQrs2TJJyozGn6OfDk,489
|
|
77
77
|
dotflow/core/serializers/workflow.py,sha256=ZoytQHb1wWa4kxyqfuwx_QwVdwJf6ocjUEszfnaB3w0,349
|
|
78
|
-
dotflow/core/task.py,sha256=
|
|
78
|
+
dotflow/core/task.py,sha256=mVqfiBXS1eclK7hSJnUvvtNp7qEYuCBdLpcVxAgWSX0,10825
|
|
79
79
|
dotflow/core/types/__init__.py,sha256=8PX9QQrZ08beDSoSZb4SJDI257CY5hbfY9lctO3OaT4,405
|
|
80
80
|
dotflow/core/types/execution.py,sha256=GxgdznWYOI8nGIrgSaJ5E9XvJtX8UnARgjJIGYz-lEM,487
|
|
81
81
|
dotflow/core/types/overlap.py,sha256=suC2sX62y9j9CksNq09RVoziiSA205FzjcmhaQGxWL8,805
|
|
@@ -96,7 +96,7 @@ dotflow/providers/notify_discord.py,sha256=9cOt3YwJzuZzpNQlMLdc3sfJ5hfFRBBAmpNoU
|
|
|
96
96
|
dotflow/providers/notify_telegram.py,sha256=xiyeqVSo_xQg3FR3_Q6Dnx2Qk8Sih2J7tkIVxkFSefk,3230
|
|
97
97
|
dotflow/providers/scheduler_cron.py,sha256=wRXI5g0fDrYkBgD5zAMa5T8xxjU9v1SjDNpmsQD8nwA,8245
|
|
98
98
|
dotflow/providers/scheduler_default.py,sha256=mkgMz5D6mROTDDY5juGXV4IgEDRPM0yW8_NJWDVfRTQ,258
|
|
99
|
-
dotflow/providers/server_default.py,sha256=
|
|
99
|
+
dotflow/providers/server_default.py,sha256=RRJMwN2oyyS_gHPif2fPJRGNsmTw2e3BmXVuQMYSR2M,500
|
|
100
100
|
dotflow/providers/storage_default.py,sha256=ijE6cN0TlmTn8J5TiNvq_xakoK3JmciqI7qJWxesEBM,568
|
|
101
101
|
dotflow/providers/storage_file.py,sha256=N4BPiDWWDOUbh5suzWvYzX6ZUtjhrfdZgSqwBPDW__I,2154
|
|
102
102
|
dotflow/providers/storage_gcs.py,sha256=LgkS0zjlPElbvPhk7-uVKbNTnVn2OTtk8h5XltWIOH0,2484
|
|
@@ -110,8 +110,8 @@ dotflow/utils/__init__.py,sha256=AXiUm5p-FVG9SBWPxdG6jV0ft49EK6c40ME4aznPWQc,366
|
|
|
110
110
|
dotflow/utils/basic_functions.py,sha256=S-maghYauG5QkMtHdm7qNcxBkKkSoE4akHSiI178Bwg,131
|
|
111
111
|
dotflow/utils/error_handler.py,sha256=I8DY2AKR-WxKl8k7aUJPExS6wlzKVPy_u42ZJ9gYyts,272
|
|
112
112
|
dotflow/utils/tools.py,sha256=RtC0D1SnaNCB02cT-l0Dw8Wl6uDSQSABoZH2kdD1PJQ,787
|
|
113
|
-
dotflow-0.15.0.
|
|
114
|
-
dotflow-0.15.0.
|
|
115
|
-
dotflow-0.15.0.
|
|
116
|
-
dotflow-0.15.0.
|
|
117
|
-
dotflow-0.15.0.
|
|
113
|
+
dotflow-0.15.0.dev6.dist-info/METADATA,sha256=7xYkUOdXqdNv-CYff3ejtpaAStxbTpDbGvpDq8WOsxM,29495
|
|
114
|
+
dotflow-0.15.0.dev6.dist-info/WHEEL,sha256=Vz2fHgx6HFtSwhs8KvkHLqH5Ea4w1_rner5uNVGCeIE,88
|
|
115
|
+
dotflow-0.15.0.dev6.dist-info/entry_points.txt,sha256=3AW0pYKZpaMW6WZmN3t71X0FuwxQdivmQwe47_6yBp4,45
|
|
116
|
+
dotflow-0.15.0.dev6.dist-info/licenses/LICENSE,sha256=UnmVHQt00UH2v7RBXqtIo_0D3vGBh0ujTdBKPKopAFk,1072
|
|
117
|
+
dotflow-0.15.0.dev6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|