dotflow 0.10.0.dev1__tar.gz → 0.10.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.10.0.dev1 → dotflow-0.10.0.dev2}/PKG-INFO +3 -1
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/__init__.py +2 -8
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/abc/storage.py +1 -1
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/commands/start.py +2 -2
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/config.py +5 -4
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/context.py +0 -2
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/dotflow.py +1 -1
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/execution.py +1 -1
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/workflow.py +8 -6
- dotflow-0.10.0.dev2/dotflow/providers/__init__.py +6 -0
- dotflow-0.10.0.dev1/dotflow/providers/storage_init.py → dotflow-0.10.0.dev2/dotflow/providers/storage_default.py +2 -2
- dotflow-0.10.0.dev2/dotflow/providers/storage_file.py +66 -0
- dotflow-0.10.0.dev2/dotflow/storage.py +21 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/utils/__init__.py +1 -3
- dotflow-0.10.0.dev2/dotflow/utils/tools.py +48 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/pyproject.toml +11 -2
- dotflow-0.10.0.dev1/dotflow/providers/__init__.py +0 -9
- dotflow-0.10.0.dev1/dotflow/providers/storage_file.py +0 -35
- dotflow-0.10.0.dev1/dotflow/providers/zeromq.py +0 -49
- dotflow-0.10.0.dev1/dotflow/storage.py +0 -28
- dotflow-0.10.0.dev1/dotflow/utils/tools.py +0 -53
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/LICENSE +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/README.md +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/abc/__init__.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/abc/file.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/abc/http.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/abc/tcp.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/__init__.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/command.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/commands/__init__.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/commands/init.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/commands/log.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/setup.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/validators/__init__.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/validators/start.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/__init__.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/action.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/decorators/__init__.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/decorators/time.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/exception.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/module.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/serializers/__init__.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/serializers/task.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/serializers/transport.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/serializers/workflow.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/task.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/types/__init__.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/types/execution.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/types/status.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/types/worflow.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/logging.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/main.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/settings.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/utils/basic_functions.py +0 -0
- {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/utils/error_handler.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: dotflow
|
|
3
|
-
Version: 0.10.0.
|
|
3
|
+
Version: 0.10.0.dev2
|
|
4
4
|
Summary: 🎲 Dotflow turns an idea into flow!
|
|
5
5
|
License: MIT License
|
|
6
6
|
|
|
@@ -34,6 +34,8 @@ Classifier: Programming Language :: Python :: 3.9
|
|
|
34
34
|
Classifier: Programming Language :: Python :: 3.10
|
|
35
35
|
Classifier: Programming Language :: Python :: 3.11
|
|
36
36
|
Classifier: Programming Language :: Python :: 3.12
|
|
37
|
+
Provides-Extra: mongodb
|
|
38
|
+
Requires-Dist: dotflow-mongodb ; extra == "mongodb"
|
|
37
39
|
Requires-Dist: pydantic
|
|
38
40
|
Requires-Dist: rich
|
|
39
41
|
Requires-Dist: typing-extensions
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Dotflow __init__ module."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.10.0.
|
|
3
|
+
__version__ = "0.10.0.dev2"
|
|
4
4
|
__description__ = "🎲 Dotflow turns an idea into flow!"
|
|
5
5
|
|
|
6
6
|
from .core.action import Action as action
|
|
@@ -10,10 +10,4 @@ from .core.dotflow import DotFlow
|
|
|
10
10
|
from .core.task import Task
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
__all__ = [
|
|
14
|
-
"action",
|
|
15
|
-
"Context",
|
|
16
|
-
"Config",
|
|
17
|
-
"DotFlow",
|
|
18
|
-
"Task"
|
|
19
|
-
]
|
|
13
|
+
__all__ = ["action", "Context", "Config", "DotFlow", "Task"]
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
from os import system
|
|
4
4
|
|
|
5
5
|
from dotflow import DotFlow, Config
|
|
6
|
-
from dotflow.providers import
|
|
6
|
+
from dotflow.providers import StorageDefault, StorageFile
|
|
7
7
|
from dotflow.core.types.execution import TypeExecution
|
|
8
8
|
from dotflow.cli.command import Command
|
|
9
9
|
|
|
@@ -14,7 +14,7 @@ class StartCommand(Command):
|
|
|
14
14
|
workflow = DotFlow()
|
|
15
15
|
|
|
16
16
|
if self.params.storage:
|
|
17
|
-
storage = {"default":
|
|
17
|
+
storage = {"default": StorageDefault, "file": StorageFile}
|
|
18
18
|
|
|
19
19
|
config = Config(
|
|
20
20
|
storage=storage.get(self.params.storage)(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Config module"""
|
|
2
2
|
|
|
3
3
|
from dotflow.abc.storage import Storage
|
|
4
|
-
from dotflow.providers.
|
|
4
|
+
from dotflow.providers.storage_default import StorageDefault
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class Config:
|
|
@@ -9,12 +9,13 @@ class Config:
|
|
|
9
9
|
Import:
|
|
10
10
|
You can import the **Config** class with:
|
|
11
11
|
|
|
12
|
-
from dotflow import Config
|
|
12
|
+
from dotflow import Config
|
|
13
|
+
from dotflow.storage import StorageDefault
|
|
13
14
|
|
|
14
15
|
Example:
|
|
15
16
|
`class` dotflow.core.config.Config
|
|
16
17
|
|
|
17
|
-
config = Config(storage=
|
|
18
|
+
config = Config(storage=StorageDefault)
|
|
18
19
|
|
|
19
20
|
Args:
|
|
20
21
|
storage (Storage): Type of the storage.
|
|
@@ -23,5 +24,5 @@ class Config:
|
|
|
23
24
|
storage (Storage):
|
|
24
25
|
"""
|
|
25
26
|
|
|
26
|
-
def __init__(self, storage: Storage =
|
|
27
|
+
def __init__(self, storage: Storage = StorageDefault()) -> None:
|
|
27
28
|
self.storage = storage
|
|
@@ -15,7 +15,6 @@ from dotflow.core.action import Action
|
|
|
15
15
|
from dotflow.core.context import Context
|
|
16
16
|
from dotflow.core.task import Task
|
|
17
17
|
from dotflow.core.types import TaskStatus
|
|
18
|
-
|
|
19
18
|
from dotflow.core.decorators import time
|
|
20
19
|
|
|
21
20
|
|
|
@@ -147,6 +146,7 @@ class Execution:
|
|
|
147
146
|
|
|
148
147
|
except Exception as err:
|
|
149
148
|
self.task.status = TaskStatus.FAILED
|
|
149
|
+
self.task.current_context = None
|
|
150
150
|
self.task.error = err
|
|
151
151
|
|
|
152
152
|
finally:
|
|
@@ -49,10 +49,10 @@ class Workflow:
|
|
|
49
49
|
there is the option to execute in **sequential** mode or **background** mode.
|
|
50
50
|
By default, it is in **sequential** mode.
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
workflow_id (UUID):
|
|
53
53
|
|
|
54
54
|
Attributes:
|
|
55
|
-
|
|
55
|
+
workflow_id (UUID):
|
|
56
56
|
started (datetime):
|
|
57
57
|
tasks (List[Task]):
|
|
58
58
|
success (Callable):
|
|
@@ -66,9 +66,9 @@ class Workflow:
|
|
|
66
66
|
failure: Callable = basic_callback,
|
|
67
67
|
keep_going: bool = False,
|
|
68
68
|
mode: TypeExecution = TypeExecution.SEQUENTIAL,
|
|
69
|
-
|
|
69
|
+
workflow_id: UUID = None
|
|
70
70
|
) -> None:
|
|
71
|
-
self.
|
|
71
|
+
self.workflow_id = workflow_id or uuid4()
|
|
72
72
|
self.started = datetime.now()
|
|
73
73
|
self.tasks = tasks
|
|
74
74
|
self.success = success
|
|
@@ -87,15 +87,16 @@ class Workflow:
|
|
|
87
87
|
self.success(tasks=tasks)
|
|
88
88
|
|
|
89
89
|
def sequential(self, keep_going: bool = False):
|
|
90
|
+
"""Sequential"""
|
|
90
91
|
previous_context = Context(
|
|
91
92
|
task_id=0,
|
|
92
|
-
workflow_id=self.
|
|
93
|
+
workflow_id=self.workflow_id
|
|
93
94
|
)
|
|
94
95
|
|
|
95
96
|
for task in self.tasks:
|
|
96
97
|
Execution(
|
|
97
98
|
task=task,
|
|
98
|
-
workflow_id=self.
|
|
99
|
+
workflow_id=self.workflow_id,
|
|
99
100
|
previous_context=previous_context
|
|
100
101
|
)
|
|
101
102
|
|
|
@@ -111,6 +112,7 @@ class Workflow:
|
|
|
111
112
|
return self.tasks
|
|
112
113
|
|
|
113
114
|
def background(self, keep_going: bool = False):
|
|
115
|
+
"""Background"""
|
|
114
116
|
th = threading.Thread(target=self.sequential, args=[keep_going])
|
|
115
117
|
th.start()
|
|
116
118
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Storage Default"""
|
|
2
2
|
|
|
3
3
|
from typing import Callable
|
|
4
4
|
from ctypes import cast, py_object
|
|
@@ -7,7 +7,7 @@ from dotflow.abc.storage import Storage
|
|
|
7
7
|
from dotflow.core.context import Context
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
class
|
|
10
|
+
class StorageDefault(Storage):
|
|
11
11
|
"""Storage"""
|
|
12
12
|
|
|
13
13
|
def post(self, key: str, context: Context) -> None:
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Storage File"""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Any, Callable
|
|
5
|
+
from json import dumps, loads
|
|
6
|
+
|
|
7
|
+
from dotflow.abc.storage import Storage
|
|
8
|
+
from dotflow.core.context import Context
|
|
9
|
+
from dotflow.utils import read_file, write_file
|
|
10
|
+
from dotflow.settings import Settings as settings
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class StorageFile(Storage):
|
|
14
|
+
"""Storage"""
|
|
15
|
+
|
|
16
|
+
def __init__(self, *args, path: str = settings.START_PATH, **kwargs):
|
|
17
|
+
self.path = Path(path, "tasks")
|
|
18
|
+
self.path.mkdir(parents=True, exist_ok=True)
|
|
19
|
+
|
|
20
|
+
def post(self, key: str, context: Context) -> None:
|
|
21
|
+
task_context = []
|
|
22
|
+
|
|
23
|
+
if Path(self.path, key).exists():
|
|
24
|
+
task_context = read_file(path=Path(self.path, key))
|
|
25
|
+
|
|
26
|
+
if isinstance(context.storage, list):
|
|
27
|
+
for item in context.storage:
|
|
28
|
+
if isinstance(item, Context):
|
|
29
|
+
task_context.append(self._dumps(storage=item.storage))
|
|
30
|
+
|
|
31
|
+
write_file(path=Path(self.path, key), content=task_context, mode="a")
|
|
32
|
+
return None
|
|
33
|
+
|
|
34
|
+
task_context.append(self._dumps(storage=context.storage))
|
|
35
|
+
write_file(path=Path(self.path, key), content=task_context)
|
|
36
|
+
return None
|
|
37
|
+
|
|
38
|
+
def get(self, key: str) -> Context:
|
|
39
|
+
task_context = []
|
|
40
|
+
|
|
41
|
+
if Path(self.path, key).exists():
|
|
42
|
+
task_context = read_file(path=Path(self.path, key))
|
|
43
|
+
|
|
44
|
+
if len(task_context) == 1:
|
|
45
|
+
return self._loads(storage=task_context[0])
|
|
46
|
+
|
|
47
|
+
contexts = Context(storage=[])
|
|
48
|
+
for context in task_context:
|
|
49
|
+
contexts.storage.append(self._loads(storage=context))
|
|
50
|
+
|
|
51
|
+
return contexts
|
|
52
|
+
|
|
53
|
+
def key(self, task: Callable):
|
|
54
|
+
return f"{task.workflow_id}-{task.task_id}.json"
|
|
55
|
+
|
|
56
|
+
def _loads(self, storage: Any) -> Context:
|
|
57
|
+
try:
|
|
58
|
+
return Context(storage=loads(storage))
|
|
59
|
+
except Exception:
|
|
60
|
+
return Context(storage=storage)
|
|
61
|
+
|
|
62
|
+
def _dumps(self, storage: Any) -> str:
|
|
63
|
+
try:
|
|
64
|
+
return dumps(storage)
|
|
65
|
+
except TypeError:
|
|
66
|
+
return str(storage)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""Storage module"""
|
|
2
|
+
|
|
3
|
+
from dotflow.core.exception import ModuleNotFound
|
|
4
|
+
|
|
5
|
+
from .providers.storage_default import StorageDefault
|
|
6
|
+
from .providers.storage_file import StorageFile
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class _MongoDBModuleNotFound:
|
|
10
|
+
|
|
11
|
+
def __init__(self, *args, **kwargs):
|
|
12
|
+
raise ModuleNotFound(module="StorageMongoDB", library="dotflow-mongodb")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
from dotflow_mongodb import StorageMongoDB # type: ignore
|
|
17
|
+
except ModuleNotFoundError:
|
|
18
|
+
StorageMongoDB = _MongoDBModuleNotFound
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
__all__ = ["StorageDefault", "StorageFile", "StorageMongoDB"]
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from dotflow.utils.error_handler import traceback_error, message_error
|
|
4
4
|
from dotflow.utils.basic_functions import basic_function, basic_callback
|
|
5
|
-
from dotflow.utils.tools import
|
|
5
|
+
from dotflow.utils.tools import write_file, read_file
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
__all__ = [
|
|
@@ -10,8 +10,6 @@ __all__ = [
|
|
|
10
10
|
"message_error",
|
|
11
11
|
"basic_function",
|
|
12
12
|
"basic_callback",
|
|
13
|
-
"make_dir",
|
|
14
|
-
"copy_file",
|
|
15
13
|
"write_file",
|
|
16
14
|
"read_file"
|
|
17
15
|
]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""Tools"""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Any
|
|
5
|
+
from json import loads, dumps, JSONDecodeError
|
|
6
|
+
from os import system
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def write_file_system(
|
|
10
|
+
path: str,
|
|
11
|
+
content: str,
|
|
12
|
+
mode: str = "w"
|
|
13
|
+
) -> None:
|
|
14
|
+
"""Write file system"""
|
|
15
|
+
if mode == "a":
|
|
16
|
+
system(f"echo '{content}' >> {path}")
|
|
17
|
+
|
|
18
|
+
if mode == "w":
|
|
19
|
+
system(f"echo '{content}' > {path}")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def write_file(
|
|
23
|
+
path: str,
|
|
24
|
+
content: Any,
|
|
25
|
+
mode: str = "w",
|
|
26
|
+
encoding: str = "utf-8"
|
|
27
|
+
) -> None:
|
|
28
|
+
"""Write file"""
|
|
29
|
+
try:
|
|
30
|
+
with open(file=path, mode=mode, encoding=encoding) as file:
|
|
31
|
+
file.write(dumps(content))
|
|
32
|
+
except TypeError:
|
|
33
|
+
with open(file=path, mode=mode, encoding=encoding) as file:
|
|
34
|
+
file.write(str(content))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def read_file(
|
|
38
|
+
path: Path,
|
|
39
|
+
encoding: str = "utf-8"
|
|
40
|
+
) -> Any | None:
|
|
41
|
+
"""Read file"""
|
|
42
|
+
if path.exists():
|
|
43
|
+
with open(file=path, mode="r", encoding=encoding) as file:
|
|
44
|
+
try:
|
|
45
|
+
return loads(file.read())
|
|
46
|
+
except JSONDecodeError:
|
|
47
|
+
return file.read()
|
|
48
|
+
return None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "dotflow"
|
|
3
|
-
version = "0.10.0.
|
|
3
|
+
version = "0.10.0.dev2"
|
|
4
4
|
authors = [
|
|
5
5
|
{ name="Fernando Celmer", email="email@fernandocelmer.com" },
|
|
6
6
|
]
|
|
@@ -30,9 +30,12 @@ Issues = "https://github.com/dotflow-io/dotflow/issues"
|
|
|
30
30
|
Repository = "https://github.com/dotflow-io/dotflow"
|
|
31
31
|
Documentation = "https://github.com/dotflow-io/dotflow/blob/master/README.md"
|
|
32
32
|
|
|
33
|
+
[project.optional-dependencies]
|
|
34
|
+
mongodb = ["dotflow-mongodb"]
|
|
35
|
+
|
|
33
36
|
[tool.poetry]
|
|
34
37
|
name = "dotflow"
|
|
35
|
-
version = "0.10.0.
|
|
38
|
+
version = "0.10.0.dev2"
|
|
36
39
|
description = "🎲 Dotflow turns an idea into flow!"
|
|
37
40
|
authors = ["Fernando Celmer <email@fernandocelmer.com>"]
|
|
38
41
|
readme = "README.md"
|
|
@@ -77,6 +80,12 @@ mkdocs-simple-blog = "^0.1.0"
|
|
|
77
80
|
mkdocstrings = {extras = ["python"], version = "^0.29.0"}
|
|
78
81
|
griffe-typingdoc = "^0.2.8"
|
|
79
82
|
|
|
83
|
+
|
|
84
|
+
[[tool.poetry.source]]
|
|
85
|
+
name = "test"
|
|
86
|
+
url = "https://test.pypi.org/simple/"
|
|
87
|
+
priority = "supplemental"
|
|
88
|
+
|
|
80
89
|
[build-system]
|
|
81
90
|
requires = ["poetry-core"]
|
|
82
91
|
build-backend = "poetry.core.masonry.api"
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"""Local"""
|
|
2
|
-
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
from typing import Callable
|
|
5
|
-
|
|
6
|
-
from dotflow.abc.storage import Storage
|
|
7
|
-
from dotflow.core.context import Context
|
|
8
|
-
from dotflow.utils import read_file, write_file
|
|
9
|
-
from dotflow.settings import Settings as settings
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class StorageFile(Storage):
|
|
13
|
-
"""Storage"""
|
|
14
|
-
|
|
15
|
-
def __init__(self, path: str = settings.START_PATH, *args, **kwargs):
|
|
16
|
-
self.path = Path(path, "tasks")
|
|
17
|
-
self.path.mkdir(parents=True, exist_ok=True)
|
|
18
|
-
|
|
19
|
-
def post(self, key: str, context: Context) -> None:
|
|
20
|
-
if isinstance(context.storage, list):
|
|
21
|
-
content = ""
|
|
22
|
-
for item in context.storage:
|
|
23
|
-
if isinstance(item, Context):
|
|
24
|
-
content += f"{str(item.storage)}\n"
|
|
25
|
-
|
|
26
|
-
write_file(path=Path(self.path, key), content=content, mode="a")
|
|
27
|
-
return None
|
|
28
|
-
|
|
29
|
-
write_file(path=Path(self.path, key), content=str(context.storage))
|
|
30
|
-
|
|
31
|
-
def get(self, key: str) -> Context:
|
|
32
|
-
return Context(storage=read_file(path=Path(self.path, key)))
|
|
33
|
-
|
|
34
|
-
def key(self, task: Callable):
|
|
35
|
-
return f"{task.workflow_id}-{task.task_id}"
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
# """ZeroMQ module"""
|
|
2
|
-
|
|
3
|
-
# import asyncio
|
|
4
|
-
|
|
5
|
-
# from typing import Callable
|
|
6
|
-
|
|
7
|
-
# from zmq import Context as ContextClient, PUSH, PULL, POLLIN # type: ignore
|
|
8
|
-
# from zmq.asyncio import Context as ContextServer, Poller # type: ignore
|
|
9
|
-
|
|
10
|
-
# from dotflow.abc.tcp import TCPClient, TCPServer
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
# class ZeroMQClient(TCPClient):
|
|
14
|
-
|
|
15
|
-
# def __init__(self, url: str):
|
|
16
|
-
# self.url = url
|
|
17
|
-
# self.context = ContextClient.instance()
|
|
18
|
-
|
|
19
|
-
# def sender(self, content: dict) -> None:
|
|
20
|
-
# push = self.context.socket(PUSH)
|
|
21
|
-
# push.bind(self.url)
|
|
22
|
-
# push.send_json(content)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
# class ZeroMQServer(TCPServer):
|
|
26
|
-
|
|
27
|
-
# def __init__(self, url: str, handler: Callable):
|
|
28
|
-
# self.url = url
|
|
29
|
-
# self.handler = handler
|
|
30
|
-
# self.context = ContextServer.instance()
|
|
31
|
-
|
|
32
|
-
# async def receiver(self) -> None:
|
|
33
|
-
# pull = self.context.socket(PULL)
|
|
34
|
-
# pull.connect(self.url)
|
|
35
|
-
|
|
36
|
-
# poller = Poller()
|
|
37
|
-
# poller.register(pull, POLLIN)
|
|
38
|
-
|
|
39
|
-
# while True:
|
|
40
|
-
# events = await poller.poll()
|
|
41
|
-
|
|
42
|
-
# if pull in dict(events):
|
|
43
|
-
# content = await pull.recv_json()
|
|
44
|
-
# self.handler(content, content=content)
|
|
45
|
-
|
|
46
|
-
# async def run(self) -> None:
|
|
47
|
-
# await asyncio.wait(
|
|
48
|
-
# [asyncio.create_task(self.receiver())]
|
|
49
|
-
# )
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"""Storage module"""
|
|
2
|
-
|
|
3
|
-
from dotflow.core.exception import ModuleNotFound
|
|
4
|
-
|
|
5
|
-
from .providers.storage_file import StorageFile
|
|
6
|
-
from .providers.storage_init import StorageInit
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class _MongoDBModuleNotFound:
|
|
10
|
-
|
|
11
|
-
def __init__(self, *args, **kwargs):
|
|
12
|
-
raise ModuleNotFound(
|
|
13
|
-
module="StorageMongoDB",
|
|
14
|
-
library="dotflow-mongodb"
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
try:
|
|
19
|
-
from dotflow_mongodb import StorageMongoDB
|
|
20
|
-
except ModuleNotFoundError:
|
|
21
|
-
StorageMongoDB = _MongoDBModuleNotFound
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
__all__ = [
|
|
25
|
-
"StorageFile",
|
|
26
|
-
"StorageInit",
|
|
27
|
-
"StorageMongoDB"
|
|
28
|
-
]
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"""Tools"""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
import logging
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
|
|
7
|
-
from os import makedirs, system
|
|
8
|
-
from shutil import copy
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def make_dir(path: str, show_log: bool = False):
|
|
12
|
-
try:
|
|
13
|
-
makedirs(name=path, exist_ok=True)
|
|
14
|
-
except Exception as err:
|
|
15
|
-
if show_log:
|
|
16
|
-
logging.error(err)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
def copy_file(
|
|
20
|
-
source: str,
|
|
21
|
-
destination: str,
|
|
22
|
-
show_log: bool = False
|
|
23
|
-
) -> None:
|
|
24
|
-
try:
|
|
25
|
-
copy(src=source, dst=destination)
|
|
26
|
-
except Exception as err:
|
|
27
|
-
if show_log:
|
|
28
|
-
logging.error(err)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def write_file(
|
|
32
|
-
path: str,
|
|
33
|
-
content: str,
|
|
34
|
-
mode: str = "w"
|
|
35
|
-
) -> None:
|
|
36
|
-
if isinstance(content, dict) or isinstance(content, list):
|
|
37
|
-
content = json.dumps(content)
|
|
38
|
-
|
|
39
|
-
try:
|
|
40
|
-
with open(file=path, mode=mode, encoding="utf-8") as file:
|
|
41
|
-
file.write(content)
|
|
42
|
-
except Exception:
|
|
43
|
-
if mode == "a":
|
|
44
|
-
system(f"echo '{content}' >> {path}")
|
|
45
|
-
|
|
46
|
-
if mode == "w":
|
|
47
|
-
system(f"echo '{content}' > {path}")
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def read_file(path: Path) -> str:
|
|
51
|
-
if path.exists():
|
|
52
|
-
with open(file=path, mode="r") as file:
|
|
53
|
-
return file.read()
|
|
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
|