mainsequence 4.2.37__tar.gz → 4.2.38__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 (128) hide show
  1. {mainsequence-4.2.37/mainsequence.egg-info → mainsequence-4.2.38}/PKG-INFO +1 -1
  2. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +6 -0
  3. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/migrations.py +16 -4
  4. {mainsequence-4.2.37 → mainsequence-4.2.38/mainsequence.egg-info}/PKG-INFO +1 -1
  5. {mainsequence-4.2.37 → mainsequence-4.2.38}/pyproject.toml +1 -1
  6. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_meta_table_migrations.py +13 -1
  7. {mainsequence-4.2.37 → mainsequence-4.2.38}/LICENSE +0 -0
  8. {mainsequence-4.2.37 → mainsequence-4.2.38}/README.md +0 -0
  9. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/AGENTS.md +0 -0
  10. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
  11. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  12. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  13. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  14. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  15. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  16. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  17. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  18. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  19. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  20. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  21. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  22. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  23. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  24. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  25. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  26. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  27. {mainsequence-4.2.37 → mainsequence-4.2.38}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  28. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/__init__.py +0 -0
  29. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/__main__.py +0 -0
  30. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/bootstrap.py +0 -0
  31. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/__init__.py +0 -0
  32. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/api.py +0 -0
  33. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/browser_auth.py +0 -0
  34. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/cli.py +0 -0
  35. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/config.py +0 -0
  36. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/docker_utils.py +0 -0
  37. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/doctor.py +0 -0
  38. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/local_ops.py +0 -0
  39. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/migrations.py +0 -0
  40. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/model_filters.py +0 -0
  41. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/project_status.py +0 -0
  42. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/pydantic_cli.py +0 -0
  43. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/sdk_utils.py +0 -0
  44. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/ssh_utils.py +0 -0
  45. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/cli/ui.py +0 -0
  46. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/__init__.py +0 -0
  47. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/agent_runtime_models.py +0 -0
  48. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/base.py +0 -0
  49. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/client.py +0 -0
  50. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/command_center/__init__.py +0 -0
  51. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/command_center/app_component.py +0 -0
  52. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/command_center/connections.py +0 -0
  53. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/command_center/data_models.py +0 -0
  54. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/command_center/workspace.py +0 -0
  55. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  56. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/compute_validation.py +0 -0
  57. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  58. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  59. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  60. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  61. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/dtype_codec.py +0 -0
  62. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/exceptions.py +0 -0
  63. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/fastapi/__init__.py +0 -0
  64. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/fastapi/auth.py +0 -0
  65. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/metatables/__init__.py +0 -0
  66. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/metatables/core.py +0 -0
  67. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/models_foundry.py +0 -0
  68. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/models_helpers.py +0 -0
  69. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/models_user.py +0 -0
  70. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/client/utils.py +0 -0
  71. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/defaults.py +0 -0
  72. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/instrumentation/__init__.py +0 -0
  73. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/instrumentation/utils.py +0 -0
  74. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/logconf.py +0 -0
  75. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/__init__.py +0 -0
  76. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/__main__.py +0 -0
  77. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  78. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  79. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
  80. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
  81. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
  82. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/data_nodes/models.py +0 -0
  83. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
  84. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
  85. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
  86. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
  87. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/future_registry.py +0 -0
  88. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/hashing.py +0 -0
  89. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  90. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/schema_names.py +0 -0
  91. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  92. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence/runtime_flags.py +0 -0
  93. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence.egg-info/SOURCES.txt +0 -0
  94. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence.egg-info/dependency_links.txt +0 -0
  95. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence.egg-info/entry_points.txt +0 -0
  96. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence.egg-info/requires.txt +0 -0
  97. {mainsequence-4.2.37 → mainsequence-4.2.38}/mainsequence.egg-info/top_level.txt +0 -0
  98. {mainsequence-4.2.37 → mainsequence-4.2.38}/setup.cfg +0 -0
  99. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_auth_precedence.py +0 -0
  100. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_build_operations_hashing.py +0 -0
  101. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_cli.py +0 -0
  102. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_cli_browser_auth.py +0 -0
  103. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_cli_migrations.py +0 -0
  104. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_client.py +0 -0
  105. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_command_center_app_component_models.py +0 -0
  106. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_command_center_data_models.py +0 -0
  107. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_command_center_models.py +0 -0
  108. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  109. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_data_node_storage_dimension_queries.py +0 -0
  110. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_data_node_update_flow.py +0 -0
  111. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_dependency_extras.py +0 -0
  112. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_duckdb_interface_dimensions.py +0 -0
  113. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_filter_normalization.py +0 -0
  114. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_logconf.py +0 -0
  115. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_meta_tables_client_models.py +0 -0
  116. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  117. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_models_user_request_bound_auth.py +0 -0
  118. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_pod_project_resolution.py +0 -0
  119. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_project_batch_jobs_from_file.py +0 -0
  120. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_run_configuration.py +0 -0
  121. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_schema_names.py +0 -0
  122. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_secret_client_model.py +0 -0
  123. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_source_table_configuration.py +0 -0
  124. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_sqlite_interface_dimensions.py +0 -0
  125. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_update_runner_uid_runtime.py +0 -0
  126. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_update_statistics.py +0 -0
  127. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_update_uid_guards.py +0 -0
  128. {mainsequence-4.2.37 → mainsequence-4.2.38}/tests/test_workspace_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.2.37
