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.

Files changed (281) hide show
  1. flowrs-0.14.1/.coderabbit.yaml +10 -0
  2. flowrs-0.14.1/.gitattributes +2 -0
  3. flowrs-0.14.1/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
  4. flowrs-0.14.1/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. flowrs-0.14.1/.github/dependabot.yml +11 -0
  6. flowrs-0.14.1/.github/workflows/ci.yml +53 -0
  7. flowrs-0.14.1/.github/workflows/integration.yml +149 -0
  8. flowrs-0.14.1/.github/workflows/pypi.yml +159 -0
  9. flowrs-0.14.1/.github/workflows/release-plz.yml +54 -0
  10. flowrs-0.14.1/.github/workflows/release.yml +344 -0
  11. flowrs-0.14.1/.gitignore +20 -0
  12. flowrs-0.14.1/.pre-commit-config.yaml +16 -0
  13. flowrs-0.14.1/CHANGELOG.md +766 -0
  14. flowrs-0.14.1/CLAUDE.md +175 -0
  15. flowrs-0.14.1/CODE_OF_CONDUCT.md +128 -0
  16. flowrs-0.14.1/Cargo.lock +4931 -0
  17. flowrs-0.14.1/Cargo.toml +123 -0
  18. flowrs-0.14.1/LICENSE +21 -0
  19. flowrs-0.14.1/Makefile +22 -0
  20. flowrs-0.14.1/PKG-INFO +101 -0
  21. flowrs-0.14.1/README.md +77 -0
  22. flowrs-0.14.1/clippy.toml +1 -0
  23. flowrs-0.14.1/crates/flowrs-airflow/CHANGELOG.md +89 -0
  24. flowrs-0.14.1/crates/flowrs-airflow/Cargo.toml +38 -0
  25. flowrs-0.14.1/crates/flowrs-airflow/src/auth.rs +95 -0
  26. flowrs-0.14.1/crates/flowrs-airflow/src/client/auth/basic.rs +54 -0
  27. flowrs-0.14.1/crates/flowrs-airflow/src/client/auth/command.rs +157 -0
  28. flowrs-0.14.1/crates/flowrs-airflow/src/client/auth/mod.rs +107 -0
  29. flowrs-0.14.1/crates/flowrs-airflow/src/client/auth/static_token.rs +51 -0
  30. flowrs-0.14.1/crates/flowrs-airflow/src/client/base.rs +74 -0
  31. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/dag.rs +86 -0
  32. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/dagrun.rs +88 -0
  33. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/dagstats.rs +23 -0
  34. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/log.rs +137 -0
  35. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/mod.rs +59 -0
  36. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/dag.rs +52 -0
  37. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/dagrun.rs +35 -0
  38. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/dagstats.rs +19 -0
  39. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/log.rs +8 -0
  40. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/mod.rs +6 -0
  41. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/task.rs +19 -0
  42. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/model/taskinstance.rs +97 -0
  43. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/task.rs +19 -0
  44. flowrs-0.14.1/crates/flowrs-airflow/src/client/v1/taskinstance.rs +189 -0
  45. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/dag.rs +86 -0
  46. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/dagrun.rs +80 -0
  47. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/dagstats.rs +27 -0
  48. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/log.rs +35 -0
  49. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/mod.rs +42 -0
  50. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/dag.rs +90 -0
  51. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/dagrun.rs +54 -0
  52. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/dagstats.rs +19 -0
  53. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/log.rs +56 -0
  54. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/mod.rs +6 -0
  55. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/task.rs +18 -0
  56. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/model/taskinstance.rs +109 -0
  57. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/task.rs +19 -0
  58. flowrs-0.14.1/crates/flowrs-airflow/src/client/v2/taskinstance.rs +186 -0
  59. flowrs-0.14.1/crates/flowrs-airflow/src/client.rs +30 -0
  60. flowrs-0.14.1/crates/flowrs-airflow/src/config.rs +70 -0
  61. flowrs-0.14.1/crates/flowrs-airflow/src/lib.rs +10 -0
  62. flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/astronomer.rs +340 -0
  63. flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/composer/auth.rs +1 -0
  64. flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/composer/client.rs +384 -0
  65. flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/composer/mod.rs +9 -0
  66. flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/composer/provider.rs +53 -0
  67. flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/composer/regions.rs +72 -0
  68. flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/conveyor.rs +245 -0
  69. flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/expand.rs +155 -0
  70. flowrs-0.14.1/crates/flowrs-airflow/src/managed_services/mwaa.rs +296 -0
  71. flowrs-0.14.1/crates/flowrs-airflow/src/managed_services.rs +9 -0
  72. flowrs-0.14.1/crates/flowrs-config/CHANGELOG.md +86 -0
  73. flowrs-0.14.1/crates/flowrs-config/Cargo.toml +21 -0
  74. flowrs-0.14.1/crates/flowrs-config/src/auth.rs +4 -0
  75. flowrs-0.14.1/crates/flowrs-config/src/lib.rs +399 -0
  76. flowrs-0.14.1/crates/flowrs-config/src/paths.rs +94 -0
  77. flowrs-0.14.1/crates/flowrs-config/src/server.rs +4 -0
  78. flowrs-0.14.1/crates/flowrs-config/src/theme.rs +28 -0
  79. flowrs-0.14.1/dist-workspace.toml +23 -0
  80. flowrs-0.14.1/docker-compose.yaml +288 -0
  81. flowrs-0.14.1/docs/client-architecture.md +125 -0
  82. flowrs-0.14.1/docs/plans/2024-12-14-tabs-navigation-design.md +128 -0
  83. flowrs-0.14.1/docs/plans/2025-12-13-xdg-config-design.md +100 -0
  84. flowrs-0.14.1/docs/plans/2025-12-13-xdg-config-implementation.md +685 -0
  85. flowrs-0.14.1/docs/plans/2025-12-14-binary-size-reduction-design.md +75 -0
  86. flowrs-0.14.1/docs/plans/2025-12-14-visual-refresh-design.md +126 -0
  87. flowrs-0.14.1/docs/plans/2025-12-14-visual-selection-design.md +171 -0
  88. flowrs-0.14.1/docs/plans/2025-12-14-visual-selection-implementation.md +750 -0
  89. flowrs-0.14.1/docs/plans/2025-12-18-ci-testing-design.md +121 -0
  90. flowrs-0.14.1/docs/plans/2025-12-18-ci-testing-implementation.md +385 -0
  91. flowrs-0.14.1/docs/plans/2025-12-18-focus-tracking-design.md +104 -0
  92. flowrs-0.14.1/docs/plans/2025-12-20-topological-task-sorting-design.md +169 -0
  93. flowrs-0.14.1/docs/plans/2025-12-20-topological-task-sorting.md +900 -0
  94. flowrs-0.14.1/docs/plans/2025-12-21-filter-state-machine-design.md +333 -0
  95. flowrs-0.14.1/docs/plans/2025-12-21-filter-state-machine-implementation.md +2129 -0
  96. flowrs-0.14.1/docs/plans/2025-12-31-gcp-composer-design.md +180 -0
  97. flowrs-0.14.1/docs/plans/2025-12-31-gcp-composer-implementation.md +668 -0
  98. flowrs-0.14.1/docs/plans/2025-12-31-gcp-composer-terraform-design.md +206 -0
  99. flowrs-0.14.1/image/README/1683789045509.png +3 -0
  100. flowrs-0.14.1/image/rotation/ascii/0.ascii +28 -0
  101. flowrs-0.14.1/image/rotation/ascii/1.ascii +28 -0
  102. flowrs-0.14.1/image/rotation/ascii/10.ascii +28 -0
  103. flowrs-0.14.1/image/rotation/ascii/11.ascii +28 -0
  104. flowrs-0.14.1/image/rotation/ascii/12.ascii +28 -0
  105. flowrs-0.14.1/image/rotation/ascii/13.ascii +28 -0
  106. flowrs-0.14.1/image/rotation/ascii/14.ascii +28 -0
  107. flowrs-0.14.1/image/rotation/ascii/15.ascii +28 -0
  108. flowrs-0.14.1/image/rotation/ascii/16.ascii +28 -0
  109. flowrs-0.14.1/image/rotation/ascii/2.ascii +28 -0
  110. flowrs-0.14.1/image/rotation/ascii/3.ascii +28 -0
  111. flowrs-0.14.1/image/rotation/ascii/4.ascii +28 -0
  112. flowrs-0.14.1/image/rotation/ascii/5.ascii +28 -0
  113. flowrs-0.14.1/image/rotation/ascii/6.ascii +28 -0
  114. flowrs-0.14.1/image/rotation/ascii/7.ascii +28 -0
  115. flowrs-0.14.1/image/rotation/ascii/8.ascii +28 -0
  116. flowrs-0.14.1/image/rotation/ascii/9.ascii +28 -0
  117. flowrs-0.14.1/image/rotation/png/0.png +3 -0
  118. flowrs-0.14.1/image/rotation/png/1.png +3 -0
  119. flowrs-0.14.1/image/rotation/png/10.png +3 -0
  120. flowrs-0.14.1/image/rotation/png/11.png +3 -0
  121. flowrs-0.14.1/image/rotation/png/12.png +3 -0
  122. flowrs-0.14.1/image/rotation/png/13.png +3 -0
  123. flowrs-0.14.1/image/rotation/png/14.png +3 -0
  124. flowrs-0.14.1/image/rotation/png/15.png +3 -0
  125. flowrs-0.14.1/image/rotation/png/16.png +3 -0
  126. flowrs-0.14.1/image/rotation/png/2.png +3 -0
  127. flowrs-0.14.1/image/rotation/png/3.png +3 -0
  128. flowrs-0.14.1/image/rotation/png/4.png +3 -0
  129. flowrs-0.14.1/image/rotation/png/5.png +3 -0
  130. flowrs-0.14.1/image/rotation/png/6.png +3 -0
  131. flowrs-0.14.1/image/rotation/png/7.png +3 -0
  132. flowrs-0.14.1/image/rotation/png/8.png +3 -0
  133. flowrs-0.14.1/image/rotation/png/9.png +3 -0
  134. flowrs-0.14.1/infrastructure/README.md +92 -0
  135. flowrs-0.14.1/infrastructure/astronomer/README.md +49 -0
  136. flowrs-0.14.1/infrastructure/aws/.gitignore +27 -0
  137. flowrs-0.14.1/infrastructure/aws/README.md +187 -0
  138. flowrs-0.14.1/infrastructure/aws/main.tf +382 -0
  139. flowrs-0.14.1/infrastructure/aws/outputs.tf +39 -0
  140. flowrs-0.14.1/infrastructure/aws/terraform.tfvars.example +20 -0
  141. flowrs-0.14.1/infrastructure/aws/variables.tf +41 -0
  142. flowrs-0.14.1/infrastructure/azure/README.md +34 -0
  143. flowrs-0.14.1/infrastructure/gcp/.gitignore +27 -0
  144. flowrs-0.14.1/infrastructure/gcp/README.md +136 -0
  145. flowrs-0.14.1/infrastructure/gcp/composer.tf +90 -0
  146. flowrs-0.14.1/infrastructure/gcp/iam.tf +14 -0
  147. flowrs-0.14.1/infrastructure/gcp/network.tf +30 -0
  148. flowrs-0.14.1/infrastructure/gcp/outputs.tf +24 -0
  149. flowrs-0.14.1/infrastructure/gcp/provider.tf +31 -0
  150. flowrs-0.14.1/infrastructure/gcp/terraform.tfvars.example +7 -0
  151. flowrs-0.14.1/infrastructure/gcp/variables.tf +23 -0
  152. flowrs-0.14.1/pyproject.toml +39 -0
  153. flowrs-0.14.1/release-plz.toml +33 -0
  154. flowrs-0.14.1/src/airflow/client/convert_v1.rs +183 -0
  155. flowrs-0.14.1/src/airflow/client/convert_v2.rs +179 -0
  156. flowrs-0.14.1/src/airflow/client/impls/dag_ops.rs +45 -0
  157. flowrs-0.14.1/src/airflow/client/impls/dagrun_ops.rs +71 -0
  158. flowrs-0.14.1/src/airflow/client/impls/dagstats_ops.rs +24 -0
  159. flowrs-0.14.1/src/airflow/client/impls/log_ops.rs +34 -0
  160. flowrs-0.14.1/src/airflow/client/impls/mod.rs +6 -0
  161. flowrs-0.14.1/src/airflow/client/impls/task_ops.rs +24 -0
  162. flowrs-0.14.1/src/airflow/client/impls/taskinstance_ops.rs +116 -0
  163. flowrs-0.14.1/src/airflow/client/mod.rs +48 -0
  164. flowrs-0.14.1/src/airflow/client/open_url.rs +102 -0
  165. flowrs-0.14.1/src/airflow/graph.rs +317 -0
  166. flowrs-0.14.1/src/airflow/mod.rs +4 -0
  167. flowrs-0.14.1/src/airflow/model/common/dag.rs +44 -0
  168. flowrs-0.14.1/src/airflow/model/common/dagrun.rs +130 -0
  169. flowrs-0.14.1/src/airflow/model/common/dagstats.rs +22 -0
  170. flowrs-0.14.1/src/airflow/model/common/duration.rs +154 -0
  171. flowrs-0.14.1/src/airflow/model/common/gantt.rs +259 -0
  172. flowrs-0.14.1/src/airflow/model/common/log.rs +8 -0
  173. flowrs-0.14.1/src/airflow/model/common/mod.rs +27 -0
  174. flowrs-0.14.1/src/airflow/model/common/open_item.rs +24 -0
  175. flowrs-0.14.1/src/airflow/model/common/task.rs +13 -0
  176. flowrs-0.14.1/src/airflow/model/common/taskinstance.rs +129 -0
  177. flowrs-0.14.1/src/airflow/model/mod.rs +2 -0
  178. flowrs-0.14.1/src/airflow/model/newtype_id.rs +94 -0
  179. flowrs-0.14.1/src/airflow/traits/dag.rs +20 -0
  180. flowrs-0.14.1/src/airflow/traits/dagrun.rs +29 -0
  181. flowrs-0.14.1/src/airflow/traits/dagstats.rs +11 -0
  182. flowrs-0.14.1/src/airflow/traits/log.rs +17 -0
  183. flowrs-0.14.1/src/airflow/traits/mod.rs +42 -0
  184. flowrs-0.14.1/src/airflow/traits/task.rs +11 -0
  185. flowrs-0.14.1/src/airflow/traits/taskinstance.rs +41 -0
  186. flowrs-0.14.1/src/app/events/custom.rs +22 -0
  187. flowrs-0.14.1/src/app/events/generator.rs +60 -0
  188. flowrs-0.14.1/src/app/events.rs +2 -0
  189. flowrs-0.14.1/src/app/model/config/commands.rs +16 -0
  190. flowrs-0.14.1/src/app/model/config/mod.rs +170 -0
  191. flowrs-0.14.1/src/app/model/dagruns/commands.rs +43 -0
  192. flowrs-0.14.1/src/app/model/dagruns/dag_code_view/mod.rs +92 -0
  193. flowrs-0.14.1/src/app/model/dagruns/dag_code_view/render.rs +44 -0
  194. flowrs-0.14.1/src/app/model/dagruns/mod.rs +479 -0
  195. flowrs-0.14.1/src/app/model/dagruns/popup/clear.rs +117 -0
  196. flowrs-0.14.1/src/app/model/dagruns/popup/mark.rs +202 -0
  197. flowrs-0.14.1/src/app/model/dagruns/popup/mod.rs +17 -0
  198. flowrs-0.14.1/src/app/model/dagruns/popup/trigger/mod.rs +328 -0
  199. flowrs-0.14.1/src/app/model/dagruns/popup/trigger/params.rs +209 -0
  200. flowrs-0.14.1/src/app/model/dagruns/popup/trigger/render.rs +268 -0
  201. flowrs-0.14.1/src/app/model/dagruns/popup/trigger/table.rs +190 -0
  202. flowrs-0.14.1/src/app/model/dagruns/popup/trigger/text.rs +124 -0
  203. flowrs-0.14.1/src/app/model/dagruns/render.rs +143 -0
  204. flowrs-0.14.1/src/app/model/dags/commands.rs +28 -0
  205. flowrs-0.14.1/src/app/model/dags/mod.rs +207 -0
  206. flowrs-0.14.1/src/app/model/dags/popup/mod.rs +6 -0
  207. flowrs-0.14.1/src/app/model/dags/render.rs +156 -0
  208. flowrs-0.14.1/src/app/model/filter/autocomplete.rs +220 -0
  209. flowrs-0.14.1/src/app/model/filter/condition.rs +66 -0
  210. flowrs-0.14.1/src/app/model/filter/filterable.rs +165 -0
  211. flowrs-0.14.1/src/app/model/filter/impls.rs +109 -0
  212. flowrs-0.14.1/src/app/model/filter/matching.rs +165 -0
  213. flowrs-0.14.1/src/app/model/filter/mod.rs +22 -0
  214. flowrs-0.14.1/src/app/model/filter/state.rs +174 -0
  215. flowrs-0.14.1/src/app/model/filter/state_machine.rs +812 -0
  216. flowrs-0.14.1/src/app/model/filter/widget.rs +229 -0
  217. flowrs-0.14.1/src/app/model/filterable_table/mod.rs +454 -0
  218. flowrs-0.14.1/src/app/model/filterable_table/render.rs +86 -0
  219. flowrs-0.14.1/src/app/model/logs/mod.rs +524 -0
  220. flowrs-0.14.1/src/app/model/logs/render.rs +342 -0
  221. flowrs-0.14.1/src/app/model/logs/search.rs +188 -0
  222. flowrs-0.14.1/src/app/model/popup/commands_help/mod.rs +75 -0
  223. flowrs-0.14.1/src/app/model/popup/commands_help/render.rs +43 -0
  224. flowrs-0.14.1/src/app/model/popup/error.rs +76 -0
  225. flowrs-0.14.1/src/app/model/popup/mod.rs +196 -0
  226. flowrs-0.14.1/src/app/model/popup/warning.rs +68 -0
  227. flowrs-0.14.1/src/app/model/taskinstances/commands.rs +39 -0
  228. flowrs-0.14.1/src/app/model/taskinstances/mod.rs +243 -0
  229. flowrs-0.14.1/src/app/model/taskinstances/popup/clear.rs +73 -0
  230. flowrs-0.14.1/src/app/model/taskinstances/popup/graph.rs +224 -0
  231. flowrs-0.14.1/src/app/model/taskinstances/popup/mark.rs +102 -0
  232. flowrs-0.14.1/src/app/model/taskinstances/popup/mod.rs +15 -0
  233. flowrs-0.14.1/src/app/model/taskinstances/popup/render.rs +290 -0
  234. flowrs-0.14.1/src/app/model/taskinstances/render.rs +107 -0
  235. flowrs-0.14.1/src/app/model.rs +160 -0
  236. flowrs-0.14.1/src/app/state/breadcrumb.rs +74 -0
  237. flowrs-0.14.1/src/app/state/context.rs +55 -0
  238. flowrs-0.14.1/src/app/state/environment_state.rs +187 -0
  239. flowrs-0.14.1/src/app/state/mod.rs +160 -0
  240. flowrs-0.14.1/src/app/state/navigation.rs +85 -0
  241. flowrs-0.14.1/src/app/state/sync.rs +94 -0
  242. flowrs-0.14.1/src/app/worker/browser.rs +52 -0
  243. flowrs-0.14.1/src/app/worker/config.rs +66 -0
  244. flowrs-0.14.1/src/app/worker/dagruns.rs +102 -0
  245. flowrs-0.14.1/src/app/worker/dags.rs +213 -0
  246. flowrs-0.14.1/src/app/worker/logs.rs +62 -0
  247. flowrs-0.14.1/src/app/worker/mod.rs +317 -0
  248. flowrs-0.14.1/src/app/worker/taskinstances.rs +120 -0
  249. flowrs-0.14.1/src/app/worker/tasks.rs +72 -0
  250. flowrs-0.14.1/src/app.rs +166 -0
  251. flowrs-0.14.1/src/commands/config/add.rs +101 -0
  252. flowrs-0.14.1/src/commands/config/list.rs +27 -0
  253. flowrs-0.14.1/src/commands/config/managed_services.rs +151 -0
  254. flowrs-0.14.1/src/commands/config/model.rs +195 -0
  255. flowrs-0.14.1/src/commands/config/remove.rs +34 -0
  256. flowrs-0.14.1/src/commands/config/update.rs +129 -0
  257. flowrs-0.14.1/src/commands/config.rs +6 -0
  258. flowrs-0.14.1/src/commands/run.rs +133 -0
  259. flowrs-0.14.1/src/commands.rs +2 -0
  260. flowrs-0.14.1/src/lib.rs +12 -0
  261. flowrs-0.14.1/src/main.rs +52 -0
  262. flowrs-0.14.1/src/ui/common.rs +38 -0
  263. flowrs-0.14.1/src/ui/constants.rs +88 -0
  264. flowrs-0.14.1/src/ui/gantt.rs +307 -0
  265. flowrs-0.14.1/src/ui/init_screen.rs +36 -0
  266. flowrs-0.14.1/src/ui/logo/logo.ascii +18 -0
  267. flowrs-0.14.1/src/ui/tabs.rs +164 -0
  268. flowrs-0.14.1/src/ui/theme/mod.rs +131 -0
  269. flowrs-0.14.1/src/ui/theme/presets/catppuccin.rs +136 -0
  270. flowrs-0.14.1/src/ui/theme/presets/dark.rs +38 -0
  271. flowrs-0.14.1/src/ui/theme/presets/light.rs +38 -0
  272. flowrs-0.14.1/src/ui/theme/presets/mod.rs +89 -0
  273. flowrs-0.14.1/src/ui.rs +135 -0
  274. flowrs-0.14.1/tests/common/mod.rs +103 -0
  275. flowrs-0.14.1/tests/managed_services_test.rs +139 -0
  276. flowrs-0.14.1/tests/v1_api_test.rs +98 -0
  277. flowrs-0.14.1/tests/v2_api_test.rs +147 -0
  278. flowrs-0.14.1/vhs/add_config.gif +3 -0
  279. flowrs-0.14.1/vhs/add_config.tape +30 -0
  280. flowrs-0.14.1/vhs/flowrs.gif +3 -0
  281. flowrs-0.14.1/vhs/flowrs.tape +45 -0
@@ -0,0 +1,10 @@
1
+ reviews:
2
+ path_filters:
3
+ - "!**/*.lock"
4
+ - "!Cargo.toml"
5
+ - "!**/Cargo.toml"
6
+ - "!CLAUDE.md"
7
+ - "!.gitignore"
8
+ - "!release-plz.toml"
9
+ - "!.github/**"
10
+ - "!docs/**"
@@ -0,0 +1,2 @@
1
+ *.gif filter=lfs diff=lfs merge=lfs -text
2
+ *.png filter=lfs diff=lfs merge=lfs -text
@@ -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 }}