py-data-engine 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. data_engine/__init__.py +37 -0
  2. data_engine/application/__init__.py +39 -0
  3. data_engine/application/actions.py +42 -0
  4. data_engine/application/catalog.py +151 -0
  5. data_engine/application/control.py +213 -0
  6. data_engine/application/details.py +73 -0
  7. data_engine/application/runtime.py +449 -0
  8. data_engine/application/workspace.py +62 -0
  9. data_engine/authoring/__init__.py +14 -0
  10. data_engine/authoring/builder.py +31 -0
  11. data_engine/authoring/execution/__init__.py +6 -0
  12. data_engine/authoring/execution/app.py +6 -0
  13. data_engine/authoring/execution/context.py +82 -0
  14. data_engine/authoring/execution/continuous.py +176 -0
  15. data_engine/authoring/execution/grouped.py +106 -0
  16. data_engine/authoring/execution/logging.py +83 -0
  17. data_engine/authoring/execution/polling.py +135 -0
  18. data_engine/authoring/execution/runner.py +210 -0
  19. data_engine/authoring/execution/single.py +171 -0
  20. data_engine/authoring/flow.py +361 -0
  21. data_engine/authoring/helpers.py +160 -0
  22. data_engine/authoring/model.py +59 -0
  23. data_engine/authoring/primitives.py +430 -0
  24. data_engine/authoring/services.py +42 -0
  25. data_engine/devtools/__init__.py +3 -0
  26. data_engine/devtools/project_ast_map.py +503 -0
  27. data_engine/docs/__init__.py +1 -0
  28. data_engine/docs/sphinx_source/_static/custom.css +13 -0
  29. data_engine/docs/sphinx_source/api.rst +42 -0
  30. data_engine/docs/sphinx_source/conf.py +37 -0
  31. data_engine/docs/sphinx_source/guides/app-runtime-and-workspaces.md +397 -0
  32. data_engine/docs/sphinx_source/guides/authoring-flow-modules.md +215 -0
  33. data_engine/docs/sphinx_source/guides/configuring-flows.md +185 -0
  34. data_engine/docs/sphinx_source/guides/core-concepts.md +208 -0
  35. data_engine/docs/sphinx_source/guides/database-methods.md +107 -0
  36. data_engine/docs/sphinx_source/guides/duckdb-helpers.md +462 -0
  37. data_engine/docs/sphinx_source/guides/flow-context.md +538 -0
  38. data_engine/docs/sphinx_source/guides/flow-methods.md +206 -0
  39. data_engine/docs/sphinx_source/guides/getting-started.md +271 -0
  40. data_engine/docs/sphinx_source/guides/project-inventory.md +5683 -0
  41. data_engine/docs/sphinx_source/guides/project-map.md +118 -0
  42. data_engine/docs/sphinx_source/guides/recipes.md +268 -0
  43. data_engine/docs/sphinx_source/index.rst +22 -0
  44. data_engine/domain/__init__.py +92 -0
  45. data_engine/domain/actions.py +69 -0
  46. data_engine/domain/catalog.py +128 -0
  47. data_engine/domain/details.py +214 -0
  48. data_engine/domain/diagnostics.py +56 -0
  49. data_engine/domain/errors.py +104 -0
  50. data_engine/domain/inspection.py +99 -0
  51. data_engine/domain/logs.py +118 -0
  52. data_engine/domain/operations.py +172 -0
  53. data_engine/domain/operator.py +72 -0
  54. data_engine/domain/runs.py +155 -0
  55. data_engine/domain/runtime.py +279 -0
  56. data_engine/domain/source_state.py +17 -0
  57. data_engine/domain/support.py +54 -0
  58. data_engine/domain/time.py +23 -0
  59. data_engine/domain/workspace.py +159 -0
  60. data_engine/flow_modules/__init__.py +1 -0
  61. data_engine/flow_modules/flow_module_compiler.py +179 -0
  62. data_engine/flow_modules/flow_module_loader.py +201 -0
  63. data_engine/helpers/__init__.py +25 -0
  64. data_engine/helpers/duckdb.py +705 -0
  65. data_engine/hosts/__init__.py +1 -0
  66. data_engine/hosts/daemon/__init__.py +23 -0
  67. data_engine/hosts/daemon/app.py +221 -0
  68. data_engine/hosts/daemon/bootstrap.py +69 -0
  69. data_engine/hosts/daemon/client.py +465 -0
  70. data_engine/hosts/daemon/commands.py +64 -0
  71. data_engine/hosts/daemon/composition.py +310 -0
  72. data_engine/hosts/daemon/constants.py +15 -0
  73. data_engine/hosts/daemon/entrypoints.py +97 -0
  74. data_engine/hosts/daemon/lifecycle.py +191 -0
  75. data_engine/hosts/daemon/manager.py +272 -0
  76. data_engine/hosts/daemon/ownership.py +126 -0
  77. data_engine/hosts/daemon/runtime_commands.py +188 -0
  78. data_engine/hosts/daemon/runtime_control.py +31 -0
  79. data_engine/hosts/daemon/server.py +84 -0
  80. data_engine/hosts/daemon/shared_state.py +147 -0
  81. data_engine/hosts/daemon/state_sync.py +101 -0
  82. data_engine/platform/__init__.py +1 -0
  83. data_engine/platform/identity.py +35 -0
  84. data_engine/platform/local_settings.py +146 -0
  85. data_engine/platform/theme.py +259 -0
  86. data_engine/platform/workspace_models.py +190 -0
  87. data_engine/platform/workspace_policy.py +333 -0
  88. data_engine/runtime/__init__.py +1 -0
  89. data_engine/runtime/file_watch.py +185 -0
  90. data_engine/runtime/ledger_models.py +116 -0
  91. data_engine/runtime/runtime_db.py +938 -0
  92. data_engine/runtime/shared_state.py +523 -0
  93. data_engine/services/__init__.py +49 -0
  94. data_engine/services/daemon.py +64 -0
  95. data_engine/services/daemon_state.py +40 -0
  96. data_engine/services/flow_catalog.py +102 -0
  97. data_engine/services/flow_execution.py +48 -0
  98. data_engine/services/ledger.py +85 -0
  99. data_engine/services/logs.py +65 -0
  100. data_engine/services/runtime_binding.py +105 -0
  101. data_engine/services/runtime_execution.py +126 -0
  102. data_engine/services/runtime_history.py +62 -0
  103. data_engine/services/settings.py +58 -0
  104. data_engine/services/shared_state.py +28 -0
  105. data_engine/services/theme.py +59 -0
  106. data_engine/services/workspace_provisioning.py +224 -0
  107. data_engine/services/workspaces.py +74 -0
  108. data_engine/ui/__init__.py +3 -0
  109. data_engine/ui/cli/__init__.py +19 -0
  110. data_engine/ui/cli/app.py +161 -0
  111. data_engine/ui/cli/commands_doctor.py +178 -0
  112. data_engine/ui/cli/commands_run.py +80 -0
  113. data_engine/ui/cli/commands_start.py +100 -0
  114. data_engine/ui/cli/commands_workspace.py +97 -0
  115. data_engine/ui/cli/dependencies.py +44 -0
  116. data_engine/ui/cli/parser.py +56 -0
  117. data_engine/ui/gui/__init__.py +25 -0
  118. data_engine/ui/gui/app.py +116 -0
  119. data_engine/ui/gui/bootstrap.py +487 -0
  120. data_engine/ui/gui/bootstrapper.py +140 -0
  121. data_engine/ui/gui/cache_models.py +23 -0
  122. data_engine/ui/gui/control_support.py +185 -0
  123. data_engine/ui/gui/controllers/__init__.py +6 -0
  124. data_engine/ui/gui/controllers/flows.py +439 -0
  125. data_engine/ui/gui/controllers/runtime.py +245 -0
  126. data_engine/ui/gui/dialogs/__init__.py +12 -0
  127. data_engine/ui/gui/dialogs/messages.py +88 -0
  128. data_engine/ui/gui/dialogs/previews.py +222 -0
  129. data_engine/ui/gui/helpers/__init__.py +62 -0
  130. data_engine/ui/gui/helpers/inspection.py +81 -0
  131. data_engine/ui/gui/helpers/lifecycle.py +112 -0
  132. data_engine/ui/gui/helpers/scroll.py +28 -0
  133. data_engine/ui/gui/helpers/theming.py +87 -0
  134. data_engine/ui/gui/icons/dark_light.svg +12 -0
  135. data_engine/ui/gui/icons/documentation.svg +1 -0
  136. data_engine/ui/gui/icons/failed.svg +3 -0
  137. data_engine/ui/gui/icons/group.svg +4 -0
  138. data_engine/ui/gui/icons/home.svg +2 -0
  139. data_engine/ui/gui/icons/manual.svg +2 -0
  140. data_engine/ui/gui/icons/poll.svg +2 -0
  141. data_engine/ui/gui/icons/schedule.svg +4 -0
  142. data_engine/ui/gui/icons/settings.svg +2 -0
  143. data_engine/ui/gui/icons/started.svg +3 -0
  144. data_engine/ui/gui/icons/success.svg +3 -0
  145. data_engine/ui/gui/icons/view-log.svg +3 -0
  146. data_engine/ui/gui/icons.py +50 -0
  147. data_engine/ui/gui/launcher.py +48 -0
  148. data_engine/ui/gui/presenters/__init__.py +72 -0
  149. data_engine/ui/gui/presenters/docs.py +140 -0
  150. data_engine/ui/gui/presenters/logs.py +58 -0
  151. data_engine/ui/gui/presenters/runtime_projection.py +29 -0
  152. data_engine/ui/gui/presenters/sidebar.py +88 -0
  153. data_engine/ui/gui/presenters/steps.py +148 -0
  154. data_engine/ui/gui/presenters/workspace.py +39 -0
  155. data_engine/ui/gui/presenters/workspace_binding.py +75 -0
  156. data_engine/ui/gui/presenters/workspace_settings.py +182 -0
  157. data_engine/ui/gui/preview_models.py +37 -0
  158. data_engine/ui/gui/render_support.py +241 -0
  159. data_engine/ui/gui/rendering/__init__.py +12 -0
  160. data_engine/ui/gui/rendering/artifacts.py +95 -0
  161. data_engine/ui/gui/rendering/icons.py +50 -0
  162. data_engine/ui/gui/runtime.py +47 -0
  163. data_engine/ui/gui/state_support.py +193 -0
  164. data_engine/ui/gui/support.py +214 -0
  165. data_engine/ui/gui/surface.py +209 -0
  166. data_engine/ui/gui/theme.py +720 -0
  167. data_engine/ui/gui/widgets/__init__.py +34 -0
  168. data_engine/ui/gui/widgets/config.py +41 -0
  169. data_engine/ui/gui/widgets/logs.py +62 -0
  170. data_engine/ui/gui/widgets/panels.py +507 -0
  171. data_engine/ui/gui/widgets/sidebar.py +130 -0
  172. data_engine/ui/gui/widgets/steps.py +84 -0
  173. data_engine/ui/tui/__init__.py +5 -0
  174. data_engine/ui/tui/app.py +222 -0
  175. data_engine/ui/tui/bootstrap.py +475 -0
  176. data_engine/ui/tui/bootstrapper.py +117 -0
  177. data_engine/ui/tui/controllers/__init__.py +6 -0
  178. data_engine/ui/tui/controllers/flows.py +349 -0
  179. data_engine/ui/tui/controllers/runtime.py +167 -0
  180. data_engine/ui/tui/runtime.py +34 -0
  181. data_engine/ui/tui/state_support.py +141 -0
  182. data_engine/ui/tui/support.py +63 -0
  183. data_engine/ui/tui/theme.py +204 -0
  184. data_engine/ui/tui/widgets.py +123 -0
  185. data_engine/views/__init__.py +109 -0
  186. data_engine/views/actions.py +80 -0
  187. data_engine/views/artifacts.py +58 -0
  188. data_engine/views/flow_display.py +69 -0
  189. data_engine/views/logs.py +54 -0
  190. data_engine/views/models.py +96 -0
  191. data_engine/views/presentation.py +133 -0
  192. data_engine/views/runs.py +62 -0
  193. data_engine/views/state.py +39 -0
  194. data_engine/views/status.py +13 -0
  195. data_engine/views/text.py +109 -0
  196. py_data_engine-0.1.0.dist-info/METADATA +330 -0
  197. py_data_engine-0.1.0.dist-info/RECORD +200 -0
  198. py_data_engine-0.1.0.dist-info/WHEEL +5 -0
  199. py_data_engine-0.1.0.dist-info/entry_points.txt +2 -0
  200. py_data_engine-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,109 @@
