mainsequence-metatable 0.1.30.dev57__tar.gz → 0.1.31.dev58__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.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/client/metatables-migrations/SKILL.md +34 -3
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0013-application-owned-migrations.md +35 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/client/define-and-migrate-tables.md +15 -1
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/client/deploy-application-migrations.md +26 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/client/installation-and-connection.md +7 -2
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/contributing/documentation.md +1 -1
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/operations/catalog-migrations.md +7 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/pyproject.toml +1 -1
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/mainsequence_metatable.egg-info/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/mainsequence_metatable.egg-info/SOURCES.txt +3 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/bootstrap.py +35 -14
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/main.py +2 -1
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/managed_finalize.py +34 -12
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +80 -54
- mainsequence_metatable-0.1.31.dev58/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +162 -0
- mainsequence_metatable-0.1.31.dev58/src/metatables/api/backend/backends/batch_inspection.py +45 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/contracts.py +4 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/native.py +3 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/operations.py +22 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/relational.py +81 -62
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/operations/catalog_schema.py +52 -4
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/endpoint.py +32 -11
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/runner.py +59 -28
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_data_source_identity.py +2 -2
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_runtime_bootstrap.py +16 -0
- mainsequence_metatable-0.1.31.dev58/tests/catalog/test_schema_validation.py +60 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_api_endpoint.py +53 -2
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_application_owned_migrations.py +91 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_client_package.py +1 -1
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_managed_finalize_client_api.py +85 -3
- mainsequence_metatable-0.1.31.dev58/tests/e2e/test_runtime_upgrade.py +159 -0
- mainsequence_metatable-0.1.31.dev58/tests/integrations/test_batch_introspection.py +202 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/uv.lock +1 -1
- mainsequence_metatable-0.1.30.dev57/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -146
- mainsequence_metatable-0.1.30.dev57/tests/e2e/test_runtime_upgrade.py +0 -71
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/analyze-with-sql/SKILL.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/client/metatables-meta-tables/SKILL.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/client/metatables-table-discovery/SKILL.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/discover-tables/SKILL.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/ms_tau_sdk/PINNED_FROM.txt +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/ms_tau_sdk/tau_a2a_runtime_adapter/SKILL.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/ms_tau_sdk/tau_local_development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/ms_tau_sdk/tau_project_customization/SKILL.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/ms_tau_sdk/tau_repository_integration/SKILL.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.agents/skills/ms_tau_sdk/tau_security_and_access/SKILL.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/.mainsequence/workflows/metatables-api.yaml +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/LICENSE +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/MANIFEST.in +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/README.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/alembic.ini +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/compose.database-tests.yml +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/agent/0019-metatables-analyst-agent.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/agent/0020-analyst-reads-as-its-requester.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/agent/0021-api-serves-the-analyst-tools-over-mcp.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0004-approved-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0006-historical-run-graphs.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0007-database-enforced-table-access.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0009-shared-credential-store.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0016-impact-preflight.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0017-hosted-request-identity.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0018-search-document-pipeline.svg +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0018-table-search.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/api/0022-concurrent-requests-and-connection-reuse.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/adr/index.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/api/authentication-and-errors.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/api/data-sources.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/api/openapi.json +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/api/overview.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/api/reference.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/api/tables-and-migrations.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/api/time-index-and-updates.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/assets/branding/metatables.svg +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/assets/diagrams/local-client-experience.svg +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/assets/diagrams/namespace-access.svg +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/client/bounded-transfers.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/client/build-an-updater.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/client/local-storage.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/client/query-and-mutate.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/client/quickstart.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/client/read-existing-time-index-tables.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/client/register-existing-tables.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/client/tutorial.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/client/upgrade-legacy-app.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/concepts/architecture.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/concepts/data-sources.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/concepts/identity-and-scope.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/concepts/permissions-namespaces-labels.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/concepts/runs-and-execution-graphs.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/concepts/time-index-tables-and-updates.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/contributing/architecture-and-boundaries.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/contributing/database-backends.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/contributing/releasing.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/contributing/testing.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/README.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/query.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/index.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/operations/configuration.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/operations/hosted-runtime.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/operations/local-runtime.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/operations/recovery-and-observability.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/operations/run-history.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/operations/run-logs.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/reference/capabilities.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/reference/cli.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/reference/python.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/security/index.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/security/ownership-and-sharing.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/docs/security/permissions.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/mkdocs.yml +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/scripts/build_reference.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/scripts/check_boundaries.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/scripts/check_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/scripts/check_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/scripts/check_docs.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/scripts/check_examples_debug.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/scripts/check_project.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/scripts/dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/scripts/test_databases.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/scripts/test_postgresql.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/setup.cfg +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/_admin_source.json +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/_build.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/_skill_bundle.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/analysis.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/analyst/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/auth/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/auth/boundary.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/auth/local_actor.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/configuration.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/connection_count.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/credential_admin.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/development.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/development_client.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/error_logging.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/mcp.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/platform_cache.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/access_map.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/caller.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/column_search.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/contract_validation.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/data_sources.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/namespaces.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/run_logs.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/security.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_cascade.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_crud.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_delete.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_filter.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_import.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_introspection.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_patch.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_registration.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_response.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_search.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_search_document.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_sql.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/time_index_reads.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/update_batch.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/update_constants.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/update_crud.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/update_details.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/update_graph.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/update_registration.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/update_runs.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/routes/update_statistics.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/runtime.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/runtime_control.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/runtime_database.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/source_passwords.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/app/transfer.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/access.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/catalog.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/catalog_types.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/connection_pool.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/hosted.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/hosted_access.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/pages.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/postgresql_access.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/registry.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/relation_tables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/sqlite_access.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/streaming.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/backends/timescale.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/contracts/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/contracts/relation_import.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/contracts/values.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/domain/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/domain/index_statistics.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/domain/label_rules.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/domain/permission_rules.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/domain/update_constants.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/integrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/integrations/credential_store.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/integrations/run_logs.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/integrations/source_validation.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/0011_table_search.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/0012_table_creator.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/operations/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/operations/create_table.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/operations/import_relations.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/operations/introspect_table.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/operations/read_time_index.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/operations/register_catalog.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/cascade.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/catalog.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/database.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/grants.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/impact.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/labels.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/locking.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/models.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/projections.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/table_queries.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/table_response.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/update_graph.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/updates.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/search/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/search/documents.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/search/embeddings.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/search/index.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/search/ranking.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/search/text.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/backend/search/worker.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/metatables/configuration.yaml +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/api/request_timing.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/cli/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/cli/admin_install.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/cli/app.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/cli/filters.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/cli/local.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/cli/migrations.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/cli/project.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/cli/skills.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/compiled_sql/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/compiled_sql/mssql.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/compiled_sql/v1.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/dtype_codec.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/README.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/query.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/future_registry.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/hashing.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/instrumentation.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/local_connection.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/local_files.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/log_contract.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/alembic.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/connection.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/provider.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/scaffold.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/sqlite.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/templates/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/templates/env.py.mako +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/templates/script.py.mako +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/migrations/tls.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/models.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/pydantic_metadata.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/run_logging.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/runtime.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/runtime_contract.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/schema_names.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/sdk_compat.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/sqlalchemy_contracts.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/storage_layout_contract.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/time_index_table_refs.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/transfer.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/transfer_contract.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/transport.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/update_configuration_contract.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/updaters/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/updaters/configuration.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/updaters/dependencies.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/updaters/managers.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/updaters/namespacing.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/updaters/runner.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/updaters/updaters.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/updaters/utils.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/src/metatables/upload.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/analyst/test_agent_surface.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/analyst/test_api_search.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/analyst/test_mcp.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/analyst/test_tools.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_bootstrap_failure_cause.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_caller_endpoint.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_development_client.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_hosted_agent.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_hosted_environment_target.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_local_mode.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_platform_fact_cache.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_request_identity.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_runtime_database.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_runtime_scaffold.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_runtime_selection.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_runtime_storage_binding.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/auth/test_source_passwords.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/catalog/test_catalog_foundation.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/catalog/test_contract_projection.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/catalog/test_database_config.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/catalog/test_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/catalog/test_migration.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/conftest.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/contracts/capabilities.json +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/contracts/client_signatures.json +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/contracts/database_operations.json +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/contracts/test_bounded_transfer.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/contracts/test_compiler_runtime_source.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/contracts/test_relation_batching.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/contracts/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/contracts/test_runtime_contract_compat.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/contracts/test_storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/contracts/test_table_contracts.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/Dockerfile +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/Dockerfile.dockerignore +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/conftest.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/provider/__init__.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/provider/env.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/test_api_contract.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/test_application_migration.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/test_bootstrap_recovery.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/test_catalog_contract.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/test_credential_catalog.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/test_physical_contract.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/test_sql_security.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_backend/test_update_client.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_operations/test_physical_operations.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_operations/test_postgresql_operations.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/database_operations/test_runtime_and_temporal.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/documentation/test_project_checks.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_admin_installation.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_catalog_outage.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_client_api_contract.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_client_migration_scaffold.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_client_migration_tls.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_client_signatures.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_client_value_behaviors.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_data_source_registry.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_local_actor_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_local_cli_workflow.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_local_client_selection.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_namespaces_admin_http.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_public_imports.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_remaining_client_routes.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_run_logs.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_sdk_local_startup.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_sqlite_runtime.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_table_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_table_filter_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_table_introspection_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_table_patch_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_table_search_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_table_search_document_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_table_search_scale.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_table_stats_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_table_updates_http.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_time_index_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_time_index_reads_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_timescale_policies_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_update_batch_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/e2e/test_update_registration_client_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/examples/test_documented_examples.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/examples/test_postgresql_examples.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/examples/test_setup_launch.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/examples/test_tutorial.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_connection_reuse.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_credential_store.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_local_data_sources.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_postgresql_sql.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_request_timing.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_serving_policy.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_source_validation.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/integrations/test_sqlite_operations.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/labels/test_labels.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/operations/test_create_table_operation.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/operations/test_create_table_postgres.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/operations/test_physical_operation_journal.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/operations/test_register_catalog.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/operations/test_search_documents.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/operations/test_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/packaging/test_client_skills.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/packaging/test_dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/packaging/test_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/packaging/test_editable_build.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/packaging/test_installed_distribution.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/permissions/test_access_map.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/permissions/test_governed_sql_scope.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/permissions/test_incremental_security.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/permissions/test_local_actor_membership.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/permissions/test_migration_boundary.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/permissions/test_namespace_grants.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/permissions/test_security_api.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/permissions/test_table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/permissions/test_table_grants.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/permissions/test_table_queries.py +0 -0
- {mainsequence_metatable-0.1.30.dev57 → mainsequence_metatable-0.1.31.dev58}/tests/permissions/test_workload_principals.py +0 -0
|
@@ -190,12 +190,43 @@ API Writer checks govern connection admission and provider catalog operations.
|
|
|
190
190
|
The client reserves catalog entries, runs Alembic, closes its physical connection,
|
|
191
191
|
and finalizes contracts through the API. Treat connection material as private.
|
|
192
192
|
|
|
193
|
-
Python
|
|
194
|
-
|
|
195
|
-
|
|
193
|
+
Applications and consuming libraries use the same public Python entry point in
|
|
194
|
+
an explicit setup function or deployment migration Job:
|
|
195
|
+
|
|
196
|
+
```python
|
|
197
|
+
from metatables import upgrade_application
|
|
198
|
+
|
|
199
|
+
result = upgrade_application("ledger.migrations:migration")
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
`src/metatables/examples/scripts/setup_metatables.py` shows the pattern. Keep
|
|
203
|
+
migration execution out of a library's import-time side effects. Remove the retired
|
|
196
204
|
`application_migration_providers` setting and use Python references instead of aliases.
|
|
197
205
|
Application migration histories remain separate from API system migrations.
|
|
198
206
|
|
|
207
|
+
## Repeated runs and migration performance
|
|
208
|
+
|
|
209
|
+
Use the shared `upgrade_application` path for every provider. Table-inventory and
|
|
210
|
+
physical-inspection batching are automatic in the client/API implementation; no
|
|
211
|
+
separate batching import, private backend helper or opt-in flag is needed.
|
|
212
|
+
An unchanged Alembic revision still reconciles physical contracts and refreshes
|
|
213
|
+
table descriptions, labels and column metadata. Do not skip finalization based
|
|
214
|
+
only on `migrated=False` or equal revision heads: missing/unreadable tables must
|
|
215
|
+
still fail, and only explicit removals may delete a catalog binding.
|
|
216
|
+
|
|
217
|
+
For a slow migration, read the "Migration timings" section in
|
|
218
|
+
`docs/client/deploy-application-migrations.md`. Enable INFO logging for
|
|
219
|
+
`metatables.migrations.runner` to see preparation, database setup, table checks,
|
|
220
|
+
Alembic, finalization and total duration. The API logs inspection and total time
|
|
221
|
+
per finalization batch. Measure these separately from platform job scheduling
|
|
222
|
+
and workflow coordination before attributing the delay to schema validation.
|
|
223
|
+
|
|
224
|
+
Check the installed client and deployed API versions. Client optimizations need
|
|
225
|
+
a package update and application image rebuild; API batching needs a shared API
|
|
226
|
+
deployment. After installing a release containing the changes, refresh copied
|
|
227
|
+
skills with `metatables copy-metatables-skills --path /path/to/application`.
|
|
228
|
+
This command copies guidance; Python imports alone do not refresh it.
|
|
229
|
+
|
|
199
230
|
## Lifecycle invariants
|
|
200
231
|
|
|
201
232
|
- Provider tables and the Alembic registry are `platform_managed` +
|
|
@@ -95,6 +95,35 @@ requires inspection and application-owned recovery. No server executor journal i
|
|
|
95
95
|
claimed for client DDL. Downgrade to base clears the recorded revision and reconciles
|
|
96
96
|
dropped tables. Revision files already applied remain immutable.
|
|
97
97
|
|
|
98
|
+
### Batched inspection (2026-10-09 amendment)
|
|
99
|
+
|
|
100
|
+
This is an implementation refinement of the lifecycle above, not a change to
|
|
101
|
+
execution ownership, authorization or the migration API.
|
|
102
|
+
|
|
103
|
+
- The client reads one table inventory per schema before Alembic and a fresh one
|
|
104
|
+
afterwards. Missing inventory entries still use `has_table` so views and temporary
|
|
105
|
+
tables retain their previous behavior. The first pass also rejects unversioned
|
|
106
|
+
application storage; it is not repeated for that check.
|
|
107
|
+
- The API authorizes every requested binding before physical inspection. It resolves
|
|
108
|
+
the admitted DataSource once per finalization request and shares a read connection
|
|
109
|
+
across its tables. PostgreSQL/TimescaleDB use four metadata queries per schema
|
|
110
|
+
(plus a diagnostic query for missing tables). SQLite/MySQL/SQL Server use SQLAlchemy
|
|
111
|
+
bulk reflection with dialect fallbacks and preserve their existing projections.
|
|
112
|
+
- Reflection caches last only for that inspection. No snapshot is reused across DDL
|
|
113
|
+
or requests. An unchanged Alembic revision still finalizes physical contracts and
|
|
114
|
+
refreshes semantic metadata; it is not evidence that the database has no drift.
|
|
115
|
+
- Missing, inaccessible and foreign-owned tables keep their existing failure
|
|
116
|
+
semantics. A bulk database error falls back to independent table inspections after
|
|
117
|
+
closing the failed transaction, so an unrelated table can still finalize. Only
|
|
118
|
+
explicitly removed, physically absent application tables lose their binding.
|
|
119
|
+
- Client phase timings and API inspection/total timings report where time is spent.
|
|
120
|
+
They do not include platform job scheduling or workflow coordination.
|
|
121
|
+
|
|
122
|
+
The client still sends bounded finalization requests (ten tables per batch); the
|
|
123
|
+
HTTP request/response contract is unchanged. Client inventory improvements require
|
|
124
|
+
a package update and application rebuild. API batching benefits existing clients
|
|
125
|
+
after the shared API is deployed, with larger gains for clients sending batches.
|
|
126
|
+
|
|
98
127
|
## MetaTables system migrations
|
|
99
128
|
|
|
100
129
|
Hosted system upgrades also run as a deployment prerequisite Job
|
|
@@ -132,3 +161,9 @@ connection dialect/TLS options, catalog authorization and runtime hold release.
|
|
|
132
161
|
SQLite integration tests use disposable files. Hosted driver configuration is
|
|
133
162
|
checked without starting databases. Container/database-matrix tests are on demand;
|
|
134
163
|
backend/runtime tests are not added to required CI checks.
|
|
164
|
+
|
|
165
|
+
The batching amendment adds non-container checks for query/connection counts,
|
|
166
|
+
fresh reflection after DDL, unchanged-revision reconciliation, authorization before
|
|
167
|
+
inspection, independent failures and dialect fallbacks. PostgreSQL query grouping is
|
|
168
|
+
checked with a recording driver; SQLite executes real local DDL. Hosted performance
|
|
169
|
+
and live MySQL/SQL Server/PostgreSQL verification remain pending.
|
|
@@ -89,7 +89,21 @@ metatables --local migrations upgrade --provider ledger.migrations:migration
|
|
|
89
89
|
The local API must already be running; `--local` selects its connection, so inspect
|
|
90
90
|
runtime status to verify the database actually selected in Settings.
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
Applications and libraries use the same public import in their migration Job or
|
|
93
|
+
explicit setup function:
|
|
94
|
+
|
|
95
|
+
```python
|
|
96
|
+
from metatables import upgrade_application
|
|
97
|
+
|
|
98
|
+
result = upgrade_application("ledger.migrations:migration")
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The shared runner automatically uses the installed client's table inventories and
|
|
102
|
+
the API's batched finalization. No separate batching import or option is needed.
|
|
103
|
+
Keep this call in the explicit migration lifecycle, rather than executing it when
|
|
104
|
+
a library is imported. See [migration timings](deploy-application-migrations.md#migration-timings)
|
|
105
|
+
for diagnostics and the client/API updates needed to receive these optimizations.
|
|
106
|
+
|
|
93
107
|
For current and downgrade, use `metatables.migrations.runner.run_migration` with
|
|
94
108
|
`operation="current"` or `operation="downgrade", revision="0001"`.
|
|
95
109
|
|
|
@@ -26,6 +26,28 @@ upgrade` or `downgrade` against a hosted API from a developer machine or agent
|
|
|
26
26
|
session. Do not migrate at application startup either: several pods would race,
|
|
27
27
|
and a failure would not stop the rollout.
|
|
28
28
|
|
|
29
|
+
## Migration timings
|
|
30
|
+
|
|
31
|
+
At INFO level, `metatables.migrations.runner` logs preparation, database setup,
|
|
32
|
+
table-presence checks before and after Alembic, Alembic execution, catalog
|
|
33
|
+
finalization and total duration. The API logs physical inspection and total time
|
|
34
|
+
for each finalization batch. Use these to distinguish database work from platform
|
|
35
|
+
scheduling and workflow coordination.
|
|
36
|
+
|
|
37
|
+
An already-current database still reconciles the provider's catalog contracts.
|
|
38
|
+
Checks use fresh table inventories and batched physical reflection; an unchanged
|
|
39
|
+
revision does not skip missing-table checks, permissions or metadata refresh.
|
|
40
|
+
PostgreSQL batches metadata queries by schema; other dialects use SQLAlchemy's
|
|
41
|
+
bulk reflection and its supported fallbacks. Caches do not survive the request.
|
|
42
|
+
Client improvements require updating the application's installed MetaTables package
|
|
43
|
+
and rebuilding its image; API improvements require deploying the shared API.
|
|
44
|
+
Applications and libraries continue to use `from metatables import upgrade_application`;
|
|
45
|
+
batching is automatic in this shared path, with no new import or opt-in flag.
|
|
46
|
+
After updating the installed package, refresh its agent guidance with
|
|
47
|
+
`metatables copy-metatables-skills --path /path/to/application`. This copies the
|
|
48
|
+
matching migration skill and its guide snapshots; importing Python code does not
|
|
49
|
+
update a project's copied skills.
|
|
50
|
+
|
|
29
51
|
## Declare the migration Job
|
|
30
52
|
|
|
31
53
|
Add one Job script that applies every provider the application owns, in
|
|
@@ -117,6 +139,10 @@ its branch to discover the API; declare it on the Job:
|
|
|
117
139
|
level: view
|
|
118
140
|
```
|
|
119
141
|
|
|
142
|
+
`upgrade_application()` waits up to five minutes for the API to wake or finish
|
|
143
|
+
replacing its pods before it fails with `ApiResolutionError`; other client calls
|
|
144
|
+
wait 30 seconds.
|
|
145
|
+
|
|
120
146
|
Team membership takes effect on the workload's next request, in the catalog and in
|
|
121
147
|
the database. When a workload User changes, add the new one to the Team; nothing
|
|
122
148
|
in MetaTables changes. A table registered in a namespace the caller already
|
|
@@ -74,7 +74,7 @@ application migrations, persistence and credentials.
|
|
|
74
74
|
|
|
75
75
|
## Copy client skills into an application
|
|
76
76
|
|
|
77
|
-
After installing MetaTables, explicitly copy its
|
|
77
|
+
After installing MetaTables, explicitly copy its client usage skills into a
|
|
78
78
|
consuming project:
|
|
79
79
|
|
|
80
80
|
```bash
|
|
@@ -88,12 +88,17 @@ metatables --json copy-metatables-skills --path /path/to/application
|
|
|
88
88
|
`metatables` does not copy skills.
|
|
89
89
|
|
|
90
90
|
The destination is `<application>/.agents/skills/metatables/`. It contains the
|
|
91
|
-
local development, table, application migration, time-index updater and legacy
|
|
91
|
+
local development, table, application migration, table discovery, time-index updater and legacy
|
|
92
92
|
application upgrade skills, with matching
|
|
93
93
|
guide/example snapshots in each skill's `references/` folder. The installed client
|
|
94
94
|
version is recorded in `PINNED_FROM.txt`. Skills for API implementation or
|
|
95
95
|
MetaTables project development are outside this bundle.
|
|
96
96
|
|
|
97
|
+
After upgrading the installed package, run the copy command again to refresh the
|
|
98
|
+
matching guidance. The migration skill includes the public `upgrade_application`
|
|
99
|
+
import, repeated-run behavior and migration timing diagnostics. Python imports
|
|
100
|
+
use the installed library independently of these copied agent instructions.
|
|
101
|
+
|
|
97
102
|
Running the command again replaces the whole `metatables` namespace: folders the
|
|
98
103
|
installed client does not ship, including any added there, are removed. Keep the
|
|
99
104
|
application's own skills in another `.agents/skills/` namespace; the copy never
|
|
@@ -56,7 +56,7 @@ belong to their component documentation and project instructions.
|
|
|
56
56
|
| --- | --- |
|
|
57
57
|
| `.agents/skills/client/metatables-local-development/SKILL.md` | Local-first application development, runtime/DataSource checks, isolated verification and explicit return to the environment. |
|
|
58
58
|
| `.agents/skills/client/metatables-meta-tables/SKILL.md` | SQLAlchemy contracts, external registration, governed queries and client access operations. |
|
|
59
|
-
| `.agents/skills/client/metatables-migrations/SKILL.md` | Alembic providers, offline revisions,
|
|
59
|
+
| `.agents/skills/client/metatables-migrations/SKILL.md` | Application-owned Alembic providers, offline revisions, shared migration execution, timing diagnostics and recovery for managed application tables. |
|
|
60
60
|
| `.agents/skills/client/metatables-table-discovery/SKILL.md` | Table search, and the authoritative rules for table descriptions, labels and column metadata (ADR 0018). |
|
|
61
61
|
| `.agents/skills/client/metatables-time-index-table-updates/SKILL.md` | Producers, dependencies, incremental frames and existing-table readers. |
|
|
62
62
|
|
|
@@ -10,6 +10,13 @@ new image, and a failure blocks the rollout. Settings is read-only in Hosted mod
|
|
|
10
10
|
See [the deployment gate](hosted-runtime.md#deployment-gate) and
|
|
11
11
|
[ADR 0014](../adr/api/0014-main-sequence-release-jobs-and-production-migrations.md).
|
|
12
12
|
|
|
13
|
+
The deployment gate checks revisions and registration during preflight, then
|
|
14
|
+
validates the full system schema once inside the migration runner, including when
|
|
15
|
+
the database is already current. Registration and permission setup finish under
|
|
16
|
+
the same bootstrap lock. Schema reflection is batched across the required tables;
|
|
17
|
+
the job logs the number of tables validated and elapsed time. Startup and explicit
|
|
18
|
+
activation still perform their own fresh schema validation.
|
|
19
|
+
|
|
13
20
|
Local mode initializes its SQLite file explicitly in Settings:
|
|
14
21
|
|
|
15
22
|
1. Open **Settings**. Local mode prefills the single local SQLite runtime file,
|
|
@@ -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.31.dev58"
|
|
8
8
|
description = "Main Sequence MetaTables Python client and standalone API"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13"
|
|
@@ -249,6 +249,7 @@ src/metatables/api/app/routes/update_statistics.py
|
|
|
249
249
|
src/metatables/api/backend/__init__.py
|
|
250
250
|
src/metatables/api/backend/backends/__init__.py
|
|
251
251
|
src/metatables/api/backend/backends/access.py
|
|
252
|
+
src/metatables/api/backend/backends/batch_inspection.py
|
|
252
253
|
src/metatables/api/backend/backends/catalog.py
|
|
253
254
|
src/metatables/api/backend/backends/catalog_ddl.py
|
|
254
255
|
src/metatables/api/backend/backends/catalog_types.py
|
|
@@ -468,6 +469,7 @@ tests/catalog/test_contract_projection.py
|
|
|
468
469
|
tests/catalog/test_database_config.py
|
|
469
470
|
tests/catalog/test_index_statistics.py
|
|
470
471
|
tests/catalog/test_migration.py
|
|
472
|
+
tests/catalog/test_schema_validation.py
|
|
471
473
|
tests/contracts/capabilities.json
|
|
472
474
|
tests/contracts/client_signatures.json
|
|
473
475
|
tests/contracts/database_operations.json
|
|
@@ -545,6 +547,7 @@ tests/examples/test_documented_examples.py
|
|
|
545
547
|
tests/examples/test_postgresql_examples.py
|
|
546
548
|
tests/examples/test_setup_launch.py
|
|
547
549
|
tests/examples/test_tutorial.py
|
|
550
|
+
tests/integrations/test_batch_introspection.py
|
|
548
551
|
tests/integrations/test_connection_reuse.py
|
|
549
552
|
tests/integrations/test_credential_store.py
|
|
550
553
|
tests/integrations/test_data_source_rules.py
|
|
@@ -7,6 +7,7 @@ from contextlib import ExitStack, contextmanager
|
|
|
7
7
|
from dataclasses import replace
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
from threading import Lock
|
|
10
|
+
from time import perf_counter
|
|
10
11
|
from types import SimpleNamespace
|
|
11
12
|
from typing import Literal
|
|
12
13
|
from uuid import UUID, uuid4
|
|
@@ -233,7 +234,7 @@ class RuntimeBootstrap:
|
|
|
233
234
|
self.reader = None
|
|
234
235
|
self.resources.close()
|
|
235
236
|
|
|
236
|
-
def configure(self, body, owner):
|
|
237
|
+
def configure(self, body, owner, *, validate_schema=True):
|
|
237
238
|
# Validate public configuration before replacing the current candidate.
|
|
238
239
|
values = RuntimeSourceInput.model_validate(body).model_dump(mode="json")
|
|
239
240
|
kind = values["class_type"]
|
|
@@ -271,7 +272,7 @@ class RuntimeBootstrap:
|
|
|
271
272
|
self.candidate, self.owner = values, owner
|
|
272
273
|
self.active, self.uid = False, None
|
|
273
274
|
self.status, self.error, self.current = "unconfigured", None, []
|
|
274
|
-
self.inspect()
|
|
275
|
+
self.inspect(validate_schema=validate_schema)
|
|
275
276
|
|
|
276
277
|
def open_engine(self, *, create=False):
|
|
277
278
|
from metatables.api.backend.backends.registry import backend_for_engine
|
|
@@ -288,8 +289,13 @@ class RuntimeBootstrap:
|
|
|
288
289
|
self.factory = sessionmaker(self.engine, expire_on_commit=False)
|
|
289
290
|
return self.engine
|
|
290
291
|
|
|
291
|
-
def inspect(self):
|
|
292
|
+
def inspect(self, *, validate_schema=True):
|
|
293
|
+
# Migration preflight defers the full schema check to upgrade_catalog.
|
|
294
|
+
# Its result can also be reused for registration verification while the
|
|
295
|
+
# same bootstrap lock is held. Startup and activation always check it;
|
|
296
|
+
# startup's activation reuses the check startup just ran (MetaTables #55).
|
|
292
297
|
self.error = None
|
|
298
|
+
started = perf_counter()
|
|
293
299
|
try:
|
|
294
300
|
script = ScriptDirectory.from_config(migration_config())
|
|
295
301
|
self.expected = list(script.get_heads())
|
|
@@ -321,8 +327,11 @@ class RuntimeBootstrap:
|
|
|
321
327
|
if not self.current:
|
|
322
328
|
self.require_prerequisites(connection)
|
|
323
329
|
return
|
|
324
|
-
|
|
325
|
-
|
|
330
|
+
if validate_schema:
|
|
331
|
+
from metatables.api.backend.operations.catalog_schema import (
|
|
332
|
+
validate_system_schema,
|
|
333
|
+
)
|
|
334
|
+
validate_system_schema(connection, self.backend.catalog)
|
|
326
335
|
with self.factory() as session:
|
|
327
336
|
row = session.scalar(select(DataSource).where(DataSource.is_runtime.__eq__(True)))
|
|
328
337
|
if row is None:
|
|
@@ -362,6 +371,9 @@ class RuntimeBootstrap:
|
|
|
362
371
|
self.status = "unavailable"
|
|
363
372
|
self.error = (f"Cannot verify the selected database or its Alembic history ({cause}). Check configuration, "
|
|
364
373
|
"Secret access and the API's migration version. The log has the full error.")
|
|
374
|
+
finally:
|
|
375
|
+
logger.info("Runtime database inspection took %.3fs (status %s, schema validated: %s)",
|
|
376
|
+
perf_counter() - started, self.status, validate_schema)
|
|
365
377
|
|
|
366
378
|
def require_prerequisites(self, connection):
|
|
367
379
|
# Before any setup DDL: a database the login cannot secure must never be
|
|
@@ -389,11 +401,11 @@ class RuntimeBootstrap:
|
|
|
389
401
|
try:
|
|
390
402
|
# Check before creating a file or scope marker: an earlier local
|
|
391
403
|
# store must remain untouched even when this target is absent.
|
|
392
|
-
self.inspect()
|
|
404
|
+
self.inspect(validate_schema=False)
|
|
393
405
|
if self.status not in {"migration_required", "registration_required", "ready"}:
|
|
394
406
|
raise BootstrapError(self.error or "The selected database cannot be migrated.")
|
|
395
407
|
with self.migration_lock():
|
|
396
|
-
self.inspect()
|
|
408
|
+
self.inspect(validate_schema=False)
|
|
397
409
|
if self.status not in {"migration_required", "registration_required", "ready"}:
|
|
398
410
|
raise BootstrapError(self.error or "The selected database cannot be migrated.")
|
|
399
411
|
self.status = "migrating"
|
|
@@ -421,11 +433,17 @@ class RuntimeBootstrap:
|
|
|
421
433
|
if hasattr(credentials, "initialize"):
|
|
422
434
|
credentials.initialize()
|
|
423
435
|
session.commit()
|
|
436
|
+
# upgrade_catalog already verified the complete system schema.
|
|
437
|
+
# Recheck registration before releasing the lock, without
|
|
438
|
+
# repeating every table/column/index/constraint lookup.
|
|
439
|
+
self.inspect(validate_schema=False)
|
|
440
|
+
if self.status != "ready":
|
|
441
|
+
raise BootstrapError(self.error or "Migration finished but the runtime is not ready.")
|
|
442
|
+
except (BootstrapError, CatalogConfigurationError) as exc:
|
|
424
443
|
self.inspect()
|
|
425
|
-
if
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
self.inspect()
|
|
444
|
+
if isinstance(exc, CatalogConfigurationError):
|
|
445
|
+
self.status, self.error = "incompatible", str(exc)
|
|
446
|
+
raise BootstrapError(self.error) from exc
|
|
429
447
|
raise
|
|
430
448
|
except Exception as exc:
|
|
431
449
|
self.inspect()
|
|
@@ -502,8 +520,11 @@ class RuntimeBootstrap:
|
|
|
502
520
|
self.error = message
|
|
503
521
|
raise BootstrapError(message) from None
|
|
504
522
|
|
|
505
|
-
def activate(self, request, user_uid=None, *, persist=True):
|
|
506
|
-
|
|
523
|
+
def activate(self, request, user_uid=None, *, persist=True, inspected=False):
|
|
524
|
+
# ``inspected``: the caller fully inspected this candidate just before,
|
|
525
|
+
# as startup does right after configure(). Every other activation checks.
|
|
526
|
+
if not inspected:
|
|
527
|
+
self.inspect()
|
|
507
528
|
if self.status != "ready":
|
|
508
529
|
raise BootstrapError(self.error or "Run MetaTables migrations before selecting this DataSource.")
|
|
509
530
|
with self.factory() as session:
|
|
@@ -551,7 +572,7 @@ def deploy_runtime_database(user_uid):
|
|
|
551
572
|
candidate = target.initial_candidate()
|
|
552
573
|
if candidate is None:
|
|
553
574
|
raise BootstrapError(target.error)
|
|
554
|
-
target.configure(candidate, user_uid)
|
|
575
|
+
target.configure(candidate, user_uid, validate_schema=False)
|
|
555
576
|
previous = sorted(target.current)
|
|
556
577
|
target.migrate(user_uid)
|
|
557
578
|
revisions = sorted(target.current)
|
|
@@ -152,7 +152,8 @@ def create_app(config: RuntimeConfig | None = None) -> FastAPI:
|
|
|
152
152
|
bootstrap = _app.state.runtime.bootstrap
|
|
153
153
|
if bootstrap and bootstrap.status == "ready":
|
|
154
154
|
from types import SimpleNamespace
|
|
155
|
-
|
|
155
|
+
# initialize_runtime() just validated this candidate (MetaTables #55).
|
|
156
|
+
bootstrap.activate(SimpleNamespace(app=_app), persist=False, inspected=True)
|
|
156
157
|
control = getattr(_app.state, "runtime_control", None)
|
|
157
158
|
if control is not None:
|
|
158
159
|
control.started()
|
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
6
|
from collections.abc import Callable
|
|
7
|
+
from time import perf_counter
|
|
7
8
|
from typing import Any
|
|
8
9
|
from uuid import UUID
|
|
9
10
|
|
|
@@ -19,7 +20,7 @@ from metatables.api.app.routes.table_introspection import data_source_provider
|
|
|
19
20
|
from metatables.api.backend.backends.operations import (
|
|
20
21
|
PhysicalConnectionUnavailable,
|
|
21
22
|
PhysicalIntrospectionError,
|
|
22
|
-
|
|
23
|
+
introspect_physical_tables,
|
|
23
24
|
)
|
|
24
25
|
from metatables.api.backend.backends.timescale import (
|
|
25
26
|
TimescaleError,
|
|
@@ -73,7 +74,7 @@ def physical_hypertable_converter() -> Callable[..., None]:
|
|
|
73
74
|
|
|
74
75
|
|
|
75
76
|
def physical_finalization_introspector() -> Callable[..., dict]:
|
|
76
|
-
return
|
|
77
|
+
return introspect_physical_tables
|
|
77
78
|
|
|
78
79
|
|
|
79
80
|
def _missing_error(root: bool, other_schemas: list[str]) -> dict:
|
|
@@ -127,6 +128,7 @@ def finalize_managed(
|
|
|
127
128
|
make_hypertable: Callable[..., None] = Depends(physical_hypertable_converter),
|
|
128
129
|
) -> dict:
|
|
129
130
|
"""Reconcile each requested row and return a per-table result envelope."""
|
|
131
|
+
started = perf_counter()
|
|
130
132
|
requested = list(dict.fromkeys(payload.meta_table_uids))
|
|
131
133
|
removed = set(payload.removed_meta_table_uids)
|
|
132
134
|
lock_catalog(session)
|
|
@@ -143,6 +145,7 @@ def finalize_managed(
|
|
|
143
145
|
if version_root is not None and (root_table is None or root_table.management_mode != 'platform_managed' or root_table.schema_management_mode != 'alembic_managed' or (root_table.alembic_version_meta_table_uid is not None) or any((value is not None and getattr(root_table, field) != value for field, value in guards.items())) or (not GrantRepository(session).may_access_table(table_uid=version_root, actor=actor, edit=True))):
|
|
144
146
|
raise HTTPException(status_code=404, detail="Alembic version MetaTable was not found.")
|
|
145
147
|
rows = []
|
|
148
|
+
eligible = []
|
|
146
149
|
source_uid = None
|
|
147
150
|
for uid in requested:
|
|
148
151
|
table = session.get(MetaTable, uid, with_for_update=True)
|
|
@@ -169,12 +172,33 @@ def finalize_managed(
|
|
|
169
172
|
rows.append(_row(table, uid, previous=previous, specialization=specialization,
|
|
170
173
|
error={"code": "provider_mismatch", "detail": "MetaTable belongs to another Alembic provider."}))
|
|
171
174
|
continue
|
|
175
|
+
eligible.append((uid, table, previous, specialization))
|
|
176
|
+
# Admit the entire batch before opening physical storage. No denied or
|
|
177
|
+
# mismatched binding is passed to the physical inspector.
|
|
178
|
+
snapshots = {}
|
|
179
|
+
if eligible:
|
|
180
|
+
inspection_started = perf_counter()
|
|
172
181
|
try:
|
|
173
|
-
source = sources.get(
|
|
174
|
-
|
|
175
|
-
source=source,
|
|
176
|
-
|
|
182
|
+
source = sources.get(source_uid)
|
|
183
|
+
snapshots = physical_introspect(
|
|
184
|
+
source=source,
|
|
185
|
+
physical_tables=[(table.physical_schema, table.physical_table_name)
|
|
186
|
+
for _, table, _, _ in eligible],
|
|
177
187
|
)
|
|
188
|
+
except DataSourceAdmissionError as exc:
|
|
189
|
+
session.rollback()
|
|
190
|
+
raise HTTPException(status_code=exc.status_code, detail=exc.code) from exc
|
|
191
|
+
except (DataSourceIntegrationError, PhysicalConnectionUnavailable) as exc:
|
|
192
|
+
session.rollback()
|
|
193
|
+
raise HTTPException(status_code=503, detail="DataSource is unavailable.") from exc
|
|
194
|
+
finally:
|
|
195
|
+
logger.info("Managed finalization: physical inspection of %s tables took %.3fs",
|
|
196
|
+
len(eligible), perf_counter() - inspection_started)
|
|
197
|
+
for uid, table, previous, specialization in eligible:
|
|
198
|
+
try:
|
|
199
|
+
snapshot = snapshots[(table.physical_schema, table.physical_table_name)]
|
|
200
|
+
if isinstance(snapshot, PhysicalIntrospectionError):
|
|
201
|
+
raise snapshot
|
|
178
202
|
except PhysicalIntrospectionError as exc:
|
|
179
203
|
logger.warning("Physical table introspection failed during finalization", exc_info=True)
|
|
180
204
|
if exc.code == "physical_table_not_found":
|
|
@@ -195,12 +219,6 @@ def finalize_managed(
|
|
|
195
219
|
rows.append(_row(table, uid, previous=previous, specialization=specialization, exists=True,
|
|
196
220
|
error={"code": exc.code, "detail": detail}))
|
|
197
221
|
continue
|
|
198
|
-
except DataSourceAdmissionError as exc:
|
|
199
|
-
session.rollback()
|
|
200
|
-
raise HTTPException(status_code=exc.status_code, detail=exc.code) from exc
|
|
201
|
-
except (DataSourceIntegrationError, PhysicalConnectionUnavailable) as exc:
|
|
202
|
-
session.rollback()
|
|
203
|
-
raise HTTPException(status_code=503, detail="DataSource is unavailable.") from exc
|
|
204
222
|
if snapshot.get("owner_reachable") is False:
|
|
205
223
|
# Grant reconciliation must re-own platform-managed tables (ADR 0007).
|
|
206
224
|
rows.append(_row(table, uid, previous=previous, specialization=specialization, exists=True,
|
|
@@ -276,6 +294,8 @@ def finalize_managed(
|
|
|
276
294
|
except (IntegrityError, SQLAlchemyError) as exc:
|
|
277
295
|
session.rollback()
|
|
278
296
|
raise HTTPException(status_code=503, detail="MetaTables catalog is unavailable.") from exc
|
|
297
|
+
by_uid = {row["meta_table_uid"]: row for row in rows}
|
|
298
|
+
rows = [by_uid[str(uid)] for uid in requested]
|
|
279
299
|
finalized_count = sum(row["finalized"] for row in rows)
|
|
280
300
|
active_count = sum(row["provisioning_status"] == "active" for row in rows)
|
|
281
301
|
reserved_count = sum(row["provisioning_status"] == "reserved" for row in rows)
|
|
@@ -291,4 +311,6 @@ def finalize_managed(
|
|
|
291
311
|
"tables": rows,
|
|
292
312
|
}
|
|
293
313
|
response.status_code = 200 if result["ok"] else 409
|
|
314
|
+
logger.info("Managed finalization: %s tables, %s failures, total %.3fs",
|
|
315
|
+
len(requested), failed_count, perf_counter() - started)
|
|
294
316
|
return result
|