3
+ Version: 4.2.38
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
@@ -292,6 +292,12 @@ SQLAlchemy class and calling normal registration again. Shape-addressed
292
292
  foreign keys, or constraints change, so new code cannot reliably recover the
293
293
  previous shape-derived table.
294
294
 
295
+ Do not modify Alembic revision files that have already been implemented/applied.
296
+ MetaTable migrations are database-backed history: once a revision may exist in a
297
+ database `alembic_version` table, changing that file corrupts the relationship
298
+ between source history and deployed state. For any follow-up schema change,
299
+ create a new Alembic revision on top of the current head.
300
+
295
301
  For contract evolution, define or update one selected
296
302
  `AlembicMetaTableMigration` provider:
297
303
 
@@ -534,9 +534,15 @@ class AlembicMetaTableMigration:
534
534
  table_name = target_table_names[model]
535
535
  existing_meta_table = existing_by_table_name.get(table_name)
536
536
  if existing_meta_table is not None:
537
- _bind_model_to_existing_metatable(model, existing_meta_table)
538
- reserved_by_model[model] = existing_meta_table
539
- continue
537
+ if _meta_table_provisioning_status(existing_meta_table) == "active":
538
+ _bind_model_to_existing_metatable(model, existing_meta_table)
539
+ reserved_by_model[model] = existing_meta_table
540
+ continue
541
+ if on_metatable_reservation_status is not None:
542
+ on_metatable_reservation_status(
543
+ "Restaging existing reserved MetaTable "
544
+ f"table_name={table_name} with current provider contract."
545
+ )
540
546
  else:
541
547
  bound_meta_table = _bound_meta_table_for_model(model)
542
548
  if bound_meta_table is not None:
@@ -1055,6 +1061,13 @@ def _meta_table_physical_table_name(meta_table: MetaTable) -> str | None:
1055
1061
  return str(physical_table_name)
1056
1062
 
1057
1063
 
1064
+ def _meta_table_provisioning_status(meta_table: MetaTable) -> str | None:
1065
+ provisioning_status = meta_table.provisioning_status
1066
+ if provisioning_status in (None, ""):
1067
+ return None
1068
+ return str(provisioning_status)
1069
+
1070
+
1058
1071
  def _meta_table_uid(meta_table: MetaTable) -> str | None:
1059
1072
  uid = meta_table.uid
1060
1073
  if uid in (None, ""):
@@ -1066,7 +1079,6 @@ def _finalize_table_failed(item: ManagedMetaTableFinalizeTableResult) -> bool:
1066
1079
  return (
1067
1080
  item.provisioning_status != "active"
1068
1081
  or item.physical_table_exists is False
1069
- or item.finalized is False
1070
1082
  or item.error not in (None, "", {})
1071
1083
  )
1072
1084
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.2.37
3
+ Version: 4.2.38
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "4.2.37"
7
+ version = "4.2.38"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1069,6 +1069,7 @@ def test_prepare_for_alembic_reserves_existing_table_name_with_provider_identity
1069
1069
  def fake_bulk_create(rows, *, timeout=None, on_status=None):
1070
1070
  reserved_payloads.extend(rows)
1071
1071
  assert [table["identifier"] for table in rows] == [
1072
+ "example_assets__account",
1072
1073
  "example_assets__asset",
1073
1074
  ]
1074
1075
  assert all(table["migration_package"] == "sample" for table in rows)
@@ -1079,11 +1080,17 @@ def test_prepare_for_alembic_reserves_existing_table_name_with_provider_identity
1079
1080
  assert not hasattr(rows[0]["table_contract"], "foreign_keys")
1080
1081
  assert all("schema_management" not in table for table in rows)
1081
1082
  return [
1083
+ _reserved_metatable(
1084
+ uid="aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
1085
+ identifier="example_assets__account",
1086
+ physical_table_name="example_assets__account",
1087
+ storage_hash=rows[0]["storage_hash"],
1088
+ ),
1082
1089
  _reserved_metatable(
1083
1090
  uid="bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
1084
1091
  identifier="example_assets__asset",
1085
1092
  physical_table_name="example_assets__asset",
1086
- storage_hash=rows[0]["storage_hash"],
1093
+ storage_hash=rows[1]["storage_hash"],
1087
1094
  ),
1088
1095
  ]
1089
1096
 
@@ -1106,6 +1113,7 @@ def test_prepare_for_alembic_reserves_existing_table_name_with_provider_identity
1106
1113
 
1107
1114
  assert len(filter_calls) == 1
1108
1115
  assert [payload["identifier"] for payload in reserved_payloads] == [
1116
+ "example_assets__account",
1109
1117
  "example_assets__asset",
1110
1118
  ]
1111
1119
  assert "schema_management" not in reserved_payloads[0]
@@ -1115,6 +1123,10 @@ def test_prepare_for_alembic_reserves_existing_table_name_with_provider_identity
1115
1123
  ]
1116
1124
  assert Account.__table__.name == "example_assets__account"
1117
1125
  assert Asset.__table__.name == "example_assets__asset"
1126
+ assert (
1127
+ "Restaging existing reserved MetaTable table_name=example_assets__account "
1128
+ "with current provider contract."
1129
+ ) in reservation_statuses
1118
1130
 
1119
1131
 
1120
1132
  def test_prepare_for_alembic_reserves_already_staged_existing_rows(monkeypatch):
File without changes
File without changes
File without changes