dotflow 0.16.0.dev1__tar.gz → 0.16.0.dev2__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.
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/PKG-INFO +2 -1
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/__init__.py +1 -1
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/abc/server.py +1 -13
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/context.py +5 -5
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/dotflow.py +0 -7
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/engine.py +5 -3
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/serializers/task.py +1 -1
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/task.py +6 -8
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/server_api.py +1 -18
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/pyproject.toml +5 -3
- dotflow-0.16.0.dev1/dotflow/constants.py +0 -3
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/LICENSE +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/README.md +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/abc/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/abc/file.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/abc/flow.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/abc/http.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/abc/log.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/abc/metrics.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/abc/notify.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/abc/scheduler.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/abc/storage.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/abc/tcp.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/abc/tracer.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/command.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/commands/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/commands/cloud.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/commands/deploy.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/commands/init.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/commands/log.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/commands/schedule.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/commands/start.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/commands/storage.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/setup.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/validators/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cli/validators/start.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/alibaba/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/alibaba/constants.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/alibaba/deployers/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/alibaba/deployers/fc.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/alibaba/deployers/fc_scheduled.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/alibaba/services/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/alibaba/services/cr.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/constants.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/deployers/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/deployers/base_lambda.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/deployers/ecs.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/deployers/ecs_scheduled.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/deployers/lambda_.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/deployers/lambda_api.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/deployers/lambda_s3.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/deployers/lambda_sqs.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/schedule.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/services/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/services/cloudwatch.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/services/ecr.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/services/iam.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/aws/services/s3.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/core.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/gcp/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/gcp/constants.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/gcp/deployers/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/gcp/deployers/cloudrun.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/gcp/services/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/gcp/services/apis.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/gcp/services/artifact_registry.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/gcp/services/gcs.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/github/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/github/constants.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/github/deployers/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/cloud/github/deployers/actions.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/action.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/config.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/decorators/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/decorators/time.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/exception.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/module.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/serializers/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/serializers/transport.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/serializers/workflow.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/types/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/types/execution.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/types/overlap.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/types/status.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/types/storage.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/types/workflow.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/core/workflow.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/logging.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/main.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/log_default.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/log_opentelemetry.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/log_sentry.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/metrics_default.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/metrics_opentelemetry.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/notify_default.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/notify_discord.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/notify_telegram.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/scheduler_cron.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/scheduler_default.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/server_default.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/storage_default.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/storage_file.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/storage_gcs.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/storage_s3.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/tracer_default.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/tracer_opentelemetry.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/providers/tracer_sentry.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/settings.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/types.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/utils/__init__.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/utils/basic_functions.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/utils/error_handler.py +0 -0
- {dotflow-0.16.0.dev1 → dotflow-0.16.0.dev2}/dotflow/utils/tools.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dotflow
|
|
3
|
-
Version: 0.16.0.
|
|
3
|
+
Version: 0.16.0.dev2
|
|
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: Apache License
|
|
6
6
|
Version 2.0, January 2004
|
|
@@ -237,6 +237,7 @@ Requires-Dist: google-cloud-storage ; extra == "gcp"
|
|
|
237
237
|
Requires-Dist: opentelemetry-api ; extra == "otel"
|
|
238
238
|
Requires-Dist: opentelemetry-sdk ; extra == "otel"
|
|
239
239
|
Requires-Dist: pydantic
|
|
240
|
+
Requires-Dist: python-ulid (>=3.0)
|
|
240
241
|
Requires-Dist: requests
|
|
241
242
|
Requires-Dist: rich
|
|
242
243
|
Requires-Dist: sentry-sdk ; extra == "sentry"
|
|
@@ -3,17 +3,9 @@
|
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
4
|
from typing import Any
|
|
5
5
|
|
|
6
|
-
from dotflow.constants import INITIAL_TASK_ID
|
|
7
|
-
|
|
8
6
|
|
|
9
7
|
class Server(ABC):
|
|
10
|
-
"""Server ABC provider for sending workflow
|
|
11
|
-
data to a remote API.
|
|
12
|
-
|
|
13
|
-
Implementations should handle HTTP communication with
|
|
14
|
-
a server like dotflow-api, sending execution data
|
|
15
|
-
(status, duration, errors, context) in real time.
|
|
16
|
-
"""
|
|
8
|
+
"""Server ABC provider for sending workflow/task data remotely."""
|
|
17
9
|
|
|
18
10
|
@abstractmethod
|
|
19
11
|
def create_workflow(self, workflow: Any) -> None:
|
|
@@ -30,7 +22,3 @@ class Server(ABC):
|
|
|
30
22
|
@abstractmethod
|
|
31
23
|
def update_task(self, task: Any) -> None:
|
|
32
24
|
"""Update task data on the remote server."""
|
|
33
|
-
|
|
34
|
-
def get_next_task_id(self, workflow: Any) -> int:
|
|
35
|
-
"""Return the next task id to use inside an existing workflow."""
|
|
36
|
-
return INITIAL_TASK_ID
|
|
@@ -37,7 +37,7 @@ class Context(ContextInstance):
|
|
|
37
37
|
Args:
|
|
38
38
|
storage (Any): Attribute where any type of Python object can be stored.
|
|
39
39
|
|
|
40
|
-
task_id (
|
|
40
|
+
task_id (str): Task ID (ULID).
|
|
41
41
|
|
|
42
42
|
workflow_id (UUID): Workflow ID.
|
|
43
43
|
"""
|
|
@@ -45,7 +45,7 @@ class Context(ContextInstance):
|
|
|
45
45
|
def __init__(
|
|
46
46
|
self,
|
|
47
47
|
storage: Any = None,
|
|
48
|
-
task_id:
|
|
48
|
+
task_id: str = "",
|
|
49
49
|
workflow_id: UUID = None,
|
|
50
50
|
) -> None:
|
|
51
51
|
super().__init__(task_id, storage, task_id, workflow_id)
|
|
@@ -67,13 +67,13 @@ class Context(ContextInstance):
|
|
|
67
67
|
return self._task_id
|
|
68
68
|
|
|
69
69
|
@task_id.setter
|
|
70
|
-
def task_id(self, value:
|
|
70
|
+
def task_id(self, value: str):
|
|
71
71
|
if value is None:
|
|
72
72
|
self._task_id = None
|
|
73
73
|
return
|
|
74
|
-
if not isinstance(value,
|
|
74
|
+
if not isinstance(value, str):
|
|
75
75
|
raise TypeError(
|
|
76
|
-
f"task_id must be
|
|
76
|
+
f"task_id must be a str, got {type(value).__name__}: {value!r}"
|
|
77
77
|
)
|
|
78
78
|
self._task_id = value
|
|
79
79
|
|
|
@@ -5,7 +5,6 @@ from __future__ import annotations
|
|
|
5
5
|
from functools import partial
|
|
6
6
|
from uuid import uuid4
|
|
7
7
|
|
|
8
|
-
from dotflow.constants import INITIAL_TASK_ID
|
|
9
8
|
from dotflow.core.config import Config
|
|
10
9
|
from dotflow.core.task import TaskBuilder
|
|
11
10
|
from dotflow.core.workflow import Manager
|
|
@@ -55,16 +54,10 @@ class DotFlow:
|
|
|
55
54
|
|
|
56
55
|
if not self._externally_provided_id:
|
|
57
56
|
self._config.server.create_workflow(workflow=self.workflow_id)
|
|
58
|
-
initial_task_id = INITIAL_TASK_ID
|
|
59
|
-
else:
|
|
60
|
-
initial_task_id = self._config.server.get_next_task_id(
|
|
61
|
-
workflow=self.workflow_id
|
|
62
|
-
)
|
|
63
57
|
|
|
64
58
|
self.task = TaskBuilder(
|
|
65
59
|
config=self._config,
|
|
66
60
|
workflow_id=self.workflow_id,
|
|
67
|
-
initial_task_id=initial_task_id,
|
|
68
61
|
)
|
|
69
62
|
|
|
70
63
|
self.start = partial(
|
|
@@ -15,6 +15,8 @@ from time import sleep
|
|
|
15
15
|
from types import FunctionType
|
|
16
16
|
from uuid import UUID
|
|
17
17
|
|
|
18
|
+
from ulid import ULID
|
|
19
|
+
|
|
18
20
|
try:
|
|
19
21
|
from types import NoneType
|
|
20
22
|
except ImportError:
|
|
@@ -253,7 +255,7 @@ class TaskEngine:
|
|
|
253
255
|
callable_list=callable_list, class_instance=class_instance
|
|
254
256
|
)
|
|
255
257
|
|
|
256
|
-
for
|
|
258
|
+
for new in ordered_list:
|
|
257
259
|
new_object = getattr(class_instance, new[1])
|
|
258
260
|
try:
|
|
259
261
|
subcontext = new_object(
|
|
@@ -261,7 +263,7 @@ class TaskEngine:
|
|
|
261
263
|
previous_context=previous_context,
|
|
262
264
|
task=self.task,
|
|
263
265
|
)
|
|
264
|
-
subcontext.task_id =
|
|
266
|
+
subcontext.task_id = str(ULID())
|
|
265
267
|
new_context.storage.append(subcontext)
|
|
266
268
|
previous_context = subcontext
|
|
267
269
|
|
|
@@ -275,7 +277,7 @@ class TaskEngine:
|
|
|
275
277
|
previous_context=previous_context,
|
|
276
278
|
task=self.task,
|
|
277
279
|
)
|
|
278
|
-
subcontext.task_id =
|
|
280
|
+
subcontext.task_id = str(ULID())
|
|
279
281
|
new_context.storage.append(subcontext)
|
|
280
282
|
previous_context = subcontext
|
|
281
283
|
|
|
@@ -28,7 +28,7 @@ class SerializerTaskError(BaseModel):
|
|
|
28
28
|
class SerializerTask(BaseModel):
|
|
29
29
|
model_config = ConfigDict(title="task")
|
|
30
30
|
|
|
31
|
-
task_id:
|
|
31
|
+
task_id: str = Field(default=None)
|
|
32
32
|
workflow_id: Optional[UUID] = Field(default=None)
|
|
33
33
|
status: str = Field(default=None, alias="_status")
|
|
34
34
|
duration: Optional[float] = Field(default=None, alias="_duration")
|
|
@@ -6,7 +6,8 @@ from datetime import datetime
|
|
|
6
6
|
from typing import Any
|
|
7
7
|
from uuid import UUID
|
|
8
8
|
|
|
9
|
-
from
|
|
9
|
+
from ulid import ULID
|
|
10
|
+
|
|
10
11
|
from dotflow.core.action import Action
|
|
11
12
|
from dotflow.core.config import Config
|
|
12
13
|
from dotflow.core.context import Context
|
|
@@ -57,13 +58,13 @@ class Task(TaskInstance):
|
|
|
57
58
|
`class` dotflow.core.task.Task
|
|
58
59
|
|
|
59
60
|
task = Task(
|
|
60
|
-
task_id=
|
|
61
|
+
task_id="01ARZ3NDEKTSV4RRFFQ69G5FAV",
|
|
61
62
|
step=my_step,
|
|
62
63
|
callback=my_callback
|
|
63
64
|
)
|
|
64
65
|
|
|
65
66
|
Args:
|
|
66
|
-
task_id (
|
|
67
|
+
task_id (str): Task ID (ULID).
|
|
67
68
|
|
|
68
69
|
step (Callable):
|
|
69
70
|
A argument that receives an object of the callable type,
|
|
@@ -86,7 +87,7 @@ class Task(TaskInstance):
|
|
|
86
87
|
|
|
87
88
|
def __init__(
|
|
88
89
|
self,
|
|
89
|
-
task_id:
|
|
90
|
+
task_id: str,
|
|
90
91
|
step: Callable,
|
|
91
92
|
callback: Callable = basic_callback,
|
|
92
93
|
initial_context: Any = None,
|
|
@@ -309,12 +310,10 @@ class TaskBuilder:
|
|
|
309
310
|
self,
|
|
310
311
|
config: Config,
|
|
311
312
|
workflow_id: UUID = None,
|
|
312
|
-
initial_task_id: int = INITIAL_TASK_ID,
|
|
313
313
|
) -> None:
|
|
314
314
|
self.queue: list[Callable] = []
|
|
315
315
|
self.workflow_id = workflow_id
|
|
316
316
|
self.config = config
|
|
317
|
-
self._next_id = initial_task_id
|
|
318
317
|
|
|
319
318
|
def add(
|
|
320
319
|
self,
|
|
@@ -354,8 +353,7 @@ class TaskBuilder:
|
|
|
354
353
|
)
|
|
355
354
|
return self
|
|
356
355
|
|
|
357
|
-
task_id =
|
|
358
|
-
self._next_id += 1
|
|
356
|
+
task_id = str(ULID())
|
|
359
357
|
|
|
360
358
|
self.queue.append(
|
|
361
359
|
Task(
|
|
@@ -5,11 +5,10 @@ from __future__ import annotations
|
|
|
5
5
|
import logging
|
|
6
6
|
from typing import Any
|
|
7
7
|
|
|
8
|
-
from requests import
|
|
8
|
+
from requests import patch, post
|
|
9
9
|
from requests.exceptions import RequestException
|
|
10
10
|
|
|
11
11
|
from dotflow.abc.server import Server
|
|
12
|
-
from dotflow.constants import INITIAL_TASK_ID
|
|
13
12
|
|
|
14
13
|
logger = logging.getLogger(__name__)
|
|
15
14
|
|
|
@@ -87,19 +86,3 @@ class ServerAPI(Server):
|
|
|
87
86
|
),
|
|
88
87
|
json=data,
|
|
89
88
|
)
|
|
90
|
-
|
|
91
|
-
def get_next_task_id(self, workflow: Any) -> int:
|
|
92
|
-
url = f"{self._base_url}/workflows/{workflow}/tasks/next-id"
|
|
93
|
-
try:
|
|
94
|
-
response = get(
|
|
95
|
-
url,
|
|
96
|
-
headers=self._headers,
|
|
97
|
-
timeout=self._timeout,
|
|
98
|
-
)
|
|
99
|
-
logger.info("GET %s [%s]", url, response.status_code)
|
|
100
|
-
if response.status_code == 200:
|
|
101
|
-
return int(response.json().get("next_id", INITIAL_TASK_ID))
|
|
102
|
-
except (RequestException, ValueError, TypeError) as error:
|
|
103
|
-
logger.error("GET %s failed: %s", url, error)
|
|
104
|
-
|
|
105
|
-
return INITIAL_TASK_ID
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "dotflow"
|
|
3
|
-
version = "0.16.0.
|
|
3
|
+
version = "0.16.0.dev2"
|
|
4
4
|
authors = [
|
|
5
5
|
{ name="Fernando Celmer", email="email@fernandocelmer.com" },
|
|
6
6
|
]
|
|
@@ -13,7 +13,8 @@ dependencies = [
|
|
|
13
13
|
"pydantic",
|
|
14
14
|
"typing-extensions",
|
|
15
15
|
"cookiecutter (>=2.0)",
|
|
16
|
-
"requests"
|
|
16
|
+
"requests",
|
|
17
|
+
"python-ulid (>=3.0)"
|
|
17
18
|
]
|
|
18
19
|
keywords = [
|
|
19
20
|
"pipeline",
|
|
@@ -66,7 +67,7 @@ sentry = ["sentry-sdk"]
|
|
|
66
67
|
|
|
67
68
|
[tool.poetry]
|
|
68
69
|
name = "dotflow"
|
|
69
|
-
version = "0.16.0.
|
|
70
|
+
version = "0.16.0.dev2"
|
|
70
71
|
description = "🎲 Dotflow turns an idea into flow! Lightweight Python library for execution pipelines with retry, parallel, cron and async support."
|
|
71
72
|
authors = ["Fernando Celmer <email@fernandocelmer.com>"]
|
|
72
73
|
readme = "README.md"
|
|
@@ -117,6 +118,7 @@ typing-extensions = "^4.14.1"
|
|
|
117
118
|
python-dotenv = "^1.1.0"
|
|
118
119
|
requests = "^2.32.4"
|
|
119
120
|
cookiecutter = "^2.0"
|
|
121
|
+
python-ulid = "^3.0.0"
|
|
120
122
|
|
|
121
123
|
[tool.poetry.group.dev.dependencies]
|
|
122
124
|
build = "^1.2.2.post1"
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|