mainsequence 4.1.8__tar.gz → 4.1.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. {mainsequence-4.1.8 → mainsequence-4.1.9}/PKG-INFO +1 -1
  2. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +10 -1
  3. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +28 -9
  4. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/__init__.py +1 -0
  5. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/sqlalchemy_contracts.py +500 -199
  6. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence.egg-info/PKG-INFO +1 -1
  7. {mainsequence-4.1.8 → mainsequence-4.1.9}/pyproject.toml +1 -1
  8. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_meta_tables_sqlalchemy_contracts.py +302 -72
  9. {mainsequence-4.1.8 → mainsequence-4.1.9}/LICENSE +0 -0
  10. {mainsequence-4.1.8 → mainsequence-4.1.9}/README.md +0 -0
  11. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/AGENTS.md +0 -0
  12. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
  13. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  14. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  15. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  16. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  17. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  18. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  19. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  20. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  21. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  22. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  23. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  24. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  25. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  26. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  27. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  28. {mainsequence-4.1.8 → mainsequence-4.1.9}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  29. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/__init__.py +0 -0
  30. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/__main__.py +0 -0
  31. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/bootstrap.py +0 -0
  32. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/__init__.py +0 -0
  33. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/api.py +0 -0
  34. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/browser_auth.py +0 -0
  35. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/cli.py +0 -0
  36. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/config.py +0 -0
  37. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/docker_utils.py +0 -0
  38. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/doctor.py +0 -0
  39. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/local_ops.py +0 -0
  40. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/model_filters.py +0 -0
  41. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/project_status.py +0 -0
  42. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/pydantic_cli.py +0 -0
  43. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/sdk_utils.py +0 -0
  44. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/ssh_utils.py +0 -0
  45. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/cli/ui.py +0 -0
  46. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/__init__.py +0 -0
  47. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/agent_runtime_models.py +0 -0
  48. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/base.py +0 -0
  49. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/client.py +0 -0
  50. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/command_center/__init__.py +0 -0
  51. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/command_center/app_component.py +0 -0
  52. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/command_center/connections.py +0 -0
  53. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/command_center/data_models.py +0 -0
  54. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/command_center/workspace.py +0 -0
  55. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  56. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/compute_validation.py +0 -0
  57. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  58. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  59. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  60. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  61. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/dtype_codec.py +0 -0
  62. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/exceptions.py +0 -0
  63. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/fastapi/__init__.py +0 -0
  64. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/fastapi/auth.py +0 -0
  65. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/models_foundry.py +0 -0
  66. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/models_helpers.py +0 -0
  67. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/models_metatables.py +0 -0
  68. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/models_user.py +0 -0
  69. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/client/utils.py +0 -0
  70. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/defaults.py +0 -0
  71. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/instrumentation/__init__.py +0 -0
  72. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/instrumentation/utils.py +0 -0
  73. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/logconf.py +0 -0
  74. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/__main__.py +0 -0
  75. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  76. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  77. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
  78. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
  79. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
  80. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/data_nodes/models.py +0 -0
  81. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
  82. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
  83. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
  84. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
  85. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/future_registry.py +0 -0
  86. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/hashing.py +0 -0
  87. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  88. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence/runtime_flags.py +0 -0
  89. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence.egg-info/SOURCES.txt +0 -0
  90. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence.egg-info/dependency_links.txt +0 -0
  91. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence.egg-info/entry_points.txt +0 -0
  92. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence.egg-info/requires.txt +0 -0
  93. {mainsequence-4.1.8 → mainsequence-4.1.9}/mainsequence.egg-info/top_level.txt +0 -0
  94. {mainsequence-4.1.8 → mainsequence-4.1.9}/setup.cfg +0 -0
  95. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_auth_precedence.py +0 -0
  96. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_build_operations_hashing.py +0 -0
  97. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_cli.py +0 -0
  98. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_cli_browser_auth.py +0 -0
  99. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_client.py +0 -0
  100. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_command_center_app_component_models.py +0 -0
  101. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_command_center_data_models.py +0 -0
  102. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_command_center_models.py +0 -0
  103. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  104. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_data_node_storage_dimension_queries.py +0 -0
  105. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_data_node_update_flow.py +0 -0
  106. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_dependency_extras.py +0 -0
  107. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_duckdb_interface_dimensions.py +0 -0
  108. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_filter_normalization.py +0 -0
  109. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_logconf.py +0 -0
  110. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_meta_tables_client_models.py +0 -0
  111. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_models_user_request_bound_auth.py +0 -0
  112. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_pod_project_resolution.py +0 -0
  113. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_project_batch_jobs_from_file.py +0 -0
  114. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_run_configuration.py +0 -0
  115. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_secret_client_model.py +0 -0
  116. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_source_table_configuration.py +0 -0
  117. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_sqlite_interface_dimensions.py +0 -0
  118. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_update_runner_uid_runtime.py +0 -0
  119. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_update_statistics.py +0 -0
  120. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_update_uid_guards.py +0 -0
  121. {mainsequence-4.1.8 → mainsequence-4.1.9}/tests/test_workspace_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.1.8
