py-data-engine 0.3.10__tar.gz → 0.3.11__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 (402) hide show
  1. {py_data_engine-0.3.10/src/py_data_engine.egg-info → py_data_engine-0.3.11}/PKG-INFO +4 -8
  2. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/README.md +3 -7
  3. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/pyproject.toml +0 -3
  4. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/setup.py +1 -32
  5. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/application/control.py +9 -6
  6. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/application/runtime.py +10 -2
  7. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/authoring/flow.py +6 -1
  8. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/core/flow.py +43 -1
  9. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/core/primitives.py +119 -12
  10. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/authoring/flow.html +7 -2
  11. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/core/flow.html +47 -2
  12. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/core/model.html +1 -1
  13. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/core/primitives.html +133 -14
  14. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/helpers/duckdb/_dimensions.html +1 -1
  15. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/helpers/duckdb/_maintenance.html +1 -1
  16. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/helpers/duckdb/_read.html +1 -1
  17. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/helpers/duckdb/_replace.html +1 -1
  18. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/helpers/excel.html +2 -2
  19. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/helpers/polars.html +2 -2
  20. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/helpers/schema.html +1 -1
  21. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/hosts/scheduler.html +1 -1
  22. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/runtime/engine.html +5 -1
  23. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/runtime/execution/grouped.html +1 -1
  24. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/runtime/execution/single.html +16 -2
  25. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/runtime/file_watch.html +1 -1
  26. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/runtime/result_cleanup.html +1 -1
  27. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/runtime/stop.html +1 -1
  28. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/daemon.html +1 -1
  29. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/daemon_state.html +1 -1
  30. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/flow_catalog.html +2 -1
  31. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/flow_execution.html +1 -1
  32. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/ledger.html +1 -1
  33. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/logs.html +1 -1
  34. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/runtime_binding.html +1 -1
  35. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/runtime_execution.html +9 -1
  36. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/runtime_history.html +1 -1
  37. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/settings.html +1 -1
  38. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/shared_state.html +1 -1
  39. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/theme.html +1 -1
  40. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/workspace_provisioning.html +3 -1
  41. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/data_engine/services/workspaces.html +1 -1
  42. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_modules/index.html +1 -1
  43. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/app-runtime-and-workspaces.md.txt +2 -2
  44. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/flow-context.md.txt +66 -1
  45. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/flow-methods.md.txt +60 -0
  46. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/getting-started.md.txt +4 -1
  47. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/project-inventory.md.txt +68 -95
  48. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/project-map.md.txt +12 -12
  49. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/documentation_options.js +1 -1
  50. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/api.html +186 -14
  51. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/genindex.html +44 -5
  52. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/app-runtime-and-workspaces.html +3 -3
  53. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/authoring-flow-modules.html +1 -1
  54. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/configuring-flows.html +1 -1
  55. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/core-concepts.html +1 -1
  56. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/database-methods.html +1 -1
  57. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/duckdb-helpers.html +1 -1
  58. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/excel-helpers.html +1 -1
  59. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/flow-context.html +63 -1
  60. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/flow-methods.html +58 -1
  61. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/getting-started.html +5 -2
  62. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/polars-helpers.html +1 -1
  63. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/project-inventory.html +102 -192
  64. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/project-map.html +24 -24
  65. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/guides/recipes.html +1 -1
  66. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/index.html +4 -1
  67. py_data_engine-0.3.11/src/data_engine/docs/html/objects.inv +0 -0
  68. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/py-modindex.html +1 -1
  69. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/search.html +1 -1
  70. py_data_engine-0.3.11/src/data_engine/docs/html/searchindex.js +1 -0
  71. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/app-runtime-and-workspaces.md +2 -2
  72. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/flow-context.md +66 -1
  73. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/flow-methods.md +60 -0
  74. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/getting-started.md +4 -1
  75. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/project-inventory.md +68 -95
  76. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/project-map.md +12 -12
  77. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/catalog.py +2 -0
  78. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/helpers/excel.py +1 -1
  79. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/helpers/polars.py +1 -1
  80. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/client.py +10 -2
  81. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/commands.py +2 -0
  82. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/runtime_commands.py +24 -8
  83. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/platform/identity.py +1 -1
  84. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/platform/paths.py +6 -5
  85. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/platform/processes.py +8 -3
  86. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/platform/workspace_models.py +2 -0
  87. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/engine.py +4 -0
  88. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/execution/context.py +18 -2
  89. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/execution/single.py +15 -1
  90. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/flow_catalog.py +1 -0
  91. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/runtime_execution.py +8 -0
  92. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/workspace_provisioning.py +2 -0
  93. py_data_engine-0.3.11/src/data_engine/ui/cli/__init__.py +31 -0
  94. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/cli/app.py +5 -5
  95. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/cli/commands_doctor.py +1 -3
  96. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/cli/commands_start.py +0 -48
  97. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/cli/commands_workspace.py +2 -0
  98. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/cli/parser.py +2 -6
  99. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/controllers/runtime.py +9 -0
  100. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/dialogs/__init__.py +2 -0
  101. py_data_engine-0.3.11/src/data_engine/ui/gui/dialogs/inputs.py +110 -0
  102. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/views/models.py +3 -0
  103. {py_data_engine-0.3.10 → py_data_engine-0.3.11/src/py_data_engine.egg-info}/PKG-INFO +4 -8
  104. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/py_data_engine.egg-info/SOURCES.txt +1 -7
  105. py_data_engine-0.3.10/src/data_engine/docs/html/objects.inv +0 -0
  106. py_data_engine-0.3.10/src/data_engine/docs/html/searchindex.js +0 -1
  107. py_data_engine-0.3.10/src/data_engine/ui/cli/__init__.py +0 -19
  108. py_data_engine-0.3.10/src/data_engine/ui/egui/__init__.py +0 -51
  109. py_data_engine-0.3.10/src/data_engine/ui/egui/_data_engine_egui.pyd +0 -0
  110. py_data_engine-0.3.10/src/data_engine/ui/egui/app.py +0 -3
  111. py_data_engine-0.3.10/src/data_engine/ui/egui/bootstrap.py +0 -47
  112. py_data_engine-0.3.10/src/data_engine/ui/egui/home_state.py +0 -392
  113. py_data_engine-0.3.10/src/data_engine/ui/egui/launcher.py +0 -29
  114. py_data_engine-0.3.10/src/data_engine/ui/egui/native.py +0 -45
  115. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/LICENSE +0 -0
  116. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/MANIFEST.in +0 -0
  117. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/setup.cfg +0 -0
  118. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/__init__.py +0 -0
  119. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/application/__init__.py +0 -0
  120. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/application/actions.py +0 -0
  121. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/application/catalog.py +0 -0
  122. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/application/details.py +0 -0
  123. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/application/workspace.py +0 -0
  124. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/authoring/__init__.py +0 -0
  125. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/authoring/services.py +0 -0
  126. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/core/__init__.py +0 -0
  127. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/core/helpers.py +0 -0
  128. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/core/model.py +0 -0
  129. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/devtools/__init__.py +0 -0
  130. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/devtools/project_ast_map.py +0 -0
  131. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/devtools/smoke_data.py +0 -0
  132. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/__init__.py +0 -0
  133. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/api.rst.txt +0 -0
  134. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/authoring-flow-modules.md.txt +0 -0
  135. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/configuring-flows.md.txt +0 -0
  136. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/core-concepts.md.txt +0 -0
  137. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/database-methods.md.txt +0 -0
  138. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/duckdb-helpers.md.txt +0 -0
  139. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/excel-helpers.md.txt +0 -0
  140. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/polars-helpers.md.txt +0 -0
  141. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/guides/recipes.md.txt +0 -0
  142. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_sources/index.rst.txt +0 -0
  143. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  144. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/base-stemmer.js +0 -0
  145. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/basic.css +0 -0
  146. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/badge_only.css +0 -0
  147. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  148. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  149. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  150. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  151. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  152. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  153. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  154. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  155. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  156. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  157. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  158. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/lato-bold.woff +0 -0
  159. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/lato-bold.woff2 +0 -0
  160. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  161. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  162. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/lato-normal.woff +0 -0
  163. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/fonts/lato-normal.woff2 +0 -0
  164. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/css/theme.css +0 -0
  165. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/custom.css +0 -0
  166. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/doctools.js +0 -0
  167. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/english-stemmer.js +0 -0
  168. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/file.png +0 -0
  169. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-bold.eot +0 -0
  170. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  171. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-bold.woff +0 -0
  172. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  173. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  174. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  175. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  176. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  177. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-italic.eot +0 -0
  178. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  179. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-italic.woff +0 -0
  180. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  181. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-regular.eot +0 -0
  182. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  183. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-regular.woff +0 -0
  184. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  185. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  186. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  187. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  188. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  189. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  190. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  191. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  192. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  193. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/jquery.js +0 -0
  194. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/js/badge_only.js +0 -0
  195. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/js/theme.js +0 -0
  196. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/js/versions.js +0 -0
  197. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/language_data.js +0 -0
  198. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/minus.png +0 -0
  199. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/plus.png +0 -0
  200. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/pygments.css +0 -0
  201. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/searchtools.js +0 -0
  202. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/html/_static/sphinx_highlight.js +0 -0
  203. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/_static/custom.css +0 -0
  204. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/api.rst +0 -0
  205. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/conf.py +0 -0
  206. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/authoring-flow-modules.md +0 -0
  207. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/configuring-flows.md +0 -0
  208. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/core-concepts.md +0 -0
  209. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/database-methods.md +0 -0
  210. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/duckdb-helpers.md +0 -0
  211. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/excel-helpers.md +0 -0
  212. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/polars-helpers.md +0 -0
  213. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/guides/recipes.md +0 -0
  214. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/docs/sphinx_source/index.rst +0 -0
  215. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/__init__.py +0 -0
  216. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/actions.py +0 -0
  217. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/debug_artifacts.py +0 -0
  218. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/details.py +0 -0
  219. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/diagnostics.py +0 -0
  220. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/errors.py +0 -0
  221. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/inspection.py +0 -0
  222. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/logs.py +0 -0
  223. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/operations.py +0 -0
  224. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/operator.py +0 -0
  225. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/runs.py +0 -0
  226. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/runtime.py +0 -0
  227. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/source_state.py +0 -0
  228. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/support.py +0 -0
  229. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/time.py +0 -0
  230. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/domain/workspace.py +0 -0
  231. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/flow_modules/__init__.py +0 -0
  232. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/flow_modules/flow_module_compiler.py +0 -0
  233. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/flow_modules/flow_module_loader.py +0 -0
  234. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/helpers/__init__.py +0 -0
  235. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/helpers/duckdb/__init__.py +0 -0
  236. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/helpers/duckdb/_common.py +0 -0
  237. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/helpers/duckdb/_dimensions.py +0 -0
  238. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/helpers/duckdb/_maintenance.py +0 -0
  239. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/helpers/duckdb/_read.py +0 -0
  240. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/helpers/duckdb/_replace.py +0 -0
  241. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/helpers/schema.py +0 -0
  242. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/__init__.py +0 -0
  243. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/__init__.py +0 -0
  244. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/app.py +0 -0
  245. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/bootstrap.py +0 -0
  246. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/composition.py +0 -0
  247. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/constants.py +0 -0
  248. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/entrypoints.py +0 -0
  249. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/lifecycle.py +0 -0
  250. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/manager.py +0 -0
  251. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/ownership.py +0 -0
  252. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/runtime_control.py +0 -0
  253. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/runtime_events.py +0 -0
  254. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/runtime_ledger.py +0 -0
  255. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/server.py +0 -0
  256. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/shared_state.py +0 -0
  257. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/daemon/state_sync.py +0 -0
  258. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/hosts/scheduler.py +0 -0
  259. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/platform/__init__.py +0 -0
  260. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/platform/instrumentation.py +0 -0
  261. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/platform/interpreters.py +0 -0
  262. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/platform/local_settings.py +0 -0
  263. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/platform/theme.py +0 -0
  264. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/platform/workspace_policy.py +0 -0
  265. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/__init__.py +0 -0
  266. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/execution/__init__.py +0 -0
  267. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/execution/app.py +0 -0
  268. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/execution/continuous.py +0 -0
  269. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/execution/grouped.py +0 -0
  270. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/execution/logging.py +0 -0
  271. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/execution/polling.py +0 -0
  272. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/execution/runner.py +0 -0
  273. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/file_watch.py +0 -0
  274. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/ledger_models.py +0 -0
  275. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/result_cleanup.py +0 -0
  276. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/runtime_cache_store.py +0 -0
  277. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/runtime_control_store.py +0 -0
  278. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/runtime_db.py +0 -0
  279. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/shared_state.py +0 -0
  280. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/sqlite_store.py +0 -0
  281. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/runtime/stop.py +0 -0
  282. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/__init__.py +0 -0
  283. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/daemon.py +0 -0
  284. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/daemon_state.py +0 -0
  285. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/debug_artifacts.py +0 -0
  286. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/flow_execution.py +0 -0
  287. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/ledger.py +0 -0
  288. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/logs.py +0 -0
  289. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/operator_commands.py +0 -0
  290. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/operator_queries.py +0 -0
  291. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/reset.py +0 -0
  292. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/runtime_binding.py +0 -0
  293. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/runtime_history.py +0 -0
  294. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/runtime_io.py +0 -0
  295. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/runtime_ports.py +0 -0
  296. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/runtime_state.py +0 -0
  297. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/settings.py +0 -0
  298. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/shared_state.py +0 -0
  299. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/theme.py +0 -0
  300. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/workspace_io.py +0 -0
  301. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/services/workspaces.py +0 -0
  302. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/__init__.py +0 -0
  303. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/cli/commands_run.py +0 -0
  304. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/cli/dependencies.py +0 -0
  305. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/__init__.py +0 -0
  306. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/app.py +0 -0
  307. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/app_binding.py +0 -0
  308. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/bootstrap.py +0 -0
  309. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/cache_models.py +0 -0
  310. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/control_support.py +0 -0
  311. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/controllers/__init__.py +0 -0
  312. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/controllers/flows.py +0 -0
  313. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/dialogs/messages.py +0 -0
  314. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/dialogs/previews.py +0 -0
  315. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/helpers/__init__.py +0 -0
  316. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/helpers/inspection.py +0 -0
  317. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/helpers/lifecycle.py +0 -0
  318. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/helpers/scroll.py +0 -0
  319. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/helpers/theming.py +0 -0
  320. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/check-mark-dark.svg +0 -0
  321. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/check-mark-light.svg +0 -0
  322. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/dark_light.svg +0 -0
  323. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/dataframe.svg +0 -0
  324. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/debug.svg +0 -0
  325. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/documentation.svg +0 -0
  326. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/down-chevron-dark.svg +0 -0
  327. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/down-chevron-light.svg +0 -0
  328. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/failed.svg +0 -0
  329. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/group.svg +0 -0
  330. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/home.svg +0 -0
  331. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/manual.svg +0 -0
  332. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/poll.svg +0 -0
  333. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/schedule.svg +0 -0
  334. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/select-all-all.svg +0 -0
  335. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/select-all-none.svg +0 -0
  336. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/select-all-partial.svg +0 -0
  337. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/settings.svg +0 -0
  338. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/sort-ascending.svg +0 -0
  339. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/sort-descending.svg +0 -0
  340. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/started.svg +0 -0
  341. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/success.svg +0 -0
  342. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/up-chevron-dark.svg +0 -0
  343. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/up-chevron-light.svg +0 -0
  344. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons/view-log.svg +0 -0
  345. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/icons.py +0 -0
  346. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/launcher.py +0 -0
  347. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/presenters/__init__.py +0 -0
  348. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/presenters/dataframes.py +0 -0
  349. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/presenters/debug.py +0 -0
  350. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/presenters/docs.py +0 -0
  351. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/presenters/logs.py +0 -0
  352. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/presenters/runtime_projection.py +0 -0
  353. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/presenters/sidebar.py +0 -0
  354. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/presenters/steps.py +0 -0
  355. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/presenters/workspace.py +0 -0
  356. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/presenters/workspace_binding.py +0 -0
  357. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/presenters/workspace_settings.py +0 -0
  358. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/preview_models.py +0 -0
  359. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/render_support.py +0 -0
  360. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/rendering/__init__.py +0 -0
  361. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/rendering/artifacts.py +0 -0
  362. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/rendering/icons.py +0 -0
  363. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/rendering/preview_filters.py +0 -0
  364. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/runtime.py +0 -0
  365. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/state_support.py +0 -0
  366. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/support.py +0 -0
  367. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/surface.py +0 -0
  368. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/theme.py +0 -0
  369. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/widgets/__init__.py +0 -0
  370. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/widgets/config.py +0 -0
  371. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/widgets/log_list.py +0 -0
  372. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/widgets/logs.py +0 -0
  373. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/widgets/panels.py +0 -0
  374. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/widgets/sidebar.py +0 -0
  375. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/gui/widgets/steps.py +0 -0
  376. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/tui/__init__.py +0 -0
  377. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/tui/app.py +0 -0
  378. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/tui/app_binding.py +0 -0
  379. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/tui/bootstrap.py +0 -0
  380. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/tui/controllers/__init__.py +0 -0
  381. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/tui/controllers/flows.py +0 -0
  382. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/tui/controllers/runtime.py +0 -0
  383. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/tui/runtime.py +0 -0
  384. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/tui/state_support.py +0 -0
  385. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/tui/support.py +0 -0
  386. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/tui/theme.py +0 -0
  387. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/ui/tui/widgets.py +0 -0
  388. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/views/__init__.py +0 -0
  389. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/views/actions.py +0 -0
  390. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/views/artifacts.py +0 -0
  391. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/views/flow_display.py +0 -0
  392. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/views/logs.py +0 -0
  393. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/views/presentation.py +0 -0
  394. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/views/runs.py +0 -0
  395. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/views/selection.py +0 -0
  396. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/views/state.py +0 -0
  397. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/views/status.py +0 -0
  398. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/data_engine/views/text.py +0 -0
  399. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/py_data_engine.egg-info/dependency_links.txt +0 -0
  400. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/py_data_engine.egg-info/entry_points.txt +0 -0
  401. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/py_data_engine.egg-info/requires.txt +0 -0
  402. {py_data_engine-0.3.10 → py_data_engine-0.3.11}/src/py_data_engine.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: py-data-engine
