py-data-engine 0.2.1__tar.gz → 0.2.3__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 (406) hide show
  1. {py_data_engine-0.2.1/src/py_data_engine.egg-info → py_data_engine-0.2.3}/PKG-INFO +2 -1
  2. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/pyproject.toml +1 -0
  3. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/actions.py +2 -0
  4. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/control.py +14 -14
  5. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/runtime.py +63 -21
  6. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/core/flow.py +11 -0
  7. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/core/primitives.py +1 -0
  8. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/devtools/smoke_data.py +153 -1
  9. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/authoring/flow.html +1 -1
  10. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/core/flow.html +12 -1
  11. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/core/model.html +1 -1
  12. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/core/primitives.html +2 -1
  13. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/helpers/duckdb.html +1 -1
  14. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/helpers/polars.html +512 -1
  15. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/helpers/schema.html +13 -4
  16. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/hosts/scheduler.html +1 -1
  17. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/runtime/engine.html +1 -1
  18. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/runtime/execution/grouped.html +1 -1
  19. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/runtime/execution/single.html +156 -11
  20. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/runtime/file_watch.html +1 -1
  21. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/runtime/stop.html +1 -1
  22. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/daemon.html +1 -1
  23. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/daemon_state.html +1 -1
  24. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/flow_catalog.html +10 -1
  25. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/flow_execution.html +1 -1
  26. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/ledger.html +1 -1
  27. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/logs.html +17 -4
  28. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/runtime_binding.html +49 -4
  29. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/runtime_execution.html +10 -2
  30. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/runtime_history.html +77 -13
  31. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/settings.html +1 -1
  32. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/shared_state.html +23 -2
  33. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/theme.html +1 -1
  34. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/workspace_provisioning.html +1 -1
  35. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/data_engine/services/workspaces.html +1 -1
  36. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/index.html +1 -1
  37. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/app-runtime-and-workspaces.md.txt +31 -15
  38. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/authoring-flow-modules.md.txt +9 -5
  39. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/configuring-flows.md.txt +5 -5
  40. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/core-concepts.md.txt +5 -5
  41. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/database-methods.md.txt +3 -3
  42. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/duckdb-helpers.md.txt +5 -5
  43. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/flow-context.md.txt +7 -7
  44. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/flow-methods.md.txt +6 -6
  45. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/getting-started.md.txt +8 -7
  46. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/project-inventory.md.txt +544 -18
  47. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/project-map.md.txt +26 -26
  48. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/recipes.md.txt +55 -3
  49. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/documentation_options.js +1 -1
  50. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/api.html +464 -10
  51. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/genindex.html +46 -8
  52. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/app-runtime-and-workspaces.html +32 -18
  53. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/authoring-flow-modules.html +8 -6
  54. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/configuring-flows.html +6 -6
  55. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/core-concepts.html +6 -6
  56. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/database-methods.html +4 -4
  57. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/duckdb-helpers.html +6 -6
  58. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/flow-context.html +8 -8
  59. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/flow-methods.html +7 -7
  60. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/getting-started.html +9 -8
  61. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/project-inventory.html +909 -29
  62. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/project-map.html +66 -66
  63. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/recipes.html +56 -4
  64. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/index.html +4 -1
  65. py_data_engine-0.2.3/src/data_engine/docs/html/objects.inv +0 -0
  66. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/py-modindex.html +1 -1
  67. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/search.html +1 -1
  68. py_data_engine-0.2.3/src/data_engine/docs/html/searchindex.js +1 -0
  69. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/app-runtime-and-workspaces.md +31 -15
  70. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/authoring-flow-modules.md +9 -5
  71. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/configuring-flows.md +5 -5
  72. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/core-concepts.md +5 -5
  73. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/database-methods.md +3 -3
  74. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/duckdb-helpers.md +5 -5
  75. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/flow-context.md +7 -7
  76. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/flow-methods.md +6 -6
  77. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/getting-started.md +8 -7
  78. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/project-inventory.md +544 -18
  79. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/project-map.md +26 -26
  80. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/recipes.md +55 -3
  81. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/actions.py +1 -0
  82. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/catalog.py +2 -0
  83. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/details.py +2 -0
  84. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/logs.py +20 -0
  85. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/operations.py +13 -0
  86. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/flow_modules/flow_module_compiler.py +82 -18
  87. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/flow_modules/flow_module_loader.py +85 -15
  88. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/helpers/__init__.py +4 -0
  89. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/helpers/polars.py +493 -0
  90. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/helpers/schema.py +12 -3
  91. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/app.py +36 -2
  92. py_data_engine-0.2.3/src/data_engine/hosts/daemon/commands.py +76 -0
  93. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/composition.py +17 -6
  94. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/manager.py +99 -85
  95. py_data_engine-0.2.3/src/data_engine/hosts/daemon/runtime_commands.py +234 -0
  96. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/runtime_control.py +5 -2
  97. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/server.py +42 -8
  98. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/identity.py +1 -1
  99. py_data_engine-0.2.3/src/data_engine/platform/instrumentation.py +184 -0
  100. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/workspace_policy.py +3 -11
  101. py_data_engine-0.2.3/src/data_engine/runtime/execution/continuous.py +111 -0
  102. py_data_engine-0.2.3/src/data_engine/runtime/execution/logging.py +293 -0
  103. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/single.py +146 -10
  104. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/runtime_cache_store.py +130 -1
  105. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/runtime_control_store.py +20 -0
  106. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/shared_state.py +56 -0
  107. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/sqlite_store.py +1 -1
  108. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/__init__.py +2 -0
  109. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/flow_catalog.py +9 -0
  110. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/logs.py +16 -3
  111. py_data_engine-0.2.3/src/data_engine/services/reset.py +61 -0
  112. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/runtime_binding.py +45 -3
  113. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/runtime_execution.py +9 -1
  114. py_data_engine-0.2.3/src/data_engine/services/runtime_history.py +120 -0
  115. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/runtime_ports.py +14 -1
  116. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/shared_state.py +16 -1
  117. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/app.py +6 -0
  118. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/app.py +1 -1
  119. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/bootstrap.py +12 -0
  120. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/bootstrapper.py +20 -0
  121. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/control_support.py +12 -26
  122. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/controllers/flows.py +188 -32
  123. py_data_engine-0.2.3/src/data_engine/ui/gui/controllers/runtime.py +461 -0
  124. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/__init__.py +2 -0
  125. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/logs.py +46 -5
  126. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/runtime_projection.py +2 -0
  127. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/sidebar.py +3 -1
  128. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/workspace_binding.py +13 -0
  129. py_data_engine-0.2.3/src/data_engine/ui/gui/presenters/workspace_settings.py +285 -0
  130. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/runtime.py +1 -0
  131. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/support.py +5 -0
  132. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/surface.py +17 -2
  133. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/theme.py +26 -0
  134. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/widgets/panels.py +13 -1
  135. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/widgets/sidebar.py +2 -2
  136. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/widgets/steps.py +7 -0
  137. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/app.py +1 -1
  138. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/bootstrap.py +12 -0
  139. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/bootstrapper.py +2 -0
  140. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/controllers/flows.py +22 -3
  141. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/actions.py +35 -9
  142. py_data_engine-0.2.3/src/data_engine/views/logs.py +105 -0
  143. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/models.py +3 -0
  144. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/runs.py +6 -7
  145. {py_data_engine-0.2.1 → py_data_engine-0.2.3/src/py_data_engine.egg-info}/PKG-INFO +2 -1
  146. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/py_data_engine.egg-info/SOURCES.txt +5 -0
  147. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/py_data_engine.egg-info/requires.txt +1 -0
  148. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_application.py +280 -0
  149. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_builder.py +24 -0
  150. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_cli.py +13 -2
  151. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_daemon.py +275 -20
  152. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_details.py +3 -2
  153. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_inspection.py +21 -0
  154. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_runtime.py +1 -1
  155. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_flow_module_compiler.py +81 -0
  156. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_flow_module_loader.py +62 -3
  157. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_helpers_polars.py +154 -0
  158. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_integration.py +140 -0
  159. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_logs.py +121 -0
  160. py_data_engine-0.2.3/tests/test_platform_instrumentation.py +78 -0
  161. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_qt_ui.py +749 -24
  162. py_data_engine-0.2.3/tests/test_reset_service.py +194 -0
  163. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_runtime_db.py +43 -0
  164. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_runtime_history_service.py +62 -1
  165. py_data_engine-0.2.3/tests/test_runtime_logging.py +63 -0
  166. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_schema_helper.py +21 -4
  167. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_services.py +15 -3
  168. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_smoke_data.py +10 -0
  169. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_sources.py +16 -7
  170. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_tui.py +22 -0
  171. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_ui_bootstrap.py +2 -0
  172. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_ui_models.py +87 -1
  173. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_views_helpers.py +4 -1
  174. py_data_engine-0.2.1/src/data_engine/docs/html/objects.inv +0 -0
  175. py_data_engine-0.2.1/src/data_engine/docs/html/searchindex.js +0 -1
  176. py_data_engine-0.2.1/src/data_engine/hosts/daemon/commands.py +0 -64
  177. py_data_engine-0.2.1/src/data_engine/hosts/daemon/runtime_commands.py +0 -188
  178. py_data_engine-0.2.1/src/data_engine/runtime/execution/continuous.py +0 -117
  179. py_data_engine-0.2.1/src/data_engine/runtime/execution/logging.py +0 -99
  180. py_data_engine-0.2.1/src/data_engine/services/runtime_history.py +0 -62
  181. py_data_engine-0.2.1/src/data_engine/ui/gui/controllers/runtime.py +0 -247
  182. py_data_engine-0.2.1/src/data_engine/ui/gui/presenters/workspace_settings.py +0 -173
  183. py_data_engine-0.2.1/src/data_engine/views/logs.py +0 -62
  184. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/LICENSE +0 -0
  185. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/README.md +0 -0
  186. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/setup.cfg +0 -0
  187. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/setup.py +0 -0
  188. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/__init__.py +0 -0
  189. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/__init__.py +0 -0
  190. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/catalog.py +0 -0
  191. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/details.py +0 -0
  192. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/workspace.py +0 -0
  193. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/authoring/__init__.py +0 -0
  194. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/authoring/flow.py +0 -0
  195. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/authoring/services.py +0 -0
  196. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/core/__init__.py +0 -0
  197. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/core/helpers.py +0 -0
  198. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/core/model.py +0 -0
  199. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/devtools/__init__.py +0 -0
  200. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/devtools/project_ast_map.py +0 -0
  201. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/__init__.py +0 -0
  202. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/api.rst.txt +0 -0
  203. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/index.rst.txt +0 -0
  204. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  205. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/base-stemmer.js +0 -0
  206. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/basic.css +0 -0
  207. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/badge_only.css +0 -0
  208. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  209. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  210. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  211. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  212. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  213. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  214. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  215. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  216. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  217. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  218. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  219. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/lato-bold.woff +0 -0
  220. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/lato-bold.woff2 +0 -0
  221. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  222. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  223. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/lato-normal.woff +0 -0
  224. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/fonts/lato-normal.woff2 +0 -0
  225. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/theme.css +0 -0
  226. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/custom.css +0 -0
  227. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/doctools.js +0 -0
  228. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/english-stemmer.js +0 -0
  229. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/file.png +0 -0
  230. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-bold.eot +0 -0
  231. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  232. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-bold.woff +0 -0
  233. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  234. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  235. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  236. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  237. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  238. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-italic.eot +0 -0
  239. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  240. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-italic.woff +0 -0
  241. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  242. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-regular.eot +0 -0
  243. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  244. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-regular.woff +0 -0
  245. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  246. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  247. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  248. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  249. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  250. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  251. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  252. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  253. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  254. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/jquery.js +0 -0
  255. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/js/badge_only.js +0 -0
  256. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/js/theme.js +0 -0
  257. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/js/versions.js +0 -0
  258. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/language_data.js +0 -0
  259. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/minus.png +0 -0
  260. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/plus.png +0 -0
  261. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/pygments.css +0 -0
  262. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/searchtools.js +0 -0
  263. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/sphinx_highlight.js +0 -0
  264. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/_static/custom.css +0 -0
  265. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/api.rst +0 -0
  266. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/conf.py +0 -0
  267. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/index.rst +0 -0
  268. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/__init__.py +0 -0
  269. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/diagnostics.py +0 -0
  270. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/errors.py +0 -0
  271. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/inspection.py +0 -0
  272. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/operator.py +0 -0
  273. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/runs.py +0 -0
  274. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/runtime.py +0 -0
  275. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/source_state.py +0 -0
  276. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/support.py +0 -0
  277. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/time.py +0 -0
  278. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/workspace.py +0 -0
  279. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/flow_modules/__init__.py +0 -0
  280. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/helpers/duckdb.py +0 -0
  281. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/__init__.py +0 -0
  282. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/__init__.py +0 -0
  283. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/bootstrap.py +0 -0
  284. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/client.py +0 -0
  285. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/constants.py +0 -0
  286. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/entrypoints.py +0 -0
  287. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/lifecycle.py +0 -0
  288. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/ownership.py +0 -0
  289. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/shared_state.py +0 -0
  290. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/state_sync.py +0 -0
  291. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/scheduler.py +0 -0
  292. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/__init__.py +0 -0
  293. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/interpreters.py +0 -0
  294. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/local_settings.py +0 -0
  295. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/paths.py +0 -0
  296. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/processes.py +0 -0
  297. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/theme.py +0 -0
  298. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/workspace_models.py +0 -0
  299. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/__init__.py +0 -0
  300. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/engine.py +0 -0
  301. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/__init__.py +0 -0
  302. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/app.py +0 -0
  303. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/context.py +0 -0
  304. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/grouped.py +0 -0
  305. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/polling.py +0 -0
  306. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/runner.py +0 -0
  307. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/file_watch.py +0 -0
  308. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/ledger_models.py +0 -0
  309. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/runtime_db.py +0 -0
  310. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/stop.py +0 -0
  311. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/daemon.py +0 -0
  312. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/daemon_state.py +0 -0
  313. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/flow_execution.py +0 -0
  314. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/ledger.py +0 -0
  315. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/settings.py +0 -0
  316. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/theme.py +0 -0
  317. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/workspace_provisioning.py +0 -0
  318. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/workspaces.py +0 -0
  319. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/__init__.py +0 -0
  320. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/__init__.py +0 -0
  321. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/commands_doctor.py +0 -0
  322. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/commands_run.py +0 -0
  323. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/commands_start.py +0 -0
  324. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/commands_workspace.py +0 -0
  325. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/dependencies.py +0 -0
  326. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/parser.py +0 -0
  327. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/__init__.py +0 -0
  328. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/cache_models.py +0 -0
  329. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/controllers/__init__.py +0 -0
  330. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/dialogs/__init__.py +0 -0
  331. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/dialogs/messages.py +0 -0
  332. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/dialogs/previews.py +0 -0
  333. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/helpers/__init__.py +0 -0
  334. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/helpers/inspection.py +0 -0
  335. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/helpers/lifecycle.py +0 -0
  336. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/helpers/scroll.py +0 -0
  337. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/helpers/theming.py +0 -0
  338. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/dark_light.svg +0 -0
  339. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/documentation.svg +0 -0
  340. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/failed.svg +0 -0
  341. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/group.svg +0 -0
  342. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/home.svg +0 -0
  343. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/manual.svg +0 -0
  344. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/poll.svg +0 -0
  345. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/schedule.svg +0 -0
  346. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/settings.svg +0 -0
  347. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/started.svg +0 -0
  348. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/success.svg +0 -0
  349. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/view-log.svg +0 -0
  350. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons.py +0 -0
  351. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/launcher.py +0 -0
  352. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/docs.py +0 -0
  353. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/steps.py +0 -0
  354. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/workspace.py +0 -0
  355. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/preview_models.py +0 -0
  356. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/render_support.py +0 -0
  357. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/rendering/__init__.py +0 -0
  358. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/rendering/artifacts.py +0 -0
  359. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/rendering/icons.py +0 -0
  360. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/state_support.py +0 -0
  361. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/widgets/__init__.py +0 -0
  362. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/widgets/config.py +0 -0
  363. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/widgets/logs.py +0 -0
  364. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/__init__.py +0 -0
  365. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/controllers/__init__.py +0 -0
  366. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/controllers/runtime.py +0 -0
  367. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/runtime.py +0 -0
  368. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/state_support.py +0 -0
  369. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/support.py +0 -0
  370. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/theme.py +0 -0
  371. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/widgets.py +0 -0
  372. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/__init__.py +0 -0
  373. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/artifacts.py +0 -0
  374. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/flow_display.py +0 -0
  375. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/presentation.py +0 -0
  376. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/state.py +0 -0
  377. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/status.py +0 -0
  378. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/text.py +0 -0
  379. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/py_data_engine.egg-info/dependency_links.txt +0 -0
  380. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/py_data_engine.egg-info/entry_points.txt +0 -0
  381. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/py_data_engine.egg-info/top_level.txt +0 -0
  382. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_authoring_helpers.py +0 -0
  383. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_authoring_services.py +0 -0
  384. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_cli_helpers.py +0 -0
  385. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_actions.py +0 -0
  386. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_catalog.py +0 -0
  387. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_errors.py +0 -0
  388. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_logs.py +0 -0
  389. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_operations.py +0 -0
  390. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_operator.py +0 -0
  391. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_runs.py +0 -0
  392. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_support.py +0 -0
  393. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_workspace.py +0 -0
  394. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_export_project_bundle_script.py +0 -0
  395. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_helpers_duckdb.py +0 -0
  396. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_live_runtime_suite.py +0 -0
  397. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_local_settings.py +0 -0
  398. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_platform_identity.py +0 -0
  399. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_project_ast_map.py +0 -0
  400. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_scheduler_host.py +0 -0
  401. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_shared_state.py +0 -0
  402. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_theme.py +0 -0
  403. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_tui_widgets.py +0 -0
  404. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_ui_runtime_theme.py +0 -0
  405. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_ui_state.py +0 -0
  406. {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_workspace_provisioning.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: py-data-engine
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: Workbook-driven workflow jobs with strict filename parsing and DuckDB-backed processing.
5
5
  Author: Data Engine contributors
6
6
  License-Expression: MIT
@@ -66,6 +66,7 @@ Requires-Dist: pytest-cov>=7.0.0; extra == "dev"
66
66
  Requires-Dist: ruff>=0.15.10; extra == "dev"
67
67
  Requires-Dist: Sphinx>=9.1.0; extra == "dev"
68
68
  Requires-Dist: sphinx_rtd_theme>=3.1.0; extra == "dev"
69
+ Requires-Dist: viztracer>=1.1.0; extra == "dev"
69
70
  Dynamic: license-file
70
71
 
71
72
  # Data Engine
@@ -98,6 +98,7 @@ dev = [
98
98
  "ruff>=0.15.10",
99
99
  "Sphinx>=9.1.0",
100
100
  "sphinx_rtd_theme>=3.1.0",
101
+ "viztracer>=1.1.0",
101
102
  ]
102
103
 
103
104
  [tool.setuptools]
@@ -20,6 +20,7 @@ class ActionStateApplication:
20
20
  has_automated_flows: bool,
21
21
  workspace_available: bool = True,
22
22
  selected_run_group_present: bool = False,
23
+ local_request_pending: bool = False,
23
24
  ) -> OperatorActionContext:
