dotflow 0.16.0.dev3__tar.gz → 1.0.0.dev1__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 (118) hide show
  1. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/PKG-INFO +1 -1
  2. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/__init__.py +1 -1
  3. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/commands/start.py +3 -28
  4. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/module.py +2 -1
  5. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/__init__.py +0 -2
  6. dotflow-1.0.0.dev1/dotflow/providers/server_default.py +116 -0
  7. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/pyproject.toml +2 -2
  8. dotflow-0.16.0.dev3/dotflow/providers/server_api.py +0 -89
  9. dotflow-0.16.0.dev3/dotflow/providers/server_default.py +0 -23
  10. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/LICENSE +0 -0
  11. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/README.md +0 -0
  12. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/abc/__init__.py +0 -0
  13. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/abc/file.py +0 -0
  14. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/abc/flow.py +0 -0
  15. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/abc/http.py +0 -0
  16. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/abc/log.py +0 -0
  17. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/abc/metrics.py +0 -0
  18. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/abc/notify.py +0 -0
  19. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/abc/scheduler.py +0 -0
  20. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/abc/server.py +0 -0
  21. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/abc/storage.py +0 -0
  22. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/abc/tcp.py +0 -0
  23. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/abc/tracer.py +0 -0
  24. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/__init__.py +0 -0
  25. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/command.py +0 -0
  26. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/commands/__init__.py +0 -0
  27. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/commands/cloud.py +0 -0
  28. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/commands/deploy.py +0 -0
  29. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/commands/init.py +0 -0
  30. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/commands/log.py +0 -0
  31. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/commands/schedule.py +0 -0
  32. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/commands/storage.py +0 -0
  33. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/setup.py +0 -0
  34. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/validators/__init__.py +0 -0
  35. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cli/validators/start.py +0 -0
  36. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/__init__.py +0 -0
  37. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/alibaba/__init__.py +0 -0
  38. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/alibaba/constants.py +0 -0
  39. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/alibaba/deployers/__init__.py +0 -0
  40. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/alibaba/deployers/fc.py +0 -0
  41. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/alibaba/deployers/fc_scheduled.py +0 -0
  42. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/alibaba/services/__init__.py +0 -0
  43. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/alibaba/services/cr.py +0 -0
  44. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/__init__.py +0 -0
  45. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/constants.py +0 -0
  46. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/deployers/__init__.py +0 -0
  47. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/deployers/base_lambda.py +0 -0
  48. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/deployers/ecs.py +0 -0
  49. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/deployers/ecs_scheduled.py +0 -0
  50. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/deployers/lambda_.py +0 -0
  51. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/deployers/lambda_api.py +0 -0
  52. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/deployers/lambda_s3.py +0 -0
  53. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/deployers/lambda_sqs.py +0 -0
  54. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/schedule.py +0 -0
  55. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/services/__init__.py +0 -0
  56. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/services/cloudwatch.py +0 -0
  57. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/services/ecr.py +0 -0
  58. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/services/iam.py +0 -0
  59. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/aws/services/s3.py +0 -0
  60. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/core.py +0 -0
  61. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/gcp/__init__.py +0 -0
  62. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/gcp/constants.py +0 -0
  63. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/gcp/deployers/__init__.py +0 -0
  64. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/gcp/deployers/cloudrun.py +0 -0
  65. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/gcp/services/__init__.py +0 -0
  66. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/gcp/services/apis.py +0 -0
  67. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/gcp/services/artifact_registry.py +0 -0
  68. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/gcp/services/gcs.py +0 -0
  69. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/github/__init__.py +0 -0
  70. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/github/constants.py +0 -0
  71. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/github/deployers/__init__.py +0 -0
  72. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/cloud/github/deployers/actions.py +0 -0
  73. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/__init__.py +0 -0
  74. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/action.py +0 -0
  75. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/config.py +0 -0
  76. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/context.py +0 -0
  77. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/decorators/__init__.py +0 -0
  78. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/decorators/time.py +0 -0
  79. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/dotflow.py +0 -0
  80. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/engine.py +0 -0
  81. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/exception.py +0 -0
  82. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/serializers/__init__.py +0 -0
  83. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/serializers/task.py +0 -0
  84. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/serializers/transport.py +0 -0
  85. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/serializers/workflow.py +0 -0
  86. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/task.py +0 -0
  87. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/types/__init__.py +0 -0
  88. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/types/execution.py +0 -0
  89. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/types/overlap.py +0 -0
  90. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/types/status.py +0 -0
  91. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/types/storage.py +0 -0
  92. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/types/workflow.py +0 -0
  93. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/core/workflow.py +0 -0
  94. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/logging.py +0 -0
  95. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/main.py +0 -0
  96. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/log_default.py +0 -0
  97. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/log_opentelemetry.py +0 -0
  98. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/log_sentry.py +0 -0
  99. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/metrics_default.py +0 -0
  100. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/metrics_opentelemetry.py +0 -0
  101. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/notify_default.py +0 -0
  102. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/notify_discord.py +0 -0
  103. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/notify_telegram.py +0 -0
  104. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/scheduler_cron.py +0 -0
  105. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/scheduler_default.py +0 -0
  106. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/storage_default.py +0 -0
  107. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/storage_file.py +0 -0
  108. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/storage_gcs.py +0 -0
  109. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/storage_s3.py +0 -0
  110. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/tracer_default.py +0 -0
  111. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/tracer_opentelemetry.py +0 -0
  112. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/providers/tracer_sentry.py +0 -0
  113. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/settings.py +0 -0
  114. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/types.py +0 -0
  115. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/utils/__init__.py +0 -0
  116. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/utils/basic_functions.py +0 -0
  117. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/dotflow/utils/error_handler.py +0 -0
  118. {dotflow-0.16.0.dev3 → dotflow-1.0.0.dev1}/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.dev3
