dotflow 0.15.0.dev5__tar.gz → 0.15.0.dev7__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.15.0.dev5 → dotflow-0.15.0.dev7}/PKG-INFO +1 -1
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/__init__.py +1 -1
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/schedule.py +14 -1
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/serializers/task.py +23 -7
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/pyproject.toml +5 -2
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/LICENSE +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/README.md +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/abc/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/abc/file.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/abc/flow.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/abc/http.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/abc/log.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/abc/metrics.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/abc/notify.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/abc/scheduler.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/abc/server.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/abc/storage.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/abc/tcp.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/abc/tracer.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/command.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/commands/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/commands/cloud.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/commands/deploy.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/commands/init.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/commands/log.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/commands/schedule.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/commands/start.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/commands/storage.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/setup.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/validators/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cli/validators/start.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/alibaba/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/alibaba/constants.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/alibaba/deployers/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/alibaba/deployers/fc.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/alibaba/deployers/fc_scheduled.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/alibaba/services/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/alibaba/services/cr.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/constants.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/deployers/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/deployers/base_lambda.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/deployers/ecs.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/deployers/ecs_scheduled.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/deployers/lambda_.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/deployers/lambda_api.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/deployers/lambda_s3.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/deployers/lambda_sqs.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/services/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/services/cloudwatch.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/services/ecr.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/services/iam.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/aws/services/s3.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/core.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/gcp/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/gcp/constants.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/gcp/deployers/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/gcp/deployers/cloudrun.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/gcp/services/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/gcp/services/apis.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/gcp/services/artifact_registry.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/gcp/services/gcs.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/github/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/github/constants.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/github/deployers/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/cloud/github/deployers/actions.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/action.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/config.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/context.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/decorators/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/decorators/time.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/dotflow.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/engine.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/exception.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/module.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/serializers/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/serializers/transport.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/serializers/workflow.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/task.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/types/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/types/execution.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/types/overlap.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/types/status.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/types/storage.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/types/workflow.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/core/workflow.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/logging.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/main.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/log_default.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/log_opentelemetry.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/log_sentry.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/metrics_default.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/metrics_opentelemetry.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/notify_default.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/notify_discord.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/notify_telegram.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/scheduler_cron.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/scheduler_default.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/server_default.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/storage_default.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/storage_file.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/storage_gcs.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/storage_s3.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/tracer_default.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/tracer_opentelemetry.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/providers/tracer_sentry.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/settings.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/types.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/utils/__init__.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/utils/basic_functions.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/utils/error_handler.py +0 -0
- {dotflow-0.15.0.dev5 → dotflow-0.15.0.dev7}/dotflow/utils/tools.py +0 -0
|
@@ -58,9 +58,22 @@ def _crontab_to_aws(expression: str) -> str:
|
|
|
58
58
|
|
|
59
59
|
minute, hour, dom, month, dow = parts
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
minute = _fix_step(minute)
|
|
62
|
+
hour = _fix_step(hour)
|
|
63
|
+
dom = _fix_step(dom)
|
|
64
|
+
month = _fix_step(month)
|
|
65
|
+
dow = _fix_step(dow)
|
|
66
|
+
|
|
67
|
+
if dow != "*" and dow != "?" and dom == "*":
|
|
62
68
|
dom = "?"
|
|
63
69
|
else:
|
|
64
70
|
dow = "?"
|
|
65
71
|
|
|
66
72
|
return f"cron({minute} {hour} {dom} {month} {dow} *)"
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _fix_step(field: str) -> str:
|
|
76
|
+
"""Convert */N to 0/N for AWS EventBridge compatibility."""
|
|
77
|
+
if field.startswith("*/"):
|
|
78
|
+
return "0/" + field[2:]
|
|
79
|
+
return field
|
|
@@ -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)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "dotflow"
|
|
3
|
-
version = "0.15.0.
|
|
3
|
+
version = "0.15.0.dev7"
|
|
4
4
|
authors = [
|
|
5
5
|
{ name="Fernando Celmer", email="email@fernandocelmer.com" },
|
|
6
6
|
]
|
|
@@ -66,7 +66,7 @@ sentry = ["sentry-sdk"]
|
|
|
66
66
|
|
|
67
67
|
[tool.poetry]
|
|
68
68
|
name = "dotflow"
|
|
69
|
-
version = "0.15.0.
|
|
69
|
+
version = "0.15.0.dev7"
|
|
70
70
|
description = "🎲 Dotflow turns an idea into flow! Lightweight Python library for execution pipelines with retry, parallel, cron and async support."
|
|
71
71
|
authors = ["Fernando Celmer <email@fernandocelmer.com>"]
|
|
72
72
|
readme = "README.md"
|
|
@@ -153,6 +153,9 @@ name = "test"
|
|
|
153
153
|
url = "https://test.pypi.org/simple/"
|
|
154
154
|
priority = "supplemental"
|
|
155
155
|
|
|
156
|
+
[tool.pytest.ini_options]
|
|
157
|
+
testpaths = ["tests"]
|
|
158
|
+
|
|
156
159
|
[build-system]
|
|
157
160
|
requires = ["poetry-core"]
|
|
158
161
|
build-backend = "poetry.core.masonry.api"
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|