1
+ """Shared plain-text rendering helpers for terminal-style surfaces."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from data_engine.domain import FlowRunState, OperationSessionState, RunDetailState, SelectedFlowDetailState
6
+ from data_engine.views.runs import RunGroupDisplay
7
+ from data_engine.views.models import QtFlowCard
8
+ from data_engine.views.presentation import format_seconds, operation_marker
9
+
10
+
11
+ def pad(value: str, width: int) -> str:
12
+ """Pad or truncate one text cell to a fixed width."""
13
+ text = str(value)
14
+ if len(text) > width:
15
+ if width <= 1:
16
+ return text[:width]
17
+ return text[: width - 1] + "…"
18
+ return text.ljust(width)
19
+
20
+
21
+ def short_datetime(text: str) -> str:
22
+ """Collapse one display timestamp to a shorter day/time string."""
23
+ parts = text.split()
24
+ if len(parts) >= 3:
25
+ return f"{parts[1]} {parts[2]}"
26
+ return text
27
+
28
+
29
+ def format_optional_seconds(seconds: float | None) -> str:
30
+ """Format an optional duration using the shared compact duration style."""
31
+ if seconds is None:
32
+ return "-"
33
+ return format_seconds(seconds)
34
+
35
+
36
+ def run_group_row_text(run_state: FlowRunState) -> str:
37
+ """Render one compact run-group row for list displays."""
38
+ detail = RunDetailState.from_run(run_state)
39
+ display = RunGroupDisplay.from_run(run_state)
40
+ status = display.status_text.upper()
41
+ duration = format_optional_seconds(detail.elapsed_seconds)
42
+ return (
43
+ f"{pad(short_datetime(display.primary_label), 11)} "
44
+ f"{pad(status, 8)} "
45
+ f"{pad(duration, 6)} "
46
+ f"{display.source_label}"
47
+ )
48
+
49
+
50
+ def render_run_group_lines(run_state: FlowRunState) -> tuple[str, ...]:
51
+ """Render one run-group detail block for modal/detail text surfaces."""
52
+ detail = RunDetailState.from_run(run_state)
53
+ display = RunGroupDisplay.from_run(run_state)
54
+ status = display.status_text.upper()
55
+ duration = format_optional_seconds(detail.elapsed_seconds)
56
+ header = (
57
+ f"{pad(display.primary_label, 22)} "
58
+ f"{pad(f'[{status}]', 10)} "
59
+ f"{pad(duration, 5)} "
60
+ f"{display.source_label}"
61
+ )
62
+ lines = [header]
63
+ for row in detail.step_rows:
64
+ elapsed = format_optional_seconds(row.elapsed_seconds)
65
+ lines.append(
66
+ f" {operation_marker(row.status)} "
67
+ f"{pad(row.step_name, 24)} "
68
+ f"{pad(row.status, 7)} "
69
+ f"{elapsed}"
70
+ )
71
+ return tuple(lines)
72
+
73
+
74
+ def render_operation_lines(card: QtFlowCard, tracker: OperationSessionState) -> tuple[str, ...]:
75
+ """Render one compact step table for terminal/detail displays."""
76
+ detail = SelectedFlowDetailState.from_flow(card, tracker)
77
+ lines: list[str] = [" Step Time", " ----------------------- -----"]
78
+ for row in detail.operation_rows:
79
+ duration = "-"
80
+ if row.elapsed_seconds is not None:
81
+ duration = format_seconds(row.elapsed_seconds)
82
+ lines.append(
83
+ f" {pad(row.name, 23)} "
84
+ f"{duration}"
85
+ )
86
+ return tuple(lines)
87
+
88
+
89
+ def render_selected_flow_lines(card: QtFlowCard, tracker: OperationSessionState) -> tuple[str, ...]:
90
+ """Render the selected-flow detail block used by terminal-style surfaces."""
91
+ detail = SelectedFlowDetailState.from_flow(card, tracker)
92
+ lines = [detail.title, "", "Selected Flow", ""]
93
+ lines.extend(render_operation_lines(card, tracker))
94
+ if detail.description:
95
+ lines.extend(["", "Description", f" {detail.description}"])
96
+ if detail.error:
97
+ lines.extend(["", "Error", f" {detail.error}"])
98
+ return tuple(lines)
99
+
100
+
101
+ __all__ = [
102
+ "format_optional_seconds",
103
+ "pad",
104
+ "render_operation_lines",
105
+ "render_run_group_lines",
106
+ "render_selected_flow_lines",
107
+ "run_group_row_text",
108
+ "short_datetime",
109
+ ]
@@ -0,0 +1,330 @@
1
+ Metadata-Version: 2.4
2
+ Name: py-data-engine
3
+ Version: 0.1.0
4
+ Summary: Workbook-driven workflow jobs with strict filename parsing and DuckDB-backed processing.
5
+ Author: Data Engine contributors
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/bj-data-eng/data-engine
8
+ Project-URL: Repository, https://github.com/bj-data-eng/data-engine
9
+ Project-URL: Issues, https://github.com/bj-data-eng/data-engine/issues
10
+ Keywords: duckdb,excel,parquet,flow,polars
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.14
15
+ Classifier: Topic :: Database
16
+ Classifier: Topic :: Office/Business :: Financial :: Spreadsheet
17
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
+ Requires-Python: >=3.14
19
+ Description-Content-Type: text/markdown
20
+ Requires-Dist: duckdb>=1.5.0
21
+ Requires-Dist: fastexcel>=0.19.0
22
+ Requires-Dist: pyarrow>=23.0.1
23
+ Requires-Dist: PySide6>=6.9.0
24
+ Requires-Dist: textual>=0.74.0
25
+ Requires-Dist: xlsxwriter>=3.2.9
26
+ Provides-Extra: polars
27
+ Requires-Dist: polars>=1.39.0; extra == "polars"
28
+ Provides-Extra: polars-lts
29
+ Requires-Dist: polars-lts-cpu>=1.33.1; extra == "polars-lts"
30
+ Provides-Extra: synthetic
31
+ Requires-Dist: numpy>=2.4.0; extra == "synthetic"
32
+ Requires-Dist: openpyxl>=3.1.0; extra == "synthetic"
33
+ Requires-Dist: pandas>=3.0.0; extra == "synthetic"
34
+ Provides-Extra: notebook
35
+ Requires-Dist: ipykernel>=7.0.0; extra == "notebook"
36
+ Requires-Dist: ipython>=9.0.0; extra == "notebook"
37
+ Requires-Dist: jupyterlab>=4.4.0; extra == "notebook"
38
+ Requires-Dist: notebook>=7.4.0; extra == "notebook"
39
+ Provides-Extra: docs
40
+ Requires-Dist: myst-parser>=4.0.0; extra == "docs"
41
+ Requires-Dist: Sphinx>=9.1.0; extra == "docs"
42
+ Requires-Dist: sphinx_rtd_theme>=3.1.0; extra == "docs"
43
+ Provides-Extra: package
44
+ Requires-Dist: pyinstaller>=6.15.0; extra == "package"
45
+ Provides-Extra: test
46
+ Requires-Dist: openpyxl>=3.1.0; extra == "test"
47
+ Requires-Dist: pandas>=3.0.0; extra == "test"
48
+ Requires-Dist: pydocstyle>=6.3.0; extra == "test"
49
+ Requires-Dist: pytest>=9.0.0; extra == "test"
50
+ Requires-Dist: pytest-cov>=7.0.0; extra == "test"
51
+ Provides-Extra: dev
52
+ Requires-Dist: ipykernel>=7.0.0; extra == "dev"
53
+ Requires-Dist: ipython>=9.0.0; extra == "dev"
54
+ Requires-Dist: jupyterlab>=4.4.0; extra == "dev"
55
+ Requires-Dist: myst-parser>=4.0.0; extra == "dev"
56
+ Requires-Dist: notebook>=7.4.0; extra == "dev"
57
+ Requires-Dist: numpy>=2.4.0; extra == "dev"
58
+ Requires-Dist: openpyxl>=3.1.0; extra == "dev"
59
+ Requires-Dist: pandas>=3.0.0; extra == "dev"
60
+ Requires-Dist: pydocstyle>=6.3.0; extra == "dev"
61
+ Requires-Dist: pyinstaller>=6.15.0; extra == "dev"
62
+ Requires-Dist: pytest>=9.0.0; extra == "dev"
63
+ Requires-Dist: pytest-cov>=7.0.0; extra == "dev"
64
+ Requires-Dist: Sphinx>=9.1.0; extra == "dev"
65
+ Requires-Dist: sphinx_rtd_theme>=3.1.0; extra == "dev"
66
+
67
+ # Data Engine
68
+
69
+ Data Engine is a pre-alpha workflow runtime for file-driven jobs. A flow declares:
70
+
71
+ - a group
72
+ - an optional runtime trigger via `watch(...)`
73
+ - ordered generic `step(...)` callables
74
+
75
+ The runtime orchestrates source handling, scheduling, and mirrored output routing. Poll freshness is tracked in the runtime ledger rather than by comparing output mtimes. Step functions use native libraries directly, such as Polars for dataframe work and DuckDB for SQL work.
76
+
77
+ ## Install
78
+
79
+ ### Installer scripts
80
+
81
+ Use the installer that matches your environment:
82
+
83
+ - macOS: [INSTALL/INSTALL MAC.command](INSTALL/INSTALL%20MAC.command)
84
+ - Windows: [INSTALL/INSTALL WINDOWS.bat](INSTALL/INSTALL%20WINDOWS.bat)
85
+ - Windows VM / CPU-safe Polars test path: [INSTALL/INSTALL WINDOWS_VM.bat](INSTALL/INSTALL%20WINDOWS_VM.bat)
86
+
87
+ The macOS and standard Windows installers install the regular Polars package. The Windows VM installer installs the `polars-lts-cpu` variant instead.
88
+
89
+ ### Manual install
90
+
91
+ Data Engine now uses explicit Polars extras so you can choose the runtime package:
92
+
93
+ ```bash
94
+ python -m pip install -e ".[dev,polars]"
95
+ ```
96
+
97
+ For the CPU-safe LTS variant:
98
+
99
+ ```bash
100
+ python -m pip install -e ".[dev,polars-lts]"
101
+ ```
102
+
103
+ Launch the GUI with:
104
+
105
+ ```bash
106
+ python -m data_engine.ui.cli.app start gui
107
+ ```
108
+
109
+ ## Public API
110
+
111
+ ```python
112
+ from data_engine import Flow, FlowContext, discover_flows, load_flow, run
113
+ ```
114
+
115
+ ## Headless CLI
116
+
117
+ Data Engine now ships with a headless CLI:
118
+
119
+ ```bash
120
+ data-engine list
121
+ data-engine show example_summary
122
+ data-engine run --once example_summary
123
+ data-engine run
124
+ ```
125
+
126
+ `data-engine run` starts the automated engine headlessly for discovered automated flows and keeps running until stopped. Use `--once` to force a single pass instead.
127
+
128
+ ## Workspace Model
129
+
130
+ Data Engine discovers workspaces from a collection root resolved from:
131
+
132
+ - `DATA_ENGINE_WORKSPACE_COLLECTION_ROOT`, when explicitly set
133
+ - `DATA_ENGINE_WORKSPACE_ROOT`, when binding directly to one authored workspace
134
+ - otherwise the machine-local app settings store
135
+
136
+ Each immediate child folder containing `flow_modules/` is treated as a workspace, for example:
137
+
138
+ - `workspaces/example_workspace/flow_modules/`
139
+ - `workspaces/claims2/flow_modules/`
140
+
141
+ The app resolves per-workspace local artifacts under:
142
+
143
+ - `artifacts/workspace_cache/<workspace_id>/`
144
+ - `artifacts/runtime_state/<workspace_id>/`
145
+
146
+ Shared lease and checkpoint state lives inside each authored workspace:
147
+
148
+ - `workspaces/<workspace_id>/.workspace_state/`
149
+
150
+ The app's workspace selection and collection-root preference are machine-local state, not repo-local config checked into the project tree.
151
+
152
+ ## Basic shape
153
+
154
+ ```python
155
+ from data_engine import Flow
156
+ import polars as pl
157
+
158
+
159
+ def read_claims(context):
160
+ return pl.read_excel(context.source.path)
161
+
162
+
163
+ def keep_open(context):
164
+ return context.current.filter(pl.col("status") == "OPEN")
165
+
166
+
167
+ def write_parquet(context):
168
+ output = context.mirror.with_suffix(".parquet")
169
+ context.current.write_parquet(output)
170
+ return output
171
+
172
+
173
+ def build():
174
+ return (
175
+ Flow(group="Claims")
176
+ .watch(
177
+ mode="poll",
178
+ source="../../../example_data/Input/claims_flat",
179
+ interval="5s",
180
+ extensions=[".xlsx", ".xls", ".xlsm"],
181
+ settle=1,
182
+ )
183
+ .mirror(root="../../../example_data/Output/example_mirror")
184
+ .step(read_claims, save_as="raw_df")
185
+ .step(keep_open, use="raw_df", save_as="filtered_df")
186
+ .step(write_parquet, use="filtered_df")
187
+ )
188
+ ```
189
+
190
+ ## Batch helpers
191
+
192
+ For batch-oriented flows, use `Flow.collect(...)` and either `Flow.map(...)` or `Flow.step_each(...)` instead of importing extra helpers or hand-managing raw lists.
193
+
194
+ ```python
195
+ from data_engine import Flow
196
+
197
+
198
+ def validate_workbook(context, file_ref):
199
+ return {
200
+ "name": file_ref.name,
201
+ "path": file_ref.path,
202
+ "ok": file_ref.exists(),
203
+ }
204
+
205
+
206
+ def build():
207
+ return (
208
+ Flow(group="Claims")
209
+ .watch(mode="schedule", run_as="batch", interval="15m", source="../../../example_data/Input/claims_flat")
210
+ .collect([".xlsx"])
211
+ .map(validate_workbook)
212
+ )
213
+ ```
214
+
215
+ `Flow.collect(...)` returns a `Batch` of `FileRef` items. `Flow.map(...)` applies one callable to each item and returns a new `Batch`. `Flow.step_each(...)` is the equivalent readability-first alias. If the batch is empty, both forms raise immediately so the mapped step gets the useful failure.
216
+
217
+ ## Flow API
218
+
219
+ - `Flow(group=...)`
220
+ - `.watch(mode="manual", source=None, run_as="individual")`
221
+ - `.watch(mode="poll", source=..., interval=..., extensions=None, settle=1, run_as="individual")`
222
+ - `.watch(mode="schedule", interval=..., source=None, run_as="individual" | "batch")`
223
+ - `.watch(mode="schedule", time="HH:MM", source=None, run_as="individual" | "batch")`
224
+ - `.watch(mode="schedule", time=["08:15", "14:45"], source=..., run_as="individual" | "batch")`
225
+ - `.mirror(root=...)`
226
+ - `.step(fn, use=None, save_as=None, label=None)`
227
+ - `.collect(extensions, root=None, recursive=False, use=None, save_as=None, label=None)`
228
+ - `.map(fn, use=None, save_as=None, label=None)`
229
+ - `.step_each(fn, use=None, save_as=None, label=None)`
230
+ - `.preview(use=None)`
231
+ - `.run_once()`
232
+ - `.run()`
233
+ - `.show()`
234
+
235
+ `step()` callables always receive one `FlowContext` parameter and return the next value for `context.current`.
236
+ `map()` and `step_each()` callables accept either `(item)` or `(context, item)` and return a mapped `Batch`.
237
+
238
+ For notebook authoring, `preview()` is usually the most useful inspection helper:
239
+
240
+ ```python
241
+ build().preview(use="raw_df").head(10)
242
+ build().preview(use="filtered_df")
243
+ ```
244
+
245
+ `preview(use="name")` runs the flow until that `save_as="name"` object exists, then returns the real object without running later steps.
246
+
247
+ ## Flow context
248
+
249
+ `FlowContext` exposes the active run state:
250
+
251
+ - `context.source`
252
+ - `context.mirror`
253
+ - `context.current`
254
+ - `context.objects`
255
+ - `context.metadata`
256
+ - `context.source_metadata()`
257
+
258
+ `context.source` is the resolved input namespace for the active source. The most useful helpers are:
259
+
260
+ - `context.source.path`
261
+ - `context.source.with_extension(".json")`
262
+ - `context.source.with_suffix(".json")`
263
+ - `context.source.file("notes.json")`
264
+ - `context.source.namespaced_file("notes.json")`
265
+ - `context.source.root_file("lookup.csv")`
266
+
267
+ `context.mirror` is the mirrored output namespace for the active source. The two core helpers are:
268
+
269
+ - `context.mirror.with_extension(".parquet")`
270
+ - `context.mirror.with_suffix(".parquet")`
271
+ - `context.mirror.file("open_claims.parquet")`
272
+ - `context.mirror.namespaced_file("open_claims.parquet")`
273
+
274
+ `with_extension(...)` is the clearer extension-changing helper. `with_suffix(...)` remains available as the pathlib-style alias.
275
+ `file(...)` stays in the mirrored/source folder. `namespaced_file(...)` creates a source-stem namespace for multi-output cases.
276
+
277
+ When a step writes one inspectable artifact, return that existing `Path`. The UI uses returned output paths to enable the `Inspect` button for that step.
278
+
279
+ `use="name"` loads `context.objects["name"]` into `context.current` before the step runs. `save_as="name"` stores the returned value into `context.objects["name"]`. Those same saved names are what `build().preview(use="name")` uses in notebooks.
280
+
281
+ ## Discovery
282
+
283
+ Flows are code-defined. Starter flow modules live in:
284
+
285
+ - `workspaces/<workspace_id>/flow_modules/`
286
+ - `artifacts/workspace_cache/<workspace_id>/compiled_flow_modules/`
287
+
288
+ Each flow module must export:
289
+
290
+ - optional `DESCRIPTION`
291
+ - `build() -> Flow`
292
+
293
+ The flow-module filename is the flow identity. Authored flow modules should use `Flow(group=...)` and let the loader inject the name from the module filename.
294
+
295
+ Authored flow modules compile into `artifacts/workspace_cache/<workspace_id>/compiled_flow_modules/*.py`, and the runtime loads discovered flows from those compiled modules.
296
+
297
+ ## Workspace layout
298
+
299
+ - `src/data_engine/`
300
+ Runtime package and desktop UI
301
+ - `workspaces/<workspace_id>/flow_modules/`
302
+ Authored flow sources (`.py` or `.ipynb`)
303
+ - `workspaces/<workspace_id>/.workspace_state/`
304
+ Shared lease markers and checkpoint parquet snapshots
305
+ - `artifacts/workspace_cache/<workspace_id>/compiled_flow_modules/`
306
+ Generated/importable flow modules
307
+ - `artifacts/runtime_state/<workspace_id>/`
308
+ Internal runtime ledger state for one workspace
309
+ - `artifacts/documentation/`
310
+ Generated documentation output
311
+ - `example_data/Input`
312
+ Example input files
313
+ - `example_data/Settings`
314
+ Example single-file inputs
315
+ - `example_data/Output`
316
+ Flow outputs
317
+ - `example_data/databases`
318
+ DuckDB files created on demand
319
+
320
+ ## Live Smoke Suite
321
+
322
+ The live smoke suite is intentionally self-contained:
323
+
324
+ - `tests/test_live_runtime_suite.py`
325
+
326
+ It generates temporary workspaces from scratch, generates temporary `example_data/` and `data2/` with the real starter-data generator, adds notebook-authored poll/schedule/manual flows, runs the daemons, and tears the whole environment down afterward. It does not rely on existing `workspaces/example_workspace` or `workspaces/claims2` or live repo data directories.
327
+
328
+ ## Status
329
+
330
+ This project is pre-alpha. Backwards compatibility is not a goal; the API should stay small and explicit while the runtime architecture settles.
@@ -0,0 +1,200 @@
1
+ data_engine/__init__.py,sha256=hIoehELT03zz-hlf8XLL5-4ms-T1F5BFa1h7lIdno78,1512
2
+ data_engine/application/__init__.py,sha256=G47Je7Dz5-79wquZTcYkP0w_hd-87QGNG10q_Gql31I,1369
3
+ data_engine/application/actions.py,sha256=FPzYJnpUjHTTeZsGGyMEl4Mg_r5O7GHMPFtWo-UZpUg,1406
4
+ data_engine/application/catalog.py,sha256=hni0uYXdnq_SUDZkpUq7b-WkV57K0mkoadJJgV3EemY,5527
5
+ data_engine/application/control.py,sha256=MOzeiN9ggeY_iczdemnpKRlftBoK02FzaWiddfwYwcI,8613
6
+ data_engine/application/details.py,sha256=qkCYzAbFZy62KndpYMoycNZFfbX46UwT1KdXyqqRur8,2726
7
+ data_engine/application/runtime.py,sha256=XXofcK3q9wUFHa7YgUxuHjK_061RIzRxAgVKpZgC4eg,17764
8
+ data_engine/application/workspace.py,sha256=4WRRlhe_ZY1i3npAyM80E927Ndp3XckAG6Fgmm8ViQY,2114
9
+ data_engine/authoring/__init__.py,sha256=ATc6OJJsCYVKph22DUIaM-PuS3mf6M6cTyaGqrGWaEU,450
10
+ data_engine/authoring/builder.py,sha256=csf3QRdqYdBWSYnZFi-CsEyjmX5RAlzzLfTkBl9-Z_U,1036
11
+ data_engine/authoring/flow.py,sha256=Wr70B4GYLOspgp2pF56Ep56V75vqylp9SkKhpvPCCzE,14415
12
+ data_engine/authoring/helpers.py,sha256=3qsPBlv72KSlnie7DyjXxPfMOuV8UdpXTyMX4mgZhu4,5674
13
+ data_engine/authoring/model.py,sha256=z_-hl6i8h9IockHkE-WAkuMqHtsBBHh0ra8kFgG-CJo,2174
14
+ data_engine/authoring/primitives.py,sha256=bTe1MKoCgYxzv933ZS8dpSup-RnpkG3NBKHEBQNGrQs,15814
15
+ data_engine/authoring/services.py,sha256=lI3h4K8SzUg6SoraLCYZ6KXnmF9w7AG9pr075F_mNs8,1310
16
+ data_engine/authoring/execution/__init__.py,sha256=C_oySYb6FHeS5brMKsl_Wcs3wU_fHI84-cWMsjn9uv4,235
17
+ data_engine/authoring/execution/app.py,sha256=1Uwp15ZGM5GG9Lyvv_eU_pYa-e3DiwL7skps1yxQVqU,248
18
+ data_engine/authoring/execution/context.py,sha256=Q4maXbAOF6YkelcqUXoAw9EnZXZXj-KwahPL7Nmapqo,3483
19
+ data_engine/authoring/execution/continuous.py,sha256=KUU-d2e05iTRPFoTpUxllEOV9Yc9mJPKSuCW-hqg6ZA,7852
20
+ data_engine/authoring/execution/grouped.py,sha256=oKSp7t4mHblm9OTBb2nDJL5t-nxhON0BYKtjb6uVNKc,4390
21
+ data_engine/authoring/execution/logging.py,sha256=VNEIc3HimSsK8BstP764h65hJWrk11AhPGlI1THtEmQ,2422
22
+ data_engine/authoring/execution/polling.py,sha256=ITu6ROoAclL4opY253qiv5CM8NCTJy7DHDFzevrt1GU,6234
23
+ data_engine/authoring/execution/runner.py,sha256=KIi8czjBS2nugkpHDT5N28e6O4U6VQycBBgAIURBa20,10652
24
+ data_engine/authoring/execution/single.py,sha256=LhRr4iWIInHe7T40PSvGLEEPtsWY8rPiXDmLbGRaYBQ,7511
25
+ data_engine/devtools/__init__.py,sha256=6XvaQlPlPAIaKpzb68pBsD227ectbdxl5k2EoBr9Vbc,55
26
+ data_engine/devtools/project_ast_map.py,sha256=DJ9l1glEXU5hKhqhOXD8UJIo7VRxF_rbYSEu5gave-0,18649
27
+ data_engine/docs/__init__.py,sha256=uubwb36TT51g7vvOsjWqoKjupfAa2nT7HBanm2wCyiA,56
28
+ data_engine/docs/sphinx_source/api.rst,sha256=F4VtanUHrwjAskxaUayyVRfoMLsKWlsMJcjzygy4LSw,742
29
+ data_engine/docs/sphinx_source/conf.py,sha256=JFD4GeAibVN64RX0UKg8HIxcNXHBKrHWuUREJKNM0ZE,808
30
+ data_engine/docs/sphinx_source/index.rst,sha256=H4EcDWSqMDHdDB6LwhHLjTAQ7b-T8GMn1OX-4rO7VL0,512
31
+ data_engine/docs/sphinx_source/_static/custom.css,sha256=GL_yFw7RxPrDVb6S4sUiPsgUzi8vE-AsgPX_zyMy0w8,178
32
+ data_engine/docs/sphinx_source/guides/app-runtime-and-workspaces.md,sha256=8xEQmomrZGjqN5O0dsud2qdptRvOUPxyJN224_DHEoo,12519
33
+ data_engine/docs/sphinx_source/guides/authoring-flow-modules.md,sha256=TrGXkQ4Vcq2qM_2Egu2Ej7xedgFlAvxYwbVpKahtzLY,6716
34
+ data_engine/docs/sphinx_source/guides/configuring-flows.md,sha256=Wk1F5nPLFeduMJ5WnueaZsVX-Sq89nRTmdLQD8HuBrI,5375
35
+ data_engine/docs/sphinx_source/guides/core-concepts.md,sha256=qBp-hcT9be4Zmx8xgSNWEcMlimqXIl6AH061ffNL7jo,6336
36
+ data_engine/docs/sphinx_source/guides/database-methods.md,sha256=Z8mokVmHq5ldFvTfH71M3d5f-s1AeCE_-CA_BeaYeqo,3400
37
+ data_engine/docs/sphinx_source/guides/duckdb-helpers.md,sha256=PfAKb-_pjtiu37BAE7wP-FfYd4dLIkH61sjJTt2T8_w,9931
38
+ data_engine/docs/sphinx_source/guides/flow-context.md,sha256=Tx3SgdASsJw7Ln0SIbK1d3SozZMkVQohmP24_yQwxds,12851
39
+ data_engine/docs/sphinx_source/guides/flow-methods.md,sha256=VWJNQYXCcw85SJMLHU_obNWXydzm-YCSWggzzZt0ugc,6617
40
+ data_engine/docs/sphinx_source/guides/getting-started.md,sha256=AMADTFHIXYVCOUigiWR8Foqm1G8JWI_SrWUF-MFI6_c,8396
41
+ data_engine/docs/sphinx_source/guides/project-inventory.md,sha256=-MLZb3eKfQ3HKTf0V-Y17LSAWFqO0TrcDheNBYT7AsI,194804
42
+ data_engine/docs/sphinx_source/guides/project-map.md,sha256=aO7viQA4NnTWA0BPJz_OIZ7HFmS0FeKQl24GYqZILKM,5724
43
+ data_engine/docs/sphinx_source/guides/recipes.md,sha256=DcDN6WYfRwteJLOHDHZkTl6xRY7X5km6oZfp8s9wjNM,7659
44
+ data_engine/domain/__init__.py,sha256=CV8qc7s7-hD-HJINvkc1zsjEe_d2o1vLU6bxemEUJ6c,2928
45
+ data_engine/domain/actions.py,sha256=7AVmJd-DZMty308dFyy9wolX7yUpqxr64dhm9yG411E,1954
46
+ data_engine/domain/catalog.py,sha256=4WpAdIZXw9WePIk8hKg2l2qn5YCjawI6NtUn1e7ycmE,4224
47
+ data_engine/domain/details.py,sha256=-NAexTcLwjKjmGKe61KOFmWqL2OenNw-ARO_SHh1j1I,6502
48
+ data_engine/domain/diagnostics.py,sha256=ECkqlbW4NL5V038zjnVnvOvfcR8XZU__hHir5v86TWA,1174
49
+ data_engine/domain/errors.py,sha256=Is6P3jIe1ErpCVDSQieAwh-7T5bbihesKmUGX2jvxeo,3809
50
+ data_engine/domain/inspection.py,sha256=VR9PAYNdyPV5Ii57M6GstvgqoRlcrz_qpugWrBbgHs4,3402
51
+ data_engine/domain/logs.py,sha256=N_lvUaHHJk8VPDvHIzuDIicftGJ-9JKC0d-SsDM6Poc,4162
52
+ data_engine/domain/operations.py,sha256=ze_uet1YHs9_boN61VexDGezwHFTcQRRCV5OuXnCU20,7103
53
+ data_engine/domain/operator.py,sha256=FU14TIYc3RMoqXWT2KwY_hi8eB1PNsvm85tmHAFD7v4,2879
54
+ data_engine/domain/runs.py,sha256=vGMAkBW9S7Umu_nizBnn9ju8DoeMH_hqjXu6EqJnyJk,5863
55
+ data_engine/domain/runtime.py,sha256=x7FZ4wcBR8c1dAfyQOQHwcKRw_4Yn763mh-PYzkhlhw,11084
56
+ data_engine/domain/source_state.py,sha256=pn1HLC6ZUQYW8FU9C9BTY9BY-kCUvXr7aMfEPcAc-EY,352
57
+ data_engine/domain/support.py,sha256=TRfKgKyTtqRkvEnR14VSacsRqG2C_ko-7UkqkK3Aeuw,1697
58
+ data_engine/domain/time.py,sha256=P20v4dwVSu0K7Y8GTdAoKFf0oqHpvrppwjSbE8pTkaw,615
59
+ data_engine/domain/workspace.py,sha256=uW8DJs-GBG99dbnnPgbRFCXlhGKU9qDhiIu_7Ub_e2A,6230
60
+ data_engine/flow_modules/__init__.py,sha256=Q1YeTnTr2WQgvm7rlwIlM7sAcEakn-Gu75UOOzwnG_0,53
61
+ data_engine/flow_modules/flow_module_compiler.py,sha256=hSuykhOUjhq35FSZQZykJUE3gFzL8gmBy2oETX2X-dA,7433
62
+ data_engine/flow_modules/flow_module_loader.py,sha256=Opzy53PJmt8v7-ME67b3XFJmz0u8yune7yfHSEJZ_Ig,7963
63
+ data_engine/helpers/__init__.py,sha256=9AtI43I9JW_Tu3xDsvxO6aOvGrVHmmOXT3QtI-w2VNI,853
64
+ data_engine/helpers/duckdb.py,sha256=6hczpeEntNB1OJKgUlr65WJitoLf94N8Wx5td32e8zA,24695
65
+ data_engine/hosts/__init__.py,sha256=CVbji2mwBuxzPWdKqjIWP28L5yaS5gtdzp1pG3CJs8E,42
66
+ data_engine/hosts/daemon/__init__.py,sha256=B4RN_GP09tfC6cQ2axxmweXE6QQmg0RbWpXk8Mhfogc,885
67
+ data_engine/hosts/daemon/app.py,sha256=EcnUh_GKtJPPvWR6S9gIKO-kF_j-VvKlUC3Z58WzVj4,7978
68
+ data_engine/hosts/daemon/bootstrap.py,sha256=KjPlWHqsUwHE8HY8WMoFNa2zS53F8i6D8RxM6eCG_rw,3117
69
+ data_engine/hosts/daemon/client.py,sha256=rE_pCHpYrZYweMDePBUr3JDdRgnSv-hCE667JTHCFo4,16238
70
+ data_engine/hosts/daemon/commands.py,sha256=hKPCgyrS3JZa0R1bnIlMJk4C2nNMc0DHtOTQAel_V1k,2813
71
+ data_engine/hosts/daemon/composition.py,sha256=JFSVeifinNeNKAISBZbTeDGNrkLSAHjh-CF3nNngEd0,11088
72
+ data_engine/hosts/daemon/constants.py,sha256=P3BRlKAyhoilDSaqvocNrxEGVaU9EChMjRPcr6fPbnY,388
73
+ data_engine/hosts/daemon/entrypoints.py,sha256=x_7feVM8Qj3dFDkVuOZqpYsSaEHIBjsxFvhvLFLdZc4,3670
74
+ data_engine/hosts/daemon/lifecycle.py,sha256=pts4OOReGMCC8MIeEyltP1GiedmLtsGVR1AvG1jM2eY,7949
75
+ data_engine/hosts/daemon/manager.py,sha256=YyV7DJRox-u4j56pR45LREiWAg2jVHX0Gj06LEqislg,11009
76
+ data_engine/hosts/daemon/ownership.py,sha256=1PGEwMFiERzyb1R8VE5eRYZgLRL6lg5bKDiy4Cazbnc,4612
77
+ data_engine/hosts/daemon/runtime_commands.py,sha256=lsaQlkq6YG441yp1kEVB5Rudc7XlHHpCiB80JpMtRHs,8052
78
+ data_engine/hosts/daemon/runtime_control.py,sha256=IiICN_w0A67MEpFSHQH4dfzI_H7UmCKxm1_bokqnBR8,1115
79
+ data_engine/hosts/daemon/server.py,sha256=qITf0vDEv2I72WLgBzQwOYU95AEcp1stbEm-7TpEeLg,3258
80
+ data_engine/hosts/daemon/shared_state.py,sha256=OhwwRsTH5vVPFXcQH89-GxLqIEPZmhi1qGCbhynVXZw,4562
81
+ data_engine/hosts/daemon/state_sync.py,sha256=PjjBWZczY12-Izx3mndk5-1MN94OV9mxP5dN9dcEZ0I,4048
82
+ data_engine/platform/__init__.py,sha256=oHZ_PNHsaf_6dGUi8sVRVcYfC__LZhPt_hu5efC2wFw,64
83
+ data_engine/platform/identity.py,sha256=HSs8iOJRmeicx7F_Mv4QWKCB2qea-1cGXs-z_VZ3Z48,1021
84
+ data_engine/platform/local_settings.py,sha256=hQ2-rOkSYFtJ_jjJWlVtGerQmpmW0-RTMrm8SGsQg28,5214
85
+ data_engine/platform/theme.py,sha256=9OuXLLoeAn94vXJBvMBHdZw4T6c8NF4InEKnSsobvuE,6930
86
+ data_engine/platform/workspace_models.py,sha256=k2MBNqaAIHfgkZzpkHGP5LL33V3MRiCigN5xpdysqOE,6534
87
+ data_engine/platform/workspace_policy.py,sha256=YDZMnWwTkUYH6SJt1quZeThssZrL9TDLmRpx3nsbP14,17413
88
+ data_engine/runtime/__init__.py,sha256=8YtvoQMEwKnrERCWuLkU73GieFYEXnlV4AybePo4Yq4,71
89
+ data_engine/runtime/file_watch.py,sha256=Dos6UC48c0QEhiU7LsVavu56muDydwLgpo7eJ_5gXYI,6536
90
+ data_engine/runtime/ledger_models.py,sha256=7Gadzqy3DEj40ZZoaT5CW4RikuUPMKvcxPij13nWONM,2571
91
+ data_engine/runtime/runtime_db.py,sha256=q3FSFAFPmbxComz4cNRpLu0WqiFRpKBLCrXn3UJixko,34773
92
+ data_engine/runtime/shared_state.py,sha256=vjKu9TkBjLk7rh8ZOFxt-K-BkVE1ykIZ0X4s8cO-jjU,17442
93
+ data_engine/services/__init__.py,sha256=C0FupMQ7UjJq8UNtWDYKECi1A9r7sxHSnprUxj8G93s,1713
94
+ data_engine/services/daemon.py,sha256=3SHywdJp5JgaLoB6XdTZM6TFXsU8FHDqSAup1ZwIK4g,2302
95
+ data_engine/services/daemon_state.py,sha256=9Y1C7Qs9pKm1GEWY5tuaGd-ZneVzxcMLvm4-aeVR8ZU,1690
96
+ data_engine/services/flow_catalog.py,sha256=YdzpPgCacTpNefOZZKehIfzrCTSabLAHvtHAacisTIY,3738
97
+ data_engine/services/flow_execution.py,sha256=whCUWZ2kDzJf0g9GsuW1T42ez1MF-sjcSD4ZaLP8Kzg,1891
98
+ data_engine/services/ledger.py,sha256=9DVWQ23CSw7vM-4gfG_Yg5JLaUfvzcYS1Yd0lCdNF_k,2847
99
+ data_engine/services/logs.py,sha256=bjXaZ5TpAcKXw-71v7SBr3w3ZiV_dx3URR0Iqe2Zd7E,2678
100
+ data_engine/services/runtime_binding.py,sha256=r6fZFHRBdLWQ7PbGTqhZJ7NQ_AkGHRsKUKeOl4dK0Cs,3861
101
+ data_engine/services/runtime_execution.py,sha256=z5ospAr3l6F3mSaSy01qSU9pDtSabUmr1MFBma7KL1I,3703
102
+ data_engine/services/runtime_history.py,sha256=ZQQaZWAilRJyr8zFmK8KIxN2TLrke0EiRY3_ucl2JKw,2502
103
+ data_engine/services/settings.py,sha256=7TxIlt115KZ3xCM606B_H3uAdzfnazZb9avJdNSDCGI,2185
104
+ data_engine/services/shared_state.py,sha256=gq_qGA95BisZYxoci1Ta_TSl5ZhKu9aXRlwDhNKGw3E,1150
105
+ data_engine/services/theme.py,sha256=wdjWYSDlud5i_kINvyn4U_eZtmlPwOQn7yoCUrZRgXc,2001
106
+ data_engine/services/workspace_provisioning.py,sha256=m0sPsEB-9SVxIFk54XMd3vhs6isirLV8LT1rWaFy01Q,7829
107
+ data_engine/services/workspaces.py,sha256=x-YnpWF8DDyZDwwt8CE8GmXek6rNuOANa3UTvwoAPns,2958
108
+ data_engine/ui/__init__.py,sha256=5VFh5PIojsYtEly58f3FU8bM0ETAmUfFuZX8m4q4KBk,75
109
+ data_engine/ui/cli/__init__.py,sha256=0du9dC1EQmy4lnNKSK31l0bd0ohrjUAoN6Xud1iCqJE,396
110
+ data_engine/ui/cli/app.py,sha256=3_8byHR_Qxs_3CLJ8lZxwgMcjXQh8120dKJfqkeYQ-o,5740
111
+ data_engine/ui/cli/commands_doctor.py,sha256=oEfNJS5J6Q4XkETT1ScIfwqxecPu1HBeGYygtQM0nsc,7238
112
+ data_engine/ui/cli/commands_run.py,sha256=BviqaYLlZzURWpUpw6vpQGtc-70oce8HpZZykLUSPxE,2979
113
+ data_engine/ui/cli/commands_start.py,sha256=yTmb6YojG_k_vM22YXaFcKcr3sIaM4rpBql6NlB8Gms,3387
114
+ data_engine/ui/cli/commands_workspace.py,sha256=SchLauCoKaWO4BNvUlfscWfvOSMBPWz71okHIwENCTU,3968
115
+ data_engine/ui/cli/dependencies.py,sha256=zgEPTBnJ2STPQQwRpROxUoE7f7WeTNFofXnGlum9dUc,1501
116
+ data_engine/ui/cli/parser.py,sha256=Qukyu1ewjx3JSF3miE3fpDPfO2DJOA8QfomHgv5Cnuw,2918
117
+ data_engine/ui/gui/__init__.py,sha256=7ACiYnLJ1X3KbwbMYpjo4_A18pSYLJ9fVpp5rUpI__M,609
118
+ data_engine/ui/gui/app.py,sha256=EW1XjGtEAwuVSshrfCsr8UPelEnet8daH6s_E7vV_oU,4066
119
+ data_engine/ui/gui/bootstrap.py,sha256=MoKFfQ7YOyIzG6IllRdJwBDagtLSjDtZNMipJW7ZORo,22947
120
+ data_engine/ui/gui/bootstrapper.py,sha256=kxlJq-pHeNDwThMNN36ixoPtBe0OhsVEpJJuzXbo36Q,6844
121
+ data_engine/ui/gui/cache_models.py,sha256=v88knL1_QYJM36rBNlJNHaz5QqAV1_Vdv6peGQk4jBo,515
122
+ data_engine/ui/gui/control_support.py,sha256=eLhXlSpE5Y3QNa6ENrGvRbrb0-aoySLw-2-XK5KJSWU,8217
123
+ data_engine/ui/gui/icons.py,sha256=aJu4WxGKQVQr6vahBJcxn0NYoLA7GUDq8agRo4vXZSw,1709
124
+ data_engine/ui/gui/launcher.py,sha256=JuGsy0Ycxu4BzfkTRbpoG6xheBiouFeh2Glc8Lj9KNs,1553
125
+ data_engine/ui/gui/preview_models.py,sha256=E46K1jh_xQi7PVvduhipANsUcNQSO-vUXuYXQehJXHs,946
126
+ data_engine/ui/gui/render_support.py,sha256=tqTzBM9VPkBZfvADPiXkeM6YzGYRWunoxKtMeHl6ENU,11431
127
+ data_engine/ui/gui/runtime.py,sha256=u3erXc4LrTvwiNbdXlQbAgGLB3bZDMzBEfQfexpsbQw,1583
128
+ data_engine/ui/gui/state_support.py,sha256=RNzwPcmM3LS-ghGbfiYBtG97vKXgzRBbmRTUDsJot5g,8180
129
+ data_engine/ui/gui/support.py,sha256=-4UeQYY8feFEoJJsA6ERgY5kY32XQP_4rlx_K_-MrMU,10646
130
+ data_engine/ui/gui/surface.py,sha256=S90bW3eMXJDOKY_NpQogfu7SA8ZXSln8Erhoo3YATms,8257
131
+ data_engine/ui/gui/theme.py,sha256=eBMWR_7O2bDz_iXNq9QX7IgcUrTL1Na-0sIo6HCt7do,21103
132
+ data_engine/ui/gui/controllers/__init__.py,sha256=xw6Yar7zBKd_y1nXDXlNvtmMI_jmxY8GVNY7atrJWrA,251
133
+ data_engine/ui/gui/controllers/flows.py,sha256=Bl3fgtH2JwGe3lmIMqMTSgXIPTGzj5GNNdLKuKYP464,20079
134
+ data_engine/ui/gui/controllers/runtime.py,sha256=wpAlNa2nw_0Nq0LAxTFX90i-klR1Xnw6QDuTOGAH9iU,11150
135
+ data_engine/ui/gui/dialogs/__init__.py,sha256=BeACrF_BXs60bzztJN-PLbf22ztD2w09wCex82xrfN8,403
136
+ data_engine/ui/gui/dialogs/messages.py,sha256=WurZ7TglLe43ZVX_XG1__ZgCSccDAJFqPRZI57Cqze4,3218
137
+ data_engine/ui/gui/dialogs/previews.py,sha256=5ua4RnfxlYw5b5tXqvlTaBdwKOutk2xtA--L2B233pk,7998
138
+ data_engine/ui/gui/helpers/__init__.py,sha256=3PaaeKKOCE7T-k0mZm3SJPLoM9rY_tw-HXWiWsOWQBI,1743
139
+ data_engine/ui/gui/helpers/inspection.py,sha256=0Lf9rcI9jNPLeJVL9ztoQiWSnZ1TEIPxvon5h6jbIZw,3555
140
+ data_engine/ui/gui/helpers/lifecycle.py,sha256=JaKZvJgRgwH-ILRkn3RecXes70nCl04NA6bE9DjZRNA,3929
141
+ data_engine/ui/gui/helpers/scroll.py,sha256=WOVOZAo1CbnZRt-8msrmYdWmkkLi1mZ16nSJWBExFIA,980
142
+ data_engine/ui/gui/helpers/theming.py,sha256=asQm_no2vASuZXq3AMgtJYkUE0-089UreSyI1KF3u1o,2998
143
+ data_engine/ui/gui/icons/dark_light.svg,sha256=-D0nH5MUuFlDvpNoZmSolaBog48ATOPwKgGZa0EnfNg,831
144
+ data_engine/ui/gui/icons/documentation.svg,sha256=__T-RxxEK6omsr3Uq3X61r3XPogwGe7KgwZvdQ259BM,649
145
+ data_engine/ui/gui/icons/failed.svg,sha256=2hbpUY5ecmykEAiXt6BBb9FkMaip_1_u21eifWf1luc,276
146
+ data_engine/ui/gui/icons/group.svg,sha256=Pxhsdh3MtmZ2baqhsjLp4h-h64q9TKPLGMZLo7r7PsQ,2930
147
+ data_engine/ui/gui/icons/home.svg,sha256=-VSTqRXMBRCWhPJII1Z5McmpEWrhZLvmpXd7CP5gFI4,529
148
+ data_engine/ui/gui/icons/manual.svg,sha256=jhp1Xgpw1p9jZj_SLCyxCbIE0cSHtQAVK7Z1_3yKeSU,454
149
+ data_engine/ui/gui/icons/poll.svg,sha256=W9cZ1hoGK1QT-GBLHf3UA5vyUM4vwu8r6k2ajrR0u3Q,1200
150
+ data_engine/ui/gui/icons/schedule.svg,sha256=vxdS4vPqqKzMCvahC35prj3SvhsdFt0PNd-Ty1-I2KA,1115
151
+ data_engine/ui/gui/icons/settings.svg,sha256=EKmOh5euzyFo9nvehimgiyDTeLjVgTQT060TUFFqAiw,1227
152
+ data_engine/ui/gui/icons/started.svg,sha256=TRhn7W_X0RKFLfEx8ZCDk8fB-kVNbUy3YmQvjnpThA0,1144
153
+ data_engine/ui/gui/icons/success.svg,sha256=QcvMKqwdGPRgcBETHhkfGjI-0g98BoAVBoA60rSkY8Y,443
154
+ data_engine/ui/gui/icons/view-log.svg,sha256=C7kqszOpKLdUDmgTxR1jzbeylt3VA734fmAmxN3D8ys,1359
155
+ data_engine/ui/gui/presenters/__init__.py,sha256=i4-qXWUXJ6gmT9g8hFhYP6eZj7LCjf6sMK2xaNCH8ao,2375
156
+ data_engine/ui/gui/presenters/docs.py,sha256=HEFZoGywGjkARaTF-cklA8buhmG094NA3azgcaltFiA,4769
157
+ data_engine/ui/gui/presenters/logs.py,sha256=EUUUr4ctxaiUpGZHwDGBiaGstme2mQ0jIOpKonXv4WY,2218
158
+ data_engine/ui/gui/presenters/runtime_projection.py,sha256=H5eKMMVsfRvOAS7Vg3vsS-DoebTUaMQpWcDZL75ZLh0,942
159
+ data_engine/ui/gui/presenters/sidebar.py,sha256=SYU-gTLLvP2mHXN_4aR2r7-yNhW-ahcHAw_t7kfqqpk,3478
160
+ data_engine/ui/gui/presenters/steps.py,sha256=r6W5DD86J4oHNnN_chbu585ajvyBsE5bbBCCTaBFZ5E,5789
161
+ data_engine/ui/gui/presenters/workspace.py,sha256=P0oW96osPIP2gZZClkmSDzlgQh3FcpTI_SY5VK8dU6Q,1198
162
+ data_engine/ui/gui/presenters/workspace_binding.py,sha256=LV3bDgGiwnawk-GK6aCJZnYHFQTNOl7xcifA5tNxPhs,2737
163
+ data_engine/ui/gui/presenters/workspace_settings.py,sha256=Kh1_Xr__xLweHVXMttWxeoW-gdWj0XDvi4KmKeahnHE,7755
164
+ data_engine/ui/gui/rendering/__init__.py,sha256=ypB8NBe2O20mX6vhK-0yVnXKjME7aPur0nf8wXZInz0,414
165
+ data_engine/ui/gui/rendering/artifacts.py,sha256=Li4djNgo2mBk5BERpACds5Ctbk6HADBBxi2A_MplJ2M,3875
166
+ data_engine/ui/gui/rendering/icons.py,sha256=agLek6KlFVCrMWXv-pM5qvBF9GINh5jEeHia9bMzWeE,1575
167
+ data_engine/ui/gui/widgets/__init__.py,sha256=5owQ2i5bjg1vAJiRhteg15YVxDsjx-Cwa2yZIMDvEIg,1020
168
+ data_engine/ui/gui/widgets/config.py,sha256=A_-h7rQt4p4ltEGiHfHn0ii6rz-ZDkOBJrC7dFKJiXU,1385
169
+ data_engine/ui/gui/widgets/logs.py,sha256=FmnN70CkOUDGxrz0ge6lf9XfW2YwD8I8S4azfwtOyr8,2251
170
+ data_engine/ui/gui/widgets/panels.py,sha256=sMnTYX2kz_bqFJAMbJy6kKr2IHb0d7PVvNjpNaMKH1g,19308
171
+ data_engine/ui/gui/widgets/sidebar.py,sha256=MTqRTdrmzus0uJx6eO0TGpguUJV6sQZjNa9aXgYtBZQ,4708
172
+ data_engine/ui/gui/widgets/steps.py,sha256=ESDj-4X8ppq3miSIniGGniBTPxL_hPI15wFb4YlCL6E,3205
173
+ data_engine/ui/tui/__init__.py,sha256=nomzIeyEuQe30Nhe2pgLIvA9ondwPaH964sYYeobpKk,136
174
+ data_engine/ui/tui/app.py,sha256=groOHLo4pXgW-q4zx7VfGxiQjoq_hfZzLyKe0yX1kCY,8993
175
+ data_engine/ui/tui/bootstrap.py,sha256=Xh1ydOcro8YfGI3sE-7GYv_cA34xElftOKb2Xj8Zl5Y,22017
176
+ data_engine/ui/tui/bootstrapper.py,sha256=SBGmFham5IA9N1VznPlC-Excmzwi2TMLA2PnyvUlyv0,5452
177
+ data_engine/ui/tui/runtime.py,sha256=HzxusiUjTXo5PLCXPEg7wfxjFyw12TVWBHGUBQ8QXOE,1047
178
+ data_engine/ui/tui/state_support.py,sha256=vMXUiCkdzdbKHEaHWgCe6eaDA0t-SFYPLqzj6FfLhfM,5709
179
+ data_engine/ui/tui/support.py,sha256=A0D2BYIbXHLbgVzi8FfGSSlJ1H0G-lgfBudN_a6Zj-4,2568
180
+ data_engine/ui/tui/theme.py,sha256=1yTH4S-SGDHRFbpT14ObTacWroibku6kw1Fawd8kWpE,4241
181
+ data_engine/ui/tui/widgets.py,sha256=INupFDBwupZDba_WpMK6SZeSCPgo8HLsCGSu7yQ4q1U,3601
182
+ data_engine/ui/tui/controllers/__init__.py,sha256=0cn3bxv1jouB5tv4dhoVip21Jl-QJ1c-2cmd5crpp0c,251
183
+ data_engine/ui/tui/controllers/flows.py,sha256=LeXQqPtC-z4foXgNgXg7Chg6-vw5ou_8hzF8Rw4actQ,15862
184
+ data_engine/ui/tui/controllers/runtime.py,sha256=C6thLC4nip2CIsLryd9d7ckvakZhAOl8doX20BIAZPs,7721
185
+ data_engine/views/__init__.py,sha256=cP0mNszKLNrCzZhVbsFz1Evzp-VMBWir3GpArPyOdsQ,2888
186
+ data_engine/views/actions.py,sha256=eXLJ49yXcGEHRW1mWh7_WQPn49qhEf4Rl8uqbK3E_A0,3196
187
+ data_engine/views/artifacts.py,sha256=FOP6CiOapIGiAzA57kqHJalg8AgycMhPkQW4M1kMJQY,2121
188
+ data_engine/views/flow_display.py,sha256=n9LchzfEJjG0hY2yOI3J_Xk5buYSNGLWFlN1g7TFK8Q,2186
189
+ data_engine/views/logs.py,sha256=9fbR9XJJGoOq33OtQuhnLD0np4gwZ_w5XtylTCcXZvE,1727
190
+ data_engine/views/models.py,sha256=rWY2RSP4bV7vk7HD-UFm5XeVAtw7h7LUjBX2oaQKGeM,2791
191
+ data_engine/views/presentation.py,sha256=q_RTJC06d4OU9Y3xyjvIxCTfqGGib-E_xQfMDgK74sA,4347
192
+ data_engine/views/runs.py,sha256=v08HRpyp54eEg7yPmFlqYVJZfOy9LUq-jxrlmh6nzE0,2098
193
+ data_engine/views/state.py,sha256=GkSY5AB4GodKady-DX3GCmdp5foFhA-JEXAbfrnGR90,1475
194
+ data_engine/views/status.py,sha256=wXAIeH2e_UjaFBwSfYElM1rn3aalssLaCORZB6CKPAc,472
195
+ data_engine/views/text.py,sha256=7NDIIQ2os4oULn3p79K26X0qKSx1OyO599bo2MaUM_I,3801
196
+ py_data_engine-0.1.0.dist-info/METADATA,sha256=JezR1q1R9gNFev5rz6ngqimVsCog8vSye3NHAov_Ttk,12025
197
+ py_data_engine-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
198
+ py_data_engine-0.1.0.dist-info/entry_points.txt,sha256=aZzhX24BL-CKUvPbJXsav5JzNnG0kXjY7CvEfAqb0zM,60
199
+ py_data_engine-0.1.0.dist-info/top_level.txt,sha256=cOctGnlCl4PnLuqj4UBRlBLKoCEdjjNIqxc_RRjYXT8,12
200
+ py_data_engine-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ data-engine = data_engine.ui.cli.app:main
@@ -0,0 +1 @@
1
+ data_engine