24
25
  """Return one operator action context from current runtime and selection state."""
25
26
  selected_flow = SelectedFlowState.from_runtime(
@@ -36,6 +37,7 @@ class ActionStateApplication:
36
37
  has_automated_flows=has_automated_flows,
37
38
  workspace_available=workspace_available,
38
39
  selected_run_group_present=selected_run_group_present,
40
+ local_request_pending=local_request_pending,
39
41
  )
40
42
 
41
43
 
@@ -68,7 +68,7 @@ class OperatorControlApplication:
68
68
  requested=False,
69
69
  status_text=f"{selected_flow_name} is invalid and cannot run.",
70
70
  )
71
- if selected_flow_group_active or runtime_session.manual_run_active:
71
+ if selected_flow_group_active:
72
72
  return OperatorActionResult(requested=False)
73
73
  if not runtime_session.control_available:
74
74
  return OperatorActionResult(requested=False, status_text=blocked_status_text)
@@ -128,27 +128,27 @@ class OperatorControlApplication:
128
128
  timeout: float = 2.0,
129
129
  ) -> OperatorActionResult:
130
130
  """Validate and request stop for the engine or selected manual flow."""
131
- if runtime_session.runtime_active:
132
- result = self.runtime_application.stop_engine(paths, timeout=timeout)
131
+ manual_flow_name = runtime_session.active_manual_runs.get(selected_flow_group)
132
+ if manual_flow_name is None and len(runtime_session.manual_runs) == 1:
133
+ manual_flow_name = runtime_session.manual_runs[0].flow_name
134
+ if manual_flow_name is not None:
135
+ if not runtime_session.control_available:
136
+ return OperatorActionResult(requested=False, status_text=blocked_status_text)
137
+ result = self.runtime_application.stop_flow(paths, name=manual_flow_name, timeout=timeout)
133
138
  if not result.ok:
