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.
- {py_data_engine-0.2.1/src/py_data_engine.egg-info → py_data_engine-0.2.3}/PKG-INFO +2 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/pyproject.toml +1 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/actions.py +2 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/control.py +14 -14
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/runtime.py +63 -21
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/core/flow.py +11 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/core/primitives.py +1 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/devtools/smoke_data.py +153 -1
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_modules/index.html +1 -1
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/guides/recipes.md.txt +55 -3
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/documentation_options.js +1 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/api.html +464 -10
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/genindex.html +46 -8
- {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
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/authoring-flow-modules.html +8 -6
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/configuring-flows.html +6 -6
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/core-concepts.html +6 -6
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/database-methods.html +4 -4
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/duckdb-helpers.html +6 -6
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/flow-context.html +8 -8
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/flow-methods.html +7 -7
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/getting-started.html +9 -8
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/project-inventory.html +909 -29
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/project-map.html +66 -66
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/guides/recipes.html +56 -4
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/index.html +4 -1
- py_data_engine-0.2.3/src/data_engine/docs/html/objects.inv +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/py-modindex.html +1 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/search.html +1 -1
- py_data_engine-0.2.3/src/data_engine/docs/html/searchindex.js +1 -0
- {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
- {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
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/configuring-flows.md +5 -5
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/core-concepts.md +5 -5
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/database-methods.md +3 -3
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/duckdb-helpers.md +5 -5
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/flow-context.md +7 -7
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/flow-methods.md +6 -6
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/getting-started.md +8 -7
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/project-inventory.md +544 -18
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/project-map.md +26 -26
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/guides/recipes.md +55 -3
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/actions.py +1 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/catalog.py +2 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/details.py +2 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/logs.py +20 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/operations.py +13 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/flow_modules/flow_module_compiler.py +82 -18
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/flow_modules/flow_module_loader.py +85 -15
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/helpers/__init__.py +4 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/helpers/polars.py +493 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/helpers/schema.py +12 -3
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/app.py +36 -2
- py_data_engine-0.2.3/src/data_engine/hosts/daemon/commands.py +76 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/composition.py +17 -6
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/manager.py +99 -85
- py_data_engine-0.2.3/src/data_engine/hosts/daemon/runtime_commands.py +234 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/runtime_control.py +5 -2
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/server.py +42 -8
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/identity.py +1 -1
- py_data_engine-0.2.3/src/data_engine/platform/instrumentation.py +184 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/workspace_policy.py +3 -11
- py_data_engine-0.2.3/src/data_engine/runtime/execution/continuous.py +111 -0
- py_data_engine-0.2.3/src/data_engine/runtime/execution/logging.py +293 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/single.py +146 -10
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/runtime_cache_store.py +130 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/runtime_control_store.py +20 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/shared_state.py +56 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/sqlite_store.py +1 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/__init__.py +2 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/flow_catalog.py +9 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/logs.py +16 -3
- py_data_engine-0.2.3/src/data_engine/services/reset.py +61 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/runtime_binding.py +45 -3
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/runtime_execution.py +9 -1
- py_data_engine-0.2.3/src/data_engine/services/runtime_history.py +120 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/runtime_ports.py +14 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/shared_state.py +16 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/app.py +6 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/app.py +1 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/bootstrap.py +12 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/bootstrapper.py +20 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/control_support.py +12 -26
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/controllers/flows.py +188 -32
- py_data_engine-0.2.3/src/data_engine/ui/gui/controllers/runtime.py +461 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/__init__.py +2 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/logs.py +46 -5
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/runtime_projection.py +2 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/sidebar.py +3 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/workspace_binding.py +13 -0
- py_data_engine-0.2.3/src/data_engine/ui/gui/presenters/workspace_settings.py +285 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/runtime.py +1 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/support.py +5 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/surface.py +17 -2
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/theme.py +26 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/widgets/panels.py +13 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/widgets/sidebar.py +2 -2
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/widgets/steps.py +7 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/app.py +1 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/bootstrap.py +12 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/bootstrapper.py +2 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/controllers/flows.py +22 -3
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/actions.py +35 -9
- py_data_engine-0.2.3/src/data_engine/views/logs.py +105 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/models.py +3 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/runs.py +6 -7
- {py_data_engine-0.2.1 → py_data_engine-0.2.3/src/py_data_engine.egg-info}/PKG-INFO +2 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/py_data_engine.egg-info/SOURCES.txt +5 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/py_data_engine.egg-info/requires.txt +1 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_application.py +280 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_builder.py +24 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_cli.py +13 -2
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_daemon.py +275 -20
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_details.py +3 -2
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_inspection.py +21 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_runtime.py +1 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_flow_module_compiler.py +81 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_flow_module_loader.py +62 -3
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_helpers_polars.py +154 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_integration.py +140 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_logs.py +121 -0
- py_data_engine-0.2.3/tests/test_platform_instrumentation.py +78 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_qt_ui.py +749 -24
- py_data_engine-0.2.3/tests/test_reset_service.py +194 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_runtime_db.py +43 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_runtime_history_service.py +62 -1
- py_data_engine-0.2.3/tests/test_runtime_logging.py +63 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_schema_helper.py +21 -4
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_services.py +15 -3
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_smoke_data.py +10 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_sources.py +16 -7
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_tui.py +22 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_ui_bootstrap.py +2 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_ui_models.py +87 -1
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_views_helpers.py +4 -1
- py_data_engine-0.2.1/src/data_engine/docs/html/objects.inv +0 -0
- py_data_engine-0.2.1/src/data_engine/docs/html/searchindex.js +0 -1
- py_data_engine-0.2.1/src/data_engine/hosts/daemon/commands.py +0 -64
- py_data_engine-0.2.1/src/data_engine/hosts/daemon/runtime_commands.py +0 -188
- py_data_engine-0.2.1/src/data_engine/runtime/execution/continuous.py +0 -117
- py_data_engine-0.2.1/src/data_engine/runtime/execution/logging.py +0 -99
- py_data_engine-0.2.1/src/data_engine/services/runtime_history.py +0 -62
- py_data_engine-0.2.1/src/data_engine/ui/gui/controllers/runtime.py +0 -247
- py_data_engine-0.2.1/src/data_engine/ui/gui/presenters/workspace_settings.py +0 -173
- py_data_engine-0.2.1/src/data_engine/views/logs.py +0 -62
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/LICENSE +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/README.md +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/setup.cfg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/setup.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/catalog.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/details.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/application/workspace.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/authoring/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/authoring/flow.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/authoring/services.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/core/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/core/helpers.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/core/model.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/devtools/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/devtools/project_ast_map.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/api.rst.txt +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_sources/index.rst.txt +0 -0
- {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
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/base-stemmer.js +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/basic.css +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/badge_only.css +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/css/theme.css +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/custom.css +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/doctools.js +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/english-stemmer.js +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/file.png +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/jquery.js +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/js/badge_only.js +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/js/theme.js +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/js/versions.js +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/language_data.js +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/minus.png +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/plus.png +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/pygments.css +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/searchtools.js +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/html/_static/sphinx_highlight.js +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/_static/custom.css +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/api.rst +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/conf.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/docs/sphinx_source/index.rst +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/diagnostics.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/errors.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/inspection.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/operator.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/runs.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/runtime.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/source_state.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/support.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/time.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/domain/workspace.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/flow_modules/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/helpers/duckdb.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/bootstrap.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/client.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/constants.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/entrypoints.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/lifecycle.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/ownership.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/shared_state.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/daemon/state_sync.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/hosts/scheduler.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/interpreters.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/local_settings.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/paths.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/processes.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/theme.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/platform/workspace_models.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/engine.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/app.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/context.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/grouped.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/polling.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/execution/runner.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/file_watch.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/ledger_models.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/runtime_db.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/runtime/stop.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/daemon.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/daemon_state.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/flow_execution.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/ledger.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/settings.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/theme.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/workspace_provisioning.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/services/workspaces.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/commands_doctor.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/commands_run.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/commands_start.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/commands_workspace.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/dependencies.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/cli/parser.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/cache_models.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/controllers/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/dialogs/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/dialogs/messages.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/dialogs/previews.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/helpers/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/helpers/inspection.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/helpers/lifecycle.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/helpers/scroll.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/helpers/theming.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/dark_light.svg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/documentation.svg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/failed.svg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/group.svg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/home.svg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/manual.svg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/poll.svg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/schedule.svg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/settings.svg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/started.svg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/success.svg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons/view-log.svg +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/icons.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/launcher.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/docs.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/steps.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/presenters/workspace.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/preview_models.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/render_support.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/rendering/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/rendering/artifacts.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/rendering/icons.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/state_support.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/widgets/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/widgets/config.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/gui/widgets/logs.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/controllers/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/controllers/runtime.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/runtime.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/state_support.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/support.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/theme.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/ui/tui/widgets.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/__init__.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/artifacts.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/flow_display.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/presentation.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/state.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/status.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/data_engine/views/text.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/py_data_engine.egg-info/dependency_links.txt +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/py_data_engine.egg-info/entry_points.txt +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/src/py_data_engine.egg-info/top_level.txt +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_authoring_helpers.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_authoring_services.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_cli_helpers.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_actions.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_catalog.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_errors.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_logs.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_operations.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_operator.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_runs.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_support.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_domain_workspace.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_export_project_bundle_script.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_helpers_duckdb.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_live_runtime_suite.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_local_settings.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_platform_identity.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_project_ast_map.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_scheduler_host.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_shared_state.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_theme.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_tui_widgets.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_ui_runtime_theme.py +0 -0
- {py_data_engine-0.2.1 → py_data_engine-0.2.3}/tests/test_ui_state.py +0 -0
- {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.
|
|
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
|
|
@@ -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
|
|
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
|
-
|
|
132
|
-
|
|
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
|
|
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
|
|
139
|
-
if runtime_session.
|
|
140
|
-
|
|
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(
|
|
149
|
+
error_text=_verbose_action_error("stop the engine", result.error),
|
|
150
150
|
)
|
|
151
|
-
return OperatorActionResult(requested=True, sync_after=True, status_text="Stopping
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
)
|
|
375
|
-
|
|
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
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
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,
|
|
@@ -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=
|
|
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=
|
|
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">"individual"</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"> ``"individual"`` to run once per source file, or ``"batch"`` 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="individual"``. 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">"individual"</span><span class="p">,</span> <span class="s2">"batch"</span><span class="p">}:</span>
|
|
246
250
|
<span class="k">raise</span> <span class="n">FlowValidationError</span><span class="p">(</span><span class="s2">"watch() run_as must be either 'individual' or 'batch'."</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"><=</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">"watch() max_parallel must be an integer greater than or equal to one."</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"><</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">"watch() settle must be an integer greater than or equal to zero."</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">"manual"</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">"poll"</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">"schedule"</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">"schedule"</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=
|
|
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=
|
|
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=
|
|
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>
|