3
- Version: 0.3.10
3
+ Version: 0.3.11
4
4
  Summary: GUI orchestrator for python-based dataframe transform pipelines.
5
5
  Author: Data Engine contributors
6
6
  License-Expression: MIT
@@ -79,7 +79,6 @@ It provides:
79
79
  - a workspace-based runtime for authored flows
80
80
  - a desktop GUI for operators
81
81
  - a terminal UI for headless/local operation
82
- - an experimental Rust-backed `egui` surface
83
82
  - parquet-first inspect/debug tooling for dataframe outputs
84
83
 
85
84
  Flows are plain Python modules that declare how source files, settings workbooks, schedules, and manual runs should move through Polars, DuckDB, and file outputs.
@@ -153,12 +152,6 @@ Desktop GUI:
153
152
  data-engine start gui
154
153
  ```
155
154
 
156
- Experimental Rust `egui` surface:
157
-
158
- ```bash
159
- data-engine start egui
160
- ```
161
-
162
155
  Terminal UI:
163
156
 
164
157
  ```bash
@@ -307,6 +300,7 @@ def build():
307
300
  - `.watch(mode="schedule", time="HH:MM", source=None, run_as="individual" | "batch")`
308
301
  - `.watch(mode="schedule", time=["08:15", "14:45"], source=..., run_as="individual" | "batch")`
