mainsequence-metatable 0.1.31.dev60__tar.gz → 0.1.32.dev61__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.31.dev60 → mainsequence_metatable-0.1.32.dev61}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0013-application-owned-migrations.md +33 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/api/openapi.json +96 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/client/deploy-application-migrations.md +6 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/pyproject.toml +1 -1
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/mainsequence_metatable.egg-info/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/mainsequence_metatable.egg-info/SOURCES.txt +1 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/managed_finalize.py +40 -3
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/access.py +7 -2
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/operations/finalize_managed.py +8 -1
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/__init__.py +49 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/models.py +4 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_application_owned_migrations.py +4 -5
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_managed_finalize_unchanged.py +65 -0
- mainsequence_metatable-0.1.32.dev61/tests/e2e/test_migration_metadata_and_downgrade.py +162 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/uv.lock +1 -1
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/analyze-with-sql/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/client/metatables-meta-tables/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/client/metatables-table-discovery/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/discover-tables/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/ms_tau_sdk/PINNED_FROM.txt +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/ms_tau_sdk/tau_a2a_runtime_adapter/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/ms_tau_sdk/tau_local_development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/ms_tau_sdk/tau_project_customization/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/ms_tau_sdk/tau_repository_integration/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.agents/skills/ms_tau_sdk/tau_security_and_access/SKILL.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/.mainsequence/workflows/metatables-api.yaml +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/LICENSE +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/MANIFEST.in +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/alembic.ini +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/compose.database-tests.yml +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/agent/0019-metatables-analyst-agent.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/agent/0020-analyst-reads-as-its-requester.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/agent/0021-api-serves-the-analyst-tools-over-mcp.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0004-approved-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0006-historical-run-graphs.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0007-database-enforced-table-access.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0009-shared-credential-store.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0016-impact-preflight.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0017-hosted-request-identity.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0018-search-document-pipeline.svg +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0018-table-search.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/api/0022-concurrent-requests-and-connection-reuse.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/adr/index.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/api/authentication-and-errors.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/api/data-sources.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/api/overview.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/api/reference.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/api/tables-and-migrations.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/api/time-index-and-updates.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/assets/branding/metatables.svg +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/assets/diagrams/local-client-experience.svg +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/assets/diagrams/namespace-access.svg +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/client/bounded-transfers.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/client/build-an-updater.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/client/define-and-migrate-tables.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/client/installation-and-connection.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/client/local-storage.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/client/query-and-mutate.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/client/quickstart.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/client/read-existing-time-index-tables.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/client/register-existing-tables.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/client/tutorial.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/client/upgrade-legacy-app.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/concepts/architecture.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/concepts/data-sources.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/concepts/identity-and-scope.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/concepts/permissions-namespaces-labels.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/concepts/runs-and-execution-graphs.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/concepts/time-index-tables-and-updates.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/contributing/architecture-and-boundaries.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/contributing/database-backends.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/contributing/documentation.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/contributing/releasing.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/contributing/testing.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/query.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/index.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/operations/catalog-migrations.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/operations/configuration.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/operations/hosted-runtime.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/operations/local-runtime.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/operations/recovery-and-observability.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/operations/run-history.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/operations/run-logs.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/reference/capabilities.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/reference/cli.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/reference/python.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/security/index.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/security/ownership-and-sharing.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/security/permissions.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/mkdocs.yml +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/scripts/build_reference.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/scripts/check_boundaries.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/scripts/check_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/scripts/check_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/scripts/check_docs.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/scripts/check_examples_debug.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/scripts/check_project.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/scripts/dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/scripts/test_databases.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/scripts/test_postgresql.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/setup.cfg +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/_admin_source.json +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/_build.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/_skill_bundle.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/analysis.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/analyst/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/auth/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/auth/boundary.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/auth/local_actor.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/bootstrap.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/configuration.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/connection_count.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/credential_admin.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/development.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/development_client.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/error_logging.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/main.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/mcp.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/platform_cache.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/access_map.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/caller.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/column_search.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/contract_validation.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/data_sources.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/namespaces.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/run_logs.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/security.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_cascade.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_crud.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_delete.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_filter.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_import.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_introspection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_patch.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_registration.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_response.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_search.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_search_document.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_sql.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/time_index_reads.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/update_batch.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/update_constants.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/update_crud.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/update_details.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/update_graph.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/update_registration.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/update_runs.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/routes/update_statistics.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/runtime.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/runtime_control.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/runtime_database.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/source_passwords.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/app/transfer.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/batch_inspection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/catalog.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/catalog_types.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/connection_pool.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/contracts.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/hosted.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/hosted_access.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/native.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/pages.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/postgresql_access.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/registry.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/relation_tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/relational.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/sqlite_access.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/streaming.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/backends/timescale.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/contracts/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/contracts/relation_import.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/contracts/values.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/domain/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/domain/index_statistics.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/domain/label_rules.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/domain/permission_rules.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/domain/update_constants.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/integrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/integrations/credential_store.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/integrations/run_logs.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/integrations/source_validation.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/0011_table_search.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/0012_table_creator.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/operations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/operations/bootstrap_timing.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/operations/create_table.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/operations/import_relations.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/operations/introspect_table.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/operations/read_time_index.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/operations/register_catalog.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/cascade.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/catalog.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/database.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/grants.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/impact.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/labels.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/locking.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/models.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/projections.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/table_queries.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/table_response.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/update_graph.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/updates.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/search/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/search/documents.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/search/embeddings.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/search/index.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/search/ranking.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/search/text.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/backend/search/worker.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/metatables/configuration.yaml +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/api/request_timing.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/cli/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/cli/admin_install.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/cli/app.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/cli/filters.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/cli/local.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/cli/migrations.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/cli/project.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/cli/skills.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/compiled_sql/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/compiled_sql/mssql.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/compiled_sql/v1.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/dtype_codec.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/endpoint.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/query.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/future_registry.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/hashing.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/instrumentation.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/local_connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/local_files.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/log_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/alembic.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/provider.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/runner.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/scaffold.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/sqlite.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/templates/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/templates/env.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/templates/script.py.mako +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/migrations/tls.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/pydantic_metadata.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/run_logging.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/runtime.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/runtime_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/schema_names.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/sdk_compat.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/sqlalchemy_contracts.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/storage_layout_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/time_index_table_refs.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/transfer.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/transfer_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/transport.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/update_configuration_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/updaters/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/updaters/configuration.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/updaters/dependencies.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/updaters/managers.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/updaters/namespacing.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/updaters/runner.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/updaters/updaters.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/updaters/utils.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/upload.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/analyst/test_agent_surface.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/analyst/test_api_search.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/analyst/test_mcp.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/analyst/test_tools.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_bootstrap_failure_cause.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_caller_endpoint.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_data_source_identity.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_development_client.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_hosted_agent.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_hosted_environment_target.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_local_mode.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_platform_fact_cache.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_request_identity.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_runtime_database.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_runtime_scaffold.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_runtime_selection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_runtime_storage_binding.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/auth/test_source_passwords.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/catalog/test_catalog_foundation.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/catalog/test_contract_projection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/catalog/test_database_config.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/catalog/test_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/catalog/test_migration.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/catalog/test_schema_validation.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/conftest.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/contracts/capabilities.json +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/contracts/client_signatures.json +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/contracts/database_operations.json +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/contracts/test_bounded_transfer.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/contracts/test_compiler_runtime_source.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/contracts/test_relation_batching.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/contracts/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/contracts/test_runtime_contract_compat.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/contracts/test_storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/contracts/test_table_contracts.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/Dockerfile +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/Dockerfile.dockerignore +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/conftest.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/provider/__init__.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/provider/env.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/test_api_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/test_application_migration.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/test_bootstrap_recovery.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/test_catalog_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/test_credential_catalog.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/test_physical_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/test_sql_security.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_backend/test_update_client.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_operations/test_physical_operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_operations/test_postgresql_operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/database_operations/test_runtime_and_temporal.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/documentation/test_project_checks.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_admin_installation.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_api_endpoint.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_catalog_outage.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_client_api_contract.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_client_migration_scaffold.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_client_migration_tls.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_client_package.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_client_signatures.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_client_value_behaviors.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_data_source_registry.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_local_actor_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_local_cli_workflow.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_local_client_selection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_managed_finalize_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_namespaces_admin_http.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_public_imports.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_remaining_client_routes.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_run_logs.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_runtime_upgrade.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_sdk_local_startup.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_sqlite_runtime.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_table_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_table_filter_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_table_introspection_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_table_patch_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_table_search_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_table_search_document_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_table_search_scale.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_table_stats_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_table_updates_http.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_time_index_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_time_index_reads_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_timescale_policies_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_update_batch_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/e2e/test_update_registration_client_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/examples/test_documented_examples.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/examples/test_postgresql_examples.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/examples/test_setup_launch.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/examples/test_tutorial.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_batch_introspection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_connection_reuse.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_credential_store.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_local_data_sources.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_postgresql_sql.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_request_timing.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_serving_policy.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_source_validation.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/integrations/test_sqlite_operations.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/labels/test_labels.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/operations/test_create_table_operation.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/operations/test_create_table_postgres.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/operations/test_physical_operation_journal.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/operations/test_register_catalog.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/operations/test_search_documents.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/operations/test_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/packaging/test_client_skills.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/packaging/test_dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/packaging/test_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/packaging/test_editable_build.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/packaging/test_installed_distribution.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/permissions/test_access_map.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/permissions/test_deployment_security.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/permissions/test_governed_sql_scope.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/permissions/test_incremental_security.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/permissions/test_local_actor_membership.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/permissions/test_migration_boundary.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/permissions/test_namespace_grants.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/permissions/test_security_api.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/permissions/test_table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/permissions/test_table_grants.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/permissions/test_table_queries.py +0 -0
- {mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/tests/permissions/test_workload_principals.py +0 -0
|
@@ -169,6 +169,39 @@ flowchart TD
|
|
|
169
169
|
replaying already-applied DDL. The response contract and client calls stay the
|
|
170
170
|
same; no consuming-application opt-in is required.
|
|
171
171
|
|
|
172
|
+
### Authored metadata and SQLite policy reflection (2026-10-10 amendment)
|
|
173
|
+
|
|
174
|
+
The public migration runner sends current authored table descriptions, labels and
|
|
175
|
+
column descriptions, labels and logical names in each finalization batch, including
|
|
176
|
+
when Alembic is already at the requested revision. Reusing an existing binding at
|
|
177
|
+
reservation time must not suppress metadata refresh ([#57](https://github.com/mainsequence-projects/MetaTables/issues/57)).
|
|
178
|
+
The runner compares authored values with the fresh reservation lookup and sends
|
|
179
|
+
only changed, non-empty metadata; it never caches equality across deployments.
|
|
180
|
+
|
|
181
|
+
The optional `authored_metadata` map is keyed only by UIDs in that request. The API
|
|
182
|
+
applies it after Writer/provider/source admission and fresh physical inspection,
|
|
183
|
+
inside the table's savepoint. The physical snapshot remains authoritative for
|
|
184
|
+
types, nullability, indexes, keys and binding identity. As with registration,
|
|
185
|
+
empty/absent metadata preserves existing descriptions and labels. Equal metadata
|
|
186
|
+
does not dirty rows or replace label links; the next unchanged upgrade still
|
|
187
|
+
performs no catalog DML. Failed reconciliation rolls back metadata and can retry.
|
|
188
|
+
Older clients may omit the map; clients that send it require an API supporting it.
|
|
189
|
+
|
|
190
|
+
Security dependency reflection uses the backend's physical schema normalization.
|
|
191
|
+
SQLite maps logical provider schemas and physical `main` cascade targets to the
|
|
192
|
+
same physical namespace, rather than querying `PRAGMA public.foreign_key_list`.
|
|
193
|
+
This keeps per-batch checks scoped when a downgrade has dropped tables belonging
|
|
194
|
+
to later batches ([#58](https://github.com/mainsequence-projects/MetaTables/issues/58)).
|
|
195
|
+
The conservative full policy sweep on a genuine reflection failure remains, and
|
|
196
|
+
unexpected missing tables still fail without losing their catalog bindings. Only
|
|
197
|
+
explicitly removed, freshly confirmed absent tables may lose bindings.
|
|
198
|
+
|
|
199
|
+
Regression coverage runs the public client against a real disposable SQLite API:
|
|
200
|
+
metadata changes at an unchanged revision, zero-write reruns, a provider larger
|
|
201
|
+
than a finalization batch with later-batch drops, and a subsequent normal upgrade.
|
|
202
|
+
Route coverage additionally checks physical-shape rejection, Writer admission,
|
|
203
|
+
unrequested metadata UIDs, and failed metadata finalization/retry.
|
|
204
|
+
|
|
172
205
|
## MetaTables system migrations
|
|
173
206
|
|
|
174
207
|
Hosted system upgrades also run as a deployment prerequisite Job
|
{mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/docs/api/openapi.json
RENAMED
|
@@ -18,6 +18,85 @@
|
|
|
18
18
|
"title": "Assignments",
|
|
19
19
|
"type": "object"
|
|
20
20
|
},
|
|
21
|
+
"AuthoredColumnMetadata": {
|
|
22
|
+
"additionalProperties": false,
|
|
23
|
+
"properties": {
|
|
24
|
+
"description": {
|
|
25
|
+
"anyOf": [
|
|
26
|
+
{
|
|
27
|
+
"type": "string"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"type": "null"
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"title": "Description"
|
|
34
|
+
},
|
|
35
|
+
"label": {
|
|
36
|
+
"anyOf": [
|
|
37
|
+
{
|
|
38
|
+
"type": "string"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"type": "null"
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"title": "Label"
|
|
45
|
+
},
|
|
46
|
+
"logical_name": {
|
|
47
|
+
"anyOf": [
|
|
48
|
+
{
|
|
49
|
+
"type": "string"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"type": "null"
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
"title": "Logical Name"
|
|
56
|
+
},
|
|
57
|
+
"name": {
|
|
58
|
+
"title": "Name",
|
|
59
|
+
"type": "string"
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"required": [
|
|
63
|
+
"name"
|
|
64
|
+
],
|
|
65
|
+
"title": "AuthoredColumnMetadata",
|
|
66
|
+
"type": "object"
|
|
67
|
+
},
|
|
68
|
+
"AuthoredTableMetadata": {
|
|
69
|
+
"additionalProperties": false,
|
|
70
|
+
"properties": {
|
|
71
|
+
"columns": {
|
|
72
|
+
"items": {
|
|
73
|
+
"$ref": "#/components/schemas/AuthoredColumnMetadata"
|
|
74
|
+
},
|
|
75
|
+
"title": "Columns",
|
|
76
|
+
"type": "array"
|
|
77
|
+
},
|
|
78
|
+
"description": {
|
|
79
|
+
"anyOf": [
|
|
80
|
+
{
|
|
81
|
+
"type": "string"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"type": "null"
|
|
85
|
+
}
|
|
86
|
+
],
|
|
87
|
+
"title": "Description"
|
|
88
|
+
},
|
|
89
|
+
"labels": {
|
|
90
|
+
"items": {
|
|
91
|
+
"type": "string"
|
|
92
|
+
},
|
|
93
|
+
"title": "Labels",
|
|
94
|
+
"type": "array"
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"title": "AuthoredTableMetadata",
|
|
98
|
+
"type": "object"
|
|
99
|
+
},
|
|
21
100
|
"BatchDetailsPatch": {
|
|
22
101
|
"properties": {
|
|
23
102
|
"update_map": {
|
|
@@ -622,6 +701,23 @@
|
|
|
622
701
|
],
|
|
623
702
|
"title": "Alembic Version Meta Table Uid"
|
|
624
703
|
},
|
|
704
|
+
"authored_metadata": {
|
|
705
|
+
"anyOf": [
|
|
706
|
+
{
|
|
707
|
+
"additionalProperties": {
|
|
708
|
+
"$ref": "#/components/schemas/AuthoredTableMetadata"
|
|
709
|
+
},
|
|
710
|
+
"propertyNames": {
|
|
711
|
+
"format": "uuid"
|
|
712
|
+
},
|
|
713
|
+
"type": "object"
|
|
714
|
+
},
|
|
715
|
+
{
|
|
716
|
+
"type": "null"
|
|
717
|
+
}
|
|
718
|
+
],
|
|
719
|
+
"title": "Authored Metadata"
|
|
720
|
+
},
|
|
625
721
|
"code_repository_context": {
|
|
626
722
|
"anyOf": [
|
|
627
723
|
{
|
|
@@ -37,6 +37,12 @@ scheduling and workflow coordination.
|
|
|
37
37
|
An already-current database still reconciles the provider's catalog contracts.
|
|
38
38
|
Checks use fresh table inventories and batched physical reflection; an unchanged
|
|
39
39
|
revision does not skip missing-table checks, permissions or metadata refresh.
|
|
40
|
+
Each finalization batch carries current authored descriptions, labels and column
|
|
41
|
+
descriptions/labels/logical names. Non-empty values refresh existing bindings
|
|
42
|
+
without a new revision; empty or absent values preserve catalog metadata, as in
|
|
43
|
+
registration. Physical shape always comes from fresh database inspection. The
|
|
44
|
+
next equal-valued upgrade skips catalog writes. This metadata payload requires
|
|
45
|
+
the corresponding API update as well as the updated client.
|
|
40
46
|
PostgreSQL batches metadata queries by schema; other dialects use SQLAlchemy's
|
|
41
47
|
bulk reflection and its supported fallbacks. Caches do not survive the request.
|
|
42
48
|
Client improvements require updating the application's installed MetaTables package
|
|
@@ -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.32.dev61"
|
|
8
8
|
description = "Main Sequence MetaTables Python client and standalone API"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13"
|
|
@@ -519,6 +519,7 @@ tests/e2e/test_local_cli_workflow.py
|
|
|
519
519
|
tests/e2e/test_local_client_selection.py
|
|
520
520
|
tests/e2e/test_managed_finalize_client_api.py
|
|
521
521
|
tests/e2e/test_managed_finalize_unchanged.py
|
|
522
|
+
tests/e2e/test_migration_metadata_and_downgrade.py
|
|
522
523
|
tests/e2e/test_namespaces_admin_http.py
|
|
523
524
|
tests/e2e/test_public_imports.py
|
|
524
525
|
tests/e2e/test_remaining_client_routes.py
|
|
@@ -9,7 +9,7 @@ from typing import Any
|
|
|
9
9
|
from uuid import UUID
|
|
10
10
|
|
|
11
11
|
from fastapi import APIRouter, Depends, HTTPException, Response
|
|
12
|
-
from pydantic import BaseModel, ConfigDict, Field
|
|
12
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
13
13
|
from sqlalchemy import delete
|
|
14
14
|
from sqlalchemy.exc import IntegrityError, SQLAlchemyError
|
|
15
15
|
from sqlalchemy.orm import Session
|
|
@@ -31,12 +31,14 @@ from metatables.api.backend.backends.timescale import (
|
|
|
31
31
|
from metatables.api.backend.contracts.table_contracts import ContractValidationError
|
|
32
32
|
from metatables.api.backend.domain.catalog_rules import CatalogInvariantError
|
|
33
33
|
from metatables.api.backend.domain.data_source_rules import DataSourceAdmissionError
|
|
34
|
+
from metatables.api.backend.domain.label_rules import LabelInvariantError, normalize_label_name
|
|
34
35
|
from metatables.api.backend.domain.permission_rules import TrustedActorFacts
|
|
35
36
|
from metatables.api.backend.integrations.data_source_provider import DataSourceProvider
|
|
36
37
|
from metatables.api.backend.integrations.runtime_data_sources import DataSourceIntegrationError
|
|
37
38
|
from metatables.api.backend.operations.finalize_managed import contract_from_physical_snapshot
|
|
38
39
|
from metatables.api.backend.operations.register_catalog import time_index_spec_from_contract
|
|
39
40
|
from metatables.api.backend.persistence.grants import GrantRepository
|
|
41
|
+
from metatables.api.backend.persistence.labels import LabelRepository
|
|
40
42
|
from metatables.api.backend.persistence.locking import lock_catalog
|
|
41
43
|
from metatables.api.backend.persistence.models import (
|
|
42
44
|
MetaTable,
|
|
@@ -58,6 +60,28 @@ logger = logging.getLogger(__name__)
|
|
|
58
60
|
router = APIRouter(prefix="/meta-tables", tags=["MetaTables"])
|
|
59
61
|
|
|
60
62
|
|
|
63
|
+
class AuthoredColumnMetadata(BaseModel):
|
|
64
|
+
model_config = ConfigDict(extra="forbid")
|
|
65
|
+
|
|
66
|
+
name: str
|
|
67
|
+
description: str | None = None
|
|
68
|
+
label: str | None = None
|
|
69
|
+
logical_name: str | None = None
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class AuthoredTableMetadata(BaseModel):
|
|
73
|
+
model_config = ConfigDict(extra="forbid")
|
|
74
|
+
|
|
75
|
+
description: str | None = None
|
|
76
|
+
labels: list[str] = Field(default_factory=list)
|
|
77
|
+
columns: list[AuthoredColumnMetadata] = Field(default_factory=list)
|
|
78
|
+
|
|
79
|
+
@field_validator("labels")
|
|
80
|
+
@classmethod
|
|
81
|
+
def valid_labels(cls, labels):
|
|
82
|
+
return [normalize_label_name(label) for label in labels if label.strip()]
|
|
83
|
+
|
|
84
|
+
|
|
61
85
|
class FinalizeManagedRequest(BaseModel):
|
|
62
86
|
model_config = ConfigDict(extra="forbid")
|
|
63
87
|
|
|
@@ -71,6 +95,7 @@ class FinalizeManagedRequest(BaseModel):
|
|
|
71
95
|
# these may lose their binding when absent; absence alone is never removal.
|
|
72
96
|
removed_meta_table_uids: list[UUID] = Field(default_factory=list, max_length=200)
|
|
73
97
|
code_repository_context: dict[str, Any] | None = None
|
|
98
|
+
authored_metadata: dict[UUID, AuthoredTableMetadata] | None = None
|
|
74
99
|
|
|
75
100
|
|
|
76
101
|
def physical_hypertable_converter() -> Callable[..., None]:
|
|
@@ -134,6 +159,8 @@ def finalize_managed(
|
|
|
134
159
|
"""Reconcile each requested row and return a per-table result envelope."""
|
|
135
160
|
started = perf_counter()
|
|
136
161
|
requested = list(dict.fromkeys(payload.meta_table_uids))
|
|
162
|
+
if set(payload.authored_metadata or {}) - set(requested):
|
|
163
|
+
raise HTTPException(status_code=422, detail="Authored metadata must name requested MetaTables.")
|
|
137
164
|
removed = set(payload.removed_meta_table_uids)
|
|
138
165
|
lock_catalog(session)
|
|
139
166
|
guards = {
|
|
@@ -232,8 +259,10 @@ def finalize_managed(
|
|
|
232
259
|
continue
|
|
233
260
|
try:
|
|
234
261
|
with session.begin_nested():
|
|
262
|
+
authored = (payload.authored_metadata or {}).get(uid)
|
|
235
263
|
contract = contract_from_physical_snapshot(
|
|
236
|
-
session=session, table=table, snapshot=snapshot
|
|
264
|
+
session=session, table=table, snapshot=snapshot,
|
|
265
|
+
authored_metadata=authored.model_dump() if authored else None,
|
|
237
266
|
)
|
|
238
267
|
targets = resolved_foreign_key_targets(
|
|
239
268
|
session, data_source_uid=table.data_source_uid, contract=contract,
|
|
@@ -251,6 +280,14 @@ def finalize_managed(
|
|
|
251
280
|
"provisioning_status": "active",
|
|
252
281
|
"protect_from_deletion": True,
|
|
253
282
|
}
|
|
283
|
+
if authored is not None:
|
|
284
|
+
if authored.description and authored.description.strip():
|
|
285
|
+
updates["description"] = authored.description
|
|
286
|
+
if authored.labels:
|
|
287
|
+
LabelRepository(session).mutate_target(
|
|
288
|
+
kind="meta_table", target_uid=uid, mode="replace",
|
|
289
|
+
names=authored.labels, created_by_user_uid=actor.user_uid,
|
|
290
|
+
)
|
|
254
291
|
if not same_contract_state(table.table_contract, contract):
|
|
255
292
|
updates["table_contract"] = contract
|
|
256
293
|
if not same_contract_state(table.introspection_snapshot, snapshot):
|
|
@@ -288,7 +325,7 @@ def finalize_managed(
|
|
|
288
325
|
check_table_security_on_commit(session, table)
|
|
289
326
|
rows.append(_row(table, uid, previous=previous, specialization=specialization,
|
|
290
327
|
exists=True, finalized=previous != "active"))
|
|
291
|
-
except (CatalogInvariantError, ContractValidationError, IntegrityError) as exc:
|
|
328
|
+
except (CatalogInvariantError, ContractValidationError, LabelInvariantError, IntegrityError) as exc:
|
|
292
329
|
logger.warning("Physical table contract could not be reconciled", exc_info=True)
|
|
293
330
|
rows.append(_row(
|
|
294
331
|
table, uid, previous=previous, specialization=specialization, exists=True,
|
|
@@ -217,7 +217,11 @@ class DatabaseAccess:
|
|
|
217
217
|
}
|
|
218
218
|
|
|
219
219
|
def key(schema, name):
|
|
220
|
-
|
|
220
|
+
# SQLite stores logical provider schemas such as public, but its
|
|
221
|
+
# physical relations and cascade targets all live in main.
|
|
222
|
+
return self.backend.catalog.schema(
|
|
223
|
+
self.backend.catalog.registration_schema(self.source, schema)
|
|
224
|
+
), name
|
|
221
225
|
|
|
222
226
|
by_name = {key(t.physical_schema, t.physical_table_name): uid for uid, t in tables.items()}
|
|
223
227
|
names = {key(t.physical_schema, t.physical_table_name) for uid, t in tables.items() if uid in changed}
|
|
@@ -235,7 +239,8 @@ class DatabaseAccess:
|
|
|
235
239
|
continue
|
|
236
240
|
try:
|
|
237
241
|
references = inspector.get_foreign_keys(
|
|
238
|
-
table.physical_table_name,
|
|
242
|
+
table.physical_table_name,
|
|
243
|
+
schema=self.backend.catalog.schema(table.physical_schema),
|
|
239
244
|
)
|
|
240
245
|
except Exception:
|
|
241
246
|
return None
|
|
@@ -15,7 +15,8 @@ from metatables.api.backend.persistence.models import MetaTable
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
def contract_from_physical_snapshot(
|
|
18
|
-
*, session: Session, table: MetaTable, snapshot: Mapping[str, Any]
|
|
18
|
+
*, session: Session, table: MetaTable, snapshot: Mapping[str, Any],
|
|
19
|
+
authored_metadata: Mapping[str, Any] | None = None,
|
|
19
20
|
) -> dict[str, Any]:
|
|
20
21
|
"""Use physical column, index, and FK facts; preserve declared semantic metadata."""
|
|
21
22
|
schema = str(snapshot.get("schema_name") or table.physical_schema or "").strip()
|
|
@@ -38,12 +39,18 @@ def contract_from_physical_snapshot(
|
|
|
38
39
|
item.get("name"): item for item in existing.get("columns") or ()
|
|
39
40
|
if isinstance(item, Mapping)
|
|
40
41
|
}
|
|
42
|
+
authored_columns = {column["name"]: column for column in
|
|
43
|
+
(authored_metadata or {}).get("columns") or ()}
|
|
41
44
|
columns = []
|
|
42
45
|
for index, item in enumerate(snapshot.get("columns") or ()):
|
|
43
46
|
if not isinstance(item, Mapping) or not item.get("name"):
|
|
44
47
|
continue
|
|
45
48
|
column_name = str(item["name"])
|
|
46
49
|
prior = prior_columns.get(column_name) or {}
|
|
50
|
+
# Match registration semantics: absent/empty metadata preserves the
|
|
51
|
+
# catalog's descriptions. Authored shape never overrides fresh DDL.
|
|
52
|
+
prior = {**prior, **{key: value for key, value in authored_columns.get(column_name, {}).items()
|
|
53
|
+
if key in {"description", "label", "logical_name"} and value}}
|
|
47
54
|
columns.append({
|
|
48
55
|
"name": column_name,
|
|
49
56
|
"logical_name": prior.get("logical_name"),
|
|
@@ -622,6 +622,26 @@ class AlembicMetaTableMigration:
|
|
|
622
622
|
dict.fromkeys([str(registry_uid), *prepared.meta_table_uids])
|
|
623
623
|
)
|
|
624
624
|
removed = set(prepared.removed_meta_table_uids)
|
|
625
|
+
# Existing bindings bypass reservation. Carry their current descriptive
|
|
626
|
+
# metadata to finalization without trusting models for physical shape.
|
|
627
|
+
authored_metadata = {}
|
|
628
|
+
for model in self.metatable_models:
|
|
629
|
+
uid = model.get_meta_table_uid()
|
|
630
|
+
if uid in (None, "") or str(uid) in removed:
|
|
631
|
+
continue
|
|
632
|
+
request = model.build_registration_request(data_source_uid=prepared.data_source_uid)
|
|
633
|
+
contract = _collection_create_table_contract_payload(request.table_contract)
|
|
634
|
+
metadata = {
|
|
635
|
+
"description": request.description,
|
|
636
|
+
"labels": list(request.labels or []),
|
|
637
|
+
"columns": [
|
|
638
|
+
{key: column.get(key) for key in ("name", "description", "label", "logical_name")}
|
|
639
|
+
for column in contract.get("columns") or []
|
|
640
|
+
],
|
|
641
|
+
}
|
|
642
|
+
changes = _changed_authored_metadata(_bound_meta_table_for_model(model), metadata)
|
|
643
|
+
if changes:
|
|
644
|
+
authored_metadata[str(uid)] = changes
|
|
625
645
|
response = _finalize_in_batches(
|
|
626
646
|
finalize_meta_table_uids,
|
|
627
647
|
lambda batch: MetaTable.finalize_managed(
|
|
@@ -633,6 +653,8 @@ class AlembicMetaTableMigration:
|
|
|
633
653
|
alembic_version_meta_table_uid=str(registry_uid),
|
|
634
654
|
alembic_revision=alembic_revision,
|
|
635
655
|
removed_meta_table_uids=[uid for uid in batch if uid in removed] or None,
|
|
656
|
+
authored_metadata={uid: authored_metadata[uid] for uid in batch
|
|
657
|
+
if uid in authored_metadata} or None,
|
|
636
658
|
),
|
|
637
659
|
timeout=timeout,
|
|
638
660
|
on_status=on_metatable_finalize_status,
|
|
@@ -1062,6 +1084,33 @@ def resolve_alembic_revision_metadata(
|
|
|
1062
1084
|
return str(resolved.revision), _normalize_down_revision(resolved.down_revision)
|
|
1063
1085
|
|
|
1064
1086
|
|
|
1087
|
+
def _changed_authored_metadata(table: MetaTable | None, metadata: dict[str, Any]) -> dict[str, Any]:
|
|
1088
|
+
"""Compare with the fresh reservation lookup, never a cached prior deployment.
|
|
1089
|
+
|
|
1090
|
+
Omit equal or empty values so unchanged upgrades need no extra metadata/label
|
|
1091
|
+
reconciliation. Finalization still inspects physical shape and projections.
|
|
1092
|
+
"""
|
|
1093
|
+
if table is None:
|
|
1094
|
+
return metadata
|
|
1095
|
+
changes = {}
|
|
1096
|
+
description = metadata.get("description")
|
|
1097
|
+
if description and description.strip() and description != table.description:
|
|
1098
|
+
changes["description"] = description
|
|
1099
|
+
labels = [" ".join(label.split()) for label in metadata.get("labels") or [] if label.strip()]
|
|
1100
|
+
if labels and set(labels) != set(table.labels):
|
|
1101
|
+
changes["labels"] = labels
|
|
1102
|
+
current = {column["name"]: column for column in table.table_contract.get("columns") or []}
|
|
1103
|
+
columns = []
|
|
1104
|
+
for column in metadata.get("columns") or []:
|
|
1105
|
+
fields = {key: value for key, value in column.items()
|
|
1106
|
+
if key != "name" and value and current.get(column["name"], {}).get(key) != value}
|
|
1107
|
+
if fields:
|
|
1108
|
+
columns.append({"name": column["name"], **fields})
|
|
1109
|
+
if columns:
|
|
1110
|
+
changes["columns"] = columns
|
|
1111
|
+
return changes
|
|
1112
|
+
|
|
1113
|
+
|
|
1065
1114
|
def _collection_create_row_from_registration_request(
|
|
1066
1115
|
request: Any,
|
|
1067
1116
|
*,
|
{mainsequence_metatable-0.1.31.dev60 → mainsequence_metatable-0.1.32.dev61}/src/metatables/models.py
RENAMED
|
@@ -934,6 +934,10 @@ class MetaTableMigrationConnection(BasePydanticModel):
|
|
|
934
934
|
|
|
935
935
|
|
|
936
936
|
class ManagedMetaTableFinalizeRequest(BasePydanticModel):
|
|
937
|
+
authored_metadata: dict[str, dict[str, Any]] | None = Field(
|
|
938
|
+
None,
|
|
939
|
+
description="Current authored descriptions, labels and column metadata, keyed by requested UID.",
|
|
940
|
+
)
|
|
937
941
|
meta_table_uids: list[str] = Field(
|
|
938
942
|
...,
|
|
939
943
|
min_length=1,
|
|
@@ -242,9 +242,8 @@ def test_batched_finalization_sends_every_batch_and_merges_the_results(monkeypat
|
|
|
242
242
|
def test_current_revision_still_refreshes_physical_shape_and_rejects_missing_tables(
|
|
243
243
|
api_runtime, providers, caplog
|
|
244
244
|
):
|
|
245
|
-
from mainsequence.client.exceptions import BadRequestError
|
|
246
|
-
|
|
247
245
|
from metatables import MetaTable
|
|
246
|
+
from metatables.migrations import AlembicProviderPhysicalStateError
|
|
248
247
|
from metatables.runtime_context import get_runtime_context
|
|
249
248
|
|
|
250
249
|
migration = providers[0]
|
|
@@ -265,9 +264,9 @@ def test_current_revision_still_refreshes_physical_shape_and_rejects_missing_tab
|
|
|
265
264
|
assert f"{phase} took" in caplog.text
|
|
266
265
|
with engine.begin() as connection:
|
|
267
266
|
connection.exec_driver_sql("DROP TABLE client_ledger_item")
|
|
268
|
-
#
|
|
269
|
-
#
|
|
270
|
-
with pytest.raises(
|
|
267
|
+
# Scoped policy reflection lets the route return the precise missing-table
|
|
268
|
+
# failure without deleting the unexpectedly missing binding.
|
|
269
|
+
with pytest.raises(AlembicProviderPhysicalStateError, match="physical_table_missing"):
|
|
271
270
|
run_migration(migration)
|
|
272
271
|
assert MetaTable.get(identifier="client_ledger.item").uid == item.uid
|
|
273
272
|
finally:
|
|
@@ -254,3 +254,68 @@ def test_unchanged_state_still_runs_fresh_checks(finalized, failure):
|
|
|
254
254
|
assert finalized.statements == []
|
|
255
255
|
if failure == "permission":
|
|
256
256
|
assert [name for _, name in finalized.inspections[-1]] == ["parents"]
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def test_authored_metadata_changes_only_semantics_and_converges(finalized):
|
|
260
|
+
uid = finalized.uids[1]
|
|
261
|
+
finalized.payload["authored_metadata"] = {str(uid): {
|
|
262
|
+
"description": "Changed authored table meaning",
|
|
263
|
+
"labels": ["authored"],
|
|
264
|
+
"columns": [{"name": "value", "description": "Changed authored column meaning",
|
|
265
|
+
"label": "Value", "logical_name": "semantic_value"}],
|
|
266
|
+
}}
|
|
267
|
+
response = finalized.finalize()
|
|
268
|
+
assert response.status_code == 200, response.text
|
|
269
|
+
with Session(finalized.engine) as session:
|
|
270
|
+
table = session.get(MetaTable, uid)
|
|
271
|
+
assert table.description == "Changed authored table meaning"
|
|
272
|
+
column = session.scalar(select(MetaTableColumn).where(
|
|
273
|
+
MetaTableColumn.meta_table_uid == uid, MetaTableColumn.name == "value"))
|
|
274
|
+
assert column.description == "Changed authored column meaning"
|
|
275
|
+
assert column.data_type == "integer" and column.nullable
|
|
276
|
+
before = projection_uids(finalized.engine)
|
|
277
|
+
assert finalized.finalize().status_code == 200
|
|
278
|
+
assert finalized.statements == []
|
|
279
|
+
assert projection_uids(finalized.engine) == before
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
@pytest.mark.parametrize("invalid", ["shape", "unrequested", "denied"])
|
|
283
|
+
def test_authored_metadata_cannot_bypass_shape_or_writer_admission(finalized, invalid):
|
|
284
|
+
uid = finalized.uids[1]
|
|
285
|
+
metadata = {"description": "Must not be applied"}
|
|
286
|
+
if invalid == "shape":
|
|
287
|
+
metadata["columns"] = [{"name": "value", "data_type": "text", "nullable": False}]
|
|
288
|
+
if invalid == "unrequested":
|
|
289
|
+
uid = uuid4()
|
|
290
|
+
if invalid == "denied":
|
|
291
|
+
with Session(finalized.engine) as session:
|
|
292
|
+
GrantRepository(session).revoke_table_grant(
|
|
293
|
+
table_uid=uid, principal_kind="user", principal_uid=finalized.user)
|
|
294
|
+
session.commit()
|
|
295
|
+
finalized.payload["authored_metadata"] = {str(uid): metadata}
|
|
296
|
+
response = finalized.finalize()
|
|
297
|
+
assert response.status_code == (409 if invalid == "denied" else 422)
|
|
298
|
+
assert finalized.statements == []
|
|
299
|
+
with Session(finalized.engine) as session:
|
|
300
|
+
assert session.get(MetaTable, finalized.uids[1]).description != "Must not be applied"
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
def test_failed_authored_metadata_finalization_rolls_back_and_retries(finalized, monkeypatch):
|
|
304
|
+
uid = finalized.uids[1]
|
|
305
|
+
finalized.payload["authored_metadata"] = {str(uid): {
|
|
306
|
+
"description": "Retry table description", "labels": ["retry"],
|
|
307
|
+
"columns": [{"name": "value", "description": "Retry column description"}],
|
|
308
|
+
}}
|
|
309
|
+
with Session(finalized.engine) as session:
|
|
310
|
+
before = session.get(MetaTable, uid).description
|
|
311
|
+
with monkeypatch.context() as failure:
|
|
312
|
+
failure.setattr(managed_finalize, "materialize_contract_projection",
|
|
313
|
+
lambda *a, **kw: (_ for _ in ()).throw(IntegrityError("insert", {}, Exception())))
|
|
314
|
+
assert finalized.finalize().status_code == 409
|
|
315
|
+
with Session(finalized.engine) as session:
|
|
316
|
+
assert session.get(MetaTable, uid).description == before
|
|
317
|
+
assert finalized.finalize().status_code == 200
|
|
318
|
+
with Session(finalized.engine) as session:
|
|
319
|
+
assert session.get(MetaTable, uid).description == "Retry table description"
|
|
320
|
+
assert finalized.finalize().status_code == 200
|
|
321
|
+
assert finalized.statements == []
|