mainsequence-metatable 0.1.16.dev28__tar.gz → 0.1.17__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.16.dev28 → mainsequence_metatable-0.1.17}/.agents/skills/client/metatables-meta-tables/SKILL.md +8 -0
- {mainsequence_metatable-0.1.16.dev28/src/mainsequence_metatable.egg-info → mainsequence_metatable-0.1.17}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0007-database-enforced-table-access.md +13 -3
- mainsequence_metatable-0.1.17/docs/adr/api/0016-impact-preflight.md +109 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/index.md +1 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/api/openapi.json +180 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/api/reference.md +2 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/reference/capabilities.md +2 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/reference/python.md +4 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/security/index.md +3 -1
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/mkdocs.yml +1 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/pyproject.toml +1 -1
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17/src/mainsequence_metatable.egg-info}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/mainsequence_metatable.egg-info/SOURCES.txt +4 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/__init__.py +4 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/table_cascade.py +33 -26
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/access.py +74 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/hosted_access.py +17 -17
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/postgresql_access.py +33 -8
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/sqlite_access.py +25 -8
- mainsequence_metatable-0.1.17/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +20 -0
- mainsequence_metatable-0.1.17/src/metatables/api/backend/persistence/impact.py +420 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/models.py +3 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/models.py +113 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_runtime_bootstrap.py +8 -8
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/catalog/test_migration.py +2 -2
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/contracts/capabilities.json +36 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/contracts/client_signatures.json +4 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/test_catalog_contract.py +1 -1
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/test_sql_security.py +41 -4
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_remaining_client_routes.py +55 -0
- mainsequence_metatable-0.1.17/tests/permissions/test_cascade_writes.py +49 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/uv.lock +1 -1
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/.mainsequence/workflows/metatables-api.yaml +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/LICENSE +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/MANIFEST.in +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/README.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/alembic.ini +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/compose.database-tests.yml +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0004-approved-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0006-historical-run-graphs.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0009-shared-credential-store.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0013-application-owned-migrations.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/api/authentication-and-errors.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/api/data-sources.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/api/overview.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/api/tables-and-migrations.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/api/time-index-and-updates.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/assets/branding/metatables.svg +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/assets/diagrams/local-client-experience.svg +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/client/bounded-transfers.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/client/build-an-updater.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/client/define-and-migrate-tables.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/client/deploy-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/client/installation-and-connection.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/client/local-storage.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/client/query-and-mutate.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/client/quickstart.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/client/read-existing-time-index-tables.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/client/register-existing-tables.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/client/tutorial.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/client/upgrade-legacy-app.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/concepts/architecture.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/concepts/data-sources.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/concepts/identity-and-scope.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/concepts/permissions-namespaces-labels.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/concepts/runs-and-execution-graphs.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/concepts/time-index-tables-and-updates.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/contributing/architecture-and-boundaries.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/contributing/database-backends.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/contributing/documentation.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/contributing/releasing.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/contributing/testing.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/README.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/query.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/index.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/operations/catalog-migrations.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/operations/configuration.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/operations/hosted-runtime.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/operations/local-runtime.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/operations/recovery-and-observability.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/operations/run-history.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/operations/run-logs.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/reference/cli.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/security/ownership-and-sharing.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/security/permissions.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/scripts/build_reference.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/scripts/check_boundaries.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/scripts/check_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/scripts/check_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/scripts/check_docs.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/scripts/check_examples_debug.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/scripts/check_project.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/scripts/dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/scripts/test_databases.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/scripts/test_postgresql.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/setup.cfg +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/_admin_source.json +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/_build.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/_skill_bundle.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/auth/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/auth/boundary.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/auth/caller_assertions.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/auth/local_actor.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/bootstrap.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/configuration.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/credential_admin.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/development.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/development_client.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/error_logging.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/main.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/platform_cache.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/column_search.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/contract_validation.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/data_sources.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/managed_finalize.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/namespaces.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/run_logs.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/security.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/table_crud.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/table_delete.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/table_filter.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/table_import.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/table_introspection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/table_patch.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/table_registration.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/table_response.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/table_search_document.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/table_sql.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/time_index_reads.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/update_batch.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/update_constants.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/update_crud.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/update_details.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/update_graph.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/update_registration.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/update_runs.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/routes/update_statistics.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/runtime.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/runtime_control.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/runtime_database.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/source_passwords.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/app/transfer.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/catalog.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/catalog_types.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/contracts.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/hosted.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/native.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/operations.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/pages.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/registry.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/relation_tables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/relational.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/streaming.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/backends/timescale.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/contracts/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/contracts/relation_import.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/contracts/values.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/domain/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/domain/index_statistics.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/domain/label_rules.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/domain/permission_rules.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/domain/update_constants.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/integrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/integrations/credential_store.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/integrations/run_logs.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/integrations/source_validation.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/operations/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/operations/create_table.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/operations/import_relations.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/operations/introspect_table.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/operations/read_time_index.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/operations/register_catalog.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/operations/search_documents.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/cascade.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/catalog.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/database.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/grants.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/labels.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/locking.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/projections.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/table_queries.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/table_response.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/update_graph.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/updates.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/metatables/configuration.yaml +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/cli/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/cli/admin_install.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/cli/app.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/cli/filters.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/cli/local.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/cli/migrations.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/cli/project.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/cli/skills.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/compiled_sql/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/compiled_sql/mssql.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/compiled_sql/v1.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/dtype_codec.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/endpoint.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/README.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/query.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/future_registry.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/hashing.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/instrumentation.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/local_connection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/local_files.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/log_contract.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/alembic.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/connection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/provider.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/runner.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/scaffold.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/sqlite.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/templates/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/templates/env.py.mako +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/templates/script.py.mako +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/migrations/tls.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/pydantic_metadata.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/run_logging.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/runtime.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/runtime_contract.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/schema_names.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/sdk_compat.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/sqlalchemy_contracts.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/storage_layout_contract.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/time_index_table_refs.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/transfer.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/transfer_contract.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/transport.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/update_configuration_contract.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/updaters/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/updaters/configuration.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/updaters/dependencies.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/updaters/managers.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/updaters/namespacing.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/updaters/runner.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/updaters/updaters.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/updaters/utils.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/upload.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_bootstrap_failure_cause.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_caller_assertions.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_data_source_identity.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_development_client.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_hosted_environment_target.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_local_mode.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_platform_fact_cache.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_runtime_database.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_runtime_scaffold.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_runtime_selection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_runtime_storage_binding.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/auth/test_source_passwords.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/catalog/test_catalog_foundation.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/catalog/test_contract_projection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/catalog/test_database_config.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/catalog/test_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/conftest.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/contracts/database_operations.json +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/contracts/test_bounded_transfer.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/contracts/test_compiler_runtime_source.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/contracts/test_relation_batching.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/contracts/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/contracts/test_storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/contracts/test_table_contracts.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/Dockerfile +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/Dockerfile.dockerignore +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/conftest.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/provider/__init__.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/provider/env.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/test_api_contract.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/test_application_migration.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/test_bootstrap_recovery.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/test_credential_catalog.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/test_physical_contract.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_backend/test_update_client.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_operations/test_physical_operations.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_operations/test_postgresql_operations.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/database_operations/test_runtime_and_temporal.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/documentation/test_project_checks.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_admin_installation.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_api_endpoint.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_application_owned_migrations.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_catalog_outage.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_client_api_contract.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_client_migration_scaffold.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_client_migration_tls.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_client_package.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_client_signatures.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_client_value_behaviors.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_data_source_registry.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_local_actor_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_local_cli_workflow.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_local_client_selection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_managed_finalize_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_namespaces_admin_http.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_public_imports.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_run_logs.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_runtime_transition.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_runtime_upgrade.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_sdk_local_startup.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_sqlite_runtime.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_table_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_table_filter_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_table_introspection_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_table_patch_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_table_search_document_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_table_stats_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_table_updates_http.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_time_index_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_time_index_reads_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_timescale_policies_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_update_batch_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/e2e/test_update_registration_client_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/examples/test_documented_examples.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/examples/test_postgresql_examples.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/examples/test_setup_launch.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/examples/test_tutorial.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/integrations/test_credential_store.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/integrations/test_data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/integrations/test_local_data_sources.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/integrations/test_local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/integrations/test_postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/integrations/test_postgresql_sql.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/integrations/test_postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/integrations/test_source_validation.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/integrations/test_sqlite_operations.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/labels/test_labels.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/operations/test_create_table_operation.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/operations/test_create_table_postgres.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/operations/test_physical_operation_journal.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/operations/test_register_catalog.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/operations/test_search_documents.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/operations/test_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/packaging/test_client_skills.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/packaging/test_dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/packaging/test_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/packaging/test_editable_build.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/packaging/test_installed_distribution.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/permissions/test_governed_sql_scope.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/permissions/test_local_actor_membership.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/permissions/test_migration_boundary.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/permissions/test_namespace_grants.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/permissions/test_security_api.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/permissions/test_table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/permissions/test_table_grants.py +0 -0
- {mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/tests/permissions/test_table_queries.py +0 -0
|
@@ -138,6 +138,14 @@ A null cutoff requires a scope. Do not replace that workflow with ad hoc SQL.
|
|
|
138
138
|
Deletion/cascade requires edit access, relevant protection checks, and explicit
|
|
139
139
|
cascade intent; it is not an administrator-role bypass or migration repair.
|
|
140
140
|
|
|
141
|
+
Before a destructive action, or to show impact in an application UI, call
|
|
142
|
+
`table.get_impact(action=...)` with `delete_rows`, `update_keys` or `drop_table`.
|
|
143
|
+
The API returns whether the caller may run it, every blocker, and a graph of
|
|
144
|
+
affected tables, foreign-key effects and reading updates; render that result
|
|
145
|
+
rather than re-deriving foreign-key or permission rules in the client. Cascading
|
|
146
|
+
foreign keys are allowed, but write on a table requires write on every table its
|
|
147
|
+
cascades modify; a cascade into an unregistered table makes the parent read-only.
|
|
148
|
+
|
|
141
149
|
On a TimescaleDB DataSource, time-index tables are hypertables. Their compression
|
|
142
150
|
and retention policies are set only through `TimeIndexMetaTable.set_timescale_policies`
|
|
143
151
|
(Writer) and read with `get_timescale_policies`. Do not add policies to table
|
|
@@ -14,6 +14,15 @@
|
|
|
14
14
|
> `metatables` schema and tables in the DataSource's default schema; it need not
|
|
15
15
|
> own the database.
|
|
16
16
|
|
|
17
|
+
> Amendment (2026-10-03): Cascading foreign keys are allowed. The database runs
|
|
18
|
+
> `CASCADE`, `SET NULL` and `SET DEFAULT` actions as the table owner, so a role
|
|
19
|
+
> keeps write on a table only while every login reaching it can also write each
|
|
20
|
+
> table those actions modify, following chains of cascades. A cascade into an
|
|
21
|
+
> unregistered table leaves the parent read-only. Registration and reconciliation
|
|
22
|
+
> record each table's cascade targets; nothing inspects submitted queries. This
|
|
23
|
+
> replaces the rule that foreign keys must use `restrict` or `no action`, which the
|
|
24
|
+
> implementation applied on every engine, not only where the explorer is enabled.
|
|
25
|
+
|
|
17
26
|
|
|
18
27
|
Date: 2026-09-29
|
|
19
28
|
|
|
@@ -193,8 +202,8 @@ client.
|
|
|
193
202
|
- Any role can see the names, columns and row counts of every table in PostgreSQL's
|
|
194
203
|
system catalogs, but not their data. MetaTables accepts this where the explorer
|
|
195
204
|
is enabled. Role names are opaque, because table permissions are visible too.
|
|
196
|
-
-
|
|
197
|
-
|
|
205
|
+
- Databases run foreign-key cascades as the table owner. Write on a table
|
|
206
|
+
requires write on every table its cascades modify (amendment 2026-10-03).
|
|
198
207
|
- Heavy queries still consume resources. Per-role connection limits, time limits
|
|
199
208
|
and, optionally, a read replica bound them.
|
|
200
209
|
|
|
@@ -274,7 +283,8 @@ and [MySQL implicit commits](https://dev.mysql.com/doc/refman/8.4/en/implicit-co
|
|
|
274
283
|
- The DataSource login needs `CREATEROLE` and the right to create the `metatables`
|
|
275
284
|
schema; it does not need to own the database.
|
|
276
285
|
- Physical table names become visible to explorer users.
|
|
277
|
-
- Cascading foreign keys
|
|
286
|
+
- Cascading foreign keys narrow write access to callers who can write the whole
|
|
287
|
+
cascade; a cascade into an unregistered table makes its parent read-only.
|
|
278
288
|
- Team membership reaches the database at the pace of the existing one-hour
|
|
279
289
|
platform-fact cache.
|
|
280
290
|
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# ADR 0016: Impact pre-flight for cascades and deletes
|
|
2
|
+
|
|
3
|
+
Date: 2026-10-03
|
|
4
|
+
|
|
5
|
+
Status: Accepted.
|
|
6
|
+
|
|
7
|
+
Implementation status: implemented. Tests cover the planner through the Python
|
|
8
|
+
client against an isolated catalog and the SQLite engine. PostgreSQL,
|
|
9
|
+
TimescaleDB, MySQL and SQL Server cascade-target queries have not yet been run
|
|
10
|
+
against their containers.
|
|
11
|
+
|
|
12
|
+
Owner: MetaTables API. The Python client exposes the result; consuming projects
|
|
13
|
+
own their UIs.
|
|
14
|
+
|
|
15
|
+
Related decisions: [ADR 0001](0001-unified-api-storage-and-local-sqlite.md) (the SDK
|
|
16
|
+
makes no access decisions of its own), [ADR 0002](0002-application-administration-and-table-ownership.md)
|
|
17
|
+
(cascades need access to every affected table) and [ADR 0007](0007-database-enforced-table-access.md)
|
|
18
|
+
(amended 2026-10-03: write requires write on every cascade target).
|
|
19
|
+
|
|
20
|
+
## Context
|
|
21
|
+
|
|
22
|
+
Cascading foreign keys are now allowed. A caller keeps write on a table only while
|
|
23
|
+
they can write every table its `CASCADE`, `SET NULL` and `SET DEFAULT` actions
|
|
24
|
+
modify. A project that builds its own UI needs to show, before acting, which
|
|
25
|
+
tables a delete or key update reaches, what happens to each, and why a write is
|
|
26
|
+
or is not available. Before this decision, a caller could only try the action
|
|
27
|
+
and read the error.
|
|
28
|
+
|
|
29
|
+
## Decision
|
|
30
|
+
|
|
31
|
+
The API answers one question: *what would this action do, and may I do it?* The
|
|
32
|
+
API computes the answer from the catalog and the recorded cascade targets. The
|
|
33
|
+
client returns it unchanged.
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
GET /meta-tables/{uid}/impact/?action=delete_rows|update_keys|drop_table
|
|
37
|
+
GET /time-index-meta-tables/{uid}/impact/?action=...
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
`drop_table` also accepts the `delete-with-cascade` options. The client method is
|
|
41
|
+
`MetaTable.get_impact(action=...) -> MetaTableImpact`, inherited by
|
|
42
|
+
`TimeIndexMetaTable`.
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
impact = table.get_impact(action="delete_rows")
|
|
46
|
+
if not impact.allowed:
|
|
47
|
+
for blocker in impact.blockers:
|
|
48
|
+
print(blocker.code, blocker.node, blocker.message)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
The response is a graph rooted at the table:
|
|
52
|
+
|
|
53
|
+
- **Nodes**:
|
|
54
|
+
- `meta_table` nodes carry the uid, identifier, namespace and physical name.
|
|
55
|
+
- `relation` nodes are unregistered physical tables, identified by physical
|
|
56
|
+
name only.
|
|
57
|
+
- `update` nodes are updates that read an affected table.
|
|
58
|
+
- `hidden` nodes are tables the caller cannot view. They are opaque: an effect
|
|
59
|
+
with no names.
|
|
60
|
+
|
|
61
|
+
Each node lists its `effects` (`drop`, `delete`, `update`, `input_changed`) and
|
|
62
|
+
the caller's `can_write`. For row actions, `can_write` is the database
|
|
63
|
+
privilege after cascade narrowing, computed by the same function the
|
|
64
|
+
reconciler uses. For `drop_table`, it is the edit grant the drop requires.
|
|
65
|
+
- **Edges**: each edge points from the dependent to what it depends on, as in
|
|
66
|
+
the schema graph. Edges are classified by effect: `cascade_delete`,
|
|
67
|
+
`cascade_update`, `set_null`, `set_default`, `restrict` (fails while
|
|
68
|
+
referencing rows exist), `drop`, and `reads`.
|
|
69
|
+
- **Verdict**: `allowed` and every blocker, each with a code and the node it
|
|
70
|
+
concerns:
|
|
71
|
+
- `cascade_target_unregistered`
|
|
72
|
+
- `cascade_target_not_writable`
|
|
73
|
+
- `table_not_writable`
|
|
74
|
+
- `writes_unsupported`
|
|
75
|
+
- `data_source_read_only`
|
|
76
|
+
- `retained_referencing_table`
|
|
77
|
+
- `alembic_protection`
|
|
78
|
+
- `deletion_protected`
|
|
79
|
+
|
|
80
|
+
`delete-with-cascade` runs the same planner (`persistence/impact.py`) and refuses
|
|
81
|
+
with its first blocker's status and message, so a preview and the confirmed
|
|
82
|
+
delete cannot disagree. Recorded cascade targets now carry each foreign key's
|
|
83
|
+
`on_delete` and `on_update` action and are recorded for every table, so read-only
|
|
84
|
+
callers see the same graph.
|
|
85
|
+
|
|
86
|
+
The pre-flight is advisory. The database and the confirmed actions still enforce
|
|
87
|
+
every rule at execution time.
|
|
88
|
+
|
|
89
|
+
## Remaining gaps
|
|
90
|
+
|
|
91
|
+
| Need | Today |
|
|
92
|
+
| --- | --- |
|
|
93
|
+
| `on_update` in the catalog | `MetaTableForeignKey` and contracts carry only `on_delete`; contracts reject `set default`. Row-action edges use the physical actions, which are complete. |
|
|
94
|
+
| Effective write in table responses | `permissions.write` reflects catalog grants and can say yes when cascade narrowing says no. Callers should use the pre-flight. |
|
|
95
|
+
| Plain delete | `DELETE /meta-tables/{uid}/` still answers 409 without listing references. |
|
|
96
|
+
| Contract changes | No `change_contract` action; a PATCH that would invalidate an incoming key fails with a text message. |
|
|
97
|
+
| Schema and update graphs | `get_schema_graph` returns an untyped dict; `update-graph` has no client method. |
|
|
98
|
+
| Views | No view-to-table dependency tracking; views stay read-only registrations. |
|
|
99
|
+
| Admin visibility | `GET /security/database-permissions/` does not show cascade targets. |
|
|
100
|
+
|
|
101
|
+
## Consequences
|
|
102
|
+
|
|
103
|
+
- Consuming projects can render cascade and impact views without reimplementing
|
|
104
|
+
permission or foreign-key rules, and their UIs stay correct when those rules
|
|
105
|
+
change.
|
|
106
|
+
- One planner serves both the preview and the confirmed delete.
|
|
107
|
+
- Opaque nodes reveal that hidden tables are affected, but not which ones.
|
|
108
|
+
- Reconciliation now inspects foreign keys for every registered table, not only
|
|
109
|
+
writable ones.
|
|
@@ -36,3 +36,4 @@ decisions belong in the SDK repository and are linked as dependencies.
|
|
|
36
36
|
| [0013: Application-owned migrations](api/0013-application-owned-migrations.md) | Accepted and implemented | Application-side Alembic, environment database authority, API catalog integration and separate system migrations. |
|
|
37
37
|
| [0014: System migrations in the deployment workflow](api/0014-main-sequence-release-jobs-and-production-migrations.md) | Accepted; implemented on development; hosted verification pending | A Main Sequence Job verifies, migrates and registers the declared runtime database from the candidate image before each API rollout, including the first. |
|
|
38
38
|
| [0015: TimescaleDB compression and retention policies](api/0015-timescale-compression-and-retention-policies.md) | Accepted; implemented on branch; TimescaleDB verification pending | Time-index tables on TimescaleDB become hypertables; Writers set compression and retention through the API/Admin; Timescale keeps the jobs, and the Admin shows their status. |
|
|
39
|
+
| [0016: Impact pre-flight for cascades and deletes](api/0016-impact-preflight.md) | Accepted; implemented; container engine verification pending | `get_impact` returns what a row delete, key update or table drop reaches, every blocker and the caller's effective write, from the planner the confirmed delete runs; projects render it in their own UIs. |
|
|
@@ -6001,6 +6001,96 @@
|
|
|
6001
6001
|
]
|
|
6002
6002
|
}
|
|
6003
6003
|
},
|
|
6004
|
+
"/meta-tables/{table_uid}/impact/": {
|
|
6005
|
+
"get": {
|
|
6006
|
+
"description": "Read-only pre-flight; the confirmed delete runs the same planner (ADR 0016).",
|
|
6007
|
+
"operationId": "get_impact_meta_tables__table_uid__impact__get",
|
|
6008
|
+
"parameters": [
|
|
6009
|
+
{
|
|
6010
|
+
"in": "path",
|
|
6011
|
+
"name": "table_uid",
|
|
6012
|
+
"required": true,
|
|
6013
|
+
"schema": {
|
|
6014
|
+
"format": "uuid",
|
|
6015
|
+
"title": "Table Uid",
|
|
6016
|
+
"type": "string"
|
|
6017
|
+
}
|
|
6018
|
+
},
|
|
6019
|
+
{
|
|
6020
|
+
"in": "query",
|
|
6021
|
+
"name": "action",
|
|
6022
|
+
"required": true,
|
|
6023
|
+
"schema": {
|
|
6024
|
+
"enum": [
|
|
6025
|
+
"delete_rows",
|
|
6026
|
+
"update_keys",
|
|
6027
|
+
"drop_table"
|
|
6028
|
+
],
|
|
6029
|
+
"title": "Action",
|
|
6030
|
+
"type": "string"
|
|
6031
|
+
}
|
|
6032
|
+
},
|
|
6033
|
+
{
|
|
6034
|
+
"in": "query",
|
|
6035
|
+
"name": "delete_referencing_meta_tables",
|
|
6036
|
+
"required": false,
|
|
6037
|
+
"schema": {
|
|
6038
|
+
"default": true,
|
|
6039
|
+
"title": "Delete Referencing Meta Tables",
|
|
6040
|
+
"type": "boolean"
|
|
6041
|
+
}
|
|
6042
|
+
},
|
|
6043
|
+
{
|
|
6044
|
+
"in": "query",
|
|
6045
|
+
"name": "delete_referencing_time_index_meta_tables",
|
|
6046
|
+
"required": false,
|
|
6047
|
+
"schema": {
|
|
6048
|
+
"default": true,
|
|
6049
|
+
"title": "Delete Referencing Time Index Meta Tables",
|
|
6050
|
+
"type": "boolean"
|
|
6051
|
+
}
|
|
6052
|
+
},
|
|
6053
|
+
{
|
|
6054
|
+
"in": "query",
|
|
6055
|
+
"name": "override_schema_management_protection",
|
|
6056
|
+
"required": false,
|
|
6057
|
+
"schema": {
|
|
6058
|
+
"default": false,
|
|
6059
|
+
"title": "Override Schema Management Protection",
|
|
6060
|
+
"type": "boolean"
|
|
6061
|
+
}
|
|
6062
|
+
}
|
|
6063
|
+
],
|
|
6064
|
+
"responses": {
|
|
6065
|
+
"200": {
|
|
6066
|
+
"content": {
|
|
6067
|
+
"application/json": {
|
|
6068
|
+
"schema": {
|
|
6069
|
+
"additionalProperties": true,
|
|
6070
|
+
"title": "Response Get Impact Meta Tables Table Uid Impact Get",
|
|
6071
|
+
"type": "object"
|
|
6072
|
+
}
|
|
6073
|
+
}
|
|
6074
|
+
},
|
|
6075
|
+
"description": "Successful Response"
|
|
6076
|
+
},
|
|
6077
|
+
"422": {
|
|
6078
|
+
"content": {
|
|
6079
|
+
"application/json": {
|
|
6080
|
+
"schema": {
|
|
6081
|
+
"$ref": "#/components/schemas/HTTPValidationError"
|
|
6082
|
+
}
|
|
6083
|
+
}
|
|
6084
|
+
},
|
|
6085
|
+
"description": "Validation Error"
|
|
6086
|
+
}
|
|
6087
|
+
},
|
|
6088
|
+
"summary": "Get Impact",
|
|
6089
|
+
"tags": [
|
|
6090
|
+
"MetaTables"
|
|
6091
|
+
]
|
|
6092
|
+
}
|
|
6093
|
+
},
|
|
6004
6094
|
"/meta-tables/{table_uid}/introspect/": {
|
|
6005
6095
|
"post": {
|
|
6006
6096
|
"operationId": "introspect_meta_table_meta_tables__table_uid__introspect__post",
|
|
@@ -8978,6 +9068,96 @@
|
|
|
8978
9068
|
]
|
|
8979
9069
|
}
|
|
8980
9070
|
},
|
|
9071
|
+
"/time-index-meta-tables/{table_uid}/impact/": {
|
|
9072
|
+
"get": {
|
|
9073
|
+
"description": "Read-only pre-flight; the confirmed delete runs the same planner (ADR 0016).",
|
|
9074
|
+
"operationId": "time_index_get_impact_time_index_meta_tables__table_uid__impact__get",
|
|
9075
|
+
"parameters": [
|
|
9076
|
+
{
|
|
9077
|
+
"in": "path",
|
|
9078
|
+
"name": "table_uid",
|
|
9079
|
+
"required": true,
|
|
9080
|
+
"schema": {
|
|
9081
|
+
"format": "uuid",
|
|
9082
|
+
"title": "Table Uid",
|
|
9083
|
+
"type": "string"
|
|
9084
|
+
}
|
|
9085
|
+
},
|
|
9086
|
+
{
|
|
9087
|
+
"in": "query",
|
|
9088
|
+
"name": "action",
|
|
9089
|
+
"required": true,
|
|
9090
|
+
"schema": {
|
|
9091
|
+
"enum": [
|
|
9092
|
+
"delete_rows",
|
|
9093
|
+
"update_keys",
|
|
9094
|
+
"drop_table"
|
|
9095
|
+
],
|
|
9096
|
+
"title": "Action",
|
|
9097
|
+
"type": "string"
|
|
9098
|
+
}
|
|
9099
|
+
},
|
|
9100
|
+
{
|
|
9101
|
+
"in": "query",
|
|
9102
|
+
"name": "delete_referencing_meta_tables",
|
|
9103
|
+
"required": false,
|
|
9104
|
+
"schema": {
|
|
9105
|
+
"default": true,
|
|
9106
|
+
"title": "Delete Referencing Meta Tables",
|
|
9107
|
+
"type": "boolean"
|
|
9108
|
+
}
|
|
9109
|
+
},
|
|
9110
|
+
{
|
|
9111
|
+
"in": "query",
|
|
9112
|
+
"name": "delete_referencing_time_index_meta_tables",
|
|
9113
|
+
"required": false,
|
|
9114
|
+
"schema": {
|
|
9115
|
+
"default": true,
|
|
9116
|
+
"title": "Delete Referencing Time Index Meta Tables",
|
|
9117
|
+
"type": "boolean"
|
|
9118
|
+
}
|
|
9119
|
+
},
|
|
9120
|
+
{
|
|
9121
|
+
"in": "query",
|
|
9122
|
+
"name": "override_schema_management_protection",
|
|
9123
|
+
"required": false,
|
|
9124
|
+
"schema": {
|
|
9125
|
+
"default": false,
|
|
9126
|
+
"title": "Override Schema Management Protection",
|
|
9127
|
+
"type": "boolean"
|
|
9128
|
+
}
|
|
9129
|
+
}
|
|
9130
|
+
],
|
|
9131
|
+
"responses": {
|
|
9132
|
+
"200": {
|
|
9133
|
+
"content": {
|
|
9134
|
+
"application/json": {
|
|
9135
|
+
"schema": {
|
|
9136
|
+
"additionalProperties": true,
|
|
9137
|
+
"title": "Response Time Index Get Impact Time Index Meta Tables Table Uid Impact Get",
|
|
9138
|
+
"type": "object"
|
|
9139
|
+
}
|
|
9140
|
+
}
|
|
9141
|
+
},
|
|
9142
|
+
"description": "Successful Response"
|
|
9143
|
+
},
|
|
9144
|
+
"422": {
|
|
9145
|
+
"content": {
|
|
9146
|
+
"application/json": {
|
|
9147
|
+
"schema": {
|
|
9148
|
+
"$ref": "#/components/schemas/HTTPValidationError"
|
|
9149
|
+
}
|
|
9150
|
+
}
|
|
9151
|
+
},
|
|
9152
|
+
"description": "Validation Error"
|
|
9153
|
+
}
|
|
9154
|
+
},
|
|
9155
|
+
"summary": "Time Index Get Impact",
|
|
9156
|
+
"tags": [
|
|
9157
|
+
"TimeIndexMetaTables"
|
|
9158
|
+
]
|
|
9159
|
+
}
|
|
9160
|
+
},
|
|
8981
9161
|
"/time-index-meta-tables/{table_uid}/introspect/": {
|
|
8982
9162
|
"post": {
|
|
8983
9163
|
"operationId": "time_index_introspect_meta_table_time_index_meta_tables__table_uid__introspect__post",
|
|
@@ -31,6 +31,7 @@ These methods and paths are mounted by the current application. See the [OpenAPI
|
|
|
31
31
|
| GET | `/meta-tables/{table_uid}/` | Retrieve Table | 200 |
|
|
32
32
|
| PATCH | `/meta-tables/{table_uid}/` | Patch Meta Table | 200 |
|
|
33
33
|
| POST | `/meta-tables/{table_uid}/delete-with-cascade/` | Delete With Cascade | 200 |
|
|
34
|
+
| GET | `/meta-tables/{table_uid}/impact/` | Get Impact | 200 |
|
|
34
35
|
| POST | `/meta-tables/{table_uid}/introspect/` | Introspect Meta Table | 200 |
|
|
35
36
|
| POST | `/meta-tables/{table_uid}/migration-connection/` | Migration Connection | 200 |
|
|
36
37
|
| POST | `/meta-tables/{table_uid}/read/` | Read Rows | 200 |
|
|
@@ -89,6 +90,7 @@ These methods and paths are mounted by the current application. See the [OpenAPI
|
|
|
89
90
|
| POST | `/time-index-meta-tables/{table_uid}/get-data-between-dates-from-remote/` | Get Data Between Dates From Remote | 200 |
|
|
90
91
|
| POST | `/time-index-meta-tables/{table_uid}/get-last-observation/` | Get Last Observation | 200 |
|
|
91
92
|
| GET | `/time-index-meta-tables/{table_uid}/get-stats/` | Get Time Index Stats | 200 |
|
|
93
|
+
| GET | `/time-index-meta-tables/{table_uid}/impact/` | Time Index Get Impact | 200 |
|
|
92
94
|
| POST | `/time-index-meta-tables/{table_uid}/introspect/` | Time Index Introspect Meta Table | 200 |
|
|
93
95
|
| POST | `/time-index-meta-tables/{table_uid}/migration-connection/` | Time Index Migration Connection | 200 |
|
|
94
96
|
| GET | `/time-index-meta-tables/{table_uid}/schema-graph` | Time Index Get Schema Graph | 200 |
|
{mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/reference/capabilities.md
RENAMED
|
@@ -60,6 +60,7 @@ This inventory records the support status of public resource methods and CLI com
|
|
|
60
60
|
| `MetaTable.get_effective_access` | tested | `GET /meta-tables/{uid}/effective-access/` | Reader/Writer sharing through the application security API; changes require Writer or application admin, with revision conflict checks. Tests: `tests/permissions/test_security_api.py::test_public_client_access_roundtrip` |
|
|
61
61
|
| `MetaTable.get_object_url` | internal | | Transport, serialization, or model lifecycle helper; not a separate API operation. |
|
|
62
62
|
| `MetaTable.get_or_none` | implemented | `GET /meta-tables/{table_uid}/` | Generic resource operation with a mounted API route. Check route constraints; method-specific evidence is not claimed. |
|
|
63
|
+
| `MetaTable.get_impact` | tested | `GET /meta-tables/{table_uid}/impact/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_remaining_client_routes.py::test_public_impact_preflight_matches_cascade_rules` |
|
|
63
64
|
| `MetaTable.get_schema_graph` | tested | `GET /meta-tables/{table_uid}/schema-graph` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_local_actor_client_api.py::test_client_detail_validation_uses_platform_membership_and_revocation` |
|
|
64
65
|
| `MetaTable.import_from_data_source` | tested | `POST /meta-tables/import-from-data-source/` | Import creates relational external registrations (preview by default); bounded reads enforce existing MetaTable grants and never accept SQL. Inherited methods use the shared MetaTable endpoint. Tests: `tests/database_backend/test_relation_import.py::test_python_client_import_read_and_writer_refresh` |
|
|
65
66
|
| `MetaTable.introspect` | tested | `POST /meta-tables/{table_uid}/introspect/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_table_introspection_client_api.py::test_client_introspection_checks_grant_and_persists_snapshot` |
|
|
@@ -147,6 +148,7 @@ This inventory records the support status of public resource methods and CLI com
|
|
|
147
148
|
| `TimeIndexMetaTable.get_object_url` | internal | | Transport, serialization, or model lifecycle helper; not a separate API operation. |
|
|
148
149
|
| `TimeIndexMetaTable.get_or_create` | tested | `POST /time-index-meta-tables/get-or-create/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_remaining_client_routes.py::test_public_registration_bulk_and_time_index_get_or_create` |
|
|
149
150
|
| `TimeIndexMetaTable.get_or_none` | implemented | `GET /time-index-meta-tables/{table_uid}/` | Generic resource operation with a mounted API route. Check route constraints; method-specific evidence is not claimed. |
|
|
151
|
+
| `TimeIndexMetaTable.get_impact` | tested | `GET /time-index-meta-tables/{table_uid}/impact/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_remaining_client_routes.py::test_public_impact_preflight_matches_cascade_rules` |
|
|
150
152
|
| `TimeIndexMetaTable.get_schema_graph` | tested | `GET /time-index-meta-tables/{table_uid}/schema-graph` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_local_actor_client_api.py::test_client_detail_validation_uses_platform_membership_and_revocation` |
|
|
151
153
|
| `TimeIndexMetaTable.import_from_data_source` | tested | `POST /meta-tables/import-from-data-source/` | Import creates relational external registrations (preview by default); bounded reads enforce existing MetaTable grants and never accept SQL. Inherited methods use the shared MetaTable endpoint. Tests: `tests/database_backend/test_relation_import.py::test_python_client_import_read_and_writer_refresh` |
|
|
152
154
|
| `TimeIndexMetaTable.introspect` | tested | `POST /time-index-meta-tables/{table_uid}/introspect/` | Client/API behavior covered with isolated catalog and adapters; live storage checks are separate. Tests: `tests/e2e/test_table_introspection_client_api.py::test_client_introspection_checks_grant_and_persists_snapshot` |
|
{mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/reference/python.md
RENAMED
|
@@ -43,6 +43,10 @@ Import application APIs from `metatables`. This list is generated from `metatabl
|
|
|
43
43
|
| `MetaTableCompiledSQLVersion` | `typing` | constant |
|
|
44
44
|
| `MetaTableContract` | `metatables.models` | class |
|
|
45
45
|
| `MetaTableForeignKeyPayload` | `metatables.models` | class |
|
|
46
|
+
| `MetaTableImpact` | `metatables.models` | class |
|
|
47
|
+
| `MetaTableImpactBlocker` | `metatables.models` | class |
|
|
48
|
+
| `MetaTableImpactEdge` | `metatables.models` | class |
|
|
49
|
+
| `MetaTableImpactNode` | `metatables.models` | class |
|
|
46
50
|
| `MetaTableIndexPayload` | `metatables.models` | class |
|
|
47
51
|
| `MetaTableManagementMode` | `typing` | constant |
|
|
48
52
|
| `MetaTableMigrationConnection` | `metatables.models` | class |
|
{mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/docs/security/index.md
RENAMED
|
@@ -128,7 +128,9 @@ statement classification or function allowlist. The database enforces access in
|
|
|
128
128
|
joins, CTEs, subqueries and permitted invoker routines. Database permissions are
|
|
129
129
|
established during setup and schema changes. Catalog tables remain inaccessible,
|
|
130
130
|
views cannot be registered, elevated routines cannot confer owner access, and
|
|
131
|
-
triggered writes
|
|
131
|
+
triggered writes are restricted by the engine's policy. A table with cascading
|
|
132
|
+
foreign keys is writable only by callers who can write every table the cascade
|
|
133
|
+
modifies.
|
|
132
134
|
|
|
133
135
|
PostgreSQL stores the catalog in `metatables` and owns managed tables through a
|
|
134
136
|
non-login owner role. User, Team and namespace grants become database privileges
|
|
@@ -82,3 +82,4 @@ nav:
|
|
|
82
82
|
- "0013: Application-owned migrations": adr/api/0013-application-owned-migrations.md
|
|
83
83
|
- "0014: System migrations in the deployment workflow": adr/api/0014-main-sequence-release-jobs-and-production-migrations.md
|
|
84
84
|
- "0015: TimescaleDB compression and retention policies": adr/api/0015-timescale-compression-and-retention-policies.md
|
|
85
|
+
- "0016: Impact pre-flight": adr/api/0016-impact-preflight.md
|
|
@@ -30,6 +30,7 @@ docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md
|
|
|
30
30
|
docs/adr/api/0013-application-owned-migrations.md
|
|
31
31
|
docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md
|
|
32
32
|
docs/adr/api/0015-timescale-compression-and-retention-policies.md
|
|
33
|
+
docs/adr/api/0016-impact-preflight.md
|
|
33
34
|
docs/adr/client/0003-api-endpoint-resolution.md
|
|
34
35
|
docs/adr/client/0011-cli-local-development-with-managed-admin.md
|
|
35
36
|
docs/api/authentication-and-errors.md
|
|
@@ -299,6 +300,7 @@ src/metatables/api/backend/migrations/versions/0006_local_credentials.py
|
|
|
299
300
|
src/metatables/api/backend/migrations/versions/0007_external_relation_names.py
|
|
300
301
|
src/metatables/api/backend/migrations/versions/0008_upload_receipts.py
|
|
301
302
|
src/metatables/api/backend/migrations/versions/0009_timescale_policies.py
|
|
303
|
+
src/metatables/api/backend/migrations/versions/0010_cascade_targets.py
|
|
302
304
|
src/metatables/api/backend/migrations/versions/__init__.py
|
|
303
305
|
src/metatables/api/backend/operations/__init__.py
|
|
304
306
|
src/metatables/api/backend/operations/bootstrap_migrations.py
|
|
@@ -315,6 +317,7 @@ src/metatables/api/backend/persistence/cascade.py
|
|
|
315
317
|
src/metatables/api/backend/persistence/catalog.py
|
|
316
318
|
src/metatables/api/backend/persistence/database.py
|
|
317
319
|
src/metatables/api/backend/persistence/grants.py
|
|
320
|
+
src/metatables/api/backend/persistence/impact.py
|
|
318
321
|
src/metatables/api/backend/persistence/labels.py
|
|
319
322
|
src/metatables/api/backend/persistence/locking.py
|
|
320
323
|
src/metatables/api/backend/persistence/models.py
|
|
@@ -523,6 +526,7 @@ tests/packaging/test_dev_release_version.py
|
|
|
523
526
|
tests/packaging/test_distribution_sources.py
|
|
524
527
|
tests/packaging/test_editable_build.py
|
|
525
528
|
tests/packaging/test_installed_distribution.py
|
|
529
|
+
tests/permissions/test_cascade_writes.py
|
|
526
530
|
tests/permissions/test_governed_sql_scope.py
|
|
527
531
|
tests/permissions/test_local_actor_membership.py
|
|
528
532
|
tests/permissions/test_migration_boundary.py
|
{mainsequence_metatable-0.1.16.dev28 → mainsequence_metatable-0.1.17}/src/metatables/__init__.py
RENAMED
|
@@ -140,6 +140,10 @@ _CLIENT_EXPORTS = (
|
|
|
140
140
|
'MetaTableCascadeDeleteResponse',
|
|
141
141
|
'MetaTableCascadeDeletedTimeIndexMetaTable',
|
|
142
142
|
'MetaTableCascadeDeletedMetaTable',
|
|
143
|
+
'MetaTableImpact',
|
|
144
|
+
'MetaTableImpactBlocker',
|
|
145
|
+
'MetaTableImpactEdge',
|
|
146
|
+
'MetaTableImpactNode',
|
|
143
147
|
'MetaTableMigrationConnection',
|
|
144
148
|
'MetaTableMigrationConnectionRequest',
|
|
145
149
|
'MetaTableColumnContract',
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"""Confirmed dependency deletion; every affected object needs a local edit grant."""
|
|
1
|
+
"""Confirmed dependency deletion and its impact pre-flight; every affected object needs a local edit grant."""
|
|
2
2
|
from collections import defaultdict
|
|
3
3
|
from typing import Literal
|
|
4
4
|
from uuid import UUID
|
|
5
5
|
|
|
6
|
-
from fastapi import APIRouter, Depends, HTTPException
|
|
6
|
+
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
7
7
|
from pydantic import BaseModel
|
|
8
8
|
from sqlalchemy import delete, select
|
|
9
9
|
from sqlalchemy.exc import SQLAlchemyError
|
|
@@ -18,10 +18,12 @@ from metatables.api.backend.backends.operations import (
|
|
|
18
18
|
PhysicalTableDeleteOutcomeUnknown,
|
|
19
19
|
drop_tables,
|
|
20
20
|
)
|
|
21
|
+
from metatables.api.backend.domain.catalog_rules import CatalogInvariantError
|
|
21
22
|
from metatables.api.backend.domain.data_source_rules import DataSourceAdmissionError
|
|
22
23
|
from metatables.api.backend.domain.permission_rules import TrustedActorFacts
|
|
23
24
|
from metatables.api.backend.integrations.runtime_data_sources import DataSourceIntegrationError
|
|
24
25
|
from metatables.api.backend.persistence.grants import GrantRepository
|
|
26
|
+
from metatables.api.backend.persistence.impact import DropOptions, ImpactPlanner
|
|
25
27
|
from metatables.api.backend.persistence.locking import lock_catalog
|
|
26
28
|
from metatables.api.backend.persistence.models import (
|
|
27
29
|
MetaTable,
|
|
@@ -41,32 +43,37 @@ def cascade_deleter():
|
|
|
41
43
|
return drop_tables
|
|
42
44
|
|
|
43
45
|
def _plan(session, actor, root_uid, payload):
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
MetaTableForeignKey.target_table_uid.in_(planned))))
|
|
48
|
-
related.update(session.scalars(select(MetaTable.uid).where(
|
|
49
|
-
MetaTable.alembic_version_meta_table_uid.in_(planned))))
|
|
50
|
-
remaining = related - planned
|
|
51
|
-
if not remaining:
|
|
52
|
-
break
|
|
53
|
-
planned.update(remaining)
|
|
54
|
-
rows = tuple(session.scalars(select(MetaTable).where(MetaTable.uid.in_(planned)).with_for_update()))
|
|
55
|
-
if len(rows) != len(planned):
|
|
56
|
-
raise HTTPException(404, 'MetaTable not found.')
|
|
57
|
-
for row in rows:
|
|
58
|
-
if (not GrantRepository(session).may_access_table(table_uid=row.uid, actor=actor, edit=True)):
|
|
59
|
-
raise HTTPException(404, 'An affected MetaTable was not found.')
|
|
60
|
-
if row.uid != root_uid and not (payload.delete_referencing_time_index_meta_tables if row.kind == 'time_index'
|
|
61
|
-
else payload.delete_referencing_meta_tables):
|
|
62
|
-
raise HTTPException(409, 'Deletion is blocked by a retained referencing table.')
|
|
63
|
-
alembic = row.schema_management_mode == 'alembic_managed'
|
|
64
|
-
if alembic and not payload.override_schema_management_protection:
|
|
65
|
-
raise HTTPException(409, 'Alembic protection requires explicit override.')
|
|
66
|
-
if (row.protect_from_deletion and not alembic):
|
|
67
|
-
raise HTTPException(409, 'An affected MetaTable is protected from deletion.')
|
|
46
|
+
rows, blockers = ImpactPlanner(session, actor).drop_closure(root_uid, _options(payload), lock=True)
|
|
47
|
+
if blockers:
|
|
48
|
+
raise HTTPException(blockers[0].status, blockers[0].message)
|
|
68
49
|
return rows
|
|
69
50
|
|
|
51
|
+
|
|
52
|
+
def _options(payload):
|
|
53
|
+
return DropOptions(
|
|
54
|
+
delete_referencing_meta_tables=payload.delete_referencing_meta_tables,
|
|
55
|
+
delete_referencing_time_index_meta_tables=payload.delete_referencing_time_index_meta_tables,
|
|
56
|
+
override_schema_management_protection=payload.override_schema_management_protection,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@router.get('/{table_uid}/impact/')
|
|
61
|
+
def get_impact(table_uid: UUID, action: Literal['delete_rows', 'update_keys', 'drop_table'] = Query(...),
|
|
62
|
+
delete_referencing_meta_tables: bool = True,
|
|
63
|
+
delete_referencing_time_index_meta_tables: bool = True,
|
|
64
|
+
override_schema_management_protection: bool = False,
|
|
65
|
+
actor: TrustedActorFacts = Depends(trusted_actor_facts),
|
|
66
|
+
session: Session = Depends(catalog_session)) -> dict:
|
|
67
|
+
"""Read-only pre-flight; the confirmed delete runs the same planner (ADR 0016)."""
|
|
68
|
+
options = DropOptions(delete_referencing_meta_tables, delete_referencing_time_index_meta_tables,
|
|
69
|
+
override_schema_management_protection)
|
|
70
|
+
try:
|
|
71
|
+
return ImpactPlanner(session, actor).plan(table_uid, action, options)
|
|
72
|
+
except CatalogInvariantError as exc:
|
|
73
|
+
if 'does not exist' in str(exc):
|
|
74
|
+
raise HTTPException(404, 'MetaTable not found.') from exc
|
|
75
|
+
raise HTTPException(422, str(exc)) from exc
|
|
76
|
+
|
|
70
77
|
@router.post('/{table_uid}/delete-with-cascade/')
|
|
71
78
|
def delete_with_cascade(table_uid: UUID, payload: CascadeRequest,
|
|
72
79
|
actor: TrustedActorFacts = Depends(trusted_actor_facts),
|