309
302
  - `.mirror(root=...)`
303
+ - `.date_range_input(name="period", label="Reporting Period")` for manual-only pre-run start/end date selection
310
304
  - `.step(fn, use=None, save_as=None, label=None)`
311
305
  - `.collect(extensions, root=None, recursive=False, use=None, save_as=None, label=None)`
312
306
  - `.map(fn, use=None, save_as=None, label=None)`
@@ -329,6 +323,8 @@ def build():
329
323
  - `context.current`
330
324
  - `context.objects`
331
325
  - `context.metadata`
326
+ - `context.database("analytics.duckdb")`
327
+ - `context.template("reports/base.xlsx")`
332
328
  - `context.source_metadata()`
333
329
  - `context.debug`
334
330
 
@@ -7,7 +7,6 @@ It provides:
7
7
  - a workspace-based runtime for authored flows
8
8
  - a desktop GUI for operators
9
9
  - a terminal UI for headless/local operation
10
- - an experimental Rust-backed `egui` surface
11
10
  - parquet-first inspect/debug tooling for dataframe outputs
12
11
 
13
12
  Flows are plain Python modules that declare how source files, settings workbooks, schedules, and manual runs should move through Polars, DuckDB, and file outputs.
@@ -81,12 +80,6 @@ Desktop GUI:
81
80
  data-engine start gui