3
+ Version: 1.0.0.dev1
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
@@ -1,6 +1,6 @@
1
1
  """Dotflow __init__ module."""
2
2
 
3
- __version__ = "0.16.0.dev3"
3
+ __version__ = "1.0.0.dev1"
4
4
  __description__ = "🎲 Dotflow turns an idea into flow!"
5
5
 
6
6
  from .core.action import Action as action
@@ -1,6 +1,5 @@
1
1
  """Command start module"""
2
2
 
3
- import os
4
3
  from os import system
5
4
 
6
5
  from dotflow import Config, DotFlow
@@ -9,8 +8,6 @@ from dotflow.core.exception import InvalidWorkflowFactory, WorkflowFlagConflict
9
8
  from dotflow.core.module import Module
10
9
  from dotflow.core.types.execution import TypeExecution
11
10
  from dotflow.providers import (
12
- ServerAPI,
13
- ServerDefault,
14
11
  StorageDefault,
15
12
  StorageFile,
16
13
  StorageGCS,
@@ -62,32 +59,10 @@ class StartCommand(Command):
62
59
  result.start(mode=self.params.mode)
63
60
 
64
61
  def _new_workflow(self):
65
- config = self._build_config()
66
- workflow_id = os.getenv("WORKFLOW_ID")
67
-
68
- if config is None:
69
- return DotFlow(workflow_id=workflow_id)
70
- return DotFlow(config=config, workflow_id=workflow_id)
71
-
72
- def _build_config(self):
73
62
  storage = self._build_storage()
74
- server = self._build_server()
75
-
76
- if storage is None and server is None:
77
- return None
78
-
79
- return Config(
80
- storage=storage or StorageDefault(),
81
- server=server or ServerDefault(),
82
- )
83
-
84
- def _build_server(self):
85
- base_url = os.getenv("SERVER_BASE_URL")
86
- user_token = os.getenv("SERVER_USER_TOKEN")
87
-
88
- if not base_url or not user_token:
89
- return None
90
- return ServerAPI(base_url=base_url, user_token=user_token)
63
+ if storage is None:
64
+ return DotFlow()
65
+ return DotFlow(config=Config(storage=storage))
91
66
 
92
67
  def _build_storage(self):
93
68
  if not self.params.storage:
@@ -14,7 +14,8 @@ class Module:
14
14
 
15
15
  @classmethod
16
16
  def import_module(cls, value: str):
17
- module_path, _, attr_name = value.rpartition(".")
17
+ separator = ":" if ":" in value else "."
18
+ module_path, _, attr_name = value.rpartition(separator)
18
19
 
19
20
  if not module_path:
20
21
  raise ImportModuleError(module=value)
@@ -6,7 +6,6 @@ from dotflow.providers.notify_default import NotifyDefault
6
6
  from dotflow.providers.notify_discord import NotifyDiscord
7
7
  from dotflow.providers.notify_telegram import NotifyTelegram
8
8
  from dotflow.providers.scheduler_default import SchedulerDefault
9
- from dotflow.providers.server_api import ServerAPI
10
9
  from dotflow.providers.server_default import ServerDefault
11
10
  from dotflow.providers.storage_default import StorageDefault
12
11
  from dotflow.providers.storage_file import StorageFile
@@ -21,7 +20,6 @@ __all__ = [
21
20
  "NotifyTelegram",
22
21
  "SchedulerCron",
23
22
  "SchedulerDefault",
24
- "ServerAPI",
25
23
  "ServerDefault",
26
24
  "StorageDefault",
27
25
  "StorageFile",
@@ -0,0 +1,116 @@
1
+ """ServerDefault — no-op or managed HTTP server provider."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ from functools import wraps
7
+ from typing import Any
8
+
9
+ from requests import patch, post
10
+ from requests.exceptions import RequestException
11
+
12
+ from dotflow.abc.server import Server
13
+ from dotflow.logging import logger
14
+
15
+
16
+ def managed(method):
17
+ @wraps(method)
18
+ def wrapper(self, *args, **kwargs):
19
+ if not self._managed:
20
+ return
21
+ return method(self, *args, **kwargs)
22
+
23
+ return wrapper
24
+
25
+
26
+ class ServerDefault(Server):
27
+ """Default Server provider with auto-detected managed mode.
28
+
29
+ When ``SERVER_BASE_URL`` and ``SERVER_USER_TOKEN`` env vars are set,
30
+ sends workflow and task events to the remote API. Otherwise, all
31
+ methods are no-ops.
32
+ """
33
+
34
+ MAX_RESULT_SIZE = 5_000_000
35
+ TIMEOUT = 15.0
36
+
37
+ ENDPOINT_WORKFLOWS = "/workflows"
38
+ ENDPOINT_WORKFLOW = "/workflows/{workflow_id}"
39
+ ENDPOINT_TASKS = "/workflows/{workflow_id}/tasks"
40
+ ENDPOINT_TASK = "/workflows/{workflow_id}/tasks/{task_id}"
41
+
42
+ def __init__(self) -> None:
43
+ base_url = os.getenv("SERVER_BASE_URL")
44
+ user_token = os.getenv("SERVER_USER_TOKEN")
45
+ self._managed = bool(base_url and user_token)
46
+
47
+ self._base_url = base_url.rstrip("/") if base_url else None
48
+ self._user_token = user_token
49
+
50
+ @property
51
+ def _headers(self) -> dict:
52
+ return {
53
+ "Authorization": f"Bearer {self._user_token}",
54
+ "Content-Type": "application/json",
55
+ }
56
+
57
+ def _post(self, url: str, json: dict) -> None:
58
+ try:
59
+ response = post(
60
+ url,
61
+ json=json,
62
+ headers=self._headers,
63
+ timeout=self.TIMEOUT,
64
+ )
65
+ logger.info("POST %s [%s]", url, response.status_code)
66
+ except RequestException as error:
67
+ logger.error("POST %s failed: %s", url, error)
68
+
69
+ def _patch(self, url: str, json: dict) -> None:
70
+ try:
71
+ response = patch(
72
+ url,
73
+ json=json,
74
+ headers=self._headers,
75
+ timeout=self.TIMEOUT,
76
+ )
77
+ logger.info("PATCH %s [%s]", url, response.status_code)
78
+ except RequestException as error:
79
+ logger.error("PATCH %s failed: %s", url, error)
80
+
81
+ @managed
82
+ def create_workflow(self, workflow: Any) -> None:
83
+ self._post(
84
+ self._base_url + self.ENDPOINT_WORKFLOWS,
85
+ json={"id": str(workflow)},
86
+ )
87
+
88
+ @managed
89
+ def update_workflow(self, workflow: Any, status: str = "") -> None:
90
+ self._patch(
91
+ self._base_url
92
+ + self.ENDPOINT_WORKFLOW.format(workflow_id=workflow),
93
+ json={"status": status},
94
+ )
95
+
96
+ @managed
97
+ def create_task(self, task: Any) -> None:
98
+ data = task.result(max=self.MAX_RESULT_SIZE)
99
+ data["id"] = data.pop("task_id", task.task_id)
100
+ self._post(
101
+ self._base_url
102
+ + self.ENDPOINT_TASKS.format(workflow_id=task.workflow_id),
103
+ json=data,
104
+ )
105
+
106
+ @managed
107
+ def update_task(self, task: Any) -> None:
108
+ data = task.result(max=self.MAX_RESULT_SIZE)
109
+ self._patch(
110
+ self._base_url
111
+ + self.ENDPOINT_TASK.format(
112
+ workflow_id=task.workflow_id,
113
+ task_id=task.task_id,
114
+ ),
115
+ json=data,
116
+ )
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "dotflow"
3
- version = "0.16.0.dev3"
3
+ version = "1.0.0.dev1"
4
4
  authors = [
5
5
  { name="Fernando Celmer", email="email@fernandocelmer.com" },
6
6
  ]
@@ -67,7 +67,7 @@ sentry = ["sentry-sdk"]
67
67
 
68
68
  [tool.poetry]
69
69
  name = "dotflow"
70
- version = "0.16.0.dev3"
70
+ version = "1.0.0.dev1"
71
71
  description = "🎲 Dotflow turns an idea into flow! Lightweight Python library for execution pipelines with retry, parallel, cron and async support."
72
72
  authors = ["Fernando Celmer <email@fernandocelmer.com>"]
73
73
  readme = "README.md"
@@ -1,89 +0,0 @@
1
- """ServerAPI — sends workflow/task events to a remote HTTP endpoint."""
2
-
3
- from __future__ import annotations
4
-
5
- import logging
6
- from typing import Any
7
-
8
- from requests import patch, post
9
- from requests.exceptions import RequestException
10
-
11
- from dotflow.abc.server import Server
12
-
13
- logger = logging.getLogger(__name__)
14
-
15
-
16
- class ServerAPI(Server):
17
- """HTTP implementation of the Server ABC."""
18
-
19
- def __init__(
20
- self,
21
- base_url: str,
22
- user_token: str,
23
- timeout: float = 15.0,
24
- ):
25
- self._base_url = base_url.rstrip("/")
26
- self._user_token = user_token
27
- self._timeout = timeout
28
-
29
- @property
30
- def _headers(self) -> dict:
31
- return {
32
- "Authorization": f"Bearer {self._user_token}",
33
- "Content-Type": "application/json",
34
- }
35
-
36
- def _post(self, url: str, json: dict) -> None:
37
- try:
38
- response = post(
39
- url,
40
- json=json,
41
- headers=self._headers,
42
- timeout=self._timeout,
43
- )
44
- logger.info("POST %s [%s]", url, response.status_code)
45
- except RequestException as error:
46
- logger.error("POST %s failed: %s", url, error)
47
-
48
- def _patch(self, url: str, json: dict) -> None:
49
- try:
50
- response = patch(
51
- url,
52
- json=json,
53
- headers=self._headers,
54
- timeout=self._timeout,
55
- )
56
- logger.info("PATCH %s [%s]", url, response.status_code)
57
- except RequestException as error:
58
- logger.error("PATCH %s failed: %s", url, error)
59
-
60
- def create_workflow(self, workflow: Any) -> None:
61
- self._post(
62
- f"{self._base_url}/workflows",
63
- json={"id": str(workflow)},
64
- )
65
-
66
- def update_workflow(self, workflow: Any, status: str = "") -> None:
67
- self._patch(
68
- f"{self._base_url}/workflows/{workflow}",
69
- json={"status": status},
70
- )
71
-
72
- def create_task(self, task: Any) -> None:
73
- data = task.result(max=5_000_000)
74
- data["id"] = data.pop("task_id", task.task_id)
75
- self._post(
76
- f"{self._base_url}/workflows/{task.workflow_id}/tasks",
77
- json=data,
78
- )
79
-
80
- def update_task(self, task: Any) -> None:
81
- data = task.result(max=5_000_000)
82
- data["id"] = data.pop("task_id", task.task_id)
83
- self._patch(
84
- (
85
- f"{self._base_url}/workflows/{task.workflow_id}"
86
- f"/tasks/{task.task_id}"
87
- ),
88
- json=data,
89
- )
@@ -1,23 +0,0 @@
1
- """ServerDefault — no-op server provider."""
2
-
3
- from __future__ import annotations
4
-
5
- from typing import Any
6
-
7
- from dotflow.abc.server import Server
8
-
9
-
10
- class ServerDefault(Server):
11
- """Default Server implementation (no-op)."""
12
-
13
- def create_workflow(self, workflow: Any) -> None:
14
- pass
15
-
16
- def update_workflow(self, workflow: Any, status: str = "") -> None:
17
- pass
18
-
19
- def create_task(self, task: Any) -> None:
20
- pass
21
-
22
- def update_task(self, task: Any) -> None:
23
- pass
File without changes
File without changes