134
139
  return OperatorActionResult(
135
140
  requested=False,
136
- error_text=_verbose_action_error("stop the engine", result.error),
141
+ error_text=_verbose_action_error(f"stop {manual_flow_name}", result.error),
137
142
  )
138
- return OperatorActionResult(requested=True, sync_after=True, status_text="Stopping engine...")
139
- if runtime_session.manual_run_active:
140
- if not runtime_session.control_available:
141
- return OperatorActionResult(requested=False, status_text=blocked_status_text)
142
- flow_name = runtime_session.active_manual_runs.get(selected_flow_group)
143
- if flow_name is None:
144
- return OperatorActionResult(requested=False)
145
- result = self.runtime_application.stop_flow(paths, name=flow_name, timeout=timeout)
143
+ return OperatorActionResult(requested=True, sync_after=True, status_text="Stopping selected flow...")
144
+ if runtime_session.runtime_active:
145
+ result = self.runtime_application.stop_engine(paths, timeout=timeout)
146
146
  if not result.ok:
147
147
  return OperatorActionResult(
148
148
  requested=False,
149
- error_text=_verbose_action_error(f"stop {flow_name}", result.error),
149
+ error_text=_verbose_action_error("stop the engine", result.error),
150
150
  )
151
- return OperatorActionResult(requested=True, sync_after=True, status_text="Stopping selected flow...")
151
+ return OperatorActionResult(requested=True, sync_after=True, status_text="Stopping engine...")
152
152
  return OperatorActionResult(requested=False)