82
81
  ```
83
82
 
84
- Experimental Rust `egui` surface:
85
-
86
- ```bash
87
- data-engine start egui
88
- ```
89
-
90
83
  Terminal UI:
91
84
 
92
85
  ```bash
@@ -235,6 +228,7 @@ def build():
235
228
  - `.watch(mode="schedule", time="HH:MM", source=None, run_as="individual" | "batch")`
236
229
  - `.watch(mode="schedule", time=["08:15", "14:45"], source=..., run_as="individual" | "batch")`
237
230
  - `.mirror(root=...)`
231
+ - `.date_range_input(name="period", label="Reporting Period")` for manual-only pre-run start/end date selection
238
232
  - `.step(fn, use=None, save_as=None, label=None)`
239
233
  - `.collect(extensions, root=None, recursive=False, use=None, save_as=None, label=None)`
240
234
  - `.map(fn, use=None, save_as=None, label=None)`
@@ -257,6 +251,8 @@ def build():
257
251
  - `context.current`
258
252
  - `context.objects`
259
253
  - `context.metadata`
254
+ - `context.database("analytics.duckdb")`
255
+ - `context.template("reports/base.xlsx")`
260
256
  - `context.source_metadata()`
261
257
  - `context.debug`
262
258
 
@@ -115,9 +115,6 @@ include = ["data_engine*"]
115
115
  [tool.setuptools.package-data]