3
+ Version: 4.1.9
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License: MainSequence GmbH SDK License Agreement
@@ -353,7 +353,16 @@ Do not construct dependency graphs dynamically inside `update()`.
353
353
  ### 8. Foreign Keys Belong To The Storage Contract
354
354
 
355
355
  For new code, model foreign keys on the `PlatformTimeIndexMetaData` storage
356
- class or route the storage-contract work to the MetaTable skill.
356
+ class or route the storage-contract work to the MetaTable skill. When a
357
+ DataNode storage table needs a platform-managed FK, use
358
+ `MetaTableForeignKey(TargetModel, column=...)` on the storage class. Do not use
359
+ `ForeignKey(Target.__table__.c.uid)`, table fullnames, or explicit target UID
360
+ maps in DataNode examples.
361
+
362
+ Registration of the storage class follows the MetaTable lifecycle:
363
+ `register()` recursively registers unresolved FK target model classes, uses the
364
+ local process registry keyed by `storage_hash`, and writes the target
365
+ `MetaTable.uid` into the FK contract.
357
366
 
358
367
  Do not add DataNode configuration fields just to mutate storage metadata.
359
368
 
@@ -152,29 +152,48 @@ Do not add a `MAINSEQUENCE_META_TABLE_REGISTER` toggle in registration examples.
152
152
 
153
153
  Foreign-key contracts reference the target `MetaTable` UID.
154
154
 
155
- For `PlatformManagedMetaTable`, register parent tables first and then register child tables normally. The SDK inspects SQLAlchemy foreign-key constraints and resolves each target `MetaTable` by looking up the already registered table in the same data source, schema, and physical table name.
155
+ For `PlatformManagedMetaTable`, define foreign keys with
156
+ `MetaTableForeignKey(TargetModel, column=...)`. Do not write raw SQLAlchemy
157
+ table fullnames, `Parent.__table__.c.<column>` targets, or explicit target UID
158
+ maps in the platform-managed path. Registration is the lifecycle path:
159
+ `register()` recursively registers unresolved target model classes, stores each
160
+ returned `MetaTable` in a local process registry keyed by `storage_hash`, and
161
+ uses the target `MetaTable.uid` in the child FK contract.
162
+
163
+ Use this pattern:
164
+
165
+ ```python
166
+ account_uid: Mapped[uuid.UUID] = mapped_column(
167
+ Uuid,
168
+ MetaTableForeignKey(Account, column="uid", ondelete="RESTRICT"),
169
+ nullable=False,
170
+ )
171
+ ```
172
+
173
+ Every participating table must include `__metatable_description__` describing
174
+ both the schema and the table's intention.
156
175
 
157
176
  Example registration order:
158
177
 
159
178
  ```python
160
- account_meta_table = Account.register(...)
161
179
  asset_meta_table = Asset.register(...)
162
180
  ```
163
181
 
164
- The child registration will fail if the parent table has not already been registered, because there is no target `MetaTable.uid` for the backend FK contract.
165
-
166
- Do not pass `target_meta_tables` or `target_meta_table_uid_by_fullname` in the normal platform-managed path. Use explicit FK target mappings only for edge cases where automatic lookup is ambiguous or impossible.
182
+ The child registration registers `Account` first if it has not already been
183
+ registered in the current process. The local registry prevents duplicate backend
184
+ registration attempts for the same `storage_hash` and raises a clear error for
185
+ recursive registration cycles.
167
186
 
168
- For `external_registered`, there is no platform-managed parent lookup through the model class. Register the parent first, then build the child registration request with the parent UID mapped by target table fullname:
187
+ For `external_registered`, there is no platform-managed parent lookup. Register
188
+ the parent first, then build the child registration request with
189
+ `target_meta_tables={Account: account_meta_table}`:
169
190
 
170
191
  ```python
171
192
  account_meta_table = MetaTable.register(account_request)
172
193
  asset_request = external_registered_registration_request_from_sqlalchemy_model(
173
194
  Asset,
174
195
  data_source_uid=data_source_uid,
175
- target_meta_table_uid_by_fullname={
176
- Account.__table__.fullname: account_meta_table.uid,
177
- },
196
+ target_meta_tables={Account: account_meta_table},
178
197
  )
179
198
  asset_meta_table = MetaTable.register(asset_request)
180
199
  ```
@@ -9,6 +9,7 @@ _LAZY_IMPORTS = {
9
9
  ".sqlalchemy_contracts",
10
10
  "DEFAULT_PLATFORM_MANAGED_PROVISIONING",
11
11
  ),
12
+ "MetaTableForeignKey": (".sqlalchemy_contracts", "MetaTableForeignKey"),
12
13
  "PlatformManagedMetaTable": (".sqlalchemy_contracts", "PlatformManagedMetaTable"),
13
14
  "PlatformTimeIndexMetaData": (".sqlalchemy_contracts", "PlatformTimeIndexMetaData"),
14
15
  "POSTGRES_IDENTIFIER_MAX_LENGTH": (".hashing", "POSTGRES_IDENTIFIER_MAX_LENGTH"),