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.
Files changed (55) hide show
  1. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/PKG-INFO +3 -1
  2. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/__init__.py +2 -8
  3. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/abc/storage.py +1 -1
  4. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/commands/start.py +2 -2
  5. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/config.py +5 -4
  6. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/context.py +0 -2
  7. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/dotflow.py +1 -1
  8. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/execution.py +1 -1
  9. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/workflow.py +8 -6
  10. dotflow-0.10.0.dev2/dotflow/providers/__init__.py +6 -0
  11. dotflow-0.10.0.dev1/dotflow/providers/storage_init.py → dotflow-0.10.0.dev2/dotflow/providers/storage_default.py +2 -2
  12. dotflow-0.10.0.dev2/dotflow/providers/storage_file.py +66 -0
  13. dotflow-0.10.0.dev2/dotflow/storage.py +21 -0
  14. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/utils/__init__.py +1 -3
  15. dotflow-0.10.0.dev2/dotflow/utils/tools.py +48 -0
  16. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/pyproject.toml +11 -2
  17. dotflow-0.10.0.dev1/dotflow/providers/__init__.py +0 -9
  18. dotflow-0.10.0.dev1/dotflow/providers/storage_file.py +0 -35
  19. dotflow-0.10.0.dev1/dotflow/providers/zeromq.py +0 -49
  20. dotflow-0.10.0.dev1/dotflow/storage.py +0 -28
  21. dotflow-0.10.0.dev1/dotflow/utils/tools.py +0 -53
  22. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/LICENSE +0 -0
  23. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/README.md +0 -0
  24. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/abc/__init__.py +0 -0
  25. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/abc/file.py +0 -0
  26. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/abc/http.py +0 -0
  27. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/abc/tcp.py +0 -0
  28. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/__init__.py +0 -0
  29. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/command.py +0 -0
  30. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/commands/__init__.py +0 -0
  31. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/commands/init.py +0 -0
  32. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/commands/log.py +0 -0
  33. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/setup.py +0 -0
  34. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/validators/__init__.py +0 -0
  35. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/cli/validators/start.py +0 -0
  36. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/__init__.py +0 -0
  37. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/action.py +0 -0
  38. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/decorators/__init__.py +0 -0
  39. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/decorators/time.py +0 -0
  40. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/exception.py +0 -0
  41. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/module.py +0 -0
  42. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/serializers/__init__.py +0 -0
  43. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/serializers/task.py +0 -0
  44. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/serializers/transport.py +0 -0
  45. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/serializers/workflow.py +0 -0
  46. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/task.py +0 -0
  47. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/types/__init__.py +0 -0
  48. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/types/execution.py +0 -0
  49. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/types/status.py +0 -0
  50. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/core/types/worflow.py +0 -0
  51. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/logging.py +0 -0
  52. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/main.py +0 -0
  53. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/settings.py +0 -0
  54. {dotflow-0.10.0.dev1 → dotflow-0.10.0.dev2}/dotflow/utils/basic_functions.py +0 -0
  55. {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.dev1
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.dev1"
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"]
@@ -10,7 +10,7 @@ class Storage(ABC):
10
10
  """Storage"""
11
11
 
12
12
  def __init__(self, *args, **kwargs):
13
- super().__init__()
13
+ pass
14
14
 
15
15
  @abstractmethod
16
16
  def post(self, key: str, context: Context) -> None:
@@ -3,7 +3,7 @@
3
3
  from os import system
4
4
 
5
5
  from dotflow import DotFlow, Config
6
- from dotflow.providers import StorageInit, StorageFile
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": StorageInit, "file": StorageFile}
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.storage_init import StorageInit
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, StorageInit
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=StorageInit)
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 = StorageInit()) -> None:
27
+ def __init__(self, storage: Storage = StorageDefault()) -> None:
27
28
  self.storage = storage
@@ -19,8 +19,6 @@ class ContextInstance:
19
19
  self._task_id = None
20
20
  self._workflow_id = None
21
21
  self._storage = None
22
- self._current_key = None
23
- self._previous_key = None
24
22
 
25
23
 
26
24
  class Context(ContextInstance):
@@ -50,7 +50,7 @@ class DotFlow:
50
50
  self.start = partial(
51
51
  Workflow,
52
52
  tasks=self.task.queu,
53
- id=self.workflow_id
53
+ workflow_id=self.workflow_id
54
54
  )
55
55
 
56
56
  def result_task(self):
@@ -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
- id (UUID):
52
+ workflow_id (UUID):
53
53
 
54
54
  Attributes:
55
- id (UUID)
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
- id: UUID = uuid4()
69
+ workflow_id: UUID = None
70
70
  ) -> None:
71
- self.id = id
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.id
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.id,
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
 
@@ -0,0 +1,6 @@
1
+ """Providers __init__ module."""
2
+
3
+ from dotflow.providers.storage_default import StorageDefault
4
+ from dotflow.providers.storage_file import StorageFile
5
+
6
+ __all__ = ["StorageDefault", "StorageFile"]
@@ -1,4 +1,4 @@
1
- """Init"""
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 StorageInit(Storage):
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 make_dir, copy_file, write_file, read_file
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.dev1"
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.dev1"
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,9 +0,0 @@
1
- """Providers __init__ module."""
2
-
3
- from dotflow.providers.storage_file import StorageFile
4
- from dotflow.providers.storage_init import StorageInit
5
-
6
- __all__ = [
7
- "StorageFile",
8
- "StorageInit"
9
- ]
@@ -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