116
116
  data_engine = [
117
117
  "ui/gui/icons/*.svg",
118
- "ui/egui/*.pyd",
119
- "ui/egui/*.so",
120
- "ui/egui/*.dylib",
121
118
  "docs/sphinx_source/conf.py",
122
119
  "docs/sphinx_source/*.rst",
123
120
  "docs/sphinx_source/guides/*.md",
@@ -5,7 +5,6 @@ import sys
5
5
  from pathlib import Path
6
6
 
7
7
  from setuptools import setup
8
- from setuptools.command.bdist_wheel import bdist_wheel as _bdist_wheel
9
8
  from setuptools.command.build_py import build_py as _build_py
10
9
  from setuptools.command.sdist import sdist as _sdist
11
10
 
@@ -14,14 +13,6 @@ ROOT = Path(__file__).resolve().parent
14
13
  DOCS_SOURCE_DIR = ROOT / "src" / "data_engine" / "docs" / "sphinx_source"
15
14
  DOCS_OUTPUT_DIR = ROOT / "src" / "data_engine" / "docs" / "html"
16
15
  PROJECT_AST_MAP_SCRIPT = ROOT / "src" / "data_engine" / "devtools" / "project_ast_map.py"
17
- EGUI_PACKAGE_DIR = ROOT / "src" / "data_engine" / "ui" / "egui"
18
-
19
-
20
- def _vendored_native_modules() -> list[Path]:
21
- native_modules: list[Path] = []
22
- for suffix in (".pyd", ".so", ".dylib"):
23
- native_modules.extend(EGUI_PACKAGE_DIR.glob(f"_data_engine_egui*{suffix}"))
24
- return sorted(native_modules)
25
16
 
26
17
 
27
18
  def _build_packaged_docs() -> None:
@@ -63,26 +54,4 @@ class sdist(_sdist):
63
54
  super().run()
64
55
 
65
56
 
66
- class bdist_wheel(_bdist_wheel):
67
- def finalize_options(self) -> None:
68
- super().finalize_options()
69
- if _vendored_native_modules():
70
- self.root_is_pure = False
71
-
72
- def get_tag(self) -> tuple[str, str, str]:
73
- python_tag, abi_tag, platform_tag = super().get_tag()
74
- if _vendored_native_modules():
75
- python_tag = f"cp{sys.version_info.major}{sys.version_info.minor}"
76
- abi_tag = "abi3"
77
- return python_tag, abi_tag, platform_tag
78
-
79
- def run(self) -> None:
80
- if sys.platform == "win32" and not _vendored_native_modules():
81
- raise RuntimeError(
82
- "Windows wheel build requires the vendored egui native module. "
83
- "Run scripts/build_egui_native.py first."
84
- )
85
- super().run()
86
-
87
-
88
- setup(cmdclass={"bdist_wheel": bdist_wheel, "build_py": build_py, "sdist": sdist})
57
+ setup(cmdclass={"build_py": build_py, "sdist": sdist})
@@ -55,6 +55,7 @@ class OperatorControlApplication:
55
55
  selected_flow_valid: bool,
56
56
  blocked_status_text: str,
57
57
  timeout: float = 2.0,
58
+ inputs: dict[str, object] | None = None,
58
59
  ) -> OperatorActionResult:
59
60
  """Validate and request one manual run for the selected flow."""
60
61
  if not authored_workspace_is_available(paths):
@@ -76,12 +77,14 @@ class OperatorControlApplication:
76
77
  return OperatorActionResult(requested=False)
77
78
  if not action_context.control_available:
78
79
  return OperatorActionResult(requested=False, status_text=blocked_status_text)
79
- result = self.runtime_application.run_flow(
80
- paths,
81
- name=selected_flow_name,
82
- wait=False,
83
- timeout=timeout,
84
- )
80
+ run_kwargs: dict[str, object] = {
81
+ "name": selected_flow_name,
82
+ "wait": False,
83
+ "timeout": timeout,
84
+ }
85
+ if inputs is not None:
86
+ run_kwargs["inputs"] = inputs
87
+ result = self.runtime_application.run_flow(paths, **run_kwargs)
85
88
  if not result.ok:
86
89
  return OperatorActionResult(
87
90
  requested=False,
@@ -242,13 +242,21 @@ class RuntimeApplication:
242
242
  signature=signature,
243
243
  )
244
244
 
245
- def run_flow(self, paths: WorkspacePaths, *, name: str, wait: bool = False, timeout: float = 2.0) -> DaemonCommandResult:
245
+ def run_flow(
246
+ self,
247
+ paths: WorkspacePaths,
248
+ *,
249
+ name: str,
250
+ wait: bool = False,
251
+ timeout: float = 2.0,
252
+ inputs: dict[str, object] | None = None,
253
+ ) -> DaemonCommandResult:
246
254
  """Request one manual flow run through the daemon."""
247
255
  if not authored_workspace_is_available(paths):
248
256
  return DaemonCommandResult(ok=False, error="Workspace root is no longer available.")
249
257
  return self._spawn_and_request(
250
258
  paths,
251
- {"command": "run_flow", "name": name, "wait": wait},
259
+ {"command": "run_flow", "name": name, "wait": wait, "inputs": dict(inputs or {})},
252
260
  timeout=timeout,
253
261
  )
254
262
 
@@ -86,6 +86,7 @@ class Flow(_CoreFlow):
86
86
  def run_once(
87
87
  self,
88
88
  *,
89
+ inputs: dict[str, object] | None = None,
89
90
  authoring_services: AuthoringServices | None = None,
90
91
  runtime_execution_service: RuntimeExecutionService | None = None,
91
92
  ) -> list[FlowContext]:
@@ -95,6 +96,8 @@ class Flow(_CoreFlow):
95
96
  ----------
96
97
  authoring_services : AuthoringServices | None
