dotflow 0.15.0.dev3__tar.gz → 0.15.0.dev4__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 (124) hide show
  1. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/PKG-INFO +77 -22
  2. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/README.md +73 -21
  3. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/__init__.py +1 -1
  4. dotflow-0.15.0.dev4/dotflow/abc/server.py +30 -0
  5. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/cloud.py +1 -0
  6. dotflow-0.15.0.dev4/dotflow/cli/commands/deploy.py +171 -0
  7. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/log.py +2 -1
  8. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/setup.py +5 -2
  9. dotflow-0.15.0.dev4/dotflow/cloud/alibaba/__init__.py +11 -0
  10. dotflow-0.15.0.dev4/dotflow/cloud/alibaba/constants.py +22 -0
  11. dotflow-0.15.0.dev4/dotflow/cloud/alibaba/deployers/__init__.py +13 -0
  12. dotflow-0.15.0.dev4/dotflow/cloud/alibaba/deployers/fc.py +134 -0
  13. dotflow-0.15.0.dev4/dotflow/cloud/alibaba/deployers/fc_scheduled.py +78 -0
  14. dotflow-0.15.0.dev4/dotflow/cloud/alibaba/services/__init__.py +1 -0
  15. dotflow-0.15.0.dev4/dotflow/cloud/alibaba/services/cr.py +99 -0
  16. dotflow-0.15.0.dev4/dotflow/cloud/aws/__init__.py +19 -0
  17. dotflow-0.15.0.dev4/dotflow/cloud/aws/constants.py +23 -0
  18. dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/__init__.py +19 -0
  19. dotflow-0.15.0.dev3/dotflow/cloud/aws/base_lambda_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/base_lambda.py +6 -9
  20. dotflow-0.15.0.dev3/dotflow/cloud/aws/ecs_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/ecs.py +11 -3
  21. dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/ecs_scheduled.py +154 -0
  22. dotflow-0.15.0.dev3/dotflow/cloud/aws/lambda_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/lambda_.py +9 -3
  23. dotflow-0.15.0.dev3/dotflow/cloud/aws/lambda_api_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/lambda_api.py +6 -3
  24. dotflow-0.15.0.dev3/dotflow/cloud/aws/lambda_s3_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/lambda_s3.py +10 -4
  25. dotflow-0.15.0.dev3/dotflow/cloud/aws/lambda_sqs_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/lambda_sqs.py +19 -4
  26. dotflow-0.15.0.dev4/dotflow/cloud/aws/schedule.py +66 -0
  27. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/aws/services/cloudwatch.py +4 -1
  28. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/aws/services/ecr.py +8 -5
  29. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/aws/services/iam.py +4 -1
  30. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/core.py +8 -2
  31. dotflow-0.15.0.dev4/dotflow/cloud/gcp/__init__.py +5 -0
  32. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/gcp/constants.py +9 -0
  33. dotflow-0.15.0.dev4/dotflow/cloud/gcp/deployers/__init__.py +5 -0
  34. dotflow-0.15.0.dev3/dotflow/cloud/gcp/cloudrun_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/gcp/deployers/cloudrun.py +12 -10
  35. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/gcp/services/apis.py +8 -2
  36. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/gcp/services/artifact_registry.py +16 -5
  37. dotflow-0.15.0.dev4/dotflow/cloud/github/__init__.py +5 -0
  38. dotflow-0.15.0.dev4/dotflow/cloud/github/deployers/__init__.py +5 -0
  39. dotflow-0.15.0.dev3/dotflow/cloud/github/actions_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/github/deployers/actions.py +10 -15
  40. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/config.py +5 -5
  41. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/dotflow.py +1 -1
  42. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/engine.py +5 -2
  43. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/serializers/task.py +52 -34
  44. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/serializers/transport.py +2 -2
  45. dotflow-0.15.0.dev4/dotflow/core/serializers/workflow.py +14 -0
  46. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/task.py +10 -2
  47. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/types/workflow.py +1 -0
  48. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/workflow.py +23 -5
  49. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/__init__.py +2 -0
  50. dotflow-0.15.0.dev4/dotflow/providers/server_default.py +112 -0
  51. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/settings.py +2 -0
  52. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/pyproject.toml +3 -2
  53. dotflow-0.15.0.dev3/dotflow/abc/api.py +0 -24
  54. dotflow-0.15.0.dev3/dotflow/cli/commands/deploy.py +0 -110
  55. dotflow-0.15.0.dev3/dotflow/cloud/aws/__init__.py +0 -15
  56. dotflow-0.15.0.dev3/dotflow/cloud/aws/constants.py +0 -9
  57. dotflow-0.15.0.dev3/dotflow/cloud/gcp/__init__.py +0 -5
  58. dotflow-0.15.0.dev3/dotflow/cloud/github/__init__.py +0 -5
  59. dotflow-0.15.0.dev3/dotflow/core/serializers/workflow.py +0 -23
  60. dotflow-0.15.0.dev3/dotflow/providers/api_default.py +0 -158
  61. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/LICENSE +0 -0
  62. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/__init__.py +0 -0
  63. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/file.py +0 -0
  64. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/flow.py +0 -0
  65. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/http.py +0 -0
  66. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/log.py +0 -0
  67. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/metrics.py +0 -0
  68. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/notify.py +0 -0
  69. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/scheduler.py +0 -0
  70. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/storage.py +0 -0
  71. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/tcp.py +0 -0
  72. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/tracer.py +0 -0
  73. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/__init__.py +0 -0
  74. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/command.py +0 -0
  75. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/__init__.py +0 -0
  76. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/init.py +0 -0
  77. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/schedule.py +0 -0
  78. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/start.py +0 -0
  79. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/storage.py +0 -0
  80. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/validators/__init__.py +0 -0
  81. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/validators/start.py +0 -0
  82. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/__init__.py +0 -0
  83. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/aws/services/__init__.py +0 -0
  84. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/aws/services/s3.py +0 -0
  85. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/gcp/services/__init__.py +0 -0
  86. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/gcp/services/gcs.py +0 -0
  87. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/github/constants.py +0 -0
  88. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/__init__.py +0 -0
  89. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/action.py +0 -0
  90. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/context.py +0 -0
  91. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/decorators/__init__.py +0 -0
  92. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/decorators/time.py +0 -0
  93. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/exception.py +0 -0
  94. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/module.py +0 -0
  95. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/serializers/__init__.py +0 -0
  96. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/types/__init__.py +0 -0
  97. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/types/execution.py +0 -0
  98. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/types/overlap.py +0 -0
  99. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/types/status.py +0 -0
  100. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/types/storage.py +0 -0
  101. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/logging.py +0 -0
  102. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/main.py +0 -0
  103. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/log_default.py +0 -0
  104. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/log_opentelemetry.py +0 -0
  105. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/log_sentry.py +0 -0
  106. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/metrics_default.py +0 -0
  107. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/metrics_opentelemetry.py +0 -0
  108. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/notify_default.py +0 -0
  109. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/notify_discord.py +0 -0
  110. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/notify_telegram.py +0 -0
  111. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/scheduler_cron.py +0 -0
  112. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/scheduler_default.py +0 -0
  113. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/storage_default.py +0 -0
  114. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/storage_file.py +0 -0
  115. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/storage_gcs.py +0 -0
  116. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/storage_s3.py +0 -0
  117. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/tracer_default.py +0 -0
  118. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/tracer_opentelemetry.py +0 -0
  119. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/tracer_sentry.py +0 -0
  120. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/types.py +0 -0
  121. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/utils/__init__.py +0 -0
  122. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/utils/basic_functions.py +0 -0
  123. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/utils/error_handler.py +0 -0
  124. {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/utils/tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dotflow
3
- Version: 0.15.0.dev3
3
+ Version: 0.15.0.dev4
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: MIT License
6
6
 
@@ -42,6 +42,7 @@ Classifier: Programming Language :: Python :: 3.11
42
42
  Classifier: Programming Language :: Python :: 3.12
43
43
  Classifier: Programming Language :: Python :: 3.13
44
44
  Provides-Extra: aws
45
+ Provides-Extra: deploy-alibaba
45
46
  Provides-Extra: deploy-aws
46
47
  Provides-Extra: deploy-gcp
47
48
  Provides-Extra: deploy-github
@@ -51,6 +52,8 @@ Provides-Extra: scheduler
51
52
  Provides-Extra: sentry
52
53
  Requires-Dist: GitPython ; extra == "deploy-github"
53
54
  Requires-Dist: PyGithub ; extra == "deploy-github"
55
+ Requires-Dist: alibabacloud-fc-open20210406 ; extra == "deploy-alibaba"
56
+ Requires-Dist: alibabacloud-tea-openapi ; extra == "deploy-alibaba"
54
57
  Requires-Dist: boto3 ; extra == "aws"
55
58
  Requires-Dist: boto3 ; extra == "deploy-aws"
56
59
  Requires-Dist: cookiecutter (>=2.0)
@@ -78,9 +81,9 @@ Description-Content-Type: text/markdown
78
81
 
79
82
  <div align="center">
80
83
 
81
- ![](docs/assets/dotflow.png)
84
+ ![](https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/dotflow.png)
82
85
 
83
- **Build production-ready data pipelines in minutes, not days.**
86
+ **import dotflow. @action. deploy. Done.**
84
87
 
85
88
  [![PyPI](https://img.shields.io/pypi/v/dotflow?style=flat-square)](https://pypi.org/project/dotflow/)
86
89
  [![Python](https://img.shields.io/pypi/pyversions/dotflow?style=flat-square)](https://pypi.org/project/dotflow/)
@@ -103,7 +106,7 @@ Dotflow is a lightweight Python library for execution pipelines. Define tasks wi
103
106
  - **Resilient** — Retry, backoff, timeout, checkpoints, and error handling out of the box.
104
107
  - **Observable** — OpenTelemetry traces, metrics, and logs. Sentry error tracking.
105
108
  - **Deployable** — `dotflow deploy --platform lambda` ships your pipeline to AWS in one command.
106
- - **Portable** — Same code runs on Lambda, ECS, Cloud Run, Kubernetes, Docker, or GitHub Actions.
109
+ - **Portable** — Same code runs on Lambda, ECS, Cloud Run, Alibaba FC, Kubernetes, Docker, or GitHub Actions.
107
110
 
108
111
  ## Install
109
112
 
@@ -150,16 +153,20 @@ dotflow deploy --platform lambda --project my_pipeline
150
153
 
151
154
  | Platform | Deploy method |
152
155
  |----------|---------------|
153
- | <img src="https://cdn.simpleicons.org/docker" width="16" /> **Docker** | `docker compose up` |
154
- | <img src="https://www.vectorlogo.zone/logos/amazon_awslambda/amazon_awslambda-icon.svg" width="16" /> **AWS Lambda** | `dotflow deploy` |
155
- | <img src="https://www.vectorlogo.zone/logos/amazon_awslambda/amazon_awslambda-icon.svg" width="16" /> **AWS Lambda + EventBridge** | `dotflow deploy --schedule` |
156
- | <img src="https://www.vectorlogo.zone/logos/amazon_awslambda/amazon_awslambda-icon.svg" width="16" /> **AWS Lambda + S3 Trigger** | `dotflow deploy` |
157
- | <img src="https://www.vectorlogo.zone/logos/amazon_awslambda/amazon_awslambda-icon.svg" width="16" /> **AWS Lambda + SQS Trigger** | `dotflow deploy` |
158
- | <img src="https://www.vectorlogo.zone/logos/amazon_awslambda/amazon_awslambda-icon.svg" width="16" /> **AWS Lambda + API Gateway** | `dotflow deploy` |
159
- | <img src="https://www.vectorlogo.zone/logos/amazon_ecs/amazon_ecs-icon.svg" width="16" /> **AWS ECS Fargate** | `dotflow deploy` |
160
- | <img src="https://cdn.simpleicons.org/googlecloud" width="16" /> **Google Cloud Run** | `gcloud run deploy` |
161
- | <img src="https://cdn.simpleicons.org/kubernetes" width="16" /> **Kubernetes** | `kubectl apply` |
162
- | <img src="https://cdn.simpleicons.org/githubactions" width="16" /> **GitHub Actions** | `dotflow deploy` |
156
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-docker.svg" width="16" /> **Docker** | `docker compose up` |
157
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> **AWS Lambda** | `dotflow deploy` |
158
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-eventbridge.svg" width="16" /> **AWS Lambda + EventBridge** | `dotflow deploy --schedule` |
159
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-s3.svg" width="16" /> **AWS Lambda + S3 Trigger** | `dotflow deploy` |
160
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-sqs.svg" width="16" /> **AWS Lambda + SQS Trigger** | `dotflow deploy` |
161
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-api-gateway.svg" width="16" /> **AWS Lambda + API Gateway** | `dotflow deploy` |
162
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-ecs.svg" width="16" /> **AWS ECS Fargate** | `dotflow deploy` |
163
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-ecs.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-eventbridge.svg" width="16" /> **AWS ECS + EventBridge** | `dotflow deploy --schedule` |
164
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-google-cloud.svg" width="16" /> **Google Cloud Run** | `dotflow deploy` |
165
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-google-cloud.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-google-cloud-scheduler.svg" width="16" /> **Cloud Run + Scheduler** | `dotflow deploy --schedule` |
166
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-kubernetes.svg" width="16" /> **Kubernetes** | `kubectl apply` |
167
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-alibaba-cloud.svg" width="16" /> **Alibaba Cloud FC** | `dotflow deploy` |
168
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-alibaba-cloud.svg" width="16" /> **Alibaba Cloud FC + Timer** | `dotflow deploy --schedule` |
169
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-github-actions.svg" width="16" /> **GitHub Actions** | `dotflow deploy` |
163
170
 
164
171
  > [See all 34+ platforms →](https://dotflow-io.github.io/dotflow/nav/cloud/)
165
172
 
@@ -171,9 +178,10 @@ pip install dotflow[gcp] # Google Cloud Storage
171
178
  pip install dotflow[scheduler] # Cron scheduler
172
179
  pip install dotflow[otel] # OpenTelemetry
173
180
  pip install dotflow[sentry] # Sentry error tracking
174
- pip install dotflow[deploy-aws] # AWS deploy (Lambda, ECS)
175
- pip install dotflow[deploy-gcp] # GCP deploy (Cloud Run)
176
- pip install dotflow[deploy-github] # GitHub Actions deploy
181
+ pip install dotflow[deploy-aws] # AWS deploy (Lambda, ECS)
182
+ pip install dotflow[deploy-gcp] # GCP deploy (Cloud Run)
183
+ pip install dotflow[deploy-alibaba] # Alibaba Cloud deploy (FC)
184
+ pip install dotflow[deploy-github] # GitHub Actions deploy
177
185
  ```
178
186
 
179
187
  > **[Read the full documentation →](https://dotflow-io.github.io/dotflow/)**
@@ -184,8 +192,8 @@ pip install dotflow[deploy-github] # GitHub Actions deploy
184
192
  |---------|-------------|
185
193
  | [Concepts](https://dotflow-io.github.io/dotflow/nav/concepts/concept-workflow-and-tasks/) | Workflows, tasks, context, providers, process modes |
186
194
  | [How-to Guides](https://dotflow-io.github.io/dotflow/nav/how-to/) | Step-by-step tutorials for workflows, tasks, and CLI |
187
- | [Cloud Deployment](https://dotflow-io.github.io/dotflow/nav/cloud/) | Deploy to AWS, GCP, Kubernetes, Docker, GitHub Actions |
188
- | [Integrations](https://dotflow-io.github.io/dotflow/nav/integrations/) | OpenTelemetry, Sentry, Telegram, Discord, S3, GCS |
195
+ | [Cloud Deployment](https://dotflow-io.github.io/dotflow/nav/cloud/) | Deploy to AWS, GCP, Alibaba, Kubernetes, Docker, GitHub Actions |
196
+ | [Integrations](https://dotflow-io.github.io/dotflow/nav/integrations/) | OpenTelemetry, Sentry, Telegram, Discord, S3, GCS, Server |
189
197
  | [Examples](https://dotflow-io.github.io/dotflow/nav/examples/) | Real-world pipelines: ETL, health checks, async, scheduler |
190
198
  | [Reference](https://dotflow-io.github.io/dotflow/nav/reference/dotflow/) | API reference for all classes and providers |
191
199
  | [Custom Providers](https://dotflow-io.github.io/dotflow/nav/development/custom-providers/) | Build your own storage, notify, log, tracer, or metrics provider |
@@ -723,20 +731,64 @@ Available CLI commands:
723
731
 
724
732
  </details>
725
733
 
734
+ <details>
735
+ <summary><strong>Server Provider</strong></summary>
736
+
737
+ > [Server docs](https://dotflow-io.github.io/dotflow/nav/tutorial/server-default/)
738
+
739
+ Send workflow and task execution data to a remote API (e.g. dotflow-api) in real time.
740
+
741
+ ```python
742
+ from dotflow import DotFlow, Config, action
743
+ from dotflow.providers import ServerDefault
744
+
745
+ @action
746
+ def my_task():
747
+ return {"result": "ok"}
748
+
749
+ config = Config(
750
+ server=ServerDefault(
751
+ base_url="http://localhost:8000/api/v1",
752
+ user_token="your-api-token",
753
+ )
754
+ )
755
+
756
+ workflow = DotFlow(config=config)
757
+ workflow.task.add(step=my_task)
758
+ workflow.start()
759
+ ```
760
+
761
+ | Parameter | Type | Default | Description |
762
+ |-----------|------|---------|-------------|
763
+ | `base_url` | `str` | `""` | API base URL |
764
+ | `user_token` | `str` | `""` | API token (`X-User-Token` header) |
765
+ | `timeout` | `float` | `5.0` | HTTP request timeout in seconds |
766
+
767
+ The server provider automatically:
768
+ - Creates the workflow on `DotFlow()` init
769
+ - Creates each task on `task.add()`
770
+ - Updates task status on each transition (In progress, Completed, Failed, Retry)
771
+ - Updates workflow status on completion (In progress → Completed)
772
+
773
+ ---
774
+
775
+ </details>
776
+
726
777
  <details>
727
778
  <summary><strong>Dependency Injection via Config</strong></summary>
728
779
 
729
- The `Config` class lets you swap providers for storage, notifications, logging, and scheduling:
780
+ The `Config` class lets you swap providers for storage, notifications, logging, scheduling, and server:
730
781
 
731
782
  ```python
732
783
  from dotflow import DotFlow, Config
733
- from dotflow.providers import StorageFile, NotifyTelegram, LogDefault, SchedulerCron
784
+ from dotflow.providers import StorageFile, NotifyTelegram, LogDefault, SchedulerCron, ServerDefault
734
785
 
735
786
  config = Config(
736
787
  storage=StorageFile(path=".output"),
737
788
  notify=NotifyTelegram(token="...", chat_id=123),
738
789
  log=LogDefault(),
739
790
  scheduler=SchedulerCron(cron="0 * * * *"),
791
+ server=ServerDefault(base_url="...", user_token="..."),
740
792
  )
741
793
 
742
794
  workflow = DotFlow(config=config)
@@ -748,8 +800,11 @@ Extend Dotflow by implementing the abstract base classes:
748
800
  |-----|---------|---------|
749
801
  | `Storage` | `post`, `get`, `key` | Custom storage backends |
750
802
  | `Notify` | `hook_status_task` | Custom notification channels |
751
- | `Log` | `info`, `error` | Custom logging |
803
+ | `Log` | `info`, `error`, `warning`, `debug` | Custom logging |
752
804
  | `Scheduler` | `start`, `stop` | Custom scheduling strategies |
805
+ | `Tracer` | `start_workflow`, `end_workflow`, `start_task`, `end_task` | Distributed tracing |
806
+ | `Metrics` | `workflow_started`, `workflow_completed`, `workflow_failed`, `task_completed`, `task_failed`, `task_retried` | Counters and histograms |
807
+ | `Server` | `create_workflow`, `update_workflow`, `create_task`, `update_task` | Remote API communication |
753
808
 
754
809
  ---
755
810
 
@@ -1,8 +1,8 @@
1
1
  <div align="center">
2
2
 
3
- ![](docs/assets/dotflow.png)
3
+ ![](https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/dotflow.png)
4
4
 
5
- **Build production-ready data pipelines in minutes, not days.**
5
+ **import dotflow. @action. deploy. Done.**
6
6
 
7
7
  [![PyPI](https://img.shields.io/pypi/v/dotflow?style=flat-square)](https://pypi.org/project/dotflow/)
8
8
  [![Python](https://img.shields.io/pypi/pyversions/dotflow?style=flat-square)](https://pypi.org/project/dotflow/)
@@ -25,7 +25,7 @@ Dotflow is a lightweight Python library for execution pipelines. Define tasks wi
25
25
  - **Resilient** — Retry, backoff, timeout, checkpoints, and error handling out of the box.
26
26
  - **Observable** — OpenTelemetry traces, metrics, and logs. Sentry error tracking.
27
27
  - **Deployable** — `dotflow deploy --platform lambda` ships your pipeline to AWS in one command.
28
- - **Portable** — Same code runs on Lambda, ECS, Cloud Run, Kubernetes, Docker, or GitHub Actions.
28
+ - **Portable** — Same code runs on Lambda, ECS, Cloud Run, Alibaba FC, Kubernetes, Docker, or GitHub Actions.
29
29
 
30
30
  ## Install
31
31
 
@@ -72,16 +72,20 @@ dotflow deploy --platform lambda --project my_pipeline
72
72
 
73
73
  | Platform | Deploy method |
74
74
  |----------|---------------|
75
- | <img src="https://cdn.simpleicons.org/docker" width="16" /> **Docker** | `docker compose up` |
76
- | <img src="https://www.vectorlogo.zone/logos/amazon_awslambda/amazon_awslambda-icon.svg" width="16" /> **AWS Lambda** | `dotflow deploy` |
77
- | <img src="https://www.vectorlogo.zone/logos/amazon_awslambda/amazon_awslambda-icon.svg" width="16" /> **AWS Lambda + EventBridge** | `dotflow deploy --schedule` |
78
- | <img src="https://www.vectorlogo.zone/logos/amazon_awslambda/amazon_awslambda-icon.svg" width="16" /> **AWS Lambda + S3 Trigger** | `dotflow deploy` |
79
- | <img src="https://www.vectorlogo.zone/logos/amazon_awslambda/amazon_awslambda-icon.svg" width="16" /> **AWS Lambda + SQS Trigger** | `dotflow deploy` |
80
- | <img src="https://www.vectorlogo.zone/logos/amazon_awslambda/amazon_awslambda-icon.svg" width="16" /> **AWS Lambda + API Gateway** | `dotflow deploy` |
81
- | <img src="https://www.vectorlogo.zone/logos/amazon_ecs/amazon_ecs-icon.svg" width="16" /> **AWS ECS Fargate** | `dotflow deploy` |
82
- | <img src="https://cdn.simpleicons.org/googlecloud" width="16" /> **Google Cloud Run** | `gcloud run deploy` |
83
- | <img src="https://cdn.simpleicons.org/kubernetes" width="16" /> **Kubernetes** | `kubectl apply` |
84
- | <img src="https://cdn.simpleicons.org/githubactions" width="16" /> **GitHub Actions** | `dotflow deploy` |
75
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-docker.svg" width="16" /> **Docker** | `docker compose up` |
76
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> **AWS Lambda** | `dotflow deploy` |
77
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-eventbridge.svg" width="16" /> **AWS Lambda + EventBridge** | `dotflow deploy --schedule` |
78
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-s3.svg" width="16" /> **AWS Lambda + S3 Trigger** | `dotflow deploy` |
79
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-sqs.svg" width="16" /> **AWS Lambda + SQS Trigger** | `dotflow deploy` |
80
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-api-gateway.svg" width="16" /> **AWS Lambda + API Gateway** | `dotflow deploy` |
81
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-ecs.svg" width="16" /> **AWS ECS Fargate** | `dotflow deploy` |
82
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-ecs.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-eventbridge.svg" width="16" /> **AWS ECS + EventBridge** | `dotflow deploy --schedule` |
83
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-google-cloud.svg" width="16" /> **Google Cloud Run** | `dotflow deploy` |
84
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-google-cloud.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-google-cloud-scheduler.svg" width="16" /> **Cloud Run + Scheduler** | `dotflow deploy --schedule` |
85
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-kubernetes.svg" width="16" /> **Kubernetes** | `kubectl apply` |
86
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-alibaba-cloud.svg" width="16" /> **Alibaba Cloud FC** | `dotflow deploy` |
87
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-alibaba-cloud.svg" width="16" /> **Alibaba Cloud FC + Timer** | `dotflow deploy --schedule` |
88
+ | <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-github-actions.svg" width="16" /> **GitHub Actions** | `dotflow deploy` |
85
89
 
86
90
  > [See all 34+ platforms →](https://dotflow-io.github.io/dotflow/nav/cloud/)
87
91
 
@@ -93,9 +97,10 @@ pip install dotflow[gcp] # Google Cloud Storage
93
97
  pip install dotflow[scheduler] # Cron scheduler
94
98
  pip install dotflow[otel] # OpenTelemetry
95
99
  pip install dotflow[sentry] # Sentry error tracking
96
- pip install dotflow[deploy-aws] # AWS deploy (Lambda, ECS)
97
- pip install dotflow[deploy-gcp] # GCP deploy (Cloud Run)
98
- pip install dotflow[deploy-github] # GitHub Actions deploy
100
+ pip install dotflow[deploy-aws] # AWS deploy (Lambda, ECS)
101
+ pip install dotflow[deploy-gcp] # GCP deploy (Cloud Run)
102
+ pip install dotflow[deploy-alibaba] # Alibaba Cloud deploy (FC)
103
+ pip install dotflow[deploy-github] # GitHub Actions deploy
99
104
  ```
100
105
 
101
106
  > **[Read the full documentation →](https://dotflow-io.github.io/dotflow/)**
@@ -106,8 +111,8 @@ pip install dotflow[deploy-github] # GitHub Actions deploy
106
111
  |---------|-------------|
107
112
  | [Concepts](https://dotflow-io.github.io/dotflow/nav/concepts/concept-workflow-and-tasks/) | Workflows, tasks, context, providers, process modes |
108
113
  | [How-to Guides](https://dotflow-io.github.io/dotflow/nav/how-to/) | Step-by-step tutorials for workflows, tasks, and CLI |
109
- | [Cloud Deployment](https://dotflow-io.github.io/dotflow/nav/cloud/) | Deploy to AWS, GCP, Kubernetes, Docker, GitHub Actions |
110
- | [Integrations](https://dotflow-io.github.io/dotflow/nav/integrations/) | OpenTelemetry, Sentry, Telegram, Discord, S3, GCS |
114
+ | [Cloud Deployment](https://dotflow-io.github.io/dotflow/nav/cloud/) | Deploy to AWS, GCP, Alibaba, Kubernetes, Docker, GitHub Actions |
115
+ | [Integrations](https://dotflow-io.github.io/dotflow/nav/integrations/) | OpenTelemetry, Sentry, Telegram, Discord, S3, GCS, Server |
111
116
  | [Examples](https://dotflow-io.github.io/dotflow/nav/examples/) | Real-world pipelines: ETL, health checks, async, scheduler |
112
117
  | [Reference](https://dotflow-io.github.io/dotflow/nav/reference/dotflow/) | API reference for all classes and providers |
113
118
  | [Custom Providers](https://dotflow-io.github.io/dotflow/nav/development/custom-providers/) | Build your own storage, notify, log, tracer, or metrics provider |
@@ -645,20 +650,64 @@ Available CLI commands:
645
650
 
646
651
  </details>
647
652
 
653
+ <details>
654
+ <summary><strong>Server Provider</strong></summary>
655
+
656
+ > [Server docs](https://dotflow-io.github.io/dotflow/nav/tutorial/server-default/)
657
+
658
+ Send workflow and task execution data to a remote API (e.g. dotflow-api) in real time.
659
+
660
+ ```python
661
+ from dotflow import DotFlow, Config, action
662
+ from dotflow.providers import ServerDefault
663
+
664
+ @action
665
+ def my_task():
666
+ return {"result": "ok"}
667
+
668
+ config = Config(
669
+ server=ServerDefault(
670
+ base_url="http://localhost:8000/api/v1",
671
+ user_token="your-api-token",
672
+ )
673
+ )
674
+
675
+ workflow = DotFlow(config=config)
676
+ workflow.task.add(step=my_task)
677
+ workflow.start()
678
+ ```
679
+
680
+ | Parameter | Type | Default | Description |
681
+ |-----------|------|---------|-------------|
682
+ | `base_url` | `str` | `""` | API base URL |
683
+ | `user_token` | `str` | `""` | API token (`X-User-Token` header) |
684
+ | `timeout` | `float` | `5.0` | HTTP request timeout in seconds |
685
+
686
+ The server provider automatically:
687
+ - Creates the workflow on `DotFlow()` init
688
+ - Creates each task on `task.add()`
689
+ - Updates task status on each transition (In progress, Completed, Failed, Retry)
690
+ - Updates workflow status on completion (In progress → Completed)
691
+
692
+ ---
693
+
694
+ </details>
695
+
648
696
  <details>
649
697
  <summary><strong>Dependency Injection via Config</strong></summary>
650
698
 
651
- The `Config` class lets you swap providers for storage, notifications, logging, and scheduling:
699
+ The `Config` class lets you swap providers for storage, notifications, logging, scheduling, and server:
652
700
 
653
701
  ```python
654
702
  from dotflow import DotFlow, Config
655
- from dotflow.providers import StorageFile, NotifyTelegram, LogDefault, SchedulerCron
703
+ from dotflow.providers import StorageFile, NotifyTelegram, LogDefault, SchedulerCron, ServerDefault
656
704
 
657
705
  config = Config(
658
706
  storage=StorageFile(path=".output"),
659
707
  notify=NotifyTelegram(token="...", chat_id=123),
660
708
  log=LogDefault(),
661
709
  scheduler=SchedulerCron(cron="0 * * * *"),
710
+ server=ServerDefault(base_url="...", user_token="..."),
662
711
  )
663
712
 
664
713
  workflow = DotFlow(config=config)
@@ -670,8 +719,11 @@ Extend Dotflow by implementing the abstract base classes:
670
719
  |-----|---------|---------|
671
720
  | `Storage` | `post`, `get`, `key` | Custom storage backends |
672
721
  | `Notify` | `hook_status_task` | Custom notification channels |
673
- | `Log` | `info`, `error` | Custom logging |
722
+ | `Log` | `info`, `error`, `warning`, `debug` | Custom logging |
674
723
  | `Scheduler` | `start`, `stop` | Custom scheduling strategies |
724
+ | `Tracer` | `start_workflow`, `end_workflow`, `start_task`, `end_task` | Distributed tracing |
725
+ | `Metrics` | `workflow_started`, `workflow_completed`, `workflow_failed`, `task_completed`, `task_failed`, `task_retried` | Counters and histograms |
726
+ | `Server` | `create_workflow`, `update_workflow`, `create_task`, `update_task` | Remote API communication |
675
727
 
676
728
  ---
677
729
 
@@ -1,6 +1,6 @@
1
1
  """Dotflow __init__ module."""
2
2
 
3
- __version__ = "0.15.0.dev3"
3
+ __version__ = "0.15.0.dev4"
4
4
  __description__ = "🎲 Dotflow turns an idea into flow!"
5
5
 
6
6
  from .core.action import Action as action
@@ -0,0 +1,30 @@
1
+ """Abstract base for remote server communication."""
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import Any
5
+
6
+
7
+ class Server(ABC):
8
+ """Server ABC provider for sending workflow and task
9
+ data to a remote API.
10
+
11
+ Implementations should handle HTTP communication with
12
+ a server like dotflow-api, sending execution data
13
+ (status, duration, errors, context) in real time.
14
+ """
15
+
16
+ @abstractmethod
17
+ def create_workflow(self, workflow: Any) -> None:
18
+ """Register a new workflow on the remote server."""
19
+
20
+ @abstractmethod
21
+ def update_workflow(self, workflow: Any, status: str = "") -> None:
22
+ """Update workflow status on the remote server."""
23
+
24
+ @abstractmethod
25
+ def create_task(self, task: Any) -> None:
26
+ """Register a new task on the remote server."""
27
+
28
+ @abstractmethod
29
+ def update_task(self, task: Any) -> None:
30
+ """Update task data on the remote server."""
@@ -126,6 +126,7 @@ class CloudGenerateCommand(Command):
126
126
  if not project_name:
127
127
  project_name = Path.cwd().name
128
128
 
129
+ project_name = project_name.replace("_", "-").lower()
129
130
  module_name = project_name.replace("-", "_")
130
131
 
131
132
  print(
@@ -0,0 +1,171 @@
1
+ """Command deploy module."""
2
+
3
+ from rich import print # type: ignore
4
+ from rich.prompt import Prompt
5
+
6
+ from dotflow.cli.command import Command
7
+ from dotflow.cloud.alibaba.constants import (
8
+ DEFAULT_REGION as ALI_DEFAULT_REGION,
9
+ )
10
+ from dotflow.cloud.alibaba.constants import PLATFORMS as ALI_PLATFORMS
11
+ from dotflow.cloud.alibaba.constants import (
12
+ SCHEDULED_PLATFORMS as ALI_SCHEDULED,
13
+ )
14
+ from dotflow.cloud.aws.constants import DEFAULT_REGION as AWS_DEFAULT_REGION
15
+ from dotflow.cloud.aws.constants import PLATFORMS as AWS_PLATFORMS
16
+ from dotflow.cloud.aws.constants import SCHEDULED_PLATFORMS as AWS_SCHEDULED
17
+ from dotflow.cloud.gcp.constants import DEFAULT_REGION as GCP_DEFAULT_REGION
18
+ from dotflow.cloud.gcp.constants import PLATFORMS as GCP_PLATFORMS
19
+ from dotflow.cloud.gcp.constants import SCHEDULED_PLATFORMS as GCP_SCHEDULED
20
+ from dotflow.settings import Settings as settings
21
+
22
+ DEFAULT_REGIONS = {
23
+ **dict.fromkeys(AWS_PLATFORMS, AWS_DEFAULT_REGION),
24
+ **dict.fromkeys(GCP_PLATFORMS, GCP_DEFAULT_REGION),
25
+ **dict.fromkeys(ALI_PLATFORMS, ALI_DEFAULT_REGION),
26
+ }
27
+
28
+ SCHEDULED_PLATFORMS = AWS_SCHEDULED | GCP_SCHEDULED | ALI_SCHEDULED
29
+
30
+
31
+ class ScheduleResolver:
32
+ """Resolves a schedule expression.
33
+
34
+ From CLI args, template, or user input.
35
+ """
36
+
37
+ @classmethod
38
+ def _get_provider(cls, platform: str) -> type | None:
39
+ if platform in AWS_PLATFORMS:
40
+ from dotflow.cloud.aws.schedule import AWSSchedule
41
+
42
+ return AWSSchedule
43
+
44
+ return None
45
+
46
+ @classmethod
47
+ def resolve(cls, schedule: str | None, platform: str) -> str | None:
48
+ if platform not in SCHEDULED_PLATFORMS:
49
+ return schedule
50
+
51
+ provider = cls._get_provider(platform)
52
+
53
+ if schedule:
54
+ return provider.convert(schedule) if provider else schedule
55
+
56
+ raw = cls._ask_schedule(provider)
57
+
58
+ if not raw:
59
+ raise SystemExit(
60
+ f"{settings.ERROR_ALERT} --schedule (cron) is required for {platform}"
61
+ )
62
+
63
+ return provider.convert(raw) if provider else raw
64
+
65
+ @classmethod
66
+ def _ask_schedule(cls, provider: type | None) -> str | None:
67
+ template_schedule = None
68
+ if provider:
69
+ template_schedule = provider.read_from_template()
70
+
71
+ choices = {}
72
+ if template_schedule:
73
+ choices["1"] = f"Use from template.yaml: {template_schedule}"
74
+ choices["2"] = "Enter cron expression"
75
+
76
+ print(settings.QUESTION_ALERT, "Cron schedule is required:")
77
+ for key, label in choices.items():
78
+ print(f" [bold cyan]{key}[/bold cyan] - {label}")
79
+
80
+ choice = Prompt.ask(" Select", choices=list(choices.keys()))
81
+
82
+ if choice == "1" and template_schedule:
83
+ print(settings.INFO_ALERT, f"Using cron: {template_schedule}")
84
+ return template_schedule
85
+
86
+ print(" Format: [bold]min hour day month weekday[/bold]")
87
+ return Prompt.ask(" Cron (e.g. */5 * * * *)") or None
88
+
89
+
90
+ class DeployCommand(Command):
91
+ def setup(self):
92
+ platform = self.params.platform
93
+ name = self.params.project
94
+ region = self.params.region or DEFAULT_REGIONS.get(platform)
95
+ schedule = ScheduleResolver.resolve(
96
+ getattr(self.params, "schedule", None), platform
97
+ )
98
+
99
+ method_name = f"_deploy_{platform.replace('-', '_')}"
100
+ handler = getattr(self, method_name, None)
101
+ if not handler:
102
+ print(
103
+ settings.ERROR_ALERT, f"Deploy not supported for '{platform}'."
104
+ )
105
+ return
106
+
107
+ handler(name=name, region=region, schedule=schedule)
108
+
109
+ def _deploy_lambda(self, name, region, schedule=None):
110
+ from dotflow.cloud.aws import LambdaDeployer
111
+
112
+ LambdaDeployer(region=region).deploy(name, schedule=schedule)
113
+
114
+ def _deploy_lambda_scheduled(self, name, region, schedule=None):
115
+ from dotflow.cloud.aws import LambdaDeployer
116
+
117
+ LambdaDeployer(region=region).deploy(name, schedule=schedule)
118
+
119
+ def _deploy_lambda_s3_trigger(self, name, region, **kwargs):
120
+ from dotflow.cloud.aws import LambdaS3Deployer
121
+
122
+ LambdaS3Deployer(region=region).deploy(name)
123
+
124
+ def _deploy_lambda_sqs_trigger(self, name, region, **kwargs):
125
+ from dotflow.cloud.aws import LambdaSQSDeployer
126
+
127
+ LambdaSQSDeployer(region=region).deploy(name)
128
+
129
+ def _deploy_lambda_api_trigger(self, name, region, **kwargs):
130
+ from dotflow.cloud.aws import LambdaApiDeployer
131
+
132
+ LambdaApiDeployer(region=region).deploy(name)
133
+
134
+ def _deploy_ecs(self, name, region, **kwargs):
135
+ from dotflow.cloud.aws import ECSDeployer
136
+
137
+ ECSDeployer(region=region).deploy(name)
138
+
139
+ def _deploy_ecs_scheduled(self, name, region, schedule=None):
140
+ from dotflow.cloud.aws import ECSScheduledDeployer
141
+
142
+ ECSScheduledDeployer(region=region).deploy(name, schedule=schedule)
143
+
144
+ def _deploy_cloud_run(self, name, region, **kwargs):
145
+ from dotflow.cloud.gcp import CloudRunDeployer
146
+
147
+ CloudRunDeployer(region=region).deploy(name)
148
+
149
+ def _deploy_cloud_run_scheduled(self, name, region, **kwargs):
150
+ from dotflow.cloud.gcp import CloudRunDeployer
151
+
152
+ CloudRunDeployer(region=region).deploy(name)
153
+
154
+ def _deploy_github_actions(self, name, **kwargs):
155
+ from dotflow.cloud.github import ActionsDeployer
156
+
157
+ ActionsDeployer().deploy(name)
158
+
159
+ def _deploy_alibaba_fc(self, name, region, **kwargs):
160
+ from dotflow.cloud.alibaba import AliyunFCDeployer
161
+
162
+ AliyunFCDeployer(region=region).deploy(name)
163
+
164
+ def _deploy_alibaba_fc_scheduled(self, name, region, schedule=None):
165
+ from dotflow.cloud.alibaba import (
166
+ AliyunFCScheduledDeployer,
167
+ )
168
+
169
+ AliyunFCScheduledDeployer(region=region).deploy(
170
+ name, schedule=schedule
171
+ )
@@ -14,7 +14,8 @@ class LogCommand(Command):
14
14
 
15
15
  print(
16
16
  settings.INFO_ALERT,
17
- f"To access all logs, open the file ({settings.LOG_PATH.resolve()}).",
17
+ "To access all logs, open the file"
18
+ f" ({settings.LOG_PATH.resolve()}).",
18
19
  )
19
20
  else:
20
21
  print(settings.WARNING_ALERT, "Log file not found.")
@@ -163,7 +163,7 @@ class Command:
163
163
  cmd_generate.add_argument(
164
164
  "--platform",
165
165
  required=True,
166
- help="Target platform (e.g. docker, lambda, cloud-run, ecs, kubernetes)",
166
+ help=("Target platform (e.g. docker, lambda, cloud-run)"),
167
167
  )
168
168
  cmd_generate.add_argument(
169
169
  "--project",
@@ -206,7 +206,7 @@ class Command:
206
206
  self.cmd_deploy.add_argument(
207
207
  "--schedule",
208
208
  default=None,
209
- help="Schedule expression (e.g. 'rate(6 hours)')",
209
+ help="Cron expression (e.g. '*/5 * * * *')",
210
210
  )
211
211
  self.cmd_deploy.set_defaults(exec=DeployCommand)
212
212
 
@@ -233,6 +233,9 @@ class Command:
233
233
  except ImportModuleError as err:
234
234
  print(settings.WARNING_ALERT, err)
235
235
 
236
+ except KeyboardInterrupt:
237
+ print("\n", settings.INFO_ALERT, "Aborted.")
238
+
236
239
  except Exception as err:
237
240
  logger.error(f"Internal problem: {str(err)}")
238
241
  print(settings.ERROR_ALERT, MESSAGE_UNKNOWN_ERROR)
@@ -0,0 +1,11 @@
1
+ """Alibaba Cloud module."""
2
+
3
+ from dotflow.cloud.alibaba.deployers import (
4
+ AliyunFCDeployer,
5
+ AliyunFCScheduledDeployer,
6
+ )
7
+
8
+ __all__ = [
9
+ "AliyunFCDeployer",
10
+ "AliyunFCScheduledDeployer",
11
+ ]
@@ -0,0 +1,22 @@
1
+ """Alibaba Cloud constants."""
2
+
3
+ SDK_NOT_FOUND = (
4
+ "alibabacloud-fc-open20210406 is required: "
5
+ "pip install dotflow[deploy-alibaba]"
6
+ )
7
+
8
+ CREDENTIALS_NOT_FOUND = (
9
+ "Alibaba Cloud credentials not found. "
10
+ "Run 'aliyun configure' or set "
11
+ "ALIBABA_CLOUD_ACCESS_KEY_ID and "
12
+ "ALIBABA_CLOUD_ACCESS_KEY_SECRET."
13
+ )
14
+
15
+ PLATFORMS = {
16
+ "alibaba-fc",
17
+ "alibaba-fc-scheduled",
18
+ }
19
+
20
+ SCHEDULED_PLATFORMS = {"alibaba-fc-scheduled"}
21
+
22
+ DEFAULT_REGION = "cn-hangzhou"