mainsequence 4.2.40__tar.gz → 4.3.5__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.
- {mainsequence-4.2.40/mainsequence.egg-info → mainsequence-4.3.5}/PKG-INFO +1 -1
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +20 -20
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +1 -1
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/api.py +25 -25
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/cli.py +10 -10
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/migrations.py +27 -10
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/base.py +1 -1
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/dtype_codec.py +12 -2
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/metatables/core.py +60 -33
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/instrumentation/utils.py +7 -3
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/__init__.py +1 -1
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/compiled_sql/v1.py +9 -2
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/data_nodes/build_operations.py +11 -11
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/data_nodes/data_nodes.py +33 -16
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/data_nodes/persist_managers.py +66 -28
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/migrations.py +73 -4
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/sqlalchemy_contracts.py +45 -28
- {mainsequence-4.2.40 → mainsequence-4.3.5/mainsequence.egg-info}/PKG-INFO +1 -1
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence.egg-info/SOURCES.txt +1 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence.egg-info/entry_points.txt +1 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/pyproject.toml +2 -1
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_build_operations_hashing.py +19 -13
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_cli.py +8 -8
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_cli_migrations.py +102 -1
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_data_access_mixin_dimension_audit.py +52 -3
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_data_node_storage_dimension_queries.py +8 -8
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_data_node_update_flow.py +2 -2
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_filter_normalization.py +33 -17
- mainsequence-4.3.5/tests/test_instrumentation.py +16 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_meta_table_migrations.py +59 -7
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_meta_tables_client_models.py +47 -4
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_meta_tables_sqlalchemy_contracts.py +71 -25
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_pod_project_resolution.py +6 -6
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_run_configuration.py +43 -25
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_source_table_configuration.py +4 -4
- {mainsequence-4.2.40 → mainsequence-4.3.5}/LICENSE +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/README.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/AGENTS.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/__init__.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/__main__.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/bootstrap.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/config.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/cli/ui.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/__init__.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/agent_runtime_models.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/client.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/command_center/__init__.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/command_center/app_component.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/command_center/connections.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/command_center/data_models.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/command_center/workspace.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/compute_validation.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/fastapi/auth.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/metatables/__init__.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/models_foundry.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/models_user.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/client/utils.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/defaults.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/logconf.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/__main__.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/data_nodes/models.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/future_registry.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/hashing.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/meta_tables/schema_names.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/setup.cfg +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_auth_precedence.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_client.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_command_center_app_component_models.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_command_center_data_models.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_command_center_models.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_dependency_extras.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_duckdb_interface_dimensions.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_logconf.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_project_batch_jobs_from_file.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_schema_names.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_secret_client_model.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_sqlite_interface_dimensions.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_update_runner_uid_runtime.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_update_statistics.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_update_uid_guards.py +0 -0
- {mainsequence-4.2.40 → mainsequence-4.3.5}/tests/test_workspace_snapshot.py +0 -0
{mainsequence-4.2.40 → mainsequence-4.3.5}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mainsequence-data-nodes
|
|
3
|
-
description: Use this skill when the task is about producing, changing, validating, or reviewing Main Sequence DataNode update processes. This skill owns DataNode update configuration, dependencies, update logic, hashing, namespaces, and validation against a
|
|
3
|
+
description: Use this skill when the task is about producing, changing, validating, or reviewing Main Sequence DataNode update processes. This skill owns DataNode update configuration, dependencies, update logic, hashing, namespaces, and validation against a PlatformTimeIndexMetaTable storage contract. It does not own generic MetaTable governance, Alembic migration execution, API route contracts, scheduling, sharing policy, or storage registration internals.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Main Sequence Data Nodes
|
|
@@ -10,12 +10,12 @@ description: Use this skill when the task is about producing, changing, validati
|
|
|
10
10
|
Use this skill when the task changes a DataNode producer.
|
|
11
11
|
|
|
12
12
|
A DataNode is an update process. It is not the canonical storage model. Storage
|
|
13
|
-
is defined by a `
|
|
13
|
+
is defined by a `PlatformTimeIndexMetaTable` SQLAlchemy model. Physical schema
|
|
14
14
|
evolution is handled with Alembic, not a DataNode storage subclass.
|
|
15
15
|
|
|
16
16
|
Canonical workflow:
|
|
17
17
|
|
|
18
|
-
1. Define a `
|
|
18
|
+
1. Define a `PlatformTimeIndexMetaTable` storage class.
|
|
19
19
|
2. Construct the DataNode with `config=...` and `storage_table=StorageClass`.
|
|
20
20
|
3. Let the SDK register the output storage class automatically when needed.
|
|
21
21
|
4. Return a DataFrame from `update()` that matches the storage class contract.
|
|
@@ -32,7 +32,7 @@ Canonical workflow:
|
|
|
32
32
|
- `update()`
|
|
33
33
|
- `prepare_update_statistics()`
|
|
34
34
|
- design single-index or multidimensional time-first DataFrame outputs
|
|
35
|
-
- validate output shape against a `
|
|
35
|
+
- validate output shape against a `PlatformTimeIndexMetaTable` storage contract
|
|
36
36
|
- define explicit `hash_namespace(...)` validation strategy
|
|
37
37
|
- write or review DataNode smoke tests
|
|
38
38
|
- decide whether a consumer should use `APIDataNode`
|
|
@@ -77,7 +77,7 @@ If the task depends on one of those areas, route it explicitly instead of guessi
|
|
|
77
77
|
Before changing code, collect or infer:
|
|
78
78
|
|
|
79
79
|
- dataset meaning
|
|
80
|
-
- `
|
|
80
|
+
- `PlatformTimeIndexMetaTable` output storage class, or the class to create
|
|
81
81
|
- expected time index and identity index shape
|
|
82
82
|
- expected columns and dtypes from the storage class
|
|
83
83
|
- upstream dependencies
|
|
@@ -139,7 +139,7 @@ import datetime
|
|
|
139
139
|
from sqlalchemy import DateTime, Float, MetaData
|
|
140
140
|
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
|
141
141
|
|
|
142
|
-
from mainsequence.meta_tables import
|
|
142
|
+
from mainsequence.meta_tables import PlatformTimeIndexMetaTable, schema_table_name
|
|
143
143
|
|
|
144
144
|
PROJECT_NAME = "<project_name>"
|
|
145
145
|
PRICES_TABLE_NAME = schema_table_name(PROJECT_NAME, "prices")
|
|
@@ -149,7 +149,7 @@ class Base(DeclarativeBase):
|
|
|
149
149
|
metadata = MetaData()
|
|
150
150
|
|
|
151
151
|
|
|
152
|
-
class PricesTable(
|
|
152
|
+
class PricesTable(PlatformTimeIndexMetaTable, Base):
|
|
153
153
|
__tablename__ = PRICES_TABLE_NAME
|
|
154
154
|
__metatable_namespace__ = "<domain_namespace>"
|
|
155
155
|
__metatable_identifier__ = "<project_name>.<table_identifier>"
|
|
@@ -191,13 +191,13 @@ MetaTable migration provider and run `mainsequence migrations upgrade --provider
|
|
|
191
191
|
... head`. Do not call `PricesTable.register()` directly and do not rely on
|
|
192
192
|
DataNode construction to register storage tables.
|
|
193
193
|
|
|
194
|
-
`__index_names__` is the full DataNode storage grain. `
|
|
194
|
+
`__index_names__` is the full DataNode storage grain. `PlatformTimeIndexMetaTable`
|
|
195
195
|
automatically adds a SQLAlchemy unique index over that tuple before Alembic
|
|
196
196
|
autogenerate runs. Do not manually repeat the full grain unique index in
|
|
197
197
|
`__table_args__`; add ordinary SQLAlchemy `Index(...)` entries only for
|
|
198
198
|
additional lookup/performance paths.
|
|
199
199
|
|
|
200
|
-
`
|
|
200
|
+
`PlatformTimeIndexMetaTable.register()` remains SDK plumbing for the migration
|
|
201
201
|
workflow. Do not manually attach an existing UID, reconstruct a generic
|
|
202
202
|
`MetaTable`, or use manual bind helpers as an authoring step.
|
|
203
203
|
|
|
@@ -206,7 +206,7 @@ workflow. Do not manually attach an existing UID, reconstruct a generic
|
|
|
206
206
|
The DataNode constructor should accept:
|
|
207
207
|
|
|
208
208
|
- a `DataNodeConfiguration`
|
|
209
|
-
- a `storage_table: type[
|
|
209
|
+
- a `storage_table: type[PlatformTimeIndexMetaTable]`
|
|
210
210
|
- optional `hash_namespace`
|
|
211
211
|
|
|
212
212
|
The constructor `storage_table` is the output storage contract. Keep it out of
|
|
@@ -215,11 +215,11 @@ migration workflow before the node is constructed or run.
|
|
|
215
215
|
|
|
216
216
|
If the DataNode needs to select another DataNode's storage table as a
|
|
217
217
|
dependency, put that dependency storage reference in the config as
|
|
218
|
-
`type[
|
|
218
|
+
`type[PlatformTimeIndexMetaTable]`. Do not add an extra constructor argument for
|
|
219
219
|
dependency storage tables. Config values of this type are hashed by the bound
|
|
220
|
-
`
|
|
221
|
-
class is not yet bound, config serialization must fail and tell the user to
|
|
222
|
-
the migration workflow.
|
|
220
|
+
`TimeIndexMetaTable.uid` from `StorageClass.get_time_index_meta_table()`. If
|
|
221
|
+
the class is not yet bound, config serialization must fail and tell the user to
|
|
222
|
+
run the migration workflow.
|
|
223
223
|
|
|
224
224
|
Do not accept `test_node`. It has been removed. Use explicit
|
|
225
225
|
`hash_namespace(...)` or `hash_namespace="..."`.
|
|
@@ -232,7 +232,7 @@ from typing import ClassVar
|
|
|
232
232
|
from pydantic import Field
|
|
233
233
|
|
|
234
234
|
from mainsequence.meta_tables import DataNode, DataNodeConfiguration
|
|
235
|
-
from mainsequence.meta_tables import
|
|
235
|
+
from mainsequence.meta_tables import PlatformTimeIndexMetaTable
|
|
236
236
|
|
|
237
237
|
|
|
238
238
|
class PricesConfig(DataNodeConfiguration):
|
|
@@ -248,7 +248,7 @@ class PricesUpdate(DataNode):
|
|
|
248
248
|
def __init__(
|
|
249
249
|
self,
|
|
250
250
|
config: PricesConfig,
|
|
251
|
-
storage_table: type[
|
|
251
|
+
storage_table: type[PlatformTimeIndexMetaTable],
|
|
252
252
|
*,
|
|
253
253
|
hash_namespace: str | None = None,
|
|
254
254
|
):
|
|
@@ -375,7 +375,7 @@ Time index must be datetime64[ns, UTC]
|
|
|
375
375
|
```
|
|
376
376
|
|
|
377
377
|
Use Alembic from the first version when a DataNode storage table must support
|
|
378
|
-
physical schema evolution. Keep the `
|
|
378
|
+
physical schema evolution. Keep the `PlatformTimeIndexMetaTable` catalog model as
|
|
379
379
|
the SDK storage contract, apply Alembic-rendered SQL through the migration
|
|
380
380
|
workflow, then register or refresh the MetaTable catalog binding separately.
|
|
381
381
|
|
|
@@ -390,7 +390,7 @@ Do not construct dependency graphs dynamically inside `update()`.
|
|
|
390
390
|
|
|
391
391
|
### 8. Foreign Keys Belong To SQLAlchemy And Alembic
|
|
392
392
|
|
|
393
|
-
For new code, model foreign keys on the `
|
|
393
|
+
For new code, model foreign keys on the `PlatformTimeIndexMetaTable` storage
|
|
394
394
|
class, or route the storage work to the MetaTable skill. When a DataNode storage
|
|
395
395
|
table needs a platform-managed FK, use normal SQLAlchemy `ForeignKey(...)` /
|
|
396
396
|
`ForeignKeyConstraint(...)` metadata on the storage class. Prefer
|
|
@@ -439,14 +439,14 @@ When reviewing an existing DataNode, look for:
|
|
|
439
439
|
- hidden dependency creation inside `update()`
|
|
440
440
|
- invalid identity-indexed output shape
|
|
441
441
|
- `time_index` dtype that is not exactly `datetime64[ns, UTC]`
|
|
442
|
-
- DataFrame columns that do not match the `
|
|
442
|
+
- DataFrame columns that do not match the `PlatformTimeIndexMetaTable` class
|
|
443
443
|
|
|
444
444
|
## Validation Checklist
|
|
445
445
|
|
|
446
446
|
Do not claim success until you have checked:
|
|
447
447
|
|
|
448
448
|
- the relevant docs were read first
|
|
449
|
-
- output storage is a `
|
|
449
|
+
- output storage is a `PlatformTimeIndexMetaTable` class that the SDK can register
|
|
450
450
|
- storage has an intention-rich `__metatable_description__`
|
|
451
451
|
- every storage column has an intention-rich `info.description`
|
|
452
452
|
- the DataNode constructor requires `storage_table`
|
|
@@ -134,7 +134,7 @@ SQLAlchemy table name.
|
|
|
134
134
|
|
|
135
135
|
When a platform-managed table must support in-place contract migrations from its
|
|
136
136
|
first version, use Alembic. Keep the SDK model as a normal
|
|
137
|
-
`PlatformManagedMetaTable` or `
|
|
137
|
+
`PlatformManagedMetaTable` or `PlatformTimeIndexMetaTable` catalog contract, and
|
|
138
138
|
apply physical schema changes through the Alembic migration workflow.
|
|
139
139
|
|
|
140
140
|
Default-schema tables must leave SQLAlchemy `Table.schema` unset; do not write
|
|
@@ -2729,12 +2729,12 @@ def list_data_node_storages(
|
|
|
2729
2729
|
List data node storages via SDK client model.
|
|
2730
2730
|
|
|
2731
2731
|
Single source of truth:
|
|
2732
|
-
- delegates filtering and payload parsing to `
|
|
2732
|
+
- delegates filtering and payload parsing to `TimeIndexMetaTable.filter()`
|
|
2733
2733
|
"""
|
|
2734
2734
|
try:
|
|
2735
2735
|
storages = _run_sdk_model_operation(
|
|
2736
2736
|
module_name="mainsequence.client.metatables",
|
|
2737
|
-
class_name="
|
|
2737
|
+
class_name="TimeIndexMetaTable",
|
|
2738
2738
|
operation=lambda ClientDataNodeStorage: ClientDataNodeStorage.filter(
|
|
2739
2739
|
timeout=timeout,
|
|
2740
2740
|
**dict(filters or {}),
|
|
@@ -3198,12 +3198,12 @@ def data_node_storage_description_search(
|
|
|
3198
3198
|
|
|
3199
3199
|
Single source of truth:
|
|
3200
3200
|
- delegates search behavior and payload parsing to
|
|
3201
|
-
`
|
|
3201
|
+
`TimeIndexMetaTable.description_search()`
|
|
3202
3202
|
"""
|
|
3203
3203
|
try:
|
|
3204
3204
|
payload = _run_sdk_model_operation(
|
|
3205
3205
|
module_name="mainsequence.client.metatables",
|
|
3206
|
-
class_name="
|
|
3206
|
+
class_name="TimeIndexMetaTable",
|
|
3207
3207
|
operation=lambda ClientDataNodeStorage: ClientDataNodeStorage.description_search(
|
|
3208
3208
|
q,
|
|
3209
3209
|
q_embedding=q_embedding,
|
|
@@ -3232,12 +3232,12 @@ def data_node_storage_column_search(
|
|
|
3232
3232
|
|
|
3233
3233
|
Single source of truth:
|
|
3234
3234
|
- delegates search behavior and payload parsing to
|
|
3235
|
-
`
|
|
3235
|
+
`TimeIndexMetaTable.column_search()`
|
|
3236
3236
|
"""
|
|
3237
3237
|
try:
|
|
3238
3238
|
payload = _run_sdk_model_operation(
|
|
3239
3239
|
module_name="mainsequence.client.metatables",
|
|
3240
|
-
class_name="
|
|
3240
|
+
class_name="TimeIndexMetaTable",
|
|
3241
3241
|
operation=lambda ClientDataNodeStorage: ClientDataNodeStorage.column_search(
|
|
3242
3242
|
q,
|
|
3243
3243
|
**dict(filters or {}),
|
|
@@ -3992,12 +3992,12 @@ def get_data_node_storage(
|
|
|
3992
3992
|
Retrieve one data node storage via SDK client model.
|
|
3993
3993
|
|
|
3994
3994
|
Single source of truth:
|
|
3995
|
-
- delegates detail fetching and payload parsing to `
|
|
3995
|
+
- delegates detail fetching and payload parsing to `TimeIndexMetaTable.get()`
|
|
3996
3996
|
"""
|
|
3997
3997
|
try:
|
|
3998
3998
|
storage = _run_sdk_model_operation(
|
|
3999
3999
|
module_name="mainsequence.client.metatables",
|
|
4000
|
-
class_name="
|
|
4000
|
+
class_name="TimeIndexMetaTable",
|
|
4001
4001
|
operation=lambda ClientDataNodeStorage: ClientDataNodeStorage.get(
|
|
4002
4002
|
uid=str(storage_uid),
|
|
4003
4003
|
timeout=timeout,
|
|
@@ -4052,7 +4052,7 @@ def refresh_data_node_storage_search_index(
|
|
|
4052
4052
|
Refresh one data node storage search index via SDK client model.
|
|
4053
4053
|
|
|
4054
4054
|
Single source of truth:
|
|
4055
|
-
- delegates the refresh call to `
|
|
4055
|
+
- delegates the refresh call to `TimeIndexMetaTable.refresh_table_search_index()`
|
|
4056
4056
|
"""
|
|
4057
4057
|
try:
|
|
4058
4058
|
|
|
@@ -4067,7 +4067,7 @@ def refresh_data_node_storage_search_index(
|
|
|
4067
4067
|
|
|
4068
4068
|
return _run_sdk_model_operation(
|
|
4069
4069
|
module_name="mainsequence.client.metatables",
|
|
4070
|
-
class_name="
|
|
4070
|
+
class_name="TimeIndexMetaTable",
|
|
4071
4071
|
operation=_refresh,
|
|
4072
4072
|
)
|
|
4073
4073
|
except Exception as e:
|
|
@@ -4097,7 +4097,7 @@ def run_data_node_storage_query(
|
|
|
4097
4097
|
|
|
4098
4098
|
return _run_sdk_model_operation(
|
|
4099
4099
|
module_name="mainsequence.client.metatables",
|
|
4100
|
-
class_name="
|
|
4100
|
+
class_name="TimeIndexMetaTable",
|
|
4101
4101
|
operation=_run_query,
|
|
4102
4102
|
)
|
|
4103
4103
|
except Exception as e:
|
|
@@ -4122,7 +4122,7 @@ def delete_data_node_storage(
|
|
|
4122
4122
|
Delete one data node storage via SDK client model.
|
|
4123
4123
|
|
|
4124
4124
|
Single source of truth:
|
|
4125
|
-
- delegates deletion and destroy query params to `
|
|
4125
|
+
- delegates deletion and destroy query params to `TimeIndexMetaTable.delete()`
|
|
4126
4126
|
"""
|
|
4127
4127
|
try:
|
|
4128
4128
|
|
|
@@ -4140,7 +4140,7 @@ def delete_data_node_storage(
|
|
|
4140
4140
|
|
|
4141
4141
|
return _run_sdk_model_operation(
|
|
4142
4142
|
module_name="mainsequence.client.metatables",
|
|
4143
|
-
class_name="
|
|
4143
|
+
class_name="TimeIndexMetaTable",
|
|
4144
4144
|
operation=_delete,
|
|
4145
4145
|
)
|
|
4146
4146
|
except Exception as e:
|
|
@@ -4195,7 +4195,7 @@ def list_data_node_storage_users_can_view(
|
|
|
4195
4195
|
"""
|
|
4196
4196
|
return _get_shareable_object_access_state(
|
|
4197
4197
|
module_name="mainsequence.client.metatables",
|
|
4198
|
-
class_name="
|
|
4198
|
+
class_name="TimeIndexMetaTable",
|
|
4199
4199
|
object_id=storage_uid,
|
|
4200
4200
|
object_lookup_field="uid",
|
|
4201
4201
|
accessor_name="can_view",
|
|
@@ -4231,7 +4231,7 @@ def list_data_node_storage_users_can_edit(
|
|
|
4231
4231
|
"""
|
|
4232
4232
|
return _get_shareable_object_access_state(
|
|
4233
4233
|
module_name="mainsequence.client.metatables",
|
|
4234
|
-
class_name="
|
|
4234
|
+
class_name="TimeIndexMetaTable",
|
|
4235
4235
|
object_id=storage_uid,
|
|
4236
4236
|
object_lookup_field="uid",
|
|
4237
4237
|
accessor_name="can_edit",
|
|
@@ -4268,7 +4268,7 @@ def add_data_node_storage_user_to_view(
|
|
|
4268
4268
|
"""
|
|
4269
4269
|
return _mutate_shareable_object_access(
|
|
4270
4270
|
module_name="mainsequence.client.metatables",
|
|
4271
|
-
class_name="
|
|
4271
|
+
class_name="TimeIndexMetaTable",
|
|
4272
4272
|
object_id=storage_uid,
|
|
4273
4273
|
object_lookup_field="uid",
|
|
4274
4274
|
action_name="add_to_view",
|
|
@@ -4308,7 +4308,7 @@ def add_data_node_storage_user_to_edit(
|
|
|
4308
4308
|
"""
|
|
4309
4309
|
return _mutate_shareable_object_access(
|
|
4310
4310
|
module_name="mainsequence.client.metatables",
|
|
4311
|
-
class_name="
|
|
4311
|
+
class_name="TimeIndexMetaTable",
|
|
4312
4312
|
object_id=storage_uid,
|
|
4313
4313
|
object_lookup_field="uid",
|
|
4314
4314
|
action_name="add_to_edit",
|
|
@@ -4348,7 +4348,7 @@ def remove_data_node_storage_user_from_view(
|
|
|
4348
4348
|
"""
|
|
4349
4349
|
return _mutate_shareable_object_access(
|
|
4350
4350
|
module_name="mainsequence.client.metatables",
|
|
4351
|
-
class_name="
|
|
4351
|
+
class_name="TimeIndexMetaTable",
|
|
4352
4352
|
object_id=storage_uid,
|
|
4353
4353
|
object_lookup_field="uid",
|
|
4354
4354
|
action_name="remove_from_view",
|
|
@@ -4388,7 +4388,7 @@ def remove_data_node_storage_user_from_edit(
|
|
|
4388
4388
|
"""
|
|
4389
4389
|
return _mutate_shareable_object_access(
|
|
4390
4390
|
module_name="mainsequence.client.metatables",
|
|
4391
|
-
class_name="
|
|
4391
|
+
class_name="TimeIndexMetaTable",
|
|
4392
4392
|
object_id=storage_uid,
|
|
4393
4393
|
object_lookup_field="uid",
|
|
4394
4394
|
action_name="remove_from_edit",
|
|
@@ -4425,7 +4425,7 @@ def add_data_node_storage_team_to_view(
|
|
|
4425
4425
|
) -> dict[str, Any]:
|
|
4426
4426
|
return _mutate_shareable_object_team_access(
|
|
4427
4427
|
module_name="mainsequence.client.metatables",
|
|
4428
|
-
class_name="
|
|
4428
|
+
class_name="TimeIndexMetaTable",
|
|
4429
4429
|
object_id=storage_uid,
|
|
4430
4430
|
object_lookup_field="uid",
|
|
4431
4431
|
action_name="add_team_to_view",
|
|
@@ -4459,7 +4459,7 @@ def add_data_node_storage_team_to_edit(
|
|
|
4459
4459
|
) -> dict[str, Any]:
|
|
4460
4460
|
return _mutate_shareable_object_team_access(
|
|
4461
4461
|
module_name="mainsequence.client.metatables",
|
|
4462
|
-
class_name="
|
|
4462
|
+
class_name="TimeIndexMetaTable",
|
|
4463
4463
|
object_id=storage_uid,
|
|
4464
4464
|
object_lookup_field="uid",
|
|
4465
4465
|
action_name="add_team_to_edit",
|
|
@@ -4493,7 +4493,7 @@ def remove_data_node_storage_team_from_view(
|
|
|
4493
4493
|
) -> dict[str, Any]:
|
|
4494
4494
|
return _mutate_shareable_object_team_access(
|
|
4495
4495
|
module_name="mainsequence.client.metatables",
|
|
4496
|
-
class_name="
|
|
4496
|
+
class_name="TimeIndexMetaTable",
|
|
4497
4497
|
object_id=storage_uid,
|
|
4498
4498
|
object_lookup_field="uid",
|
|
4499
4499
|
action_name="remove_team_from_view",
|
|
@@ -4527,7 +4527,7 @@ def remove_data_node_storage_team_from_edit(
|
|
|
4527
4527
|
) -> dict[str, Any]:
|
|
4528
4528
|
return _mutate_shareable_object_team_access(
|
|
4529
4529
|
module_name="mainsequence.client.metatables",
|
|
4530
|
-
class_name="
|
|
4530
|
+
class_name="TimeIndexMetaTable",
|
|
4531
4531
|
object_id=storage_uid,
|
|
4532
4532
|
object_lookup_field="uid",
|
|
4533
4533
|
action_name="remove_team_from_edit",
|
|
@@ -4563,7 +4563,7 @@ def add_data_node_storage_labels(
|
|
|
4563
4563
|
|
|
4564
4564
|
return _mutate_labelable_object_labels(
|
|
4565
4565
|
module_name="mainsequence.client.metatables",
|
|
4566
|
-
class_name="
|
|
4566
|
+
class_name="TimeIndexMetaTable",
|
|
4567
4567
|
object_id=storage_uid,
|
|
4568
4568
|
object_lookup_field="uid",
|
|
4569
4569
|
action_name="add_label",
|
|
@@ -4601,7 +4601,7 @@ def remove_data_node_storage_labels(
|
|
|
4601
4601
|
|
|
4602
4602
|
return _mutate_labelable_object_labels(
|
|
4603
4603
|
module_name="mainsequence.client.metatables",
|
|
4604
|
-
class_name="
|
|
4604
|
+
class_name="TimeIndexMetaTable",
|
|
4605
4605
|
object_id=storage_uid,
|
|
4606
4606
|
object_lookup_field="uid",
|
|
4607
4607
|
action_name="remove_label",
|
|
@@ -423,7 +423,7 @@ CRONTAB_SCHEDULE_MODEL_REF = "mainsequence.client.models_helpers.CrontabSchedule
|
|
|
423
423
|
JOB_RUN_MODEL_REF = "mainsequence.client.models_helpers.JobRun"
|
|
424
424
|
PROJECT_IMAGE_MODEL_REF = "mainsequence.client.models_foundry.ProjectImage"
|
|
425
425
|
PROJECT_RESOURCE_MODEL_REF = "mainsequence.client.models_helpers.ProjectResource"
|
|
426
|
-
DATA_NODE_STORAGE_MODEL_REF = "mainsequence.client.metatables.
|
|
426
|
+
DATA_NODE_STORAGE_MODEL_REF = "mainsequence.client.metatables.TimeIndexMetaTable"
|
|
427
427
|
META_TABLE_MODEL_REF = "mainsequence.client.metatables.MetaTable"
|
|
428
428
|
CONSTANT_MODEL_REF = "mainsequence.client.models_foundry.Constant"
|
|
429
429
|
SECRET_MODEL_REF = "mainsequence.client.models_foundry.Secret"
|
|
@@ -7445,7 +7445,7 @@ def data_node_storage_list_cmd(
|
|
|
7445
7445
|
"""
|
|
7446
7446
|
List data node storages visible to the authenticated user.
|
|
7447
7447
|
|
|
7448
|
-
Uses SDK client `
|
|
7448
|
+
Uses SDK client `TimeIndexMetaTable.filter()` as the single source of truth.
|
|
7449
7449
|
|
|
7450
7450
|
Parameters
|
|
7451
7451
|
----------
|
|
@@ -7482,7 +7482,7 @@ def data_node_storage_detail_cmd(
|
|
|
7482
7482
|
`physical_index_plan` when the backend exposes them on the source table
|
|
7483
7483
|
configuration.
|
|
7484
7484
|
|
|
7485
|
-
Uses SDK client `
|
|
7485
|
+
Uses SDK client `TimeIndexMetaTable.get()` as the single source of truth.
|
|
7486
7486
|
|
|
7487
7487
|
Parameters
|
|
7488
7488
|
----------
|
|
@@ -7522,7 +7522,7 @@ def data_node_storage_refresh_search_index_cmd(
|
|
|
7522
7522
|
"""
|
|
7523
7523
|
Refresh the semantic search index for one data node storage.
|
|
7524
7524
|
|
|
7525
|
-
Uses SDK client `
|
|
7525
|
+
Uses SDK client `TimeIndexMetaTable.refresh_table_search_index()` as the single source of truth.
|
|
7526
7526
|
|
|
7527
7527
|
Examples
|
|
7528
7528
|
--------
|
|
@@ -7596,8 +7596,8 @@ def data_node_storage_search_cmd(
|
|
|
7596
7596
|
"""
|
|
7597
7597
|
Search data node storages by description metadata, column metadata, or both.
|
|
7598
7598
|
|
|
7599
|
-
Uses SDK client `
|
|
7600
|
-
`
|
|
7599
|
+
Uses SDK client `TimeIndexMetaTable.description_search()` and
|
|
7600
|
+
`TimeIndexMetaTable.column_search()` as the single sources of truth.
|
|
7601
7601
|
|
|
7602
7602
|
Examples
|
|
7603
7603
|
--------
|
|
@@ -7769,7 +7769,7 @@ def data_node_storage_column_search_cmd(
|
|
|
7769
7769
|
"""
|
|
7770
7770
|
Search data node storages by column metadata.
|
|
7771
7771
|
|
|
7772
|
-
Uses SDK client `
|
|
7772
|
+
Uses SDK client `TimeIndexMetaTable.column_search()` as the single source of truth.
|
|
7773
7773
|
|
|
7774
7774
|
Examples
|
|
7775
7775
|
--------
|
|
@@ -7831,7 +7831,7 @@ def data_node_storage_delete_cmd(
|
|
|
7831
7831
|
timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
|
|
7832
7832
|
):
|
|
7833
7833
|
"""
|
|
7834
|
-
Delete one data node storage using the SDK client `
|
|
7834
|
+
Delete one data node storage using the SDK client `TimeIndexMetaTable.delete()` path.
|
|
7835
7835
|
|
|
7836
7836
|
The command always requires typed verification before the delete call is executed.
|
|
7837
7837
|
|
|
@@ -7861,7 +7861,7 @@ def data_node_storage_can_view_cmd(
|
|
|
7861
7861
|
"""
|
|
7862
7862
|
List users who can view one data node storage.
|
|
7863
7863
|
|
|
7864
|
-
Uses the SDK `ShareableObjectMixin.can_view()` path through the `
|
|
7864
|
+
Uses the SDK `ShareableObjectMixin.can_view()` path through the `TimeIndexMetaTable` model.
|
|
7865
7865
|
|
|
7866
7866
|
Examples
|
|
7867
7867
|
--------
|
|
@@ -7887,7 +7887,7 @@ def data_node_storage_can_edit_cmd(
|
|
|
7887
7887
|
"""
|
|
7888
7888
|
List users who can edit one data node storage.
|
|
7889
7889
|
|
|
7890
|
-
Uses the SDK `ShareableObjectMixin.can_edit()` path through the `
|
|
7890
|
+
Uses the SDK `ShareableObjectMixin.can_edit()` path through the `TimeIndexMetaTable` model.
|
|
7891
7891
|
|
|
7892
7892
|
Examples
|
|
7893
7893
|
--------
|
|
@@ -16,7 +16,7 @@ import typer
|
|
|
16
16
|
from mainsequence.client.metatables import (
|
|
17
17
|
DynamicTableDataSource,
|
|
18
18
|
DynamicTableDataSourceMigrationConnectionRequest,
|
|
19
|
-
|
|
19
|
+
TimeIndexMetaTable,
|
|
20
20
|
)
|
|
21
21
|
from mainsequence.meta_tables.migrations import (
|
|
22
22
|
AlembicMetaTableMigration,
|
|
@@ -122,12 +122,21 @@ def _load_alembic_command(command_name: str) -> Any:
|
|
|
122
122
|
return command
|
|
123
123
|
|
|
124
124
|
|
|
125
|
+
def _coerce_alembic_version_path(version_path: str) -> str:
|
|
126
|
+
try:
|
|
127
|
+
from alembic import util
|
|
128
|
+
except ImportError as exc:
|
|
129
|
+
raise typer.BadParameter("Alembic is required for migration commands.") from exc
|
|
130
|
+
return str(util.coerce_resource_to_filename(version_path))
|
|
131
|
+
|
|
132
|
+
|
|
125
133
|
def _emit_alembic_script_context(
|
|
126
134
|
config: Any,
|
|
127
135
|
*,
|
|
128
136
|
target_revision: str | None = None,
|
|
129
137
|
) -> None:
|
|
130
138
|
script_location = config.get_main_option("script_location")
|
|
139
|
+
version_locations = config.get_main_option("version_locations")
|
|
131
140
|
version_table = config.get_main_option("version_table")
|
|
132
141
|
version_table_schema = config.get_main_option("version_table_schema")
|
|
133
142
|
version_table_label = (
|
|
@@ -135,9 +144,14 @@ def _emit_alembic_script_context(
|
|
|
135
144
|
if version_table_schema not in (None, "")
|
|
136
145
|
else version_table
|
|
137
146
|
)
|
|
147
|
+
version_locations_label = (
|
|
148
|
+
version_locations.replace("\n", ", ") if version_locations else "<default>"
|
|
149
|
+
)
|
|
138
150
|
_emit_status(
|
|
139
151
|
"Alembic script context "
|
|
140
|
-
f"script_location={script_location}
|
|
152
|
+
f"script_location={script_location} "
|
|
153
|
+
f"version_locations={version_locations_label} "
|
|
154
|
+
f"version_table={version_table_label}"
|
|
141
155
|
)
|
|
142
156
|
try:
|
|
143
157
|
from alembic.script import ScriptDirectory
|
|
@@ -348,7 +362,7 @@ def _collection_create_endpoint_for_items(items: Sequence[Any]) -> str:
|
|
|
348
362
|
|
|
349
363
|
|
|
350
364
|
def _collection_create_endpoint_for_item(item: Any) -> str:
|
|
351
|
-
if isinstance(item,
|
|
365
|
+
if isinstance(item, TimeIndexMetaTable):
|
|
352
366
|
return DYNAMIC_TABLE_COLLECTION_ENDPOINT
|
|
353
367
|
if _item_value(item, "time_index_name") not in (None, ""):
|
|
354
368
|
return DYNAMIC_TABLE_COLLECTION_ENDPOINT
|
|
@@ -745,14 +759,17 @@ def revision(
|
|
|
745
759
|
)
|
|
746
760
|
_emit_alembic_script_context(config, target_revision=head)
|
|
747
761
|
_emit_status(f"Starting Alembic revision now rev_id={resolved_rev_id}...")
|
|
762
|
+
revision_kwargs = {
|
|
763
|
+
"message": resolved_message,
|
|
764
|
+
"autogenerate": autogenerate,
|
|
765
|
+
"rev_id": resolved_rev_id,
|
|
766
|
+
"head": head,
|
|
767
|
+
}
|
|
768
|
+
version_path = migration.resolved_version_path()
|
|
769
|
+
if version_path is not None:
|
|
770
|
+
revision_kwargs["version_path"] = _coerce_alembic_version_path(version_path)
|
|
748
771
|
with _forward_alembic_logging():
|
|
749
|
-
script = command.revision(
|
|
750
|
-
config,
|
|
751
|
-
message=resolved_message,
|
|
752
|
-
autogenerate=autogenerate,
|
|
753
|
-
rev_id=resolved_rev_id,
|
|
754
|
-
head=head,
|
|
755
|
-
)
|
|
772
|
+
script = command.revision(config, **revision_kwargs)
|
|
756
773
|
_emit_status("Alembic revision finished.")
|
|
757
774
|
_emit(
|
|
758
775
|
{
|
|
@@ -83,7 +83,7 @@ class BaseObjectOrm:
|
|
|
83
83
|
"Scheduler": "ts_manager/scheduler",
|
|
84
84
|
"MultiIndexMetadata": "orm/multi_index_metadata",
|
|
85
85
|
"ContinuousAggMultiIndex": "ts_manager/cont_agg_multi_ind",
|
|
86
|
-
"
|
|
86
|
+
"TimeIndexMetaTable": "ts_manager/dynamic_table",
|
|
87
87
|
"LocalTimeSerieNodesMethods": "ts_manager/local_time_serie",
|
|
88
88
|
"DataNodeUpdate": "ts_manager/local_time_serie",
|
|
89
89
|
"DataNodeUpdateDetails": "ts_manager/local_time_serie_update_details",
|
|
@@ -83,9 +83,19 @@ def normalize_dtype_token(
|
|
|
83
83
|
)
|
|
84
84
|
return LOCAL_DATETIME_NAIVE
|
|
85
85
|
|
|
86
|
-
if lowered in {
|
|
86
|
+
if lowered in {
|
|
87
|
+
"object",
|
|
88
|
+
"str",
|
|
89
|
+
"string",
|
|
90
|
+
"text",
|
|
91
|
+
"varchar",
|
|
92
|
+
"char",
|
|
93
|
+
"character",
|
|
94
|
+
"character varying",
|
|
95
|
+
"unicode",
|
|
96
|
+
}:
|
|
87
97
|
return STRING
|
|
88
|
-
if "varchar" in lowered:
|
|
98
|
+
if "varchar" in lowered or lowered.startswith(("character varying", "character(")):
|
|
89
99
|
return STRING
|
|
90
100
|
if compact in {"uuid", "uuidtype", "uuid_", "postgresqluuid"}:
|
|
91
101
|
return UUID_TOKEN
|