97
98
  Optional service bundle used by tests or embedded hosts.
99
+ inputs : dict[str, object] | None
100
+ Submitted manual-run input values for flows that declare them.
98
101
  runtime_execution_service : RuntimeExecutionService | None
99
102
  Optional runtime execution service override.
100
103
 
@@ -108,7 +111,9 @@ class Flow(_CoreFlow):
108
111
  authoring_services=authoring_services,
109
112
  runtime_execution_service=runtime_execution_service,
110
113
  ).runtime_execution_service
111
- return service.run_once(flow)
114
+ if inputs is None:
115
+ return service.run_once(flow)
116
+ return service.run_once(flow, inputs=inputs)
112
117
 
113
118
  def preview(
114
119
  self,
@@ -19,7 +19,7 @@ from data_engine.core.helpers import (
19
19
  _validate_slot_name,
20
20
  )
21
21
  from data_engine.core.model import FlowValidationError
22
- from data_engine.core.primitives import Batch, FlowContext, MirrorSpec, StepSpec, WatchSpec, collect_files
22
+ from data_engine.core.primitives import Batch, FlowContext, ManualInputSpec, MirrorSpec, StepSpec, WatchSpec, collect_files
23
23
 
24
24
 
25
25
  @dataclass(frozen=True)
@@ -59,6 +59,8 @@ class Flow:
59
59
  Mirrored output path configuration.
60
60
  steps : tuple[StepSpec, ...]
61
61
  Ordered callable steps to run.
62
+ manual_inputs : tuple[ManualInputSpec, ...]
63
+ Pre-run operator inputs required before manual execution starts.
62
64
 
63
65
  Notes
64
66
  -----
@@ -71,6 +73,7 @@ class Flow:
71
73
  trigger: WatchSpec | None = None
72
74
  mirror_spec: MirrorSpec | None = None
73
75
  steps: tuple[StepSpec, ...] = ()
76
+ manual_inputs: tuple[ManualInputSpec, ...] = ()
74
77
  _workspace_root: Path | None = None
75
78
 
76
79
  def __post_init__(self) -> None:
@@ -80,6 +83,8 @@ class Flow:
80
83
  raise FlowValidationError("Flow label must be a non-empty string when provided.")
81
84
  if not isinstance(self.group, str) or not self.group.strip():
82
85
  raise FlowValidationError("Flow group must be a non-empty string.")
86
+ if self.manual_inputs and self.mode != "manual":
87
+ raise FlowValidationError("Flow manual inputs are only supported for manual flows.")
83
88
 
84
89
  def _clone(self, **kwargs) -> "Flow":
85
90
  return replace(self, **kwargs)
@@ -156,6 +161,8 @@ class Flow:
156
161
  normalized_mode = str(mode).strip().lower()
157
162
  if normalized_mode not in {"manual", "poll", "schedule"}:
158
163
  raise FlowValidationError("watch() mode must be one of 'manual', 'poll', or 'schedule'.")
164
+ if normalized_mode != "manual" and self.manual_inputs:
165
+ raise FlowValidationError("watch() cannot configure automated modes on flows with manual inputs.")
159
166
 
160
167
  normalized_run_as = str(run_as).strip().lower()
161
168
  if normalized_run_as not in {"individual", "batch"}:
@@ -264,6 +271,41 @@ class Flow:
264
271
  """
265
272
  return self._clone(mirror_spec=MirrorSpec(root=_resolve_flow_path(root)))
266
273
 
274
+ def date_range_input(
275
+ self,
276
+ *,
277
+ name: str,
278
+ label: str,
279
+ required: bool = True,
280
+ inclusive: bool = True,
281
+ ) -> "Flow":
282
+ """Require one start/end date range before a manual run starts.
283
+
284
+ Operator surfaces collect the value before starting the run. Runtime
285
+ steps can read the normalized ``DateRangeInputValue`` from
286
+ ``context.inputs[name]``.
287
+ """
288
+ if self.mode != "manual":
289
+ raise FlowValidationError("date_range_input() is only supported for manual flows.")
290
+ normalized_name = _validate_slot_name(method_name="date_range_input", slot_name="name", value=name)
291
+ normalized_label = _validate_label(method_name="date_range_input", label=label)
292
+ assert normalized_name is not None
293
+ assert normalized_label is not None
294
+ if normalized_name in {item.name for item in self.manual_inputs}:
295
+ raise FlowValidationError(f"date_range_input() name {normalized_name!r} is already defined.")
296
+ return self._clone(
297
+ manual_inputs=(
298
+ *self.manual_inputs,
299
+ ManualInputSpec(
300
+ name=normalized_name,
301
+ label=normalized_label,
302
+ kind="date_range",
303
+ required=bool(required),
304
+ inclusive=bool(inclusive),
305
+ ),
306
+ )
307
+ )
308
+
267
309
  def step(
268
310
  self,
269
311
  fn: Callable[[FlowContext], object],
@@ -3,7 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from dataclasses import dataclass, field
6
- from datetime import datetime, timezone
6
+ from datetime import date, datetime, timezone
7
7
  import json
8
8
  from pathlib import Path
9
9
  import tomllib
@@ -12,7 +12,11 @@ from typing import Callable, Generic, Iterator, TypeVar
12
12
  from data_engine.core.helpers import _normalize_extensions, _resolve_flow_path
13
13
  from data_engine.core.model import FlowValidationError
14
14
  from data_engine.domain.time import utcnow_text
15
- from data_engine.platform.workspace_models import WORKSPACE_CONFIG_DIR_NAME, WORKSPACE_DATABASES_DIR_NAME
15
+ from data_engine.platform.workspace_models import (
16
+ WORKSPACE_CONFIG_DIR_NAME,
17
+ WORKSPACE_DATABASES_DIR_NAME,
18
+ WORKSPACE_TEMPLATES_DIR_NAME,
19
+ )
16
20
  from data_engine.services.debug_artifacts import (
17
21
  build_debug_metadata,
18
22
  sanitize_debug_name,
@@ -58,6 +62,74 @@ class StepSpec:
58
62
  function_name: str
59
63
 
60
64
 
65
+ @dataclass(frozen=True)
66
+ class DateRangeInputValue:
67
+ """Submitted inclusive date range for one manual flow run."""
68
+
69
+ start: str
70
+ end: str
71
+ inclusive: bool = True
72
+
73
+
74
+ @dataclass(frozen=True)
75
+ class ManualInputSpec:
76
+ """One pre-run operator input required by a manual flow."""
77
+
78
+ name: str
79
+ label: str
80
+ kind: str
81
+ required: bool = True
82
+ inclusive: bool = True
83
+
84
+
85
+ def _normalize_iso_date(value: object, *, field_name: str) -> str:
86
+ if isinstance(value, date) and not isinstance(value, datetime):
87
+ return value.isoformat()
88
+ if not isinstance(value, str) or not value.strip():
89
+ raise FlowValidationError(f"Manual input {field_name} must be a YYYY-MM-DD date string.")
90
+ raw = value.strip()
91
+ try:
92
+ parsed = date.fromisoformat(raw)
93
+ except ValueError as exc:
94
+ raise FlowValidationError(f"Manual input {field_name} must be a valid YYYY-MM-DD date.") from exc
95
+ return parsed.isoformat()
96
+
97
+
98
+ def normalize_manual_inputs(
99
+ specs: tuple[ManualInputSpec, ...],
100
+ values: dict[str, object] | None,
101
+ ) -> dict[str, object]:
102
+ """Validate and normalize submitted manual-run input values."""
103
+ if not specs:
104
+ return {}
105
+ raw_values = values or {}
106
+ if not isinstance(raw_values, dict):
107
+ raise FlowValidationError("Manual flow inputs must be provided as a mapping.")
108
+ normalized: dict[str, object] = {}
109
+ for spec in specs:
110
+ if spec.name not in raw_values:
111
+ if spec.required:
112
+ raise FlowValidationError(f"Manual input {spec.name!r} is required.")
113
+ continue
114
+ raw_value = raw_values[spec.name]
115
+ if spec.kind == "date_range":
116
+ if isinstance(raw_value, DateRangeInputValue):
117
+ if date.fromisoformat(raw_value.start) > date.fromisoformat(raw_value.end):
118
+ raise FlowValidationError(f"Manual input {spec.name!r} start date must be on or before end date.")
119
+ normalized[spec.name] = raw_value
120
+ continue
121
+ if not isinstance(raw_value, dict):
122
+ raise FlowValidationError(f"Manual input {spec.name!r} must be a date range mapping.")
123
+ start = _normalize_iso_date(raw_value.get("start"), field_name=f"{spec.name}.start")
124
+ end = _normalize_iso_date(raw_value.get("end"), field_name=f"{spec.name}.end")
125
+ if date.fromisoformat(start) > date.fromisoformat(end):
126
+ raise FlowValidationError(f"Manual input {spec.name!r} start date must be on or before end date.")
127
+ normalized[spec.name] = DateRangeInputValue(start=start, end=end, inclusive=spec.inclusive)
128
+ continue
129
+ raise FlowValidationError(f"Unsupported manual input kind: {spec.kind}")
130
+ return normalized
131
+
132
+
61
133
  @dataclass(frozen=True)
62
134
  class SourceMetadata:
63
135
  """Resolved filesystem metadata for the current source file."""
@@ -337,6 +409,8 @@ class FlowContext:
337
409
  Active value passed between steps.
338
410
  objects : dict[str, object]
339
411
  Named intermediate values saved by ``save_as``.
412
+ inputs : dict[str, object]
413
+ Normalized manual-run inputs collected before execution starts.
340
414
  metadata : dict[str, object]
341
415
  Runtime metadata attached to the execution.
342
416
  config : WorkspaceConfigContext
@@ -363,6 +437,7 @@ class FlowContext:
363
437
  mirror: MirrorContext | None = None
364
438
  current: object | None = None
365
439
  objects: dict[str, object] = field(default_factory=dict)
440
+ inputs: dict[str, object] = field(default_factory=dict)
366
441
  metadata: dict[str, object] = field(default_factory=dict)
367
442
  config: WorkspaceConfigContext = field(default_factory=WorkspaceConfigContext)
368
443
  debug: FlowDebugContext | None = None
@@ -386,6 +461,9 @@ class FlowContext:
386
461
  Use this for workspace-owned DuckDB files and other durable database
387
462
  artifacts. The returned path is rooted under
388
463
  ``<workspace>/databases/`` and parent directories are created for you.
464
+ A ``FlowValidationError`` is raised when the flow is not running from
465
+ an authored workspace, or when ``name`` is absolute, empty, or escapes
466
+ the workspace databases directory.
389
467
 
390
468
  Parameters
391
469
  ----------
@@ -398,21 +476,47 @@ class FlowContext:
398
476
  Path
399
477
  Absolute write-ready database path.
400
478
 
401
- Raises
402
- ------
403
- FlowValidationError
404
- If the flow is not running from an authored workspace, or if
405
- ``name`` is absolute or empty.
406
479
  """
480
+ path = self._workspace_path(
481
+ name,
482
+ helper_name="database",
483
+ directory_name=WORKSPACE_DATABASES_DIR_NAME,
484
+ )
485
+ path.parent.mkdir(parents=True, exist_ok=True)
486
+ return path
487
+
488
+ def template(self, name: str | Path) -> Path:
489
+ """Return a write-ready path beneath the workspace templates directory.
490
+
491
+ Use this for workspace-owned template files such as Excel workbook
492
+ shells. The returned path is rooted under ``<workspace>/templates/``
493
+ and parent directories are created for you. A ``FlowValidationError``
494
+ is raised when the flow is not running from an authored workspace, or
495
+ when ``name`` is absolute, empty, or escapes the workspace templates
496
+ directory.
497
+ """
498
+ path = self._workspace_path(
499
+ name,
500
+ helper_name="template",
501
+ directory_name=WORKSPACE_TEMPLATES_DIR_NAME,
502
+ )
503
+ path.parent.mkdir(parents=True, exist_ok=True)
504
+ return path
505
+
506
+ def _workspace_path(self, name: str | Path, *, helper_name: str, directory_name: str) -> Path:
407
507
  if self.config.workspace_root is None:
408
- raise FlowValidationError("context.database() is only available for authored workspace flows.")
508
+ raise FlowValidationError(f"context.{helper_name}() is only available for authored workspace flows.")
409
509
  candidate = Path(name)
410
510
  if candidate.is_absolute():
411
- raise FlowValidationError("context.database() name must be relative.")
511
+ raise FlowValidationError(f"context.{helper_name}() name must be relative.")
412
512
  if not str(candidate).strip():
413
- raise FlowValidationError("context.database() name must be non-empty.")
414
- path = (self.config.workspace_root / WORKSPACE_DATABASES_DIR_NAME / candidate).resolve()
415
- path.parent.mkdir(parents=True, exist_ok=True)
513
+ raise FlowValidationError(f"context.{helper_name}() name must be non-empty.")
514
+ base = (self.config.workspace_root / directory_name).resolve()
515
+ path = (base / candidate).resolve()
516
+ try:
517
+ path.relative_to(base)
518
+ except ValueError as exc:
519
+ raise FlowValidationError(f"context.{helper_name}() name must stay under the workspace {directory_name} directory.") from exc
416
520
  return path
417
521
 
418
522
 
@@ -619,9 +723,11 @@ def collect_files(
619
723
 
620
724
  __all__ = [
621
725
  "Batch",
726
+ "DateRangeInputValue",
622
727
  "FileRef",
623
728
  "FlowContext",
624
729
  "FlowDebugContext",
730
+ "ManualInputSpec",
625
731
  "MirrorContext",
626
732
  "MirrorSpec",
627
733
  "SourceContext",
@@ -630,4 +736,5 @@ __all__ = [
630
736
  "WatchSpec",
631
737
  "WorkspaceConfigContext",
632
738
  "collect_files",
739
+ "normalize_manual_inputs",
633
740
  ]
@@ -13,7 +13,7 @@
13
13
 
14
14
  <script src="../../../_static/jquery.js?v=5d32c60e"></script>
15
15
  <script src="../../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
16
- <script src="../../../_static/documentation_options.js?v=9f76a604"></script>
16
+ <script src="../../../_static/documentation_options.js?v=3b0e221d"></script>
17
17
  <script src="../../../_static/doctools.js?v=fd6eb6e6"></script>
18
18
  <script src="../../../_static/sphinx_highlight.js?v=6ffebe34"></script>
19
19
  <script src="../../../_static/js/theme.js"></script>
@@ -179,6 +179,7 @@
179
179
  <span class="k">def</span><span class="w"> </span><span class="nf">run_once</span><span class="p">(</span>
180
180
  <span class="bp">self</span><span class="p">,</span>
181
181
  <span class="o">*</span><span class="p">,</span>
182
+ <span class="n">inputs</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">object</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
182
183
  <span class="n">authoring_services</span><span class="p">:</span> <span class="n">AuthoringServices</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
183
184
  <span class="n">runtime_execution_service</span><span class="p">:</span> <span class="n">RuntimeExecutionService</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
184
185
  <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">FlowContext</span><span class="p">]:</span>
@@ -188,6 +189,8 @@
188
189
  <span class="sd"> ----------</span>
189
190
  <span class="sd"> authoring_services : AuthoringServices | None</span>
190
191
  <span class="sd"> Optional service bundle used by tests or embedded hosts.</span>
192
+ <span class="sd"> inputs : dict[str, object] | None</span>
193
+ <span class="sd"> Submitted manual-run input values for flows that declare them.</span>
191
194
  <span class="sd"> runtime_execution_service : RuntimeExecutionService | None</span>
192
195
  <span class="sd"> Optional runtime execution service override.</span>
193
196
 
@@ -201,7 +204,9 @@
201
204
  <span class="n">authoring_services</span><span class="o">=</span><span class="n">authoring_services</span><span class="p">,</span>
202
205
  <span class="n">runtime_execution_service</span><span class="o">=</span><span class="n">runtime_execution_service</span><span class="p">,</span>
203
206
  <span class="p">)</span><span class="o">.</span><span class="n">runtime_execution_service</span>
204
- <span class="k">return</span> <span class="n">service</span><span class="o">.</span><span class="n">run_once</span><span class="p">(</span><span class="n">flow</span><span class="p">)</span></div>
207
+ <span class="k">if</span> <span class="n">inputs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
208
+ <span class="k">return</span> <span class="n">service</span><span class="o">.</span><span class="n">run_once</span><span class="p">(</span><span class="n">flow</span><span class="p">)</span>
209
+ <span class="k">return</span> <span class="n">service</span><span class="o">.</span><span class="n">run_once</span><span class="p">(</span><span class="n">flow</span><span class="p">,</span> <span class="n">inputs</span><span class="o">=</span><span class="n">inputs</span><span class="p">)</span></div>
205
210
 
206
211
 
207
212
  <div class="viewcode-block" id="Flow.preview">