mainsequence-metatable 0.1.28.dev50__tar.gz → 0.1.29.dev52__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_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/client/metatables-meta-tables/SKILL.md +4 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/client/metatables-migrations/SKILL.md +21 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +4 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0007-database-enforced-table-access.md +10 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0013-application-owned-migrations.md +17 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/authentication-and-errors.md +2 -2
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/openapi.json +9 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/bounded-transfers.md +5 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/hosted-runtime.md +10 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/pyproject.toml +1 -1
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/mainsequence_metatable.egg-info/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/managed_finalize.py +33 -5
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/migration_connection.py +54 -2
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +61 -2
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/contracts.py +3 -1
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/migration_connection.py +25 -1
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/operations.py +15 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/__init__.py +4 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/connection.py +34 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/env.py +3 -1
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/runner.py +45 -14
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/models.py +8 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_managed_finalize_client_api.py +91 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_remaining_client_routes.py +6 -0
- mainsequence_metatable-0.1.29.dev52/tests/permissions/test_migration_boundary.py +178 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/uv.lock +1 -1
- mainsequence_metatable-0.1.28.dev50/tests/permissions/test_migration_boundary.py +0 -77
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/analyze-with-sql/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/client/metatables-table-discovery/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/discover-tables/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/ms_tau_sdk/PINNED_FROM.txt +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/ms_tau_sdk/tau_a2a_runtime_adapter/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/ms_tau_sdk/tau_local_development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/ms_tau_sdk/tau_project_customization/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/ms_tau_sdk/tau_repository_integration/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/ms_tau_sdk/tau_security_and_access/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.mainsequence/workflows/metatables-api.yaml +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/LICENSE +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/MANIFEST.in +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/alembic.ini +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/compose.database-tests.yml +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/agent/0019-metatables-analyst-agent.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/agent/0020-analyst-reads-as-its-requester.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/agent/0021-api-serves-the-analyst-tools-over-mcp.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0004-approved-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0006-historical-run-graphs.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0009-shared-credential-store.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0016-impact-preflight.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0017-hosted-request-identity.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0018-search-document-pipeline.svg +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0018-table-search.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0022-concurrent-requests-and-connection-reuse.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/index.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/data-sources.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/overview.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/reference.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/tables-and-migrations.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/time-index-and-updates.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/assets/branding/metatables.svg +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/assets/diagrams/local-client-experience.svg +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/assets/diagrams/namespace-access.svg +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/build-an-updater.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/define-and-migrate-tables.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/deploy-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/installation-and-connection.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/local-storage.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/query-and-mutate.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/quickstart.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/read-existing-time-index-tables.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/register-existing-tables.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/tutorial.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/upgrade-legacy-app.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/architecture.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/data-sources.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/identity-and-scope.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/permissions-namespaces-labels.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/runs-and-execution-graphs.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/time-index-tables-and-updates.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/contributing/architecture-and-boundaries.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/contributing/database-backends.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/contributing/documentation.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/contributing/releasing.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/contributing/testing.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/query.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/index.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/catalog-migrations.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/configuration.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/local-runtime.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/recovery-and-observability.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/run-history.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/run-logs.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/reference/capabilities.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/reference/cli.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/reference/python.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/security/index.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/security/ownership-and-sharing.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/security/permissions.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/mkdocs.yml +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/build_reference.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/check_boundaries.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/check_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/check_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/check_docs.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/check_examples_debug.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/check_project.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/test_databases.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/test_postgresql.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/setup.cfg +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/mainsequence_metatable.egg-info/SOURCES.txt +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/_admin_source.json +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/_build.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/_skill_bundle.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/analysis.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/analyst/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/auth/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/auth/boundary.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/auth/local_actor.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/bootstrap.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/configuration.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/connection_count.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/credential_admin.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/development.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/development_client.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/error_logging.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/main.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/mcp.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/platform_cache.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/access_map.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/caller.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/column_search.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/contract_validation.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/data_sources.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/namespaces.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/run_logs.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/security.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_cascade.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_crud.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_delete.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_filter.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_import.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_introspection.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_patch.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_registration.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_response.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_search.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_search_document.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_sql.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/time_index_reads.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_batch.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_constants.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_crud.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_details.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_graph.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_registration.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_runs.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_statistics.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/runtime.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/runtime_control.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/runtime_database.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/source_passwords.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/transfer.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/access.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/catalog.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/catalog_types.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/connection_pool.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/hosted.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/hosted_access.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/native.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/pages.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/postgresql_access.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/registry.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/relation_tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/relational.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/sqlite_access.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/streaming.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/timescale.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/contracts/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/contracts/relation_import.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/contracts/values.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/index_statistics.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/label_rules.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/permission_rules.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/update_constants.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/credential_store.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/run_logs.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/source_validation.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0011_table_search.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0012_table_creator.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/create_table.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/import_relations.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/introspect_table.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/read_time_index.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/register_catalog.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/cascade.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/catalog.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/database.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/grants.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/impact.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/labels.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/locking.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/models.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/projections.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/table_queries.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/table_response.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/update_graph.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/updates.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/documents.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/embeddings.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/index.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/ranking.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/text.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/worker.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/metatables/configuration.yaml +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/request_timing.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/admin_install.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/app.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/filters.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/local.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/migrations.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/project.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/skills.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/compiled_sql/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/compiled_sql/mssql.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/compiled_sql/v1.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/dtype_codec.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/endpoint.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/query.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/future_registry.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/hashing.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/instrumentation.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/local_connection.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/local_files.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/log_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/alembic.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/provider.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/scaffold.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/sqlite.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/templates/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/templates/env.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/templates/script.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/tls.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/pydantic_metadata.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/run_logging.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/runtime.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/runtime_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/schema_names.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/sdk_compat.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/sqlalchemy_contracts.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/storage_layout_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/time_index_table_refs.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/transfer.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/transfer_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/transport.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/update_configuration_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/configuration.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/dependencies.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/managers.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/namespacing.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/runner.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/updaters.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/utils.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/upload.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/analyst/test_agent_surface.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/analyst/test_api_search.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/analyst/test_mcp.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/analyst/test_tools.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_bootstrap_failure_cause.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_caller_endpoint.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_data_source_identity.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_development_client.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_hosted_agent.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_hosted_environment_target.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_local_mode.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_platform_fact_cache.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_request_identity.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_runtime_database.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_runtime_scaffold.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_runtime_selection.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_runtime_storage_binding.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_source_passwords.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/catalog/test_catalog_foundation.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/catalog/test_contract_projection.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/catalog/test_database_config.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/catalog/test_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/catalog/test_migration.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/conftest.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/capabilities.json +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/client_signatures.json +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/database_operations.json +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_bounded_transfer.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_compiler_runtime_source.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_relation_batching.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_runtime_contract_compat.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_table_contracts.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/Dockerfile +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/Dockerfile.dockerignore +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/conftest.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/provider/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/provider/env.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_api_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_application_migration.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_bootstrap_recovery.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_catalog_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_credential_catalog.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_physical_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_sql_security.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_update_client.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_operations/test_physical_operations.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_operations/test_postgresql_operations.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_operations/test_runtime_and_temporal.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/documentation/test_project_checks.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_admin_installation.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_api_endpoint.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_application_owned_migrations.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_catalog_outage.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_api_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_migration_scaffold.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_migration_tls.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_package.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_signatures.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_value_behaviors.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_data_source_registry.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_local_actor_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_local_cli_workflow.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_local_client_selection.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_namespaces_admin_http.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_public_imports.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_run_logs.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_runtime_upgrade.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_sdk_local_startup.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_sqlite_runtime.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_filter_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_introspection_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_patch_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_search_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_search_document_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_search_scale.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_stats_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_updates_http.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_time_index_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_time_index_reads_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_timescale_policies_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_update_batch_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_update_registration_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/examples/test_documented_examples.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/examples/test_postgresql_examples.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/examples/test_setup_launch.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/examples/test_tutorial.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_connection_reuse.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_credential_store.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_local_data_sources.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_postgresql_sql.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_request_timing.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_serving_policy.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_source_validation.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_sqlite_operations.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/labels/test_labels.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/operations/test_create_table_operation.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/operations/test_create_table_postgres.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/operations/test_physical_operation_journal.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/operations/test_register_catalog.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/operations/test_search_documents.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/operations/test_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/packaging/test_client_skills.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/packaging/test_dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/packaging/test_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/packaging/test_editable_build.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/packaging/test_installed_distribution.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_access_map.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_governed_sql_scope.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_incremental_security.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_local_actor_membership.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_namespace_grants.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_security_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_table_grants.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_table_queries.py +0 -0
- {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_workload_principals.py +0 -0
|
@@ -178,3 +178,7 @@ for restart recovery. On an uncertain outcome, inspect `upload_receipt()` before
|
|
|
178
178
|
resubmitting; do not assign a fresh key to bypass uncertainty. Administrator
|
|
179
179
|
reconciliation requires verified physical evidence. This workflow uses the Main
|
|
180
180
|
Sequence API and has no Artifact or temporary-URL dependency.
|
|
181
|
+
|
|
182
|
+
A 429 `transfer_capacity_exceeded` or 503 `database_connections_busy` means the
|
|
183
|
+
API was at capacity and nothing ran. Retry after `Retry-After`, including SQL and
|
|
184
|
+
writes; it is not an uncertain outcome.
|
|
@@ -240,6 +240,27 @@ Read `docs/operations/recovery-and-observability.md`.
|
|
|
240
240
|
- Inspect partial DDL before retrying, especially on engines without transactional
|
|
241
241
|
DDL. A finalization-only failure can be retried without reapplying committed
|
|
242
242
|
revisions. Client DDL has no API executor journal.
|
|
243
|
+
- Finalization sends at most 10 tables per request, the version table first, and
|
|
244
|
+
reports `Finalizing MetaTables 11-20 of 62.` for larger providers (client 0.1.28
|
|
245
|
+
and later). A run that stops partway leaves earlier batches active; rerun the
|
|
246
|
+
same upgrade to finalize the rest.
|
|
247
|
+
- If the migration connection is refused with `provider_tables_misplaced`, provider
|
|
248
|
+
tables sit in the `metatables` catalog schema (MetaTables #50). Don't stamp, rerun or
|
|
249
|
+
hand-edit revisions. An administrator moves or drops those tables, then rerun.
|
|
250
|
+
- If it is refused with `provider_tables_owner_unreachable`, the tables belong to a
|
|
251
|
+
retired role, named in `owners`. A database administrator runs
|
|
252
|
+
`REASSIGN OWNED BY <role> TO mt_owner;` in that database, then rerun.
|
|
253
|
+
- If the client refuses because the connection "resolves unqualified names" outside the
|
|
254
|
+
default schema, it isn't the connection MetaTables issued. Use that connection, or set
|
|
255
|
+
`search_path` to the default schema.
|
|
256
|
+
- If finalization reports `physical_table_missing`, a current table is absent and nothing
|
|
257
|
+
named it as removed. Its catalog binding is kept; check `other_schemas` and where your
|
|
258
|
+
revisions created it. Client 0.1.29 and later name tables removed from the models or
|
|
259
|
+
dropped by the run, such as on downgrade. Older clients fail this way after a removal or
|
|
260
|
+
downgrade, so upgrade the client.
|
|
261
|
+
- `physical_table_inaccessible` means the table exists, but the MetaTables login can't
|
|
262
|
+
read all its columns or use its owner. Fix ownership or privileges; the stored contract
|
|
263
|
+
is kept.
|
|
243
264
|
- Destructive catalog deletion is not migration recovery and never bypasses
|
|
244
265
|
schema-management protection.
|
|
245
266
|
|
|
@@ -124,3 +124,7 @@ for restart recovery. On an uncertain outcome, inspect `upload_receipt()` before
|
|
|
124
124
|
resubmitting; do not assign a fresh key to bypass uncertainty. Administrator
|
|
125
125
|
reconciliation requires verified physical evidence. This workflow uses the Main
|
|
126
126
|
Sequence API and has no Artifact or temporary-URL dependency.
|
|
127
|
+
|
|
128
|
+
A 429 `transfer_capacity_exceeded` or 503 `database_connections_busy` means the
|
|
129
|
+
API was at capacity and nothing ran. Retry after `Retry-After`, an upload with the
|
|
130
|
+
same operation UUID; it is not an uncertain outcome.
|
|
@@ -55,6 +55,16 @@
|
|
|
55
55
|
> reuses login-role connections within a pod, only by the login role that opened them
|
|
56
56
|
> and never through `SET ROLE`; no session state carries over from one use to the next.
|
|
57
57
|
|
|
58
|
+
> Amendment (2026-10-09, [MetaTables #50](https://github.com/mainsequence-projects/MetaTables/issues/50)):
|
|
59
|
+
> Application migrations use the shared `metatables` login ([ADR 0013](0013-application-owned-migrations.md)),
|
|
60
|
+
> whose `"$user"` schema is the catalog. The invariant that they cannot accidentally create
|
|
61
|
+
> tables in the catalog therefore rests on the migration connection, not on a separate login:
|
|
62
|
+
>
|
|
63
|
+
> - the connection is pinned to `search_path=public`, and the client verifies that path;
|
|
64
|
+
> - the API refuses a provider whose tables are in `metatables`.
|
|
65
|
+
>
|
|
66
|
+
> This guards against accidents, not misuse: the login keeps its privileges.
|
|
67
|
+
|
|
58
68
|
|
|
59
69
|
Date: 2026-09-29
|
|
60
70
|
|
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# ADR 0013: Application-owned migrations through the client
|
|
2
2
|
|
|
3
|
+
> Amendment (2026-10-09, [MetaTables #50](https://github.com/mainsequence-projects/MetaTables/issues/50)
|
|
4
|
+
> and [#51](https://github.com/mainsequence-projects/MetaTables/issues/51)): The configured login is
|
|
5
|
+
> named `metatables`, so its default `"$user", public` search path starts in the catalog schema.
|
|
6
|
+
>
|
|
7
|
+
> - The migration connection carries `search_path=public`, the only default schema hosted
|
|
8
|
+
> PostgreSQL accepts. The client refuses a session whose effective path is anything else
|
|
9
|
+
> before it reads Alembic state. On PostgreSQL the version table is always qualified:
|
|
10
|
+
> `public` when the provider declares no schema.
|
|
11
|
+
> - Before issuing the connection, the API refuses a provider whose tables are in the
|
|
12
|
+
> `metatables` schema or belong to a role the login can't use. Nothing is stamped or
|
|
13
|
+
> replayed.
|
|
14
|
+
> - Lifecycle step 5 never infers removal from absence. Finalization deletes a catalog binding
|
|
15
|
+
> only for a table the client names as removed (dropped from its models, or dropped by this
|
|
16
|
+
> run, as on downgrade) and that is confirmed absent. Any other missing or unreadable table
|
|
17
|
+
> keeps its binding and fails. Older clients name nothing, so their removal and downgrade
|
|
18
|
+
> cleanup fails safe until they upgrade.
|
|
19
|
+
|
|
3
20
|
Date: 2026-10-01
|
|
4
21
|
|
|
5
22
|
Status: Accepted and implemented.
|
|
@@ -73,7 +73,7 @@ DataSource and bootstrap state and returns `Cache-Control: no-store`.
|
|
|
73
73
|
| 404 | Resource missing or not visible to the current actor. |
|
|
74
74
|
| 409 | Lifecycle, capability, protection, reference, or physical-state conflict. |
|
|
75
75
|
| 422 | Request/schema validation failure. |
|
|
76
|
-
| 503 | Catalog, SDK verification/source access, physical connection, or an uncertain operation outcome is unavailable. |
|
|
76
|
+
| 503 | Catalog, SDK verification/source access, physical connection, or an uncertain operation outcome is unavailable; or every database connection the API may hold stayed busy (`database_connections_busy`, `Retry-After: 1`). |
|
|
77
77
|
|
|
78
78
|
Most framework errors use a `detail` field. Some domain operations provide a
|
|
79
79
|
structured code and field information. Raw-query validation errors can be returned
|
|
@@ -87,4 +87,4 @@ An unknown physical commit outcome requires reconciliation, not a blind retry.
|
|
|
87
87
|
|
|
88
88
|
## Transfer errors
|
|
89
89
|
|
|
90
|
-
Data routes return 413 for request/row/response byte limits, 408 for the overall transfer deadline, and 429 with `Retry-After: 1` when
|
|
90
|
+
Data routes return 413 for request/row/response byte limits, 408 for the overall transfer deadline, and 429 `transfer_capacity_exceeded` with `Retry-After: 1` when no data-request slot freed up within the request deadline (each API process runs `serving.concurrency` data requests at once). A 503 `database_connections_busy` with `Retry-After: 1` means every database connection stayed busy until the deadline. In both cases no statement ran, so any request, including SQL and writes, is safe to retry. Existing SQL/driver errors can retain their engine-specific deadline codes and status. Upload conflicts use 409 and uncertainty can use 503. A limit enforced by schema validation can return 422. See [typed client exceptions and recovery](../client/bounded-transfers.md).
|
{mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/openapi.json
RENAMED
|
@@ -679,6 +679,15 @@
|
|
|
679
679
|
}
|
|
680
680
|
],
|
|
681
681
|
"title": "Migration Provider Key"
|
|
682
|
+
},
|
|
683
|
+
"removed_meta_table_uids": {
|
|
684
|
+
"items": {
|
|
685
|
+
"format": "uuid",
|
|
686
|
+
"type": "string"
|
|
687
|
+
},
|
|
688
|
+
"maxItems": 200,
|
|
689
|
+
"title": "Removed Meta Table Uids",
|
|
690
|
+
"type": "array"
|
|
682
691
|
}
|
|
683
692
|
},
|
|
684
693
|
"required": [
|
|
@@ -132,6 +132,11 @@ statistics refresh (even though it uses GET), and receipt reconciliation do not
|
|
|
132
132
|
automatically replay after uncertain failures. SDK authentication and one
|
|
133
133
|
credential refresh remain; SDK and HTTP adapter write retry loops are bypassed.
|
|
134
134
|
|
|
135
|
+
Capacity answers are the exception: 429 `transfer_capacity_exceeded` and 503
|
|
136
|
+
`database_connections_busy` mean the API was at capacity and no statement ran.
|
|
137
|
+
Retry any request after `Retry-After`, including SQL and writes; the client does
|
|
138
|
+
so automatically only for safe reads.
|
|
139
|
+
|
|
135
140
|
Exceptions are available in `metatables.transfer`: `TransferLimitError`,
|
|
136
141
|
`TransferDeadlineError`, `TransferRetryExhausted`, `TransferConflictError`, and
|
|
137
142
|
`TransferOutcomeUnknown`. Deterministic authorization/validation errors retain
|
|
@@ -120,6 +120,16 @@ lists what MetaTables requires.
|
|
|
120
120
|
6. Open **Settings** and check the declaration, the resolved connection, the
|
|
121
121
|
`ready` status and the applied migration revisions.
|
|
122
122
|
|
|
123
|
+
The login and the catalog schema are both named `metatables`, so the login's default
|
|
124
|
+
search path (`"$user", public`) starts in the catalog. Application migration connections
|
|
125
|
+
are therefore pinned to `public`, and a provider with tables in `metatables` is refused
|
|
126
|
+
with `provider_tables_misplaced`
|
|
127
|
+
([MetaTables #50](https://github.com/mainsequence-projects/MetaTables/issues/50)). Tables
|
|
128
|
+
created before 2026-09-30 may still belong to a retired `ms_ds_*_migration_owner` role. When
|
|
129
|
+
a migration reports `provider_tables_owner_unreachable`, a database administrator runs
|
|
130
|
+
`REASSIGN OWNED BY <role> TO mt_owner;` in that database. Granting the login that role
|
|
131
|
+
doesn't fix it.
|
|
132
|
+
|
|
123
133
|
## Deployment gate
|
|
124
134
|
|
|
125
135
|
In `.mainsequence/workflows/metatables-api.yaml`, the `migrate-system` Job
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "mainsequence-metatable"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.29.dev52"
|
|
8
8
|
description = "Main Sequence MetaTables Python client and standalone API"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13"
|
|
@@ -62,6 +62,9 @@ class FinalizeManagedRequest(BaseModel):
|
|
|
62
62
|
migration_provider_key: str | None = Field(default=None, max_length=384)
|
|
63
63
|
alembic_version_meta_table_uid: UUID | None = None
|
|
64
64
|
alembic_revision: str | None = Field(default=None, max_length=255)
|
|
65
|
+
# Tables the client removed from its models or dropped in this run. Only
|
|
66
|
+
# these may lose their binding when absent; absence alone is never removal.
|
|
67
|
+
removed_meta_table_uids: list[UUID] = Field(default_factory=list, max_length=200)
|
|
65
68
|
code_repository_context: dict[str, Any] | None = None
|
|
66
69
|
|
|
67
70
|
|
|
@@ -73,6 +76,18 @@ def physical_finalization_introspector() -> Callable[..., dict]:
|
|
|
73
76
|
return introspect_physical_table
|
|
74
77
|
|
|
75
78
|
|
|
79
|
+
def _missing_error(root: bool, other_schemas: list[str]) -> dict:
|
|
80
|
+
error = {
|
|
81
|
+
"code": "physical_table_missing",
|
|
82
|
+
"detail": "Alembic version table is missing." if root else (
|
|
83
|
+
"Physical table is missing and the request did not name it as removed."
|
|
84
|
+
),
|
|
85
|
+
}
|
|
86
|
+
if other_schemas:
|
|
87
|
+
error["other_schemas"] = other_schemas
|
|
88
|
+
return error
|
|
89
|
+
|
|
90
|
+
|
|
76
91
|
def _row(table: MetaTable | None, uid: UUID, *, previous: str = "unknown", exists: bool = False,
|
|
77
92
|
finalized: bool = False, deleted: bool = False, error: dict | None = None,
|
|
78
93
|
specialization: TimeIndexTable | None = None) -> dict:
|
|
@@ -113,6 +128,7 @@ def finalize_managed(
|
|
|
113
128
|
) -> dict:
|
|
114
129
|
"""Reconcile each requested row and return a per-table result envelope."""
|
|
115
130
|
requested = list(dict.fromkeys(payload.meta_table_uids))
|
|
131
|
+
removed = set(payload.removed_meta_table_uids)
|
|
116
132
|
lock_catalog(session)
|
|
117
133
|
guards = {
|
|
118
134
|
"migration_package": payload.migration_package,
|
|
@@ -162,16 +178,22 @@ def finalize_managed(
|
|
|
162
178
|
except PhysicalIntrospectionError as exc:
|
|
163
179
|
logger.warning("Physical table introspection failed during finalization", exc_info=True)
|
|
164
180
|
if exc.code == "physical_table_not_found":
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
else:
|
|
181
|
+
# Absence is never evidence of removal (MetaTables #50): only a table
|
|
182
|
+
# the request names as removed loses its binding, never the root.
|
|
183
|
+
if uid != version_root and uid in removed:
|
|
169
184
|
rows.append(_row(table, uid, previous=previous, specialization=specialization,
|
|
170
185
|
finalized=True, deleted=True))
|
|
171
186
|
session.delete(table)
|
|
187
|
+
else:
|
|
188
|
+
rows.append(_row(table, uid, previous=previous, specialization=specialization,
|
|
189
|
+
error=_missing_error(uid == version_root, exc.other_schemas)))
|
|
172
190
|
continue
|
|
191
|
+
detail = (
|
|
192
|
+
"The MetaTables login can't read this table's full shape."
|
|
193
|
+
if exc.code == "physical_table_inaccessible" else "Physical introspection failed."
|
|
194
|
+
)
|
|
173
195
|
rows.append(_row(table, uid, previous=previous, specialization=specialization, exists=True,
|
|
174
|
-
error={"code": exc.code, "detail":
|
|
196
|
+
error={"code": exc.code, "detail": detail}))
|
|
175
197
|
continue
|
|
176
198
|
except DataSourceAdmissionError as exc:
|
|
177
199
|
session.rollback()
|
|
@@ -179,6 +201,12 @@ def finalize_managed(
|
|
|
179
201
|
except (DataSourceIntegrationError, PhysicalConnectionUnavailable) as exc:
|
|
180
202
|
session.rollback()
|
|
181
203
|
raise HTTPException(status_code=503, detail="DataSource is unavailable.") from exc
|
|
204
|
+
if snapshot.get("owner_reachable") is False:
|
|
205
|
+
# Grant reconciliation must re-own platform-managed tables (ADR 0007).
|
|
206
|
+
rows.append(_row(table, uid, previous=previous, specialization=specialization, exists=True,
|
|
207
|
+
error={"code": "physical_table_inaccessible",
|
|
208
|
+
"detail": "The table's owner is a role the MetaTables login can't use."}))
|
|
209
|
+
continue
|
|
182
210
|
try:
|
|
183
211
|
with session.begin_nested():
|
|
184
212
|
contract = contract_from_physical_snapshot(
|
|
@@ -15,18 +15,63 @@ from metatables.api.app.auth.local_actor import catalog_session
|
|
|
15
15
|
from metatables.api.app.routes.table_introspection import data_source_provider
|
|
16
16
|
from metatables.api.app.routes.table_sql import authorized_table
|
|
17
17
|
from metatables.api.backend.backends.migration_connection import migration_connection_description
|
|
18
|
+
from metatables.api.backend.backends.operations import (
|
|
19
|
+
PhysicalConnectionUnavailable,
|
|
20
|
+
PhysicalIntrospectionError,
|
|
21
|
+
provider_physical_storage,
|
|
22
|
+
)
|
|
18
23
|
from metatables.api.backend.domain.data_source_rules import (
|
|
19
24
|
DataSourceAdmissionError,
|
|
20
25
|
require_data_source_access,
|
|
21
26
|
)
|
|
22
27
|
from metatables.api.backend.domain.permission_rules import TrustedActorFacts
|
|
23
28
|
from metatables.api.backend.integrations.runtime_data_sources import DataSourceIntegrationError
|
|
29
|
+
from metatables.api.backend.operations.bootstrap_migrations import PROGRESS_TABLE, VERSION_TABLE
|
|
24
30
|
from metatables.api.backend.persistence.grants import GrantRepository
|
|
25
31
|
from metatables.api.backend.persistence.locking import lock_catalog
|
|
26
|
-
from metatables.api.backend.persistence.models import MetaTable
|
|
32
|
+
from metatables.api.backend.persistence.models import Base, MetaTable
|
|
27
33
|
|
|
28
34
|
router = APIRouter(prefix="/meta-tables", tags=["MetaTables"])
|
|
29
35
|
|
|
36
|
+
CATALOG_TABLES = frozenset(Base.metadata.tables) | {PROGRESS_TABLE, VERSION_TABLE}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def provider_storage_inspector():
|
|
40
|
+
return provider_physical_storage
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def provider_storage_problem(tables, storage) -> dict | None:
|
|
44
|
+
"""Refuse providers whose tables a pinned connection would hide or can't use (#50)."""
|
|
45
|
+
misplaced = sorted(
|
|
46
|
+
f"metatables.{row['table_name']}"
|
|
47
|
+
for row in storage
|
|
48
|
+
if row["schema_name"] == "metatables" and row["table_name"] not in CATALOG_TABLES
|
|
49
|
+
)
|
|
50
|
+
if misplaced:
|
|
51
|
+
# A pinned connection would no longer see these and replay the provider's
|
|
52
|
+
# history next to them; nothing is stamped, replayed or chosen for it.
|
|
53
|
+
return {
|
|
54
|
+
"code": "provider_tables_misplaced",
|
|
55
|
+
"detail": "These provider tables are in the metatables catalog schema. An "
|
|
56
|
+
"administrator must move or drop them before the provider migrates.",
|
|
57
|
+
"tables": misplaced,
|
|
58
|
+
}
|
|
59
|
+
registered = {(item.physical_schema or "public", item.physical_table_name) for item in tables}
|
|
60
|
+
unreachable = [
|
|
61
|
+
row for row in storage
|
|
62
|
+
if (row["schema_name"], row["table_name"]) in registered and not row["owner_reachable"]
|
|
63
|
+
]
|
|
64
|
+
if unreachable:
|
|
65
|
+
return {
|
|
66
|
+
"code": "provider_tables_owner_unreachable",
|
|
67
|
+
"detail": "These provider tables belong to a role the MetaTables login can't use. "
|
|
68
|
+
"An administrator must move their ownership to mt_owner (REASSIGN OWNED) "
|
|
69
|
+
"before the provider migrates.",
|
|
70
|
+
"tables": [f"{row['schema_name']}.{row['table_name']}" for row in unreachable],
|
|
71
|
+
"owners": sorted({row["owner"] for row in unreachable}),
|
|
72
|
+
}
|
|
73
|
+
return None
|
|
74
|
+
|
|
30
75
|
|
|
31
76
|
class MigrationRequest(BaseModel):
|
|
32
77
|
model_config = ConfigDict(extra="forbid")
|
|
@@ -47,6 +92,7 @@ def migration_connection(
|
|
|
47
92
|
actor: TrustedActorFacts = Depends(trusted_actor_facts),
|
|
48
93
|
session: Session = Depends(catalog_session),
|
|
49
94
|
sources=Depends(data_source_provider),
|
|
95
|
+
inspect_storage=Depends(provider_storage_inspector),
|
|
50
96
|
):
|
|
51
97
|
lock_catalog(session)
|
|
52
98
|
table = authorized_table(session, actor, table_uid, edit=True, reserved_policy="reconcile")
|
|
@@ -78,11 +124,17 @@ def migration_connection(
|
|
|
78
124
|
try:
|
|
79
125
|
source = sources.get(table.data_source_uid)
|
|
80
126
|
require_data_source_access(source, access="write")
|
|
127
|
+
storage = inspect_storage(
|
|
128
|
+
source=source,
|
|
129
|
+
table_names=sorted({item.physical_table_name for item in tables if item.physical_table_name}),
|
|
130
|
+
)
|
|
81
131
|
result = migration_connection_description(source)
|
|
82
132
|
except DataSourceAdmissionError as exc:
|
|
83
133
|
raise HTTPException(exc.status_code, exc.code) from exc
|
|
84
|
-
except DataSourceIntegrationError as exc:
|
|
134
|
+
except (DataSourceIntegrationError, PhysicalConnectionUnavailable, PhysicalIntrospectionError) as exc:
|
|
85
135
|
raise HTTPException(503, "DataSource is unavailable.") from exc
|
|
136
|
+
if (problem := provider_storage_problem(tables, storage)) is not None:
|
|
137
|
+
raise HTTPException(409, problem)
|
|
86
138
|
# Include removed provider models so finalization reconciles dropped tables.
|
|
87
139
|
result["meta_table_uids"] = [str(item.uid) for item in tables if item.uid != root_uid]
|
|
88
140
|
control = getattr(request.app.state, "runtime_control", None)
|
|
@@ -14,6 +14,33 @@ from metatables.api.backend.backends.adapters.sqlite_connection import configure
|
|
|
14
14
|
from metatables.api.backend.backends.contracts import PhysicalIntrospectionError
|
|
15
15
|
from metatables.api.backend.integrations.runtime_data_sources import RuntimeDataSource
|
|
16
16
|
|
|
17
|
+
# pg_class and pg_attribute are readable whatever the login's privileges, unlike
|
|
18
|
+
# information_schema, which hides what the login can't access (MetaTables #51).
|
|
19
|
+
# The relation kinds match those information_schema.columns describes.
|
|
20
|
+
_RELATION_SQL = """
|
|
21
|
+
SELECT (SELECT count(*) FROM pg_attribute a
|
|
22
|
+
WHERE a.attrelid = c.oid AND a.attnum > 0 AND NOT a.attisdropped) AS column_count,
|
|
23
|
+
pg_has_role(current_user, c.relowner, 'MEMBER') AS owner_reachable
|
|
24
|
+
FROM pg_class c
|
|
25
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
26
|
+
WHERE n.nspname = %s AND c.relname = %s AND c.relkind IN ('r', 'p', 'v', 'f')
|
|
27
|
+
"""
|
|
28
|
+
_OTHER_SCHEMAS_SQL = """
|
|
29
|
+
SELECT n.nspname
|
|
30
|
+
FROM pg_class c
|
|
31
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
32
|
+
WHERE c.relname = %s AND n.nspname <> %s AND c.relkind IN ('r', 'p', 'v', 'f')
|
|
33
|
+
ORDER BY n.nspname
|
|
34
|
+
"""
|
|
35
|
+
_PROVIDER_STORAGE_SQL = """
|
|
36
|
+
SELECT n.nspname AS schema_name, c.relname AS table_name,
|
|
37
|
+
pg_get_userbyid(c.relowner) AS owner,
|
|
38
|
+
pg_has_role(current_user, c.relowner, 'MEMBER') AS owner_reachable
|
|
39
|
+
FROM pg_class c
|
|
40
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
41
|
+
WHERE c.relkind IN ('r', 'p') AND c.relname = ANY(%s)
|
|
42
|
+
ORDER BY n.nspname, c.relname
|
|
43
|
+
"""
|
|
17
44
|
_COLUMNS_SQL = """
|
|
18
45
|
SELECT column_name AS name, data_type, udt_name AS backend_type,
|
|
19
46
|
is_nullable = 'YES' AS nullable, ordinal_position
|
|
@@ -105,10 +132,19 @@ def introspect_postgresql_table(
|
|
|
105
132
|
with connection.cursor(cursor_factory=RealDictCursor) as cursor:
|
|
106
133
|
configure_cursor(cursor, readonly=True, statement_timeout_ms=15000)
|
|
107
134
|
arguments = (schema, physical_table_name)
|
|
135
|
+
cursor.execute(_RELATION_SQL, arguments)
|
|
136
|
+
relation = cursor.fetchone()
|
|
137
|
+
if relation is None:
|
|
138
|
+
cursor.execute(_OTHER_SCHEMAS_SQL, (physical_table_name, schema))
|
|
139
|
+
raise PhysicalIntrospectionError(
|
|
140
|
+
"physical_table_not_found",
|
|
141
|
+
other_schemas=[row["nspname"] for row in cursor.fetchall()],
|
|
142
|
+
)
|
|
108
143
|
cursor.execute(_COLUMNS_SQL, arguments)
|
|
109
144
|
columns = [dict(row) for row in cursor.fetchall()]
|
|
110
|
-
|
|
111
|
-
|
|
145
|
+
# Fewer visible columns than the table has: never a contract (#51).
|
|
146
|
+
if len(columns) < relation["column_count"]:
|
|
147
|
+
raise PhysicalIntrospectionError("physical_table_inaccessible")
|
|
112
148
|
cursor.execute(_INDEXES_SQL, arguments)
|
|
113
149
|
indexes = [dict(row) for row in cursor.fetchall()]
|
|
114
150
|
cursor.execute(_CONSTRAINTS_SQL, arguments)
|
|
@@ -127,4 +163,27 @@ def introspect_postgresql_table(
|
|
|
127
163
|
"columns": columns,
|
|
128
164
|
"indexes": indexes,
|
|
129
165
|
"constraints": constraints,
|
|
166
|
+
"owner_reachable": relation["owner_reachable"],
|
|
130
167
|
}
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def postgresql_provider_storage(
|
|
171
|
+
*, source: RuntimeDataSource, table_names: list[str]
|
|
172
|
+
) -> list[dict[str, Any]]:
|
|
173
|
+
"""Every schema in which the provider's table names exist, with their owners."""
|
|
174
|
+
with open_postgresql_connection(
|
|
175
|
+
source, access="read", operation="migration_preflight"
|
|
176
|
+
) as connection:
|
|
177
|
+
try:
|
|
178
|
+
with connection.cursor(cursor_factory=RealDictCursor) as cursor:
|
|
179
|
+
configure_cursor(cursor, readonly=True, statement_timeout_ms=15000)
|
|
180
|
+
cursor.execute(_PROVIDER_STORAGE_SQL, (list(table_names),))
|
|
181
|
+
rows = [dict(row) for row in cursor.fetchall()]
|
|
182
|
+
connection.rollback()
|
|
183
|
+
except DATABASE_ERRORS as exc:
|
|
184
|
+
try:
|
|
185
|
+
connection.rollback()
|
|
186
|
+
except DATABASE_ERRORS:
|
|
187
|
+
pass
|
|
188
|
+
raise PhysicalIntrospectionError("physical_table_introspection_failed") from exc
|
|
189
|
+
return rows
|
|
@@ -288,8 +288,10 @@ class TimeIndexQueryError(RuntimeError):
|
|
|
288
288
|
class PhysicalIntrospectionError(RuntimeError):
|
|
289
289
|
"""A secret-safe physical introspection failure."""
|
|
290
290
|
|
|
291
|
-
def __init__(self, code: str) -> None:
|
|
291
|
+
def __init__(self, code: str, *, other_schemas: Sequence[str] = ()) -> None:
|
|
292
292
|
self.code = code
|
|
293
|
+
# Where a same-named relation exists instead; a hint, not proof (#50).
|
|
294
|
+
self.other_schemas = list(other_schemas)
|
|
293
295
|
super().__init__(code)
|
|
294
296
|
|
|
295
297
|
|
|
@@ -4,9 +4,29 @@ DDL authority belongs to the configured database login. This does not create a
|
|
|
4
4
|
role or claim that a direct database connection enforces catalog table grants.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
+
import re
|
|
8
|
+
|
|
7
9
|
from sqlalchemy.engine import URL
|
|
8
10
|
|
|
9
11
|
from metatables.api.backend.backends.registry import engine_descriptor
|
|
12
|
+
from metatables.api.backend.domain.data_source_rules import DataSourceAdmissionError
|
|
13
|
+
|
|
14
|
+
_PLAIN_SCHEMA = re.compile(r"[a-z_][a-z0-9_]*")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def search_path_option(schema):
|
|
18
|
+
"""Pin unqualified application DDL to the default schema (MetaTables #50).
|
|
19
|
+
|
|
20
|
+
The login is named `metatables`, so PostgreSQL's default `"$user", public`
|
|
21
|
+
path would otherwise put unqualified tables in the catalog schema.
|
|
22
|
+
"""
|
|
23
|
+
if not _PLAIN_SCHEMA.fullmatch(schema or "") or schema == "metatables":
|
|
24
|
+
raise DataSourceAdmissionError(
|
|
25
|
+
"migration_schema_invalid",
|
|
26
|
+
"Application migrations need a plain default schema other than metatables.",
|
|
27
|
+
status_code=409,
|
|
28
|
+
)
|
|
29
|
+
return f"-c search_path={schema}"
|
|
10
30
|
|
|
11
31
|
|
|
12
32
|
def migration_connection_description(source):
|
|
@@ -23,7 +43,11 @@ def migration_connection_description(source):
|
|
|
23
43
|
"mssql": "mssql+pyodbc",
|
|
24
44
|
}[dialect]
|
|
25
45
|
if dialect == "postgresql":
|
|
26
|
-
query = {
|
|
46
|
+
query = {
|
|
47
|
+
"sslmode": settings.ssl_mode,
|
|
48
|
+
"connect_timeout": "10",
|
|
49
|
+
"options": search_path_option(settings.default_schema),
|
|
50
|
+
}
|
|
27
51
|
elif dialect == "mysql":
|
|
28
52
|
query = {"charset": settings.default_charset or "utf8mb4"}
|
|
29
53
|
else:
|
|
@@ -227,6 +227,21 @@ def introspect_physical_table(
|
|
|
227
227
|
)
|
|
228
228
|
|
|
229
229
|
|
|
230
|
+
def provider_physical_storage(*, source: RuntimeDataSource, table_names: Sequence[str]):
|
|
231
|
+
"""Where a migration provider's tables exist and who owns them (MetaTables #50).
|
|
232
|
+
|
|
233
|
+
Only PostgreSQL and TimescaleDB keep the catalog in a schema that unqualified
|
|
234
|
+
application DDL can reach; other engines report nothing.
|
|
235
|
+
"""
|
|
236
|
+
if source.class_type not in {"postgresql", "timescale_db"} or not table_names:
|
|
237
|
+
return []
|
|
238
|
+
from metatables.api.backend.backends.adapters.postgresql_introspection import (
|
|
239
|
+
postgresql_provider_storage,
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
return postgresql_provider_storage(source=source, table_names=list(table_names))
|
|
243
|
+
|
|
244
|
+
|
|
230
245
|
def drop_table(*, source: RuntimeDataSource, physical_schema: str | None, physical_table_name: str):
|
|
231
246
|
return backend_for(source).tables.drop(
|
|
232
247
|
physical_schema=physical_schema, physical_table_name=physical_table_name
|
|
@@ -72,6 +72,8 @@ class PreparedAlembicMetaTableMigration:
|
|
|
72
72
|
meta_table_uids: list[str]
|
|
73
73
|
reserved_tables: list[MetaTable] = field(default_factory=list)
|
|
74
74
|
owner_role_name: str | None = None
|
|
75
|
+
# Tables whose absence finalization may accept: removed models and tables this run dropped.
|
|
76
|
+
removed_meta_table_uids: list[str] = field(default_factory=list)
|
|
75
77
|
|
|
76
78
|
|
|
77
79
|
@dataclass(frozen=True, slots=True)
|
|
@@ -619,6 +621,7 @@ class AlembicMetaTableMigration:
|
|
|
619
621
|
finalize_meta_table_uids = list(
|
|
620
622
|
dict.fromkeys([str(registry_uid), *prepared.meta_table_uids])
|
|
621
623
|
)
|
|
624
|
+
removed = set(prepared.removed_meta_table_uids)
|
|
622
625
|
response = _finalize_in_batches(
|
|
623
626
|
finalize_meta_table_uids,
|
|
624
627
|
lambda batch: MetaTable.finalize_managed(
|
|
@@ -629,6 +632,7 @@ class AlembicMetaTableMigration:
|
|
|
629
632
|
migration_provider_key=self.migration_provider_key,
|
|
630
633
|
alembic_version_meta_table_uid=str(registry_uid),
|
|
631
634
|
alembic_revision=alembic_revision,
|
|
635
|
+
removed_meta_table_uids=[uid for uid in batch if uid in removed] or None,
|
|
632
636
|
),
|
|
633
637
|
timeout=timeout,
|
|
634
638
|
on_status=on_metatable_finalize_status,
|
|
@@ -9,6 +9,8 @@ from sqlalchemy.pool import NullPool
|
|
|
9
9
|
from . import sqlite as _sqlite # noqa: F401 Registers SQLite DDL and batch rules.
|
|
10
10
|
from .tls import migration_tls_arguments
|
|
11
11
|
|
|
12
|
+
CATALOG_SCHEMA = "metatables"
|
|
13
|
+
|
|
12
14
|
|
|
13
15
|
def version_schema(config, dialect):
|
|
14
16
|
schema = config.attributes["mainsequence_migration_provider"].version_table_schema
|
|
@@ -16,9 +18,41 @@ def version_schema(config, dialect):
|
|
|
16
18
|
return None
|
|
17
19
|
if dialect == "mssql" and schema in (None, "public"):
|
|
18
20
|
return config.attributes.get("metatables_default_schema", "dbo")
|
|
21
|
+
if dialect == "postgresql" and schema is None:
|
|
22
|
+
# Never left to search_path: the registry is the table the catalog
|
|
23
|
+
# registers, in the default schema (MetaTables #50).
|
|
24
|
+
return config.attributes.get("metatables_default_schema") or "public"
|
|
19
25
|
return schema
|
|
20
26
|
|
|
21
27
|
|
|
28
|
+
def require_default_schema_session(connection, migration, config):
|
|
29
|
+
"""Refuse a PostgreSQL session whose unqualified names could leave the default schema.
|
|
30
|
+
|
|
31
|
+
MetaTables issues migration connections pinned to the default schema; the
|
|
32
|
+
`metatables` login's own `"$user"` schema is the catalog (MetaTables #50).
|
|
33
|
+
"""
|
|
34
|
+
if connection.dialect.name != "postgresql":
|
|
35
|
+
return
|
|
36
|
+
declared = {table.schema for table in migration.target_metadata.tables.values()}
|
|
37
|
+
if CATALOG_SCHEMA in declared | {migration.version_table_schema}:
|
|
38
|
+
raise RuntimeError(
|
|
39
|
+
f"Application tables cannot use the reserved {CATALOG_SCHEMA} schema."
|
|
40
|
+
)
|
|
41
|
+
expected = config.attributes.get("metatables_default_schema") or "public"
|
|
42
|
+
began = not connection.in_transaction()
|
|
43
|
+
path = [row[0] for row in connection.exec_driver_sql(
|
|
44
|
+
"SELECT unnest(current_schemas(false))::text"
|
|
45
|
+
)]
|
|
46
|
+
if began:
|
|
47
|
+
connection.rollback()
|
|
48
|
+
if path != [expected]:
|
|
49
|
+
raise RuntimeError(
|
|
50
|
+
f"The migration connection resolves unqualified names in {path or 'no schema'}; "
|
|
51
|
+
f"MetaTables requires exactly [{expected!r}]. Use the connection MetaTables "
|
|
52
|
+
"issues for this provider or set search_path to the default schema."
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
22
56
|
@contextmanager
|
|
23
57
|
def migration_engine(config):
|
|
24
58
|
url = make_url(config.get_main_option("sqlalchemy.url"))
|
|
@@ -14,7 +14,7 @@ def run_mainsequence_alembic_env(
|
|
|
14
14
|
from alembic import context
|
|
15
15
|
|
|
16
16
|
from metatables.migrations import apply_mainsequence_migration_role
|
|
17
|
-
from metatables.migrations.connection import migration_engine
|
|
17
|
+
from metatables.migrations.connection import migration_engine, require_default_schema_session
|
|
18
18
|
from metatables.migrations.sqlite import AUTO_BATCH_OPTION, check_foreign_keys
|
|
19
19
|
|
|
20
20
|
def migration_provider() -> Any:
|
|
@@ -105,6 +105,7 @@ def run_mainsequence_alembic_env(
|
|
|
105
105
|
connection = config.attributes.get("connection")
|
|
106
106
|
if connection is not None:
|
|
107
107
|
apply_mainsequence_migration_role(connection, config)
|
|
108
|
+
require_default_schema_session(connection, migration_provider(), config)
|
|
108
109
|
context.configure(connection=connection, **configure_kwargs(connection))
|
|
109
110
|
run(connection)
|
|
110
111
|
return
|
|
@@ -112,6 +113,7 @@ def run_mainsequence_alembic_env(
|
|
|
112
113
|
config.attributes.setdefault("mainsequence_migration_provider", migration_provider())
|
|
113
114
|
with migration_engine(config) as engine, engine.connect() as connection:
|
|
114
115
|
apply_mainsequence_migration_role(connection, config)
|
|
116
|
+
require_default_schema_session(connection, migration_provider(), config)
|
|
115
117
|
context.configure(connection=connection, **configure_kwargs(connection))
|
|
116
118
|
run(connection)
|
|
117
119
|
|