153
153
 
154
154
  def request_control(self, daemon_manager: WorkspaceDaemonManager) -> OperatorActionResult:
@@ -19,6 +19,7 @@ from data_engine.domain import (
19
19
  )
20
20
  from data_engine.domain.catalog import FlowCatalogLike
21
21
  from data_engine.hosts.daemon.manager import WorkspaceDaemonManager
22
+ from data_engine.platform.instrumentation import dev_instrumentation_enabled, new_request_id, timed_operation
22
23
  from data_engine.platform.workspace_models import WorkspacePaths, authored_workspace_is_available
23
24
  from data_engine.services import DaemonService, DaemonStateService, SharedStateService
24
25
 
@@ -57,12 +58,13 @@ class RuntimeSnapshotPresentation:
57
58
 
58
59
  operation_tracker: OperationSessionState
59
60
  flow_states: dict[str, str]
61
+ active_runtime_flow_names: tuple[str, ...] = ()
60
62
 
61
63
  def signature_for(self, runtime_session: RuntimeSessionState) -> tuple[object, ...]:
62
64
  """Return a stable signature for render-diff decisions."""
63
65
  return (
64
66
  tuple(sorted(self.flow_states.items())),
65
- tuple(sorted(runtime_session.active_runtime_flow_names)),
67
+ tuple(sorted(self.active_runtime_flow_names or runtime_session.active_runtime_flow_names)),
66
68
  tuple(sorted(runtime_session.active_manual_runs.items())),
67
69
  runtime_session.workspace_owned,
68
70
  runtime_session.leased_by_machine_id,
@@ -133,7 +135,7 @@ class RuntimeApplication:
133
135
  ) -> RuntimeSyncState:
134
136
  """Return normalized daemon/runtime state for one host surface."""
135
137
  snapshot = self.daemon_state_service.sync(daemon_manager)
136
- if snapshot.source == "lease":
138
+ if snapshot.source in {"lease", "cached"} and not snapshot.workspace_owned:
137
139
  self.shared_state_service.hydrate_local_runtime(paths, runtime_ledger)
138
140
  daemon_status = DaemonStatusState.from_snapshot(snapshot)
139
141
  return RuntimeSyncState(
@@ -184,7 +186,18 @@ class RuntimeApplication:
184
186
  )
185
187
  for flow_name in list(states):
186
188
  tracker = tracker.normalize_completed(flow_name)
187
- for flow_name in runtime_session.active_runtime_flow_names:
189
+ active_runtime_flow_names = runtime_session.active_runtime_flow_names
190
+ if runtime_session.runtime_stopping:
191
+ active_runtime_flow_names = tuple(
192
+ flow_name
193
+ for flow_name in runtime_session.active_runtime_flow_names
194
+ if (
195
+ (flow_state := tracker.state_for(flow_name)) is None
196
+ or not flow_state.has_observed_activity
197
+ or flow_state.has_running_rows
198
+ )
199
+ )
200
+ for flow_name in active_runtime_flow_names:
188
201
  card = cards_by_name.get(flow_name)
189
202
  if card is None or states.get(flow_name) == "failed":
190
203
  continue
@@ -199,6 +212,7 @@ class RuntimeApplication:
199
212
  return RuntimeSnapshotPresentation(
200
213
  operation_tracker=tracker,
201
214
  flow_states=states,
215
+ active_runtime_flow_names=active_runtime_flow_names,
202
216
  )
203
217
 
204
218
  def plan_flow_state_refresh(
@@ -366,13 +380,20 @@ class RuntimeApplication:
366
380
  *,
367
381
  timeout: float = 0.0,
368
382
  ) -> DaemonCommandResult:
369
- spawn_result = self.spawn_daemon(paths)
370
- if not spawn_result.ok:
371
- return DaemonCommandResult(
372
- ok=False,
373
- error=_daemon_command_error_text(payload, spawn_result.error),
374
- )
375
- return self._request(paths, payload, timeout=timeout)
383
+ request_payload = self._instrumented_payload(payload)
384
+ with timed_operation(
385
+ self._client_timing_log_path(paths),
386
+ scope="client.daemon",
387
+ event=f"spawn_and_request:{request_payload.get('command', 'unknown')}",
388
+ fields={"request_id": request_payload.get("request_id"), "workspace": paths.workspace_id},
389
+ ):
390
+ spawn_result = self.spawn_daemon(paths)
391
+ if not spawn_result.ok:
392
+ return DaemonCommandResult(
393
+ ok=False,
394
+ error=_daemon_command_error_text(request_payload, spawn_result.error),
395
+ )
396
+ return self._request(paths, request_payload, timeout=timeout)
376
397
 
377
398
  def _request(
378
399
  self,
@@ -381,17 +402,38 @@ class RuntimeApplication:
381
402
  *,
382
403
  timeout: float = 0.0,
383
404
  ) -> DaemonCommandResult:
384
- try:
385
- response = self.daemon_service.request(paths, payload, timeout=timeout)
386
- except self.daemon_service.client_error_type as exc:
387
- return DaemonCommandResult(ok=False, error=_daemon_command_error_text(payload, exc))
388
- if not response.get("ok"):
389
- return DaemonCommandResult(
390
- ok=False,
391
- error=_daemon_command_error_text(payload, response.get("error")),
392
- payload=response,
393
- )
394
- return DaemonCommandResult(ok=True, payload=response)
405
+ request_payload = self._instrumented_payload(payload)
406
+ with timed_operation(
407
+ self._client_timing_log_path(paths),
408
+ scope="client.daemon",
409
+ event=str(request_payload.get("command", "unknown")),
410
+ fields={"request_id": request_payload.get("request_id"), "timeout": timeout, "workspace": paths.workspace_id},
411
+ ):
412
+ try:
413
+ response = self.daemon_service.request(paths, request_payload, timeout=timeout)
414
+ except self.daemon_service.client_error_type as exc:
415
+ return DaemonCommandResult(ok=False, error=_daemon_command_error_text(request_payload, exc))
416
+ if not response.get("ok"):
417
+ return DaemonCommandResult(
418
+ ok=False,
419
+ error=_daemon_command_error_text(request_payload, response.get("error")),
420
+ payload=response,
421
+ )
422
+ return DaemonCommandResult(ok=True, payload=response)
423
+
424
+ @staticmethod
425
+ def _client_timing_log_path(paths: WorkspacePaths):
426
+ if not paths.workspace_configured:
427
+ return None
428
+ return paths.runtime_state_dir / "client_timing.log"
429
+
430
+ @staticmethod
431
+ def _instrumented_payload(payload: dict[str, Any]) -> dict[str, Any]:
432
+ if "request_id" in payload or not dev_instrumentation_enabled():
433
+ return dict(payload)
434
+ instrumented = dict(payload)
435
+ instrumented["request_id"] = new_request_id(str(payload.get("command", "cmd")))
436
+ return instrumented
395
437
 
396
438
 
397
439
  def _daemon_command_error_text(payload: dict[str, Any], detail: object | None) -> str:
@@ -92,6 +92,7 @@ class Flow:
92
92
  *,
93
93
  mode: str,
94
94
  run_as: str = "individual",
95
+ max_parallel: int = 1,
95
96
  source: str | Path | None = None,
96
97
  interval: str | None = None,
97
98
  time: str | tuple[str, ...] | list[str] | set[str] | None = None,
@@ -126,6 +127,9 @@ class Flow:
126
127
  run_as : str
127
128
  ``"individual"`` to run once per source file, or ``"batch"`` to run
128
129
  once for the full source set.
130
+ max_parallel : int
131
+ Maximum number of concurrent source-file runs for one flow when
132
+ ``run_as="individual"``. Defaults to ``1``.
129
133
  source : str | Path | None
130
134
  File or directory watched by poll/schedule triggers.
131
135
  interval : str | None
@@ -157,6 +161,9 @@ class Flow:
157
161
  if normalized_run_as not in {"individual", "batch"}:
158
162
  raise FlowValidationError("watch() run_as must be either 'individual' or 'batch'.")
159
163
 
164
+ if not isinstance(max_parallel, int) or max_parallel <= 0:
165
+ raise FlowValidationError("watch() max_parallel must be an integer greater than or equal to one.")
166
+
160
167
  if not isinstance(settle, int) or settle < 0:
161
168
  raise FlowValidationError("watch() settle must be an integer greater than or equal to zero.")
162
169
 
@@ -172,6 +179,7 @@ class Flow:
172
179
  trigger=WatchSpec(
173
180
  mode="manual",
174
181
  run_as=normalized_run_as,
182
+ max_parallel=max_parallel,
175
183
  source=resolved_source,
176
184
  extensions=normalized_extensions,
177
185
  )
