flowrs 0.14.1__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.
Potentially problematic release.
This version of flowrs might be problematic. Click here for more details.
- flowrs-0.14.1/.coderabbit.yaml +10 -0
- flowrs-0.14.1/.gitattributes +2 -0
- flowrs-0.14.1/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
- flowrs-0.14.1/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- flowrs-0.14.1/.github/dependabot.yml +11 -0
- flowrs-0.14.1/.github/workflows/ci.yml +53 -0
- flowrs-0.14.1/.github/workflows/integration.yml +149 -0
- flowrs-0.14.1/.github/workflows/pypi.yml +159 -0
- flowrs-0.14.1/.github/workflows/release-plz.yml +54 -0
- flowrs-0.14.1/.github/workflows/release.yml +344 -0
- flowrs-0.14.1/.gitignore +20 -0
- flowrs-0.14.1/.pre-commit-config.yaml +16 -0
- flowrs-0.14.1/CHANGELOG.md +766 -0
- flowrs-0.14.1/CLAUDE.md +175 -0
- flowrs-0.14.1/CODE_OF_CONDUCT.md +128 -0
- flowrs-0.14.1/Cargo.lock +4931 -0
- flowrs-0.14.1/Cargo.toml +123 -0
- flowrs-0.14.1/LICENSE +21 -0
- flowrs-0.14.1/Makefile +22 -0
- flowrs-0.14.1/PKG-INFO +101 -0
- flowrs-0.14.1/README.md +77 -0
- flowrs-0.14.1/clippy.toml +1 -0
- flowrs-0.14.1/crates/flowrs-airflow/CHANGELOG.md +89 -0
- flowrs-0.14.1/crates/flowrs-airflow/Cargo.toml +38 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/auth.rs +95 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/auth/basic.rs +54 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/auth/command.rs +157 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/auth/mod.rs +107 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/auth/static_token.rs +51 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/base.rs +74 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/dag.rs +86 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/dagrun.rs +88 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/dagstats.rs +23 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/log.rs +137 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/mod.rs +59 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/dag.rs +52 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/dagrun.rs +35 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/dagstats.rs +19 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/log.rs +8 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/mod.rs +6 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/task.rs +19 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/taskinstance.rs +97 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/task.rs +19 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/taskinstance.rs +189 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/dag.rs +86 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/dagrun.rs +80 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/dagstats.rs +27 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/log.rs +35 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/mod.rs +42 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/dag.rs +90 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/dagrun.rs +54 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/dagstats.rs +19 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/log.rs +56 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/mod.rs +6 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/task.rs +18 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/taskinstance.rs +109 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/task.rs +19 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/taskinstance.rs +186 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/client.rs +30 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/config.rs +70 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/lib.rs +10 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/astronomer.rs +340 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/composer/auth.rs +1 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/composer/client.rs +384 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/composer/mod.rs +9 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/composer/provider.rs +53 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/composer/regions.rs +72 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/conveyor.rs +245 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/expand.rs +155 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/mwaa.rs +296 -0
- flowrs-0.14.1/crates/flowrs-airflow/src/managed_services.rs +9 -0
- flowrs-0.14.1/crates/flowrs-config/CHANGELOG.md +86 -0
- flowrs-0.14.1/crates/flowrs-config/Cargo.toml +21 -0
- flowrs-0.14.1/crates/flowrs-config/src/auth.rs +4 -0
- flowrs-0.14.1/crates/flowrs-config/src/lib.rs +399 -0
- flowrs-0.14.1/crates/flowrs-config/src/paths.rs +94 -0
- flowrs-0.14.1/crates/flowrs-config/src/server.rs +4 -0
- flowrs-0.14.1/crates/flowrs-config/src/theme.rs +28 -0
- flowrs-0.14.1/dist-workspace.toml +23 -0
- flowrs-0.14.1/docker-compose.yaml +288 -0
- flowrs-0.14.1/docs/client-architecture.md +125 -0
- flowrs-0.14.1/docs/plans/2024-12-14-tabs-navigation-design.md +128 -0
- flowrs-0.14.1/docs/plans/2025-12-13-xdg-config-design.md +100 -0
- flowrs-0.14.1/docs/plans/2025-12-13-xdg-config-implementation.md +685 -0
- flowrs-0.14.1/docs/plans/2025-12-14-binary-size-reduction-design.md +75 -0
- flowrs-0.14.1/docs/plans/2025-12-14-visual-refresh-design.md +126 -0
- flowrs-0.14.1/docs/plans/2025-12-14-visual-selection-design.md +171 -0
- flowrs-0.14.1/docs/plans/2025-12-14-visual-selection-implementation.md +750 -0
- flowrs-0.14.1/docs/plans/2025-12-18-ci-testing-design.md +121 -0
- flowrs-0.14.1/docs/plans/2025-12-18-ci-testing-implementation.md +385 -0
- flowrs-0.14.1/docs/plans/2025-12-18-focus-tracking-design.md +104 -0
- flowrs-0.14.1/docs/plans/2025-12-20-topological-task-sorting-design.md +169 -0
- flowrs-0.14.1/docs/plans/2025-12-20-topological-task-sorting.md +900 -0
- flowrs-0.14.1/docs/plans/2025-12-21-filter-state-machine-design.md +333 -0
- flowrs-0.14.1/docs/plans/2025-12-21-filter-state-machine-implementation.md +2129 -0
- flowrs-0.14.1/docs/plans/2025-12-31-gcp-composer-design.md +180 -0
- flowrs-0.14.1/docs/plans/2025-12-31-gcp-composer-implementation.md +668 -0
- flowrs-0.14.1/docs/plans/2025-12-31-gcp-composer-terraform-design.md +206 -0
- flowrs-0.14.1/image/README/1683789045509.png +3 -0
- flowrs-0.14.1/image/rotation/ascii/0.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/1.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/10.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/11.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/12.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/13.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/14.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/15.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/16.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/2.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/3.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/4.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/5.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/6.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/7.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/8.ascii +28 -0
- flowrs-0.14.1/image/rotation/ascii/9.ascii +28 -0
- flowrs-0.14.1/image/rotation/png/0.png +3 -0
- flowrs-0.14.1/image/rotation/png/1.png +3 -0
- flowrs-0.14.1/image/rotation/png/10.png +3 -0
- flowrs-0.14.1/image/rotation/png/11.png +3 -0
- flowrs-0.14.1/image/rotation/png/12.png +3 -0
- flowrs-0.14.1/image/rotation/png/13.png +3 -0
- flowrs-0.14.1/image/rotation/png/14.png +3 -0
- flowrs-0.14.1/image/rotation/png/15.png +3 -0
- flowrs-0.14.1/image/rotation/png/16.png +3 -0
- flowrs-0.14.1/image/rotation/png/2.png +3 -0
- flowrs-0.14.1/image/rotation/png/3.png +3 -0
- flowrs-0.14.1/image/rotation/png/4.png +3 -0
- flowrs-0.14.1/image/rotation/png/5.png +3 -0
- flowrs-0.14.1/image/rotation/png/6.png +3 -0
- flowrs-0.14.1/image/rotation/png/7.png +3 -0
- flowrs-0.14.1/image/rotation/png/8.png +3 -0
- flowrs-0.14.1/image/rotation/png/9.png +3 -0
- flowrs-0.14.1/infrastructure/README.md +92 -0
- flowrs-0.14.1/infrastructure/astronomer/README.md +49 -0
- flowrs-0.14.1/infrastructure/aws/.gitignore +27 -0
- flowrs-0.14.1/infrastructure/aws/README.md +187 -0
- flowrs-0.14.1/infrastructure/aws/main.tf +382 -0
- flowrs-0.14.1/infrastructure/aws/outputs.tf +39 -0
- flowrs-0.14.1/infrastructure/aws/terraform.tfvars.example +20 -0
- flowrs-0.14.1/infrastructure/aws/variables.tf +41 -0
- flowrs-0.14.1/infrastructure/azure/README.md +34 -0
- flowrs-0.14.1/infrastructure/gcp/.gitignore +27 -0
- flowrs-0.14.1/infrastructure/gcp/README.md +136 -0
- flowrs-0.14.1/infrastructure/gcp/composer.tf +90 -0
- flowrs-0.14.1/infrastructure/gcp/iam.tf +14 -0
- flowrs-0.14.1/infrastructure/gcp/network.tf +30 -0
- flowrs-0.14.1/infrastructure/gcp/outputs.tf +24 -0
- flowrs-0.14.1/infrastructure/gcp/provider.tf +31 -0
- flowrs-0.14.1/infrastructure/gcp/terraform.tfvars.example +7 -0
- flowrs-0.14.1/infrastructure/gcp/variables.tf +23 -0
- flowrs-0.14.1/pyproject.toml +39 -0
- flowrs-0.14.1/release-plz.toml +33 -0
- flowrs-0.14.1/src/airflow/client/convert_v1.rs +183 -0
- flowrs-0.14.1/src/airflow/client/convert_v2.rs +179 -0
- flowrs-0.14.1/src/airflow/client/impls/dag_ops.rs +45 -0
- flowrs-0.14.1/src/airflow/client/impls/dagrun_ops.rs +71 -0
- flowrs-0.14.1/src/airflow/client/impls/dagstats_ops.rs +24 -0
- flowrs-0.14.1/src/airflow/client/impls/log_ops.rs +34 -0
- flowrs-0.14.1/src/airflow/client/impls/mod.rs +6 -0
- flowrs-0.14.1/src/airflow/client/impls/task_ops.rs +24 -0
- flowrs-0.14.1/src/airflow/client/impls/taskinstance_ops.rs +116 -0
- flowrs-0.14.1/src/airflow/client/mod.rs +48 -0
- flowrs-0.14.1/src/airflow/client/open_url.rs +102 -0
- flowrs-0.14.1/src/airflow/graph.rs +317 -0
- flowrs-0.14.1/src/airflow/mod.rs +4 -0
- flowrs-0.14.1/src/airflow/model/common/dag.rs +44 -0
- flowrs-0.14.1/src/airflow/model/common/dagrun.rs +130 -0
- flowrs-0.14.1/src/airflow/model/common/dagstats.rs +22 -0
- flowrs-0.14.1/src/airflow/model/common/duration.rs +154 -0
- flowrs-0.14.1/src/airflow/model/common/gantt.rs +259 -0
- flowrs-0.14.1/src/airflow/model/common/log.rs +8 -0
- flowrs-0.14.1/src/airflow/model/common/mod.rs +27 -0
- flowrs-0.14.1/src/airflow/model/common/open_item.rs +24 -0
- flowrs-0.14.1/src/airflow/model/common/task.rs +13 -0
- flowrs-0.14.1/src/airflow/model/common/taskinstance.rs +129 -0
- flowrs-0.14.1/src/airflow/model/mod.rs +2 -0
- flowrs-0.14.1/src/airflow/model/newtype_id.rs +94 -0
- flowrs-0.14.1/src/airflow/traits/dag.rs +20 -0
- flowrs-0.14.1/src/airflow/traits/dagrun.rs +29 -0
- flowrs-0.14.1/src/airflow/traits/dagstats.rs +11 -0
- flowrs-0.14.1/src/airflow/traits/log.rs +17 -0
- flowrs-0.14.1/src/airflow/traits/mod.rs +42 -0
- flowrs-0.14.1/src/airflow/traits/task.rs +11 -0
- flowrs-0.14.1/src/airflow/traits/taskinstance.rs +41 -0
- flowrs-0.14.1/src/app/events/custom.rs +22 -0
- flowrs-0.14.1/src/app/events/generator.rs +60 -0
- flowrs-0.14.1/src/app/events.rs +2 -0
- flowrs-0.14.1/src/app/model/config/commands.rs +16 -0
- flowrs-0.14.1/src/app/model/config/mod.rs +170 -0
- flowrs-0.14.1/src/app/model/dagruns/commands.rs +43 -0
- flowrs-0.14.1/src/app/model/dagruns/dag_code_view/mod.rs +92 -0
- flowrs-0.14.1/src/app/model/dagruns/dag_code_view/render.rs +44 -0
- flowrs-0.14.1/src/app/model/dagruns/mod.rs +479 -0
- flowrs-0.14.1/src/app/model/dagruns/popup/clear.rs +117 -0
- flowrs-0.14.1/src/app/model/dagruns/popup/mark.rs +202 -0
- flowrs-0.14.1/src/app/model/dagruns/popup/mod.rs +17 -0
- flowrs-0.14.1/src/app/model/dagruns/popup/trigger/mod.rs +328 -0
- flowrs-0.14.1/src/app/model/dagruns/popup/trigger/params.rs +209 -0
- flowrs-0.14.1/src/app/model/dagruns/popup/trigger/render.rs +268 -0
- flowrs-0.14.1/src/app/model/dagruns/popup/trigger/table.rs +190 -0
- flowrs-0.14.1/src/app/model/dagruns/popup/trigger/text.rs +124 -0
- flowrs-0.14.1/src/app/model/dagruns/render.rs +143 -0
- flowrs-0.14.1/src/app/model/dags/commands.rs +28 -0
- flowrs-0.14.1/src/app/model/dags/mod.rs +207 -0
- flowrs-0.14.1/src/app/model/dags/popup/mod.rs +6 -0
- flowrs-0.14.1/src/app/model/dags/render.rs +156 -0
- flowrs-0.14.1/src/app/model/filter/autocomplete.rs +220 -0
- flowrs-0.14.1/src/app/model/filter/condition.rs +66 -0
- flowrs-0.14.1/src/app/model/filter/filterable.rs +165 -0
- flowrs-0.14.1/src/app/model/filter/impls.rs +109 -0
- flowrs-0.14.1/src/app/model/filter/matching.rs +165 -0
- flowrs-0.14.1/src/app/model/filter/mod.rs +22 -0
- flowrs-0.14.1/src/app/model/filter/state.rs +174 -0
- flowrs-0.14.1/src/app/model/filter/state_machine.rs +812 -0
- flowrs-0.14.1/src/app/model/filter/widget.rs +229 -0
- flowrs-0.14.1/src/app/model/filterable_table/mod.rs +454 -0
- flowrs-0.14.1/src/app/model/filterable_table/render.rs +86 -0
- flowrs-0.14.1/src/app/model/logs/mod.rs +524 -0
- flowrs-0.14.1/src/app/model/logs/render.rs +342 -0
- flowrs-0.14.1/src/app/model/logs/search.rs +188 -0
- flowrs-0.14.1/src/app/model/popup/commands_help/mod.rs +75 -0
- flowrs-0.14.1/src/app/model/popup/commands_help/render.rs +43 -0
- flowrs-0.14.1/src/app/model/popup/error.rs +76 -0
- flowrs-0.14.1/src/app/model/popup/mod.rs +196 -0
- flowrs-0.14.1/src/app/model/popup/warning.rs +68 -0
- flowrs-0.14.1/src/app/model/taskinstances/commands.rs +39 -0
- flowrs-0.14.1/src/app/model/taskinstances/mod.rs +243 -0
- flowrs-0.14.1/src/app/model/taskinstances/popup/clear.rs +73 -0
- flowrs-0.14.1/src/app/model/taskinstances/popup/graph.rs +224 -0
- flowrs-0.14.1/src/app/model/taskinstances/popup/mark.rs +102 -0
- flowrs-0.14.1/src/app/model/taskinstances/popup/mod.rs +15 -0
- flowrs-0.14.1/src/app/model/taskinstances/popup/render.rs +290 -0
- flowrs-0.14.1/src/app/model/taskinstances/render.rs +107 -0
- flowrs-0.14.1/src/app/model.rs +160 -0
- flowrs-0.14.1/src/app/state/breadcrumb.rs +74 -0
- flowrs-0.14.1/src/app/state/context.rs +55 -0
- flowrs-0.14.1/src/app/state/environment_state.rs +187 -0
- flowrs-0.14.1/src/app/state/mod.rs +160 -0
- flowrs-0.14.1/src/app/state/navigation.rs +85 -0
- flowrs-0.14.1/src/app/state/sync.rs +94 -0
- flowrs-0.14.1/src/app/worker/browser.rs +52 -0
- flowrs-0.14.1/src/app/worker/config.rs +66 -0
- flowrs-0.14.1/src/app/worker/dagruns.rs +102 -0
- flowrs-0.14.1/src/app/worker/dags.rs +213 -0
- flowrs-0.14.1/src/app/worker/logs.rs +62 -0
- flowrs-0.14.1/src/app/worker/mod.rs +317 -0
- flowrs-0.14.1/src/app/worker/taskinstances.rs +120 -0
- flowrs-0.14.1/src/app/worker/tasks.rs +72 -0
- flowrs-0.14.1/src/app.rs +166 -0
- flowrs-0.14.1/src/commands/config/add.rs +101 -0
- flowrs-0.14.1/src/commands/config/list.rs +27 -0
- flowrs-0.14.1/src/commands/config/managed_services.rs +151 -0
- flowrs-0.14.1/src/commands/config/model.rs +195 -0
- flowrs-0.14.1/src/commands/config/remove.rs +34 -0
- flowrs-0.14.1/src/commands/config/update.rs +129 -0
- flowrs-0.14.1/src/commands/config.rs +6 -0
- flowrs-0.14.1/src/commands/run.rs +133 -0
- flowrs-0.14.1/src/commands.rs +2 -0
- flowrs-0.14.1/src/lib.rs +12 -0
- flowrs-0.14.1/src/main.rs +52 -0
- flowrs-0.14.1/src/ui/common.rs +38 -0
- flowrs-0.14.1/src/ui/constants.rs +88 -0
- flowrs-0.14.1/src/ui/gantt.rs +307 -0
- flowrs-0.14.1/src/ui/init_screen.rs +36 -0
- flowrs-0.14.1/src/ui/logo/logo.ascii +18 -0
- flowrs-0.14.1/src/ui/tabs.rs +164 -0
- flowrs-0.14.1/src/ui/theme/mod.rs +131 -0
- flowrs-0.14.1/src/ui/theme/presets/catppuccin.rs +136 -0
- flowrs-0.14.1/src/ui/theme/presets/dark.rs +38 -0
- flowrs-0.14.1/src/ui/theme/presets/light.rs +38 -0
- flowrs-0.14.1/src/ui/theme/presets/mod.rs +89 -0
- flowrs-0.14.1/src/ui.rs +135 -0
- flowrs-0.14.1/tests/common/mod.rs +103 -0
- flowrs-0.14.1/tests/managed_services_test.rs +139 -0
- flowrs-0.14.1/tests/v1_api_test.rs +98 -0
- flowrs-0.14.1/tests/v2_api_test.rs +147 -0
- flowrs-0.14.1/vhs/add_config.gif +3 -0
- flowrs-0.14.1/vhs/add_config.tape +30 -0
- flowrs-0.14.1/vhs/flowrs.gif +3 -0
- flowrs-0.14.1/vhs/flowrs.tape +45 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Create a report to help us improve
|
|
4
|
+
title: ''
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: ''
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
**Describe the bug**
|
|
11
|
+
A clear and concise description of what the bug is.
|
|
12
|
+
|
|
13
|
+
**To Reproduce**
|
|
14
|
+
Steps to reproduce the behavior
|
|
15
|
+
|
|
16
|
+
**Expected behavior**
|
|
17
|
+
A clear and concise description of what you expected to happen.
|
|
18
|
+
|
|
19
|
+
**Screenshots**
|
|
20
|
+
If applicable, add screenshots to help explain your problem.
|
|
21
|
+
|
|
22
|
+
**Desktop (please complete the following information):**
|
|
23
|
+
- OS: [e.g. iOS]
|
|
24
|
+
- Version [e.g. 22]
|
|
25
|
+
|
|
26
|
+
**Additional context**
|
|
27
|
+
Add any other context about the problem here.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest an idea for this project
|
|
4
|
+
title: ''
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: ''
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
**Is your feature request related to a problem? Please describe.**
|
|
11
|
+
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
12
|
+
|
|
13
|
+
**Describe the solution you'd like**
|
|
14
|
+
A clear and concise description of what you want to happen.
|
|
15
|
+
|
|
16
|
+
**Describe alternatives you've considered**
|
|
17
|
+
A clear and concise description of any alternative solutions or features you've considered.
|
|
18
|
+
|
|
19
|
+
**Additional context**
|
|
20
|
+
Add any other context or screenshots about the feature request here.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# To get started with Dependabot version updates, you'll need to specify which
|
|
2
|
+
# package ecosystems to update and where the package manifests are located.
|
|
3
|
+
# Please see the documentation for all configuration options:
|
|
4
|
+
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
|
5
|
+
|
|
6
|
+
version: 2
|
|
7
|
+
updates:
|
|
8
|
+
- package-ecosystem: "cargo" # See documentation for possible values
|
|
9
|
+
directory: "/" # Location of package manifests
|
|
10
|
+
schedule:
|
|
11
|
+
interval: "weekly"
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [main]
|
|
6
|
+
|
|
7
|
+
env:
|
|
8
|
+
CARGO_TERM_COLOR: always
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
fmt:
|
|
12
|
+
name: Format
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
17
|
+
with:
|
|
18
|
+
components: rustfmt
|
|
19
|
+
- run: cargo fmt --all --check
|
|
20
|
+
|
|
21
|
+
clippy:
|
|
22
|
+
name: Clippy
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
27
|
+
with:
|
|
28
|
+
components: clippy
|
|
29
|
+
- uses: Swatinem/rust-cache@v2
|
|
30
|
+
- run: cargo clippy --workspace --all-targets --all-features -- -D warnings
|
|
31
|
+
|
|
32
|
+
feature-combos:
|
|
33
|
+
name: Feature Combinations
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@v4
|
|
37
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
38
|
+
with:
|
|
39
|
+
components: clippy
|
|
40
|
+
- uses: Swatinem/rust-cache@v2
|
|
41
|
+
- uses: taiki-e/install-action@cargo-hack
|
|
42
|
+
# flowrs-airflow is the only feature-gated crate; verify every combination
|
|
43
|
+
# of its managed-service features compiles and lints cleanly.
|
|
44
|
+
- run: cargo hack --feature-powerset -p flowrs-airflow clippy --all-targets -- -D warnings
|
|
45
|
+
|
|
46
|
+
test:
|
|
47
|
+
name: Unit Tests
|
|
48
|
+
runs-on: ubuntu-latest
|
|
49
|
+
steps:
|
|
50
|
+
- uses: actions/checkout@v4
|
|
51
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
52
|
+
- uses: Swatinem/rust-cache@v2
|
|
53
|
+
- run: cargo test --workspace --lib --bins
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
name: Integration Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
|
|
7
|
+
env:
|
|
8
|
+
CARGO_TERM_COLOR: always
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
integration:
|
|
12
|
+
name: Integration (${{ matrix.airflow_version }})
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
strategy:
|
|
15
|
+
fail-fast: false
|
|
16
|
+
matrix:
|
|
17
|
+
include:
|
|
18
|
+
- airflow_version: "2.10.4"
|
|
19
|
+
api_version: "v1"
|
|
20
|
+
- airflow_version: "3.1.6"
|
|
21
|
+
api_version: "v2"
|
|
22
|
+
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
|
|
26
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
27
|
+
|
|
28
|
+
- uses: Swatinem/rust-cache@v2
|
|
29
|
+
|
|
30
|
+
- name: Start Airflow 2.x container
|
|
31
|
+
if: matrix.api_version == 'v1'
|
|
32
|
+
run: |
|
|
33
|
+
docker run -d --name airflow \
|
|
34
|
+
-p 8080:8080 \
|
|
35
|
+
-e AIRFLOW__CORE__LOAD_EXAMPLES=true \
|
|
36
|
+
-e AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=sqlite:////tmp/airflow.db \
|
|
37
|
+
-e AIRFLOW__WEBSERVER__SECRET_KEY=test-secret-key \
|
|
38
|
+
-e AIRFLOW__API__AUTH_BACKENDS=airflow.api.auth.backend.basic_auth \
|
|
39
|
+
--entrypoint /bin/bash \
|
|
40
|
+
apache/airflow:${{ matrix.airflow_version }} \
|
|
41
|
+
-c "sleep infinity"
|
|
42
|
+
|
|
43
|
+
- name: Start Airflow 3.x container
|
|
44
|
+
if: matrix.api_version == 'v2'
|
|
45
|
+
run: |
|
|
46
|
+
docker run -d --name airflow \
|
|
47
|
+
-p 8080:8080 \
|
|
48
|
+
-e AIRFLOW__CORE__LOAD_EXAMPLES=true \
|
|
49
|
+
-e AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=sqlite:////tmp/airflow.db \
|
|
50
|
+
-e AIRFLOW__WEBSERVER__SECRET_KEY=test-secret-key \
|
|
51
|
+
-e AIRFLOW__CORE__SIMPLE_AUTH_MANAGER_USERS=airflow:admin \
|
|
52
|
+
--entrypoint /bin/bash \
|
|
53
|
+
apache/airflow:${{ matrix.airflow_version }} \
|
|
54
|
+
-c "sleep infinity"
|
|
55
|
+
|
|
56
|
+
- name: Initialize Airflow database
|
|
57
|
+
run: |
|
|
58
|
+
docker exec airflow airflow db migrate
|
|
59
|
+
|
|
60
|
+
- name: Create Airflow user (v2.x only)
|
|
61
|
+
if: matrix.api_version == 'v1'
|
|
62
|
+
run: |
|
|
63
|
+
docker exec airflow airflow users create \
|
|
64
|
+
--username airflow \
|
|
65
|
+
--password airflow \
|
|
66
|
+
--firstname Test \
|
|
67
|
+
--lastname User \
|
|
68
|
+
--role Admin \
|
|
69
|
+
--email test@example.com
|
|
70
|
+
|
|
71
|
+
- name: Start Airflow services (v2.x)
|
|
72
|
+
if: matrix.api_version == 'v1'
|
|
73
|
+
run: |
|
|
74
|
+
docker exec -d airflow airflow webserver --port 8080
|
|
75
|
+
docker exec -d airflow airflow scheduler
|
|
76
|
+
|
|
77
|
+
- name: Start Airflow services (v3.x)
|
|
78
|
+
if: matrix.api_version == 'v2'
|
|
79
|
+
run: |
|
|
80
|
+
docker exec -d airflow airflow api-server --port 8080
|
|
81
|
+
docker exec -d airflow airflow scheduler
|
|
82
|
+
docker exec -d airflow airflow dag-processor
|
|
83
|
+
|
|
84
|
+
- name: Wait for Airflow API (v2.x)
|
|
85
|
+
if: matrix.api_version == 'v1'
|
|
86
|
+
run: |
|
|
87
|
+
timeout 120 bash -c '
|
|
88
|
+
until curl -sf -u airflow:airflow http://localhost:8080/api/v1/health; do
|
|
89
|
+
echo "Waiting for Airflow API..."
|
|
90
|
+
sleep 5
|
|
91
|
+
done
|
|
92
|
+
'
|
|
93
|
+
echo "Airflow API is ready"
|
|
94
|
+
|
|
95
|
+
- name: Wait for Airflow API (v3.x)
|
|
96
|
+
if: matrix.api_version == 'v2'
|
|
97
|
+
run: |
|
|
98
|
+
timeout 120 bash -c '
|
|
99
|
+
until curl -sf http://localhost:8080/api/v2/version; do
|
|
100
|
+
echo "Waiting for Airflow API..."
|
|
101
|
+
sleep 5
|
|
102
|
+
done
|
|
103
|
+
'
|
|
104
|
+
echo "Airflow API is ready"
|
|
105
|
+
|
|
106
|
+
- name: Get Airflow 3.x password
|
|
107
|
+
if: matrix.api_version == 'v2'
|
|
108
|
+
id: airflow_password
|
|
109
|
+
run: |
|
|
110
|
+
# Password file is generated by api-server, find it
|
|
111
|
+
echo "Looking for password file..."
|
|
112
|
+
docker exec airflow find /opt/airflow /home/airflow -name "*.generated" 2>/dev/null || true
|
|
113
|
+
docker exec airflow ls -la /opt/airflow/ 2>/dev/null || true
|
|
114
|
+
|
|
115
|
+
# Try common locations
|
|
116
|
+
PASSWORD=""
|
|
117
|
+
for path in /opt/airflow/simple_auth_manager_passwords.json.generated /home/airflow/simple_auth_manager_passwords.json.generated; do
|
|
118
|
+
if docker exec airflow test -f "$path" 2>/dev/null; then
|
|
119
|
+
echo "Found password file at $path"
|
|
120
|
+
docker exec airflow cat "$path"
|
|
121
|
+
PASSWORD=$(docker exec airflow cat "$path" | python3 -c "import sys, json; print(json.load(sys.stdin).get('airflow', ''))")
|
|
122
|
+
break
|
|
123
|
+
fi
|
|
124
|
+
done
|
|
125
|
+
|
|
126
|
+
if [ -z "$PASSWORD" ]; then
|
|
127
|
+
echo "ERROR: Could not retrieve password from password file"
|
|
128
|
+
exit 1
|
|
129
|
+
fi
|
|
130
|
+
|
|
131
|
+
echo "password=$PASSWORD" >> $GITHUB_OUTPUT
|
|
132
|
+
echo "Successfully retrieved password for airflow user"
|
|
133
|
+
|
|
134
|
+
- name: Wait for DAGs to load
|
|
135
|
+
run: |
|
|
136
|
+
echo "Waiting for scheduler to parse DAGs..."
|
|
137
|
+
sleep 45
|
|
138
|
+
|
|
139
|
+
- name: Run integration tests
|
|
140
|
+
env:
|
|
141
|
+
TEST_AIRFLOW_URL: http://localhost:8080
|
|
142
|
+
TEST_AIRFLOW_USERNAME: airflow
|
|
143
|
+
TEST_AIRFLOW_PASSWORD: ${{ matrix.api_version == 'v2' && steps.airflow_password.outputs.password || 'airflow' }}
|
|
144
|
+
TEST_API_VERSION: ${{ matrix.api_version }}
|
|
145
|
+
run: cargo test --test '*' -- --test-threads=1
|
|
146
|
+
|
|
147
|
+
- name: Cleanup
|
|
148
|
+
if: always()
|
|
149
|
+
run: docker rm -f airflow || true
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
name: PyPI
|
|
2
|
+
|
|
3
|
+
# Builds platform wheels that ship the `flowrs` binary, so it can be installed
|
|
4
|
+
# with `uv tool install flowrs` / `pipx install flowrs`.
|
|
5
|
+
#
|
|
6
|
+
# Publishes on the same `flowrs-tui-v*` tags that trigger the cargo-dist
|
|
7
|
+
# release workflow, so a release-plz tag ships crates.io, GitHub Releases,
|
|
8
|
+
# Homebrew and PyPI together. The wheel version is read from Cargo.toml, so
|
|
9
|
+
# nothing needs bumping here. The `flowrs-airflow-*` and `flowrs-config-*`
|
|
10
|
+
# library tags are deliberately not matched: only the binary crate is shipped
|
|
11
|
+
# to PyPI.
|
|
12
|
+
#
|
|
13
|
+
# Running this workflow manually builds everything and exercises the PyPI
|
|
14
|
+
# trusted-publishing OIDC exchange in --dry-run mode, without uploading. Use
|
|
15
|
+
# that to validate the publisher setup before the first real release. Only a
|
|
16
|
+
# version tag ever uploads.
|
|
17
|
+
#
|
|
18
|
+
# The wheel matrix mirrors the platforms cargo-dist already releases binaries
|
|
19
|
+
# for (see dist-workspace.toml). Windows, musl and linux aarch64 are left out
|
|
20
|
+
# because flowrs ships no binaries for them today; nothing in the build blocks
|
|
21
|
+
# them, so they can be added here whenever those targets are supported.
|
|
22
|
+
|
|
23
|
+
on:
|
|
24
|
+
push:
|
|
25
|
+
tags:
|
|
26
|
+
- 'flowrs-tui-v[0-9]+.[0-9]+.[0-9]+*'
|
|
27
|
+
# Verify the packaging still builds when it changes, without publishing.
|
|
28
|
+
pull_request:
|
|
29
|
+
paths:
|
|
30
|
+
- pyproject.toml
|
|
31
|
+
- .github/workflows/pypi.yml
|
|
32
|
+
workflow_dispatch:
|
|
33
|
+
|
|
34
|
+
permissions:
|
|
35
|
+
contents: read
|
|
36
|
+
|
|
37
|
+
env:
|
|
38
|
+
CARGO_TERM_COLOR: always
|
|
39
|
+
|
|
40
|
+
jobs:
|
|
41
|
+
linux:
|
|
42
|
+
name: Wheel (manylinux x86_64)
|
|
43
|
+
runs-on: ubuntu-latest
|
|
44
|
+
steps:
|
|
45
|
+
- uses: actions/checkout@v4
|
|
46
|
+
- name: Build wheel
|
|
47
|
+
uses: PyO3/maturin-action@v1
|
|
48
|
+
with:
|
|
49
|
+
target: x86_64
|
|
50
|
+
args: --release --out dist
|
|
51
|
+
# glibc 2.28 (AlmaLinux 8) is still an older baseline than the
|
|
52
|
+
# ubuntu-22.04 the cargo-dist binaries are built on, and the build
|
|
53
|
+
# links no system libraries beyond libc, so the wheel bundles nothing.
|
|
54
|
+
manylinux: '2_28'
|
|
55
|
+
sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
56
|
+
- uses: actions/upload-artifact@v4
|
|
57
|
+
with:
|
|
58
|
+
name: wheels-manylinux-x86_64
|
|
59
|
+
path: dist
|
|
60
|
+
|
|
61
|
+
macos:
|
|
62
|
+
name: Wheel (macOS ${{ matrix.target }})
|
|
63
|
+
runs-on: ${{ matrix.runner }}
|
|
64
|
+
strategy:
|
|
65
|
+
fail-fast: false
|
|
66
|
+
matrix:
|
|
67
|
+
include:
|
|
68
|
+
- runner: macos-latest
|
|
69
|
+
target: aarch64
|
|
70
|
+
- runner: macos-15-intel
|
|
71
|
+
target: x86_64
|
|
72
|
+
steps:
|
|
73
|
+
- uses: actions/checkout@v4
|
|
74
|
+
- name: Build wheel
|
|
75
|
+
uses: PyO3/maturin-action@v1
|
|
76
|
+
with:
|
|
77
|
+
target: ${{ matrix.target }}
|
|
78
|
+
args: --release --out dist
|
|
79
|
+
sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
80
|
+
- uses: actions/upload-artifact@v4
|
|
81
|
+
with:
|
|
82
|
+
name: wheels-macos-${{ matrix.target }}
|
|
83
|
+
path: dist
|
|
84
|
+
|
|
85
|
+
sdist:
|
|
86
|
+
name: Source distribution
|
|
87
|
+
runs-on: ubuntu-latest
|
|
88
|
+
steps:
|
|
89
|
+
- uses: actions/checkout@v4
|
|
90
|
+
- name: Build sdist
|
|
91
|
+
uses: PyO3/maturin-action@v1
|
|
92
|
+
with:
|
|
93
|
+
command: sdist
|
|
94
|
+
args: --out dist
|
|
95
|
+
- uses: actions/upload-artifact@v4
|
|
96
|
+
with:
|
|
97
|
+
name: wheels-sdist
|
|
98
|
+
path: dist
|
|
99
|
+
|
|
100
|
+
smoke-test:
|
|
101
|
+
name: Smoke test (${{ matrix.os }})
|
|
102
|
+
needs: [linux, macos]
|
|
103
|
+
runs-on: ${{ matrix.os }}
|
|
104
|
+
strategy:
|
|
105
|
+
fail-fast: false
|
|
106
|
+
matrix:
|
|
107
|
+
os: [ubuntu-latest, macos-latest]
|
|
108
|
+
env:
|
|
109
|
+
UV_TOOL_BIN_DIR: ${{ github.workspace }}/tool-bin
|
|
110
|
+
steps:
|
|
111
|
+
- uses: actions/download-artifact@v4
|
|
112
|
+
with:
|
|
113
|
+
pattern: wheels-*
|
|
114
|
+
merge-multiple: true
|
|
115
|
+
path: dist
|
|
116
|
+
- uses: astral-sh/setup-uv@v7
|
|
117
|
+
- name: Install from the built wheel and run it
|
|
118
|
+
shell: bash
|
|
119
|
+
# --no-build asserts a matching wheel exists for this platform rather
|
|
120
|
+
# than silently falling back to compiling the sdist.
|
|
121
|
+
run: |
|
|
122
|
+
uv tool install --no-index --no-build --find-links dist flowrs
|
|
123
|
+
"${UV_TOOL_BIN_DIR}/flowrs" --version
|
|
124
|
+
|
|
125
|
+
publish:
|
|
126
|
+
name: Publish to PyPI
|
|
127
|
+
needs: [linux, macos, sdist, smoke-test]
|
|
128
|
+
# Tags upload for real; a manual run only dry-runs (see the step below).
|
|
129
|
+
if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch'
|
|
130
|
+
runs-on: ubuntu-latest
|
|
131
|
+
environment:
|
|
132
|
+
name: pypi
|
|
133
|
+
url: https://pypi.org/p/flowrs
|
|
134
|
+
permissions:
|
|
135
|
+
contents: read
|
|
136
|
+
# Required for PyPI Trusted Publishing (OIDC). No API token needed.
|
|
137
|
+
id-token: write
|
|
138
|
+
steps:
|
|
139
|
+
- uses: actions/download-artifact@v4
|
|
140
|
+
with:
|
|
141
|
+
pattern: wheels-*
|
|
142
|
+
merge-multiple: true
|
|
143
|
+
path: dist
|
|
144
|
+
- uses: astral-sh/setup-uv@v7
|
|
145
|
+
- name: Publish
|
|
146
|
+
# `--trusted-publishing always` fails loudly if the OIDC exchange is
|
|
147
|
+
# not configured, rather than silently falling back to looking for a
|
|
148
|
+
# token. `--check-url` makes a re-run skip already-uploaded files.
|
|
149
|
+
#
|
|
150
|
+
# A manual run adds --dry-run, which still performs the full OIDC
|
|
151
|
+
# exchange but uploads nothing, so the publisher setup can be verified
|
|
152
|
+
# without burning a version number. Uploads are therefore reachable
|
|
153
|
+
# only from a version tag.
|
|
154
|
+
run: >-
|
|
155
|
+
uv publish
|
|
156
|
+
--trusted-publishing always
|
|
157
|
+
--check-url https://pypi.org/simple/flowrs/
|
|
158
|
+
${{ github.event_name == 'workflow_dispatch' && '--dry-run' || '' }}
|
|
159
|
+
'dist/*'
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
name: Release-plz
|
|
2
|
+
|
|
3
|
+
permissions:
|
|
4
|
+
pull-requests: write
|
|
5
|
+
contents: write
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
branches:
|
|
10
|
+
- main
|
|
11
|
+
workflow_dispatch:
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
release-plz-release:
|
|
15
|
+
name: Release-plz release
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- name: Checkout repository
|
|
19
|
+
uses: actions/checkout@v4
|
|
20
|
+
with:
|
|
21
|
+
fetch-depth: 0
|
|
22
|
+
token: ${{ secrets.RELEASE_PLZ_TOKEN }}
|
|
23
|
+
- name: Install Rust toolchain
|
|
24
|
+
uses: dtolnay/rust-toolchain@stable
|
|
25
|
+
- name: Run release-plz
|
|
26
|
+
uses: MarcoIeni/release-plz-action@v0.5
|
|
27
|
+
with:
|
|
28
|
+
command: release
|
|
29
|
+
env:
|
|
30
|
+
GITHUB_TOKEN: ${{ secrets.RELEASE_PLZ_TOKEN }}
|
|
31
|
+
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
|
|
32
|
+
|
|
33
|
+
release-plz-pr:
|
|
34
|
+
name: Release-plz PR
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
needs: release-plz-release
|
|
37
|
+
concurrency:
|
|
38
|
+
group: release-plz-${{ github.ref }}
|
|
39
|
+
cancel-in-progress: false
|
|
40
|
+
steps:
|
|
41
|
+
- name: Checkout repository
|
|
42
|
+
uses: actions/checkout@v4
|
|
43
|
+
with:
|
|
44
|
+
fetch-depth: 0
|
|
45
|
+
token: ${{ secrets.RELEASE_PLZ_TOKEN }}
|
|
46
|
+
- name: Install Rust toolchain
|
|
47
|
+
uses: dtolnay/rust-toolchain@stable
|
|
48
|
+
- name: Run release-plz
|
|
49
|
+
uses: MarcoIeni/release-plz-action@v0.5
|
|
50
|
+
with:
|
|
51
|
+
command: release-pr
|
|
52
|
+
env:
|
|
53
|
+
GITHUB_TOKEN: ${{ secrets.RELEASE_PLZ_TOKEN }}
|
|
54
|
+
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
|