mainsequence 4.3.7__tar.gz → 4.3.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 (129) hide show
  1. {mainsequence-4.3.7/mainsequence.egg-info → mainsequence-4.3.9}/PKG-INFO +1 -1
  2. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +20 -6
  3. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/migrations.py +27 -1
  4. {mainsequence-4.3.7 → mainsequence-4.3.9/mainsequence.egg-info}/PKG-INFO +1 -1
  5. {mainsequence-4.3.7 → mainsequence-4.3.9}/pyproject.toml +1 -1
  6. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_meta_table_migrations.py +24 -12
  7. {mainsequence-4.3.7 → mainsequence-4.3.9}/LICENSE +0 -0
  8. {mainsequence-4.3.7 → mainsequence-4.3.9}/README.md +0 -0
  9. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/AGENTS.md +0 -0
  10. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
  11. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  12. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  13. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  14. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  15. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  16. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  17. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  18. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  19. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  20. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  21. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  22. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  23. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  24. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  25. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  26. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  27. {mainsequence-4.3.7 → mainsequence-4.3.9}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  28. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/__init__.py +0 -0
  29. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/__main__.py +0 -0
  30. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/bootstrap.py +0 -0
  31. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/__init__.py +0 -0
  32. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/api.py +0 -0
  33. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/browser_auth.py +0 -0
  34. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/cli.py +0 -0
  35. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/config.py +0 -0
  36. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/docker_utils.py +0 -0
  37. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/doctor.py +0 -0
  38. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/local_ops.py +0 -0
  39. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/migrations.py +0 -0
  40. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/model_filters.py +0 -0
  41. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/project_status.py +0 -0
  42. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/pydantic_cli.py +0 -0
  43. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/sdk_utils.py +0 -0
  44. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/ssh_utils.py +0 -0
  45. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/cli/ui.py +0 -0
  46. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/__init__.py +0 -0
  47. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/agent_runtime_models.py +0 -0
  48. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/base.py +0 -0
  49. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/client.py +0 -0
  50. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/command_center/__init__.py +0 -0
  51. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/command_center/app_component.py +0 -0
  52. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/command_center/connections.py +0 -0
  53. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/command_center/data_models.py +0 -0
  54. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/command_center/workspace.py +0 -0
  55. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  56. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/compute_validation.py +0 -0
  57. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  58. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  59. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  60. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  61. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/dtype_codec.py +0 -0
  62. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/exceptions.py +0 -0
  63. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/fastapi/__init__.py +0 -0
  64. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/fastapi/auth.py +0 -0
  65. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/metatables/__init__.py +0 -0
  66. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/metatables/core.py +0 -0
  67. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/models_foundry.py +0 -0
  68. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/models_helpers.py +0 -0
  69. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/models_user.py +0 -0
  70. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/client/utils.py +0 -0
  71. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/defaults.py +0 -0
  72. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/instrumentation/__init__.py +0 -0
  73. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/instrumentation/utils.py +0 -0
  74. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/logconf.py +0 -0
  75. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/__init__.py +0 -0
  76. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/__main__.py +0 -0
  77. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  78. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  79. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
  80. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
  81. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
  82. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/data_nodes/models.py +0 -0
  83. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
  84. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
  85. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
  86. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
  87. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/future_registry.py +0 -0
  88. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/hashing.py +0 -0
  89. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  90. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/schema_names.py +0 -0
  91. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  92. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence/runtime_flags.py +0 -0
  93. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence.egg-info/SOURCES.txt +0 -0
  94. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence.egg-info/dependency_links.txt +0 -0
  95. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence.egg-info/entry_points.txt +0 -0
  96. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence.egg-info/requires.txt +0 -0
  97. {mainsequence-4.3.7 → mainsequence-4.3.9}/mainsequence.egg-info/top_level.txt +0 -0
  98. {mainsequence-4.3.7 → mainsequence-4.3.9}/setup.cfg +0 -0
  99. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_auth_precedence.py +0 -0
  100. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_build_operations_hashing.py +0 -0
  101. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_cli.py +0 -0
  102. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_cli_browser_auth.py +0 -0
  103. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_cli_migrations.py +0 -0
  104. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_client.py +0 -0
  105. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_command_center_app_component_models.py +0 -0
  106. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_command_center_data_models.py +0 -0
  107. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_command_center_models.py +0 -0
  108. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  109. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_data_node_storage_dimension_queries.py +0 -0
  110. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_data_node_update_flow.py +0 -0
  111. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_dependency_extras.py +0 -0
  112. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_duckdb_interface_dimensions.py +0 -0
  113. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_filter_normalization.py +0 -0
  114. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_instrumentation.py +0 -0
  115. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_logconf.py +0 -0
  116. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_meta_tables_client_models.py +0 -0
  117. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  118. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_models_user_request_bound_auth.py +0 -0
  119. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_pod_project_resolution.py +0 -0
  120. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_project_batch_jobs_from_file.py +0 -0
  121. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_run_configuration.py +0 -0
  122. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_schema_names.py +0 -0
  123. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_secret_client_model.py +0 -0
  124. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_source_table_configuration.py +0 -0
  125. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_sqlite_interface_dimensions.py +0 -0
  126. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_update_runner_uid_runtime.py +0 -0
  127. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_update_statistics.py +0 -0
  128. {mainsequence-4.3.7 → mainsequence-4.3.9}/tests/test_update_uid_guards.py +0 -0
  129. {mainsequence-4.3.7 → mainsequence-4.3.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.3.7
3
+ Version: 4.3.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
@@ -127,10 +127,22 @@ Do not hand-build contract fragments when the SQLAlchemy helper can derive them.
127
127
  For `platform_managed`, inherit from `PlatformManagedMetaTable`.
128
128
 
129
129
  Declare an explicit project-prefixed SQLAlchemy `__tablename__`. Use
130
- `schema_table_name(project_or_app, concept)` from `mainsequence.meta_tables` to
131
- generate that name. The mixin derives only the logical `storage_hash` from
132
- storage-relevant configuration and table shape; it must not use that hash as the
133
- SQLAlchemy table name.
130
+ `schema_table_name(app, concept, suffix=None)` from `mainsequence.meta_tables`
131
+ to generate that name:
132
+
133
+ ```python
134
+ def schema_table_name(
135
+ app: str,
136
+ concept: str,
137
+ suffix: str | None = None,
138
+ ) -> str: ...
139
+ ```
140
+
141
+ Use `app` for the project/package prefix, `concept` for the table concept, and
142
+ `suffix` for a namespace, variant, or bounded specialization when the same
143
+ concept exists in multiple logical scopes. The mixin derives only the logical
144
+ `storage_hash` from storage-relevant configuration and table shape; it must not
145
+ use that hash as the SQLAlchemy table name.
134
146
 
135
147
  When a platform-managed table must support in-place contract migrations from its
136
148
  first version, use Alembic. Keep the SDK model as a normal
@@ -179,6 +191,7 @@ from mainsequence.meta_tables import PlatformManagedMetaTable, schema_table_name
179
191
 
180
192
  PROJECT_NAME = "sdk_examples"
181
193
  ACCOUNT_TABLE_NAME = schema_table_name(PROJECT_NAME, "account")
194
+ BROKER_ACCOUNT_TABLE_NAME = schema_table_name(PROJECT_NAME, "account", suffix="broker")
182
195
 
183
196
 
184
197
  class Account(PlatformManagedMetaTable, Base):
@@ -326,8 +339,9 @@ SQLAlchemy table name used by the provider model. Keep that table name stable
326
339
  when a class is renamed or moved but must keep the same platform identity.
327
340
  When declaring an explicit identifier, explicit physical table name, or Alembic
328
341
  version table name, prefix it with the project or package name rather than using
329
- a bare table name. Use `schema_table_name(project_or_app, concept)` for the
330
- physical table and Alembic version table names.
342
+ a bare table name. Use `schema_table_name(app, concept, suffix=None)` for the
343
+ physical table and Alembic version table names. Use `suffix` for a namespace or
344
+ variant, for example `schema_table_name("msm", "positions", suffix="broker")`.
331
345
 
332
346
  Do not ask users to construct backend migration payloads, call low-level
333
347
  migration request models, or use SDK helper functions directly. The backend
@@ -930,7 +930,9 @@ def _collection_create_row_from_registration_request(
930
930
  "alembic_revision": alembic_revision,
931
931
  "physical_table_name": str(physical_table_name),
932
932
  "protect_from_deletion": bool(getattr(request, "protect_from_deletion", False)),
933
- "table_contract": request.table_contract,
933
+ "table_contract": _collection_create_table_contract_payload(
934
+ request.table_contract
935
+ ),
934
936
  }
935
937
  time_index_name = getattr(request, "time_index_name", None)
936
938
  if time_index_name not in (None, ""):
@@ -944,6 +946,30 @@ def _collection_create_row_from_registration_request(
944
946
  return row
945
947
 
946
948
 
949
+ def _collection_create_table_contract_payload(table_contract: Any) -> dict[str, Any]:
950
+ if isinstance(table_contract, MetaTableContract):
951
+ payload = table_contract.model_dump(mode="json", exclude_none=True)
952
+ elif hasattr(table_contract, "model_dump"):
953
+ payload = table_contract.model_dump(mode="json", exclude_none=True)
954
+ elif isinstance(table_contract, Mapping):
955
+ payload = dict(table_contract)
956
+ else:
957
+ raise TypeError("Alembic MetaTable collection-create requires table_contract.")
958
+
959
+ physical = payload.get("physical")
960
+ if hasattr(physical, "model_dump"):
961
+ physical_payload = physical.model_dump(mode="json", exclude_none=True)
962
+ elif isinstance(physical, Mapping):
963
+ physical_payload = dict(physical)
964
+ else:
965
+ physical_payload = None
966
+ if physical_payload is not None:
967
+ for schema_key in ("schema", "schema_", "table_schema", "schema_name"):
968
+ physical_payload.pop(schema_key, None)
969
+ payload["physical"] = physical_payload
970
+ return payload
971
+
972
+
947
973
  def _request_contract_physical_table_name(request: Any) -> str | None:
948
974
  table_contract = getattr(request, "table_contract", None)
949
975
  if isinstance(table_contract, MetaTableContract):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.3.7
3
+ Version: 4.3.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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "4.3.7"
7
+ version = "4.3.9"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -853,10 +853,12 @@ def test_prepare_for_alembic_preserves_authored_table_names(monkeypatch):
853
853
  assert all(table["management_mode"] == "platform_managed" for table in rows)
854
854
  assert all("schema_management" not in table for table in rows)
855
855
  assert all(table["protect_from_deletion"] is False for table in rows)
856
- assert not hasattr(rows[0]["table_contract"], "indexes")
857
- assert not hasattr(rows[1]["table_contract"], "indexes")
858
- assert not hasattr(rows[0]["table_contract"], "foreign_keys")
859
- assert not hasattr(rows[1]["table_contract"], "foreign_keys")
856
+ assert "indexes" not in rows[0]["table_contract"]
857
+ assert "indexes" not in rows[1]["table_contract"]
858
+ assert "foreign_keys" not in rows[0]["table_contract"]
859
+ assert "foreign_keys" not in rows[1]["table_contract"]
860
+ assert "schema" not in rows[0]["table_contract"]["physical"]
861
+ assert "schema" not in rows[1]["table_contract"]["physical"]
860
862
 
861
863
  response_tables = []
862
864
  for table in rows:
@@ -909,12 +911,20 @@ def test_prepare_for_alembic_preserves_authored_table_names(monkeypatch):
909
911
  ]
910
912
  assert Account.__table__.name == "example_assets__account"
911
913
  assert Asset.__table__.name == "example_assets__asset"
912
- assert reserved_payloads[0]["table_contract"].physical.table_name == "example_assets__account"
913
- assert reserved_payloads[1]["table_contract"].physical.table_name == "example_assets__asset"
914
+ assert (
915
+ reserved_payloads[0]["table_contract"]["physical"]["table_name"]
916
+ == "example_assets__account"
917
+ )
918
+ assert (
919
+ reserved_payloads[1]["table_contract"]["physical"]["table_name"]
920
+ == "example_assets__asset"
921
+ )
914
922
  assert "backend" not in str(next(iter(Asset.__table__.indexes)).name)
915
923
  assert next(iter(Asset.__table__.foreign_key_constraints)).name == "asset_account_uid_fkey"
916
- assert not hasattr(reserved_payloads[1]["table_contract"], "indexes")
917
- assert not hasattr(reserved_payloads[1]["table_contract"], "foreign_keys")
924
+ assert "indexes" not in reserved_payloads[1]["table_contract"]
925
+ assert "foreign_keys" not in reserved_payloads[1]["table_contract"]
926
+ assert "schema" not in reserved_payloads[0]["table_contract"]["physical"]
927
+ assert "schema" not in reserved_payloads[1]["table_contract"]["physical"]
918
928
  assert "schema_management" not in reserved_payloads[0]
919
929
  assert reserved_payloads[0]["protect_from_deletion"] is False
920
930
 
@@ -958,8 +968,9 @@ def test_prepare_for_alembic_does_not_resolve_foreign_key_targets(monkeypatch):
958
968
  assert rows[0]["migration_namespace"] == "markets"
959
969
  assert rows[0]["migration_provider_key"] == "sample:markets"
960
970
  assert rows[0]["is_alembic_managed"] is True
961
- assert not hasattr(rows[0]["table_contract"], "indexes")
962
- assert not hasattr(rows[0]["table_contract"], "foreign_keys")
971
+ assert "indexes" not in rows[0]["table_contract"]
972
+ assert "foreign_keys" not in rows[0]["table_contract"]
973
+ assert "schema" not in rows[0]["table_contract"]["physical"]
963
974
  assert "schema_management" not in rows[0]
964
975
  return [
965
976
  _reserved_metatable(
@@ -1194,8 +1205,9 @@ def test_prepare_for_alembic_reserves_existing_table_name_with_provider_identity
1194
1205
  assert all(table["migration_namespace"] == "markets" for table in rows)
1195
1206
  assert all(table["migration_provider_key"] == "sample:markets" for table in rows)
1196
1207
  assert all(table["is_alembic_managed"] is True for table in rows)
1197
- assert not hasattr(rows[0]["table_contract"], "indexes")
1198
- assert not hasattr(rows[0]["table_contract"], "foreign_keys")
1208
+ assert "indexes" not in rows[0]["table_contract"]
1209
+ assert "foreign_keys" not in rows[0]["table_contract"]
1210
+ assert "schema" not in rows[0]["table_contract"]["physical"]
1199
1211
  assert all("schema_management" not in table for table in rows)
1200
1212
  return [
1201
1213
  _reserved_metatable(
File without changes
File without changes
File without changes