@@ -188,6 +196,7 @@ class Flow:
188
196
  trigger=WatchSpec(
189
197
  mode="poll",
190
198
  run_as=normalized_run_as,
199
+ max_parallel=max_parallel,
191
200
  source=resolved_source,
192
201
  interval=interval,
193
202
  interval_seconds=_parse_duration(interval),
@@ -205,6 +214,7 @@ class Flow:
205
214
  trigger=WatchSpec(
206
215
  mode="schedule",
207
216
  run_as=normalized_run_as,
217
+ max_parallel=max_parallel,
208
218
  source=resolved_source,
209
219
  interval=interval,
210
220
  interval_seconds=_parse_duration(interval),
@@ -217,6 +227,7 @@ class Flow:
217
227
  trigger=WatchSpec(
218
228
  mode="schedule",
219
229
  run_as=normalized_run_as,
230
+ max_parallel=max_parallel,
220
231
  source=resolved_source,
221
232
  time=time_values[0] if len(time_values) == 1 else time_values,
222
233
  times=time_values,
@@ -21,6 +21,7 @@ class WatchSpec:
21
21
 
22
22
  mode: str
23
23
  run_as: str
24
+ max_parallel: int = 1
24
25
  source: Path | None = None
25
26
  interval: str | None = None
26
27
  interval_seconds: float | None = None
@@ -38,6 +38,7 @@ def build_smoke_environment(
38
38
  secondary_data_dir_name: str = "data2",
39
39
  create_app_root: bool = False,
40
40
  rows_per_workbook: int = 2,
41
+ parallel_rows_per_workbook: int | None = None,
41
42
  column_count: int = len(_BASE_CLAIMS_COLUMNS),
42
43
  ) -> None:
43
44
  """Generate starter data roots plus authored workspaces under one root."""
@@ -59,6 +60,12 @@ def build_smoke_environment(
59
60
  rows_per_workbook=rows_per_workbook,
60
61
  column_count=column_count,
61
62
  )
63
+ create_parallel_claims_data_root(
64
+ secondary_data_root,
65
+ file_count=12,
66
+ rows_per_workbook=parallel_rows_per_workbook or rows_per_workbook,
67
+ column_count=column_count,
68
+ )
62
69
 
63
70
  for workspace_id in workspace_ids:
64
71
  target_workspace = workspace_collection_root / workspace_id
@@ -87,7 +94,6 @@ def create_python_flow_modules(
87
94
  schedule_interval: str = "30s",
88
95
  ) -> None:
89
96
  """Write starter Python-authored flow modules into one workspace."""
90
- del workspace_id
91
97
  flow_dir = target_workspace / "flow_modules"
92
98
  write_text_file(flow_dir / "example_mirror.py", _python_poll_source(data_folder_name=data_folder_name))
93
99
  write_text_file(
@@ -99,6 +105,19 @@ def create_python_flow_modules(
99
105
  flow_dir / "example_database_dimensions.py",
100
106
  _python_database_dimensions_source(data_folder_name=data_folder_name),
101
107
  )
108
+ if workspace_id == "claims2":
109
+ write_text_file(
110
+ flow_dir / "claims2_parallel_poll.py",
111
+ _python_parallel_poll_source(data_folder_name=data_folder_name),
112
+ )
113
+ write_text_file(
114
+ flow_dir / "claims2_parallel_schedule.py",
115
+ _python_parallel_schedule_source(data_folder_name=data_folder_name),
116
+ )
117
+ write_text_file(
118
+ flow_dir / "claims2_parallel_manual.py",
119
+ _python_parallel_manual_source(data_folder_name=data_folder_name),
120
+ )
102
121
 
103
122
 
104
123
  def create_notebook_flow_modules(
@@ -168,6 +187,25 @@ def create_smoke_data_root(
168
187
  )
169
188
 
170
189
 
190
+ def create_parallel_claims_data_root(
191
+ data_root: Path,
192
+ *,
193
+ file_count: int = 12,
194
+ rows_per_workbook: int = 2,
195
+ column_count: int = len(_BASE_CLAIMS_COLUMNS),
196
+ ) -> None:
197
+ """Generate one fixed-size parallel smoke dataset for file-scoped runtime tests."""
198
+ parallel_dir = data_root / "Input" / "claims_parallel_12"
199
+ parallel_dir.mkdir(parents=True, exist_ok=True)
200
+ for index in range(1, file_count + 1):
201
+ _write_claims_workbook(
202
+ parallel_dir / f"claims_parallel_{index:02d}.xlsx",
203
+ workbook_index=100 + index,
204
+ rows_per_workbook=rows_per_workbook,
205
+ column_count=column_count,
206
+ )
207
+
208
+
171
209
  def _claims_headers(*, column_count: int) -> tuple[str, ...]:
172
210
  extra_count = column_count - len(_BASE_CLAIMS_COLUMNS)
173
211
  extra_columns = tuple(f"Attribute {index:02d}" for index in range(1, extra_count + 1))
@@ -488,6 +526,120 @@ def build():
488
526
  """
489
527
 
490
528
 
529
+ def _parallel_runtime_helpers(*, data_folder_name: str, output_folder_name: str) -> str:
530
+ return f"""
531
+
532
+ import polars as pl
533
+
534
+ from data_engine.helpers import write_parquet_atomic
535
+
536
+
537
+ def read_claims(context):
538
+ return pl.read_excel(context.source.path)
539
+
540
+
541
+ def write_target(context):
542
+ output = context.mirror.with_suffix(".parquet")
543
+ write_parquet_atomic(context.current, output)
544
+ return output
545
+
546
+
547
+ SOURCE_ROOT = "../../../{data_folder_name}/Input/claims_parallel_12"
548
+ TARGET_ROOT = "../../../{data_folder_name}/Output/{output_folder_name}"
549
+ """
550
+
551
+
552
+ def _python_parallel_poll_source(*, data_folder_name: str) -> str:
553
+ return (
554
+ """from __future__ import annotations
555
+
556
+ from data_engine import Flow
557
+ """
558
+ + _parallel_runtime_helpers(data_folder_name=data_folder_name, output_folder_name="claims2_parallel_poll")
559
+ + """
560
+
561
+ DESCRIPTION = "Claims2 parallel poll demo with 12 source workbooks and bounded file concurrency."
562
+
563
+
564
+ def build():
565
+ return (
566
+ Flow(name="claims2_parallel_poll", group="Parallel")
567
+ .watch(
568
+ mode="poll",
569
+ source=SOURCE_ROOT,
570
+ interval="5s",
571
+ extensions=[".xlsx", ".xls", ".xlsm"],
572
+ settle=1,
573
+ max_parallel=4,
574
+ )
575
+ .mirror(root=TARGET_ROOT)
576
+ .step(read_claims, label="Read Excel")
577
+ .step(write_target, label="Write Parquet")
578
+ )
579
+ """
580
+ )
581
+
582
+
583
+ def _python_parallel_schedule_source(*, data_folder_name: str) -> str:
584
+ return (
585
+ """from __future__ import annotations
586
+
587
+ from data_engine import Flow
588
+ """
589
+ + _parallel_runtime_helpers(data_folder_name=data_folder_name, output_folder_name="claims2_parallel_schedule")
590
+ + """
591
+
592
+ DESCRIPTION = "Claims2 parallel schedule demo with 12 source workbooks and bounded file concurrency."
593
+
594
+
595
+ def build():
596
+ return (
597
+ Flow(name="claims2_parallel_schedule", group="Parallel")
598
+ .watch(
599
+ mode="schedule",
600
+ run_as="individual",
601
+ source=SOURCE_ROOT,
602
+ interval="5s",
603
+ extensions=[".xlsx", ".xls", ".xlsm"],
604
+ max_parallel=4,
605
+ )
606
+ .mirror(root=TARGET_ROOT)
607
+ .step(read_claims, label="Read Excel")
608
+ .step(write_target, label="Write Parquet")
609
+ )
610
+ """
611
+ )
612
+
613
+
614
+ def _python_parallel_manual_source(*, data_folder_name: str) -> str:
615
+ return (
616
+ """from __future__ import annotations
617
+
618
+ from data_engine import Flow
619
+ """
620
+ + _parallel_runtime_helpers(data_folder_name=data_folder_name, output_folder_name="claims2_parallel_manual")
621
+ + """
622
+
623
+ DESCRIPTION = "Claims2 parallel manual demo with 12 source workbooks and bounded file concurrency."
624
+
625
+
626
+ def build():
627
+ return (
628
+ Flow(name="claims2_parallel_manual", group="Parallel")
629
+ .watch(
630
+ mode="manual",
631
+ source=SOURCE_ROOT,
632
+ extensions=[".xlsx", ".xls", ".xlsm"],
633
+ max_parallel=4,
634
+ )
635
+ .mirror(root=TARGET_ROOT)
636
+ .step(read_claims, label="Read Excel")
637
+ .step(write_target, label="Write Parquet")
638
+ )
639
+ """
640
+ )
641
+
642
+
491
643
  def _poll_notebook_source(*, workspace_id: str, data_folder_name: str) -> str:
492
644
  return f"""from __future__ import annotations
493
645
 
@@ -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=37f418d5"></script>
16
+ <script src="../../../_static/documentation_options.js?v=a47416a6"></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>
@@ -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=37f418d5"></script>
16
+ <script src="../../../_static/documentation_options.js?v=a47416a6"></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>
@@ -180,6 +180,7 @@
180
180
  <span class="o">*</span><span class="p">,</span>
181
181
  <span class="n">mode</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
182
182
  <span class="n">run_as</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;individual&quot;</span><span class="p">,</span>
183
+ <span class="n">max_parallel</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
183
184
  <span class="n">source</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">Path</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="n">interval</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
185
186
  <span class="n">time</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="o">...</span><span class="p">]</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="nb">set</span><span class="p">[</span><span class="nb">str</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>
@@ -214,6 +215,9 @@
214
215
  <span class="sd"> run_as : str</span>
215
216
  <span class="sd"> ``&quot;individual&quot;`` to run once per source file, or ``&quot;batch&quot;`` to run</span>
216
217
  <span class="sd"> once for the full source set.</span>
218
+ <span class="sd"> max_parallel : int</span>
219
+ <span class="sd"> Maximum number of concurrent source-file runs for one flow when</span>
220
+ <span class="sd"> ``run_as=&quot;individual&quot;``. Defaults to ``1``.</span>
217
221
  <span class="sd"> source : str | Path | None</span>
218
222
  <span class="sd"> File or directory watched by poll/schedule triggers.</span>
219
223
  <span class="sd"> interval : str | None</span>
@@ -245,6 +249,9 @@
245
249
  <span class="k">if</span> <span class="n">normalized_run_as</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">&quot;individual&quot;</span><span class="p">,</span> <span class="s2">&quot;batch&quot;</span><span class="p">}:</span>
246
250
  <span class="k">raise</span> <span class="n">FlowValidationError</span><span class="p">(</span><span class="s2">&quot;watch() run_as must be either &#39;individual&#39; or &#39;batch&#39;.&quot;</span><span class="p">)</span>
247
251
 
252
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">max_parallel</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="ow">or</span> <span class="n">max_parallel</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
253
+ <span class="k">raise</span> <span class="n">FlowValidationError</span><span class="p">(</span><span class="s2">&quot;watch() max_parallel must be an integer greater than or equal to one.&quot;</span><span class="p">)</span>
254
+
248
255
  <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">settle</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="ow">or</span> <span class="n">settle</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
249
256
  <span class="k">raise</span> <span class="n">FlowValidationError</span><span class="p">(</span><span class="s2">&quot;watch() settle must be an integer greater than or equal to zero.&quot;</span><span class="p">)</span>
250
257
 
@@ -260,6 +267,7 @@
260
267
  <span class="n">trigger</span><span class="o">=</span><span class="n">WatchSpec</span><span class="p">(</span>
261
268
  <span class="n">mode</span><span class="o">=</span><span class="s2">&quot;manual&quot;</span><span class="p">,</span>
262
269
  <span class="n">run_as</span><span class="o">=</span><span class="n">normalized_run_as</span><span class="p">,</span>
270
+ <span class="n">max_parallel</span><span class="o">=</span><span class="n">max_parallel</span><span class="p">,</span>
263
271
  <span class="n">source</span><span class="o">=</span><span class="n">resolved_source</span><span class="p">,</span>
264
272
  <span class="n">extensions</span><span class="o">=</span><span class="n">normalized_extensions</span><span class="p">,</span>
265
273
  <span class="p">)</span>
@@ -276,6 +284,7 @@
276
284
  <span class="n">trigger</span><span class="o">=</span><span class="n">WatchSpec</span><span class="p">(</span>
277
285
  <span class="n">mode</span><span class="o">=</span><span class="s2">&quot;poll&quot;</span><span class="p">,</span>
278
286
  <span class="n">run_as</span><span class="o">=</span><span class="n">normalized_run_as</span><span class="p">,</span>
287
+ <span class="n">max_parallel</span><span class="o">=</span><span class="n">max_parallel</span><span class="p">,</span>
279
288
  <span class="n">source</span><span class="o">=</span><span class="n">resolved_source</span><span class="p">,</span>
280
289
  <span class="n">interval</span><span class="o">=</span><span class="n">interval</span><span class="p">,</span>
281
290
  <span class="n">interval_seconds</span><span class="o">=</span><span class="n">_parse_duration</span><span class="p">(</span><span class="n">interval</span><span class="p">),</span>
@@ -293,6 +302,7 @@
293
302
  <span class="n">trigger</span><span class="o">=</span><span class="n">WatchSpec</span><span class="p">(</span>
294
303
  <span class="n">mode</span><span class="o">=</span><span class="s2">&quot;schedule&quot;</span><span class="p">,</span>
295
304
  <span class="n">run_as</span><span class="o">=</span><span class="n">normalized_run_as</span><span class="p">,</span>
305
+ <span class="n">max_parallel</span><span class="o">=</span><span class="n">max_parallel</span><span class="p">,</span>
296
306
  <span class="n">source</span><span class="o">=</span><span class="n">resolved_source</span><span class="p">,</span>
297
307
  <span class="n">interval</span><span class="o">=</span><span class="n">interval</span><span class="p">,</span>
298
308
  <span class="n">interval_seconds</span><span class="o">=</span><span class="n">_parse_duration</span><span class="p">(</span><span class="n">interval</span><span class="p">),</span>
@@ -305,6 +315,7 @@
305
315
  <span class="n">trigger</span><span class="o">=</span><span class="n">WatchSpec</span><span class="p">(</span>
306
316
  <span class="n">mode</span><span class="o">=</span><span class="s2">&quot;schedule&quot;</span><span class="p">,</span>
307
317
  <span class="n">run_as</span><span class="o">=</span><span class="n">normalized_run_as</span><span class="p">,</span>
318
+ <span class="n">max_parallel</span><span class="o">=</span><span class="n">max_parallel</span><span class="p">,</span>
308
319
  <span class="n">source</span><span class="o">=</span><span class="n">resolved_source</span><span class="p">,</span>
309
320
  <span class="n">time</span><span class="o">=</span><span class="n">time_values</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">time_values</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">time_values</span><span class="p">,</span>
310
321
  <span class="n">times</span><span class="o">=</span><span class="n">time_values</span><span class="p">,</span>
@@ -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=37f418d5"></script>
16
+ <script src="../../../_static/documentation_options.js?v=a47416a6"></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>
@@ -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=37f418d5"></script>
16
+ <script src="../../../_static/documentation_options.js?v=a47416a6"></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>
@@ -107,6 +107,7 @@
107
107
 
108
108
  <span class="n">mode</span><span class="p">:</span> <span class="nb">str</span>
109
109
  <span class="n">run_as</span><span class="p">:</span> <span class="nb">str</span>
110
+ <span class="n">max_parallel</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">1</span>
110
111
  <span class="n">source</span><span class="p">:</span> <span class="n">Path</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
111
112
  <span class="n">interval</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
112
113
  <span class="n">interval_seconds</span><span class="p">:</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
@@ -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=37f418d5"></script>
16
+ <script src="../../../_static/documentation_options.js?v=a47416a6"></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>