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