mainsequence-metatable 0.1.17.dev29__tar.gz → 0.1.18.dev30__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.17.dev29 → mainsequence_metatable-0.1.18.dev30}/.agents/skills/client/metatables-meta-tables/SKILL.md +2 -2
- {mainsequence_metatable-0.1.17.dev29/src/mainsequence_metatable.egg-info → mainsequence_metatable-0.1.18.dev30}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0002-application-administration-and-table-ownership.md +8 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0007-database-enforced-table-access.md +28 -14
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0016-impact-preflight.md +26 -21
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/index.md +1 -1
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/security/index.md +5 -3
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/security/permissions.md +55 -1
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/pyproject.toml +1 -1
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30/src/mainsequence_metatable.egg-info}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/mainsequence_metatable.egg-info/SOURCES.txt +0 -1
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/access.py +0 -57
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/hosted.py +0 -23
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/hosted_access.py +2 -4
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/sqlite_access.py +0 -4
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +1 -1
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/impact.py +13 -50
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/models.py +1 -1
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/models.py +1 -1
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_sql_security.py +21 -29
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_remaining_client_routes.py +5 -13
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/uv.lock +1 -1
- mainsequence_metatable-0.1.17.dev29/tests/permissions/test_cascade_writes.py +0 -49
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/.mainsequence/workflows/metatables-api.yaml +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/LICENSE +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/MANIFEST.in +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/README.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/alembic.ini +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/compose.database-tests.yml +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0004-approved-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0006-historical-run-graphs.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0009-shared-credential-store.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0013-application-owned-migrations.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/authentication-and-errors.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/data-sources.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/openapi.json +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/overview.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/reference.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/tables-and-migrations.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/api/time-index-and-updates.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/assets/branding/metatables.svg +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/assets/diagrams/local-client-experience.svg +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/bounded-transfers.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/build-an-updater.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/define-and-migrate-tables.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/deploy-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/installation-and-connection.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/local-storage.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/query-and-mutate.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/quickstart.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/read-existing-time-index-tables.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/register-existing-tables.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/tutorial.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/client/upgrade-legacy-app.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/architecture.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/data-sources.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/identity-and-scope.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/permissions-namespaces-labels.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/runs-and-execution-graphs.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/concepts/time-index-tables-and-updates.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/contributing/architecture-and-boundaries.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/contributing/database-backends.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/contributing/documentation.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/contributing/releasing.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/contributing/testing.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/README.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/query.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/index.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/catalog-migrations.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/configuration.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/hosted-runtime.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/local-runtime.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/recovery-and-observability.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/run-history.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/operations/run-logs.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/reference/capabilities.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/reference/cli.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/reference/python.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/security/ownership-and-sharing.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/mkdocs.yml +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/build_reference.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/check_boundaries.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/check_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/check_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/check_docs.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/check_examples_debug.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/check_project.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/test_databases.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/scripts/test_postgresql.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/setup.cfg +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/_admin_source.json +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/_build.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/_skill_bundle.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/auth/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/auth/boundary.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/auth/caller_assertions.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/auth/local_actor.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/bootstrap.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/configuration.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/credential_admin.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/development.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/development_client.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/error_logging.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/main.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/platform_cache.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/column_search.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/contract_validation.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/data_sources.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/managed_finalize.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/namespaces.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/run_logs.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/security.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_cascade.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_crud.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_delete.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_filter.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_import.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_introspection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_patch.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_registration.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_response.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_search_document.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_sql.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/time_index_reads.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_batch.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_constants.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_crud.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_details.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_graph.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_registration.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_runs.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/routes/update_statistics.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/runtime.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/runtime_control.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/runtime_database.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/source_passwords.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/app/transfer.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/catalog.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/catalog_types.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/contracts.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/native.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/operations.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/pages.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/postgresql_access.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/registry.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/relation_tables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/relational.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/streaming.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/backends/timescale.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/contracts/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/contracts/relation_import.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/contracts/values.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/index_statistics.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/label_rules.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/permission_rules.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/domain/update_constants.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/credential_store.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/run_logs.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/integrations/source_validation.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/create_table.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/import_relations.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/introspect_table.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/read_time_index.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/register_catalog.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/operations/search_documents.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/cascade.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/catalog.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/database.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/grants.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/labels.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/locking.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/projections.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/table_queries.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/table_response.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/update_graph.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/updates.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/metatables/configuration.yaml +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/admin_install.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/app.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/filters.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/local.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/migrations.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/project.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/cli/skills.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/compiled_sql/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/compiled_sql/mssql.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/compiled_sql/v1.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/dtype_codec.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/endpoint.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/README.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/query.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/future_registry.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/hashing.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/instrumentation.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/local_connection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/local_files.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/log_contract.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/alembic.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/connection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/provider.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/runner.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/scaffold.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/sqlite.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/templates/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/templates/env.py.mako +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/templates/script.py.mako +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/migrations/tls.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/pydantic_metadata.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/run_logging.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/runtime.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/runtime_contract.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/schema_names.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/sdk_compat.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/sqlalchemy_contracts.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/storage_layout_contract.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/time_index_table_refs.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/transfer.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/transfer_contract.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/transport.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/update_configuration_contract.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/configuration.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/dependencies.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/managers.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/namespacing.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/runner.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/updaters.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/updaters/utils.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/upload.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_bootstrap_failure_cause.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_caller_assertions.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_data_source_identity.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_development_client.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_hosted_environment_target.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_local_mode.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_platform_fact_cache.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_runtime_database.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_runtime_scaffold.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_runtime_selection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_runtime_storage_binding.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/auth/test_source_passwords.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/catalog/test_catalog_foundation.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/catalog/test_contract_projection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/catalog/test_database_config.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/catalog/test_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/catalog/test_migration.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/conftest.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/capabilities.json +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/client_signatures.json +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/database_operations.json +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/test_bounded_transfer.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/test_compiler_runtime_source.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/test_relation_batching.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/test_storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/contracts/test_table_contracts.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/Dockerfile +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/Dockerfile.dockerignore +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/conftest.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/provider/__init__.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/provider/env.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_api_contract.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_application_migration.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_bootstrap_recovery.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_catalog_contract.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_credential_catalog.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_physical_contract.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_backend/test_update_client.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_operations/test_physical_operations.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_operations/test_postgresql_operations.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/database_operations/test_runtime_and_temporal.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/documentation/test_project_checks.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_admin_installation.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_api_endpoint.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_application_owned_migrations.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_catalog_outage.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_api_contract.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_migration_scaffold.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_migration_tls.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_package.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_signatures.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_client_value_behaviors.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_data_source_registry.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_local_actor_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_local_cli_workflow.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_local_client_selection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_managed_finalize_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_namespaces_admin_http.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_public_imports.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_run_logs.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_runtime_transition.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_runtime_upgrade.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_sdk_local_startup.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_sqlite_runtime.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_filter_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_introspection_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_patch_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_search_document_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_stats_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_table_updates_http.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_time_index_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_time_index_reads_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_timescale_policies_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_update_batch_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/e2e/test_update_registration_client_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/examples/test_documented_examples.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/examples/test_postgresql_examples.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/examples/test_setup_launch.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/examples/test_tutorial.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_credential_store.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_local_data_sources.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_postgresql_sql.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_source_validation.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/integrations/test_sqlite_operations.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/labels/test_labels.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/operations/test_create_table_operation.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/operations/test_create_table_postgres.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/operations/test_physical_operation_journal.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/operations/test_register_catalog.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/operations/test_search_documents.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/operations/test_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/packaging/test_client_skills.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/packaging/test_dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/packaging/test_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/packaging/test_editable_build.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/packaging/test_installed_distribution.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_governed_sql_scope.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_local_actor_membership.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_migration_boundary.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_namespace_grants.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_security_api.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_table_grants.py +0 -0
- {mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/tests/permissions/test_table_queries.py +0 -0
|
@@ -143,8 +143,8 @@ Before a destructive action, or to show impact in an application UI, call
|
|
|
143
143
|
The API returns whether the caller may run it, every blocker, and a graph of
|
|
144
144
|
affected tables, foreign-key effects and reading updates; render that result
|
|
145
145
|
rather than re-deriving foreign-key or permission rules in the client. Cascading
|
|
146
|
-
foreign keys are allowed
|
|
147
|
-
|
|
146
|
+
foreign keys are allowed. Write on a table depends only on its own grants; the
|
|
147
|
+
cascade effects in the result are information, never a reason the action is blocked.
|
|
148
148
|
|
|
149
149
|
On a TimescaleDB DataSource, time-index tables are hypertables. Their compression
|
|
150
150
|
and retention policies are set only through `TimeIndexMetaTable.set_timescale_policies`
|
|
@@ -6,6 +6,14 @@
|
|
|
6
6
|
> conflicting application-migration execution and credential restrictions;
|
|
7
7
|
> governed API operations and MetaTables system migrations remain separate.
|
|
8
8
|
|
|
9
|
+
> Amendment (2026-10-03): "Cascades" below means the confirmed cascade delete,
|
|
10
|
+
> which drops referencing tables and so needs Writer access to every table it
|
|
11
|
+
> drops. Foreign-key row actions (`CASCADE`, `SET NULL`, `SET DEFAULT`) are
|
|
12
|
+
> different: the referencing table's own foreign key authorizes them, so a caller
|
|
13
|
+
> who changes a referenced row needs no access to the referencing tables, and
|
|
14
|
+
> tables that reference a table never change who may write it
|
|
15
|
+
> ([ADR 0007](0007-database-enforced-table-access.md), amended 2026-10-03).
|
|
16
|
+
|
|
9
17
|
|
|
10
18
|
Date: 2026-09-29
|
|
11
19
|
|
|
@@ -14,14 +14,23 @@
|
|
|
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
|
|
18
|
-
>
|
|
19
|
-
>
|
|
20
|
-
> table
|
|
21
|
-
>
|
|
22
|
-
>
|
|
23
|
-
>
|
|
24
|
-
>
|
|
17
|
+
> Amendment (2026-10-03): Cascading foreign keys are allowed, and write on a table
|
|
18
|
+
> depends only on that table's own grants. A foreign key's `CASCADE`, `SET NULL` or
|
|
19
|
+
> `SET DEFAULT` action belongs to the referencing table: whoever controls that
|
|
20
|
+
> table's schema decided what happens to its rows when the referenced row changes.
|
|
21
|
+
> A caller who deletes or re-keys a referenced row therefore needs no access to
|
|
22
|
+
> the referencing tables, however long the chain, and no table that references
|
|
23
|
+
> another ever changes who may write it. This withdraws three rules:
|
|
24
|
+
>
|
|
25
|
+
> - foreign keys must use `restrict` or `no action`, which the implementation
|
|
26
|
+
> applied on every engine, not only where the explorer is enabled;
|
|
27
|
+
> - the MySQL and SQL Server check that refused writes whose cascades reached
|
|
28
|
+
> other tables (`unscoped_cascade_denied`);
|
|
29
|
+
> - an interim development change that removed write on a table from callers who
|
|
30
|
+
> could not write every table referencing it.
|
|
31
|
+
>
|
|
32
|
+
> Reconciliation still records each table's cascade targets, but only so the
|
|
33
|
+
> [impact pre-flight](0016-impact-preflight.md) can show their effects.
|
|
25
34
|
|
|
26
35
|
|
|
27
36
|
Date: 2026-09-29
|
|
@@ -159,8 +168,8 @@ The API removes every check of what the SQL means:
|
|
|
159
168
|
statement the role lacks privileges for.
|
|
160
169
|
- No declared table scope. A request names only its DataSource.
|
|
161
170
|
- No checks for views, triggers or cascades before query execution. Registration
|
|
162
|
-
and schema management establish and preserve the safeguards
|
|
163
|
-
|
|
171
|
+
and schema management establish and preserve the safeguards below, without
|
|
172
|
+
inspecting each submitted query.
|
|
164
173
|
- One statement per request comes from the extended query protocol, and row limits
|
|
165
174
|
from fetching at most `max_rows` rows, not from rewriting the query.
|
|
166
175
|
|
|
@@ -202,8 +211,9 @@ client.
|
|
|
202
211
|
- Any role can see the names, columns and row counts of every table in PostgreSQL's
|
|
203
212
|
system catalogs, but not their data. MetaTables accepts this where the explorer
|
|
204
213
|
is enabled. Role names are opaque, because table permissions are visible too.
|
|
205
|
-
- Databases run foreign-key cascades as the table owner.
|
|
206
|
-
|
|
214
|
+
- Databases run foreign-key cascades as the table owner. The referencing table's
|
|
215
|
+
own foreign key authorizes them, so they need no access from the caller
|
|
216
|
+
(amendment 2026-10-03). SQLite is the exception described below.
|
|
207
217
|
- Heavy queries still consume resources. Per-role connection limits, time limits
|
|
208
218
|
and, optionally, a read replica bound them.
|
|
209
219
|
|
|
@@ -214,6 +224,10 @@ runtimes: reads on the caller's Reader and Writer tables, writes on Writer table
|
|
|
214
224
|
only, and nothing else, including catalog tables, schema changes, transaction
|
|
215
225
|
control and `PRAGMA`. The callback responds to SQLite's own authorization events
|
|
216
226
|
inside the backend adapter; the API does not parse the query to infer its access.
|
|
227
|
+
SQLite also asks it about the reads and writes of foreign-key actions, which it
|
|
228
|
+
cannot tell apart from the caller's own. A local delete or key update on a
|
|
229
|
+
referenced table therefore fails unless the caller can access every referencing
|
|
230
|
+
table.
|
|
217
231
|
|
|
218
232
|
### Engine-specific enforcement
|
|
219
233
|
|
|
@@ -283,8 +297,8 @@ and [MySQL implicit commits](https://dev.mysql.com/doc/refman/8.4/en/implicit-co
|
|
|
283
297
|
- The DataSource login needs `CREATEROLE` and the right to create the `metatables`
|
|
284
298
|
schema; it does not need to own the database.
|
|
285
299
|
- Physical table names become visible to explorer users.
|
|
286
|
-
- Cascading foreign keys
|
|
287
|
-
|
|
300
|
+
- Cascading foreign keys are allowed. Tables that reference a table never change
|
|
301
|
+
who may write it.
|
|
288
302
|
- Team membership reaches the database at the pace of the existing one-hour
|
|
289
303
|
platform-fact cache.
|
|
290
304
|
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# ADR 0016: Impact pre-flight for cascades and deletes
|
|
2
2
|
|
|
3
|
+
> Amendment (2026-10-03): Cascade effects are information, never blockers. An
|
|
4
|
+
> earlier version of this ADR reported a cascade into an unregistered table or a
|
|
5
|
+
> table the caller could not write as a blocker, and computed `can_write` after
|
|
6
|
+
> removing write from such callers. Both are withdrawn with that rule
|
|
7
|
+
> ([ADR 0007](0007-database-enforced-table-access.md), amended 2026-10-03).
|
|
8
|
+
|
|
3
9
|
Date: 2026-10-03
|
|
4
10
|
|
|
5
11
|
Status: Accepted.
|
|
@@ -14,17 +20,18 @@ own their UIs.
|
|
|
14
20
|
|
|
15
21
|
Related decisions: [ADR 0001](0001-unified-api-storage-and-local-sqlite.md) (the SDK
|
|
16
22
|
makes no access decisions of its own), [ADR 0002](0002-application-administration-and-table-ownership.md)
|
|
17
|
-
(
|
|
18
|
-
(amended 2026-10-03:
|
|
23
|
+
(the confirmed cascade delete needs access to every table it drops) and
|
|
24
|
+
[ADR 0007](0007-database-enforced-table-access.md) (amended 2026-10-03: tables that
|
|
25
|
+
reference a table never change who may write it).
|
|
19
26
|
|
|
20
27
|
## Context
|
|
21
28
|
|
|
22
|
-
Cascading foreign keys are now allowed
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
and read the error.
|
|
29
|
+
Cascading foreign keys are now allowed, and write on a table depends only on its
|
|
30
|
+
own grants. A delete or key update can still reach many tables through their
|
|
31
|
+
`CASCADE`, `SET NULL` and `SET DEFAULT` actions. A project that builds its own UI
|
|
32
|
+
needs to show, before acting, which tables an action reaches, what happens to
|
|
33
|
+
each, and whether the action is available. Before this decision, a caller could
|
|
34
|
+
only try the action and read the error.
|
|
28
35
|
|
|
29
36
|
## Decision
|
|
30
37
|
|
|
@@ -59,23 +66,21 @@ The response is a graph rooted at the table:
|
|
|
59
66
|
with no names.
|
|
60
67
|
|
|
61
68
|
Each node lists its `effects` (`drop`, `delete`, `update`, `input_changed`) and
|
|
62
|
-
the caller's `can_write`. For row actions, `can_write` is the
|
|
63
|
-
|
|
64
|
-
|
|
69
|
+
the caller's `can_write`. For row actions, `can_write` is the caller's write on
|
|
70
|
+
that table: its grants, and whether the table and DataSource accept writes.
|
|
71
|
+
Tables that reference it never change it. For `drop_table`, it is the edit
|
|
72
|
+
grant the drop requires.
|
|
65
73
|
- **Edges**: each edge points from the dependent to what it depends on, as in
|
|
66
74
|
the schema graph. Edges are classified by effect: `cascade_delete`,
|
|
67
75
|
`cascade_update`, `set_null`, `set_default`, `restrict` (fails while
|
|
68
76
|
referencing rows exist), `drop`, and `reads`.
|
|
69
77
|
- **Verdict**: `allowed` and every blocker, each with a code and the node it
|
|
70
|
-
concerns:
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
- `retained_referencing_table`
|
|
77
|
-
- `alembic_protection`
|
|
78
|
-
- `deletion_protected`
|
|
78
|
+
concerns. A row action is blocked only by the table itself:
|
|
79
|
+
`table_not_writable`, `writes_unsupported` or `data_source_read_only`. Cascade
|
|
80
|
+
effects are information, never blockers, because the referencing table's own
|
|
81
|
+
foreign key authorizes them. `drop_table` keeps the confirmed delete's
|
|
82
|
+
blockers: `table_not_writable` (for every table it drops),
|
|
83
|
+
`retained_referencing_table`, `alembic_protection` and `deletion_protected`.
|
|
79
84
|
|
|
80
85
|
`delete-with-cascade` runs the same planner (`persistence/impact.py`) and refuses
|
|
81
86
|
with its first blocker's status and message, so a preview and the confirmed
|
|
@@ -91,7 +96,7 @@ every rule at execution time.
|
|
|
91
96
|
| Need | Today |
|
|
92
97
|
| --- | --- |
|
|
93
98
|
| `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
|
-
|
|
|
99
|
+
| SQLite runtimes | MetaTables' authorizer also checks the reads and writes of foreign-key actions, so a local delete or key update on a referenced table fails unless the caller can access every referencing table ([ADR 0007](0007-database-enforced-table-access.md)). The pre-flight does not report this. |
|
|
95
100
|
| Plain delete | `DELETE /meta-tables/{uid}/` still answers 409 without listing references. |
|
|
96
101
|
| Contract changes | No `change_contract` action; a PATCH that would invalidate an incoming key fails with a text message. |
|
|
97
102
|
| Schema and update graphs | `get_schema_graph` returns an untyped dict; `update-graph` has no client method. |
|
{mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/adr/index.md
RENAMED
|
@@ -36,4 +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
|
|
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 whether the caller may write each table, from the planner the confirmed delete runs; cascade effects never block. Projects render it in their own UIs. |
|
{mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/docs/security/index.md
RENAMED
|
@@ -23,6 +23,7 @@ deployment's migration Job does so for its declared runtime database.
|
|
|
23
23
|
| Application Settings and global Security admission | MetaTables, using the trusted platform admin fact |
|
|
24
24
|
| Sharing, lifecycle and schema admission | The MetaTables API |
|
|
25
25
|
| Data access during SQL execution | Database roles and privileges; SQLite engine authorizer locally |
|
|
26
|
+
| What happens to rows that reference a changed row | The referencing table's foreign key, chosen by whoever controls its schema |
|
|
26
27
|
| Showing permitted actions and access explanations | The Admin UI and Python client, using API decisions |
|
|
27
28
|
|
|
28
29
|
MetaTables does not maintain another Organization or Environment policy model.
|
|
@@ -128,9 +129,10 @@ statement classification or function allowlist. The database enforces access in
|
|
|
128
129
|
joins, CTEs, subqueries and permitted invoker routines. Database permissions are
|
|
129
130
|
established during setup and schema changes. Catalog tables remain inaccessible,
|
|
130
131
|
views cannot be registered, elevated routines cannot confer owner access, and
|
|
131
|
-
triggered writes are restricted by the engine's policy.
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
triggered writes are restricted by the engine's policy. Cascading foreign keys are
|
|
133
|
+
allowed: a referencing table's own foreign key decides what happens to its rows, so
|
|
134
|
+
tables that reference a table never change who may write it. See
|
|
135
|
+
[foreign keys and cascades](permissions.md#foreign-keys-and-cascades).
|
|
134
136
|
|
|
135
137
|
PostgreSQL stores the catalog in `metatables` and owns managed tables through a
|
|
136
138
|
non-login owner role. User, Team and namespace grants become database privileges
|
|
@@ -60,7 +60,10 @@ Permissions follow the resources actually affected:
|
|
|
60
60
|
- A query needs Reader access to every table it reads and Writer access to every
|
|
61
61
|
table it changes. Supplying an authorized table UID does not authorize arbitrary
|
|
62
62
|
SQL against other tables.
|
|
63
|
-
- A cascade needs Writer access to every
|
|
63
|
+
- A confirmed cascade delete needs Writer access to every table it drops. A
|
|
64
|
+
foreign-key action (`CASCADE`, `SET NULL`, `SET DEFAULT`) needs no access to the
|
|
65
|
+
referencing tables: their own foreign keys authorize it (see
|
|
66
|
+
[Foreign keys and cascades](#foreign-keys-and-cascades)). Migration connection
|
|
64
67
|
admission checks all provider catalog tables, including their registry. The
|
|
65
68
|
resulting direct connection is governed by database privileges, not table grants.
|
|
66
69
|
- An updater needs Writer access to its output and Reader access to its inputs.
|
|
@@ -81,6 +84,57 @@ drop the externally owned physical relation. Application system tables and grant
|
|
|
81
84
|
records cannot be edited as ordinary API table data. Direct migration access uses
|
|
82
85
|
the environment login's privileges; its restrictions are the environment operator's responsibility.
|
|
83
86
|
|
|
87
|
+
## Foreign keys and cascades
|
|
88
|
+
|
|
89
|
+
**Write on a table depends only on that table's own grants.** Tables that
|
|
90
|
+
reference it, directly or through any chain of foreign keys, never add or remove
|
|
91
|
+
access to it.
|
|
92
|
+
|
|
93
|
+
A foreign key belongs to the referencing table. Whoever controls that table's
|
|
94
|
+
schema chooses its action, and so decides what happens to their own rows when a
|
|
95
|
+
referenced row is deleted or its key changes:
|
|
96
|
+
|
|
97
|
+
| Action on the referencing table | What happens to its rows |
|
|
98
|
+
| --- | --- |
|
|
99
|
+
| `CASCADE` | Deleted with the referenced row, or re-keyed with it |
|
|
100
|
+
| `SET NULL` / `SET DEFAULT` | Their reference is cleared or reset |
|
|
101
|
+
| `RESTRICT` / `NO ACTION` | The database refuses the change while they exist |
|
|
102
|
+
|
|
103
|
+
A caller who changes a referenced row therefore needs no access to the
|
|
104
|
+
referencing tables. The database applies each referencing table's action as part
|
|
105
|
+
of that write; MetaTables adds no check of its own. PostgreSQL runs these actions
|
|
106
|
+
as the referencing table's owner.
|
|
107
|
+
|
|
108
|
+
| Operation on a referenced table | Access required |
|
|
109
|
+
| --- | --- |
|
|
110
|
+
| Insert rows, or update columns no foreign key references | Writer on the table |
|
|
111
|
+
| Delete rows, or update referenced key columns | Writer on the table; each referencing table's action then applies |
|
|
112
|
+
| Drop the table with the confirmed cascade delete | Writer on the table and on every referencing table it drops |
|
|
113
|
+
|
|
114
|
+
For example, Alice owns `assets`. Carol's `details` table references `assets`
|
|
115
|
+
with `ON DELETE CASCADE`. Alice's Writers can still insert, update and delete
|
|
116
|
+
assets without any access to `details`. When they delete an asset, the database
|
|
117
|
+
deletes Carol's rows for it, because Carol's foreign key says so. If Carol wants
|
|
118
|
+
her rows kept, she uses `RESTRICT` or `NO ACTION`, and the database then refuses
|
|
119
|
+
to delete assets her rows still reference. Dropping `assets` with the confirmed
|
|
120
|
+
cascade delete would drop `details` too, so it needs Writer access to both.
|
|
121
|
+
|
|
122
|
+
Referencing another owner's table is a commitment: its Writers' deletes and key
|
|
123
|
+
updates apply your foreign key's action to your rows.
|
|
124
|
+
|
|
125
|
+
**Seeing the effects first.** `table.get_impact(action=...)` (or
|
|
126
|
+
`GET /meta-tables/{uid}/impact/`) lists every table a row delete, key update or
|
|
127
|
+
table drop reaches and what happens to each. Cascade effects are information,
|
|
128
|
+
never a reason the action is blocked. Tables you cannot view appear as opaque
|
|
129
|
+
nodes. See [ADR 0016](../adr/api/0016-impact-preflight.md).
|
|
130
|
+
|
|
131
|
+
**SQLite limitation.** In a local SQLite runtime, MetaTables' authorizer is also
|
|
132
|
+
asked about the reads and writes that foreign-key actions make, and it cannot
|
|
133
|
+
tell them apart from the caller's own. A delete or key update on a referenced
|
|
134
|
+
table therefore fails unless the caller can access every referencing table.
|
|
135
|
+
PostgreSQL does not have this limitation; MySQL and SQL Server are pending
|
|
136
|
+
verification against their containers.
|
|
137
|
+
|
|
84
138
|
## Choosing the right page
|
|
85
139
|
|
|
86
140
|
A Writer uses the table page for data, schema, updater, deletion, and sharing
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "mainsequence-metatable"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.18.dev30"
|
|
8
8
|
description = "Main Sequence MetaTables Python client and standalone API"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13"
|
|
@@ -526,7 +526,6 @@ tests/packaging/test_dev_release_version.py
|
|
|
526
526
|
tests/packaging/test_distribution_sources.py
|
|
527
527
|
tests/packaging/test_editable_build.py
|
|
528
528
|
tests/packaging/test_installed_distribution.py
|
|
529
|
-
tests/permissions/test_cascade_writes.py
|
|
530
529
|
tests/permissions/test_governed_sql_scope.py
|
|
531
530
|
tests/permissions/test_local_actor_membership.py
|
|
532
531
|
tests/permissions/test_migration_boundary.py
|
|
@@ -87,9 +87,6 @@ class DatabaseAccess:
|
|
|
87
87
|
deleted or their keys updated, as (schema, table, on_delete, on_update)."""
|
|
88
88
|
raise NotImplementedError
|
|
89
89
|
|
|
90
|
-
def relation_key(self, schema, table):
|
|
91
|
-
return schema, table
|
|
92
|
-
|
|
93
90
|
def refresh_policies(self, session):
|
|
94
91
|
tables = list(
|
|
95
92
|
session.scalars(
|
|
@@ -191,15 +188,6 @@ class DatabaseAccess:
|
|
|
191
188
|
memberships.add((login, role("user", principal.user_uid, write)))
|
|
192
189
|
for team in principal.teams:
|
|
193
190
|
memberships.add((login, role("team", team, write)))
|
|
194
|
-
cascades = {
|
|
195
|
-
self.relation_key(p.schema_name or "main", p.table_name): {
|
|
196
|
-
self.relation_key(t["schema"], t["table"]) for t in p.cascade_targets or ()
|
|
197
|
-
}
|
|
198
|
-
for p in policies.values()
|
|
199
|
-
}
|
|
200
|
-
privileges = restrict_cascading_writes(
|
|
201
|
-
roles, memberships, privileges, cascades, key=self.relation_key
|
|
202
|
-
)
|
|
203
191
|
return dict(roles=roles, memberships=sorted(memberships), privileges=sorted(privileges))
|
|
204
192
|
|
|
205
193
|
def reconcile(self, session, *, inspect_objects=False):
|
|
@@ -310,51 +298,6 @@ def referential_action(value):
|
|
|
310
298
|
return str(value).strip().lower().replace("_", " ")
|
|
311
299
|
|
|
312
300
|
|
|
313
|
-
def restrict_cascading_writes(roles, memberships, privileges, cascades, key=lambda *r: r):
|
|
314
|
-
"""Keep a write grant only while every login reaching it may write what its cascades modify.
|
|
315
|
-
|
|
316
|
-
Databases run foreign-key actions as the table owner, so a cascade into a
|
|
317
|
-
table the caller cannot write would bypass that table's grants (ADR 0007).
|
|
318
|
-
Unregistered targets are writable by nobody. Revocations repeat until stable
|
|
319
|
-
because a withdrawn grant can invalidate another table's cascade.
|
|
320
|
-
"""
|
|
321
|
-
parents = {}
|
|
322
|
-
for member, parent in memberships:
|
|
323
|
-
parents.setdefault(member, set()).add(parent)
|
|
324
|
-
reach = {}
|
|
325
|
-
for login in (name for name, definition in roles.items() if definition["login"]):
|
|
326
|
-
reached, frontier = {login}, [login]
|
|
327
|
-
while frontier:
|
|
328
|
-
for parent in parents.get(frontier.pop(), ()):
|
|
329
|
-
if parent not in reached:
|
|
330
|
-
reached.add(parent)
|
|
331
|
-
frontier.append(parent)
|
|
332
|
-
reach[login] = reached
|
|
333
|
-
privileges = set(privileges)
|
|
334
|
-
while True:
|
|
335
|
-
writes = {}
|
|
336
|
-
for name, schema, table, allowed in privileges:
|
|
337
|
-
if allowed:
|
|
338
|
-
writes.setdefault(name, set()).add(key(schema, table))
|
|
339
|
-
effective = {
|
|
340
|
-
login: set().union(*(writes.get(name, ()) for name in reached))
|
|
341
|
-
for login, reached in reach.items()
|
|
342
|
-
}
|
|
343
|
-
denied = {
|
|
344
|
-
entry
|
|
345
|
-
for entry in privileges
|
|
346
|
-
if entry[3]
|
|
347
|
-
and any(
|
|
348
|
-
entry[0] in reached
|
|
349
|
-
and not cascades.get(key(*entry[1:3]), set()) <= effective[login]
|
|
350
|
-
for login, reached in reach.items()
|
|
351
|
-
)
|
|
352
|
-
}
|
|
353
|
-
if not denied:
|
|
354
|
-
return privileges
|
|
355
|
-
privileges = (privileges - denied) | {(*entry[:3], False) for entry in denied}
|
|
356
|
-
|
|
357
|
-
|
|
358
301
|
def install_session_security(session, resolver):
|
|
359
302
|
"""Attach the runtime resolver to a catalog unit of work, not to global auth."""
|
|
360
303
|
session.info["sql_security_resolver"] = resolver
|
|
@@ -319,17 +319,6 @@ class MySQLCatalog(HostedCatalog):
|
|
|
319
319
|
).scalar()
|
|
320
320
|
if trigger:
|
|
321
321
|
raise SQLExecutionError(code="triggered_sql_write_unsupported")
|
|
322
|
-
affected = connection.execute(
|
|
323
|
-
sa.text(
|
|
324
|
-
"SELECT CONSTRAINT_SCHEMA, TABLE_NAME "
|
|
325
|
-
"FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE UNIQUE_CONSTRAINT_SCHEMA=:schema "
|
|
326
|
-
"AND REFERENCED_TABLE_NAME=:table AND (DELETE_RULE IN ('CASCADE','SET NULL') "
|
|
327
|
-
"OR UPDATE_RULE IN ('CASCADE','SET NULL'))"
|
|
328
|
-
),
|
|
329
|
-
{"schema": schema, "table": table},
|
|
330
|
-
).all()
|
|
331
|
-
if any((s, n) not in writable for s, n in affected):
|
|
332
|
-
raise SQLExecutionError(code="unscoped_cascade_denied")
|
|
333
322
|
|
|
334
323
|
|
|
335
324
|
class MSSQLCatalog(HostedCatalog):
|
|
@@ -492,15 +481,3 @@ class MSSQLCatalog(HostedCatalog):
|
|
|
492
481
|
{"uid": row.object_id},
|
|
493
482
|
).scalar():
|
|
494
483
|
raise SQLExecutionError(code="triggered_sql_write_unsupported")
|
|
495
|
-
affected = connection.execute(
|
|
496
|
-
sa.text(
|
|
497
|
-
"SELECT s.name, t.name FROM sys.foreign_keys f "
|
|
498
|
-
"JOIN sys.tables t ON t.object_id=f.parent_object_id JOIN sys.schemas s ON s.schema_id=t.schema_id "
|
|
499
|
-
"WHERE f.referenced_object_id=:uid AND (f.delete_referential_action>0 OR f.update_referential_action>0)"
|
|
500
|
-
),
|
|
501
|
-
{"uid": row.object_id},
|
|
502
|
-
).all()
|
|
503
|
-
if any(
|
|
504
|
-
(s, n) not in writable and ("public", n) not in writable for s, n in affected
|
|
505
|
-
):
|
|
506
|
-
raise SQLExecutionError(code="unscoped_cascade_denied")
|
|
@@ -57,13 +57,11 @@ class HostedAccess(DatabaseAccess):
|
|
|
57
57
|
self.backend.tables.relations.validate_runtime_view(connection, schema, table.physical_table_name)
|
|
58
58
|
return False
|
|
59
59
|
# Existing adapter inspection runs once here, never during caller SQL.
|
|
60
|
-
# Cascade targets are in scope: plan() narrows write to callers who can write them.
|
|
61
|
-
relation = (schema, table.physical_table_name)
|
|
62
60
|
try:
|
|
63
61
|
self.backend.catalog.validate_relations(
|
|
64
62
|
connection,
|
|
65
|
-
{
|
|
66
|
-
{
|
|
63
|
+
{(schema, table.physical_table_name)},
|
|
64
|
+
{(schema, table.physical_table_name)},
|
|
67
65
|
)
|
|
68
66
|
except SQLExecutionError as exc:
|
|
69
67
|
if exc.code == "triggered_sql_write_unsupported":
|
|
@@ -75,10 +75,6 @@ class SQLiteAccess(DatabaseAccess):
|
|
|
75
75
|
)
|
|
76
76
|
return targets
|
|
77
77
|
|
|
78
|
-
def relation_key(self, schema, table):
|
|
79
|
-
# One database; the authorizer matches table names only.
|
|
80
|
-
return table
|
|
81
|
-
|
|
82
78
|
def apply(self, session, desired, previous):
|
|
83
79
|
# The immutable grant snapshot is installed on each dedicated connection.
|
|
84
80
|
return None
|
|
@@ -13,7 +13,6 @@ from uuid import UUID
|
|
|
13
13
|
from sqlalchemy import select
|
|
14
14
|
from sqlalchemy.orm import Session
|
|
15
15
|
|
|
16
|
-
from metatables.api.backend.backends.access import restrict_cascading_writes
|
|
17
16
|
from metatables.api.backend.domain.catalog_rules import CatalogInvariantError
|
|
18
17
|
from metatables.api.backend.domain.permission_rules import TrustedActorFacts
|
|
19
18
|
from metatables.api.backend.persistence.grants import GrantRepository
|
|
@@ -178,29 +177,13 @@ class _Graph:
|
|
|
178
177
|
.where(MetaTable.data_source_uid == root.data_source_uid)
|
|
179
178
|
)
|
|
180
179
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
editable = self.planner._uids(uids, edit=True)
|
|
187
|
-
privileges = {
|
|
188
|
-
("caller", key, None, True)
|
|
189
|
-
for key, policy in self.policies.items()
|
|
180
|
+
# A table's write is its own grant; foreign keys that reference it never change it.
|
|
181
|
+
editable = self.planner._uids({policy.table_uid for policy in self.policies.values()}, edit=True)
|
|
182
|
+
self.writable = {
|
|
183
|
+
policy.table_uid
|
|
184
|
+
for policy in self.policies.values()
|
|
190
185
|
if self.read_write and policy.writable and policy.table_uid in editable
|
|
191
186
|
}
|
|
192
|
-
cascades = {
|
|
193
|
-
key: {self.key(t["schema"], t["table"]) for t in policy.cascade_targets or ()}
|
|
194
|
-
for key, policy in self.policies.items()
|
|
195
|
-
}
|
|
196
|
-
kept = restrict_cascading_writes(
|
|
197
|
-
{"caller": {"login": "caller"}},
|
|
198
|
-
[],
|
|
199
|
-
privileges,
|
|
200
|
-
cascades,
|
|
201
|
-
key=lambda key, _: key,
|
|
202
|
-
)
|
|
203
|
-
return {self.policies[key].table_uid for _, key, _, allowed in kept if allowed}
|
|
204
187
|
|
|
205
188
|
def load(self, uids) -> None:
|
|
206
189
|
missing = set(uids) - set(self.tables)
|
|
@@ -238,7 +221,7 @@ class _Graph:
|
|
|
238
221
|
"physical_schema": table.physical_schema,
|
|
239
222
|
"physical_table_name": table.physical_table_name,
|
|
240
223
|
"effects": [],
|
|
241
|
-
"can_write": table.uid in self.
|
|
224
|
+
"can_write": table.uid in self.writable,
|
|
242
225
|
}
|
|
243
226
|
|
|
244
227
|
def relation(self, schema: str, table: str, effect: str) -> str:
|
|
@@ -310,16 +293,10 @@ class _Graph:
|
|
|
310
293
|
continue
|
|
311
294
|
child_key = self.key(target["schema"], target["table"])
|
|
312
295
|
row_effect = "delete" if effect == "cascade_delete" else "update"
|
|
296
|
+
# The referencing table's own foreign key authorizes these effects.
|
|
313
297
|
child = self.policies.get(child_key)
|
|
314
298
|
if child is None:
|
|
315
299
|
child_id = self.relation(target["schema"], target["table"], row_effect)
|
|
316
|
-
self.blockers.append(
|
|
317
|
-
Blocker(
|
|
318
|
-
"cascade_target_unregistered",
|
|
319
|
-
"A foreign-key action modifies a table MetaTables does not manage.",
|
|
320
|
-
child_id,
|
|
321
|
-
)
|
|
322
|
-
)
|
|
323
300
|
else:
|
|
324
301
|
affected.add(child.table_uid)
|
|
325
302
|
child_id = self.table(child.table_uid, row_effect)
|
|
@@ -346,27 +323,13 @@ class _Graph:
|
|
|
346
323
|
edge = self._edge(key.source_table_uid, key.target_table_uid, "foreign_key", "restrict")
|
|
347
324
|
edge.update(name=key.name, on_delete=key.on_delete)
|
|
348
325
|
self.edges.append(edge)
|
|
349
|
-
|
|
350
|
-
for uid in sorted(affected, key=str):
|
|
351
|
-
node_id = self.table(uid)
|
|
352
|
-
policy = policies.get(uid)
|
|
353
|
-
if uid not in editable:
|
|
354
|
-
code, message = "table_not_writable", "You cannot write an affected table."
|
|
355
|
-
elif policy is None or not policy.writable:
|
|
356
|
-
code, message = "writes_unsupported", "An affected table does not accept writes."
|
|
357
|
-
elif uid not in self.database_writable and uid != self.root.uid:
|
|
358
|
-
code, message = "cascade_target_not_writable", "A cascade reaches a table you cannot write."
|
|
359
|
-
else:
|
|
360
|
-
continue
|
|
361
|
-
self.blockers.append(Blocker(code, message, node_id))
|
|
362
|
-
if self.root.uid not in self.database_writable and not self.blockers:
|
|
363
|
-
# Write is all-or-nothing: another action of this table's keys may reach further.
|
|
326
|
+
if not self.planner._uids({self.root.uid}, edit=True):
|
|
364
327
|
self.blockers.append(
|
|
365
|
-
Blocker(
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
)
|
|
328
|
+
Blocker("table_not_writable", "You cannot write this table.", root_id)
|
|
329
|
+
)
|
|
330
|
+
elif root_policy is None or not root_policy.writable:
|
|
331
|
+
self.blockers.append(
|
|
332
|
+
Blocker("writes_unsupported", "This table does not accept writes.", root_id)
|
|
370
333
|
)
|
|
371
334
|
|
|
372
335
|
def readers(self) -> None:
|
|
@@ -105,7 +105,7 @@ class SQLTablePolicy(Base):
|
|
|
105
105
|
table_name: Mapped[str] = mapped_column(String(255), nullable=False)
|
|
106
106
|
writable: Mapped[bool] = mapped_column(Boolean, nullable=False)
|
|
107
107
|
# {schema, table, on_delete, on_update} per foreign key whose actions modify
|
|
108
|
-
# another table;
|
|
108
|
+
# another table; read by the impact pre-flight (ADR 0016).
|
|
109
109
|
cascade_targets: Mapped[list | None] = mapped_column(JSON, default=list)
|
|
110
110
|
|
|
111
111
|
|
{mainsequence_metatable-0.1.17.dev29 → mainsequence_metatable-0.1.18.dev30}/src/metatables/models.py
RENAMED
|
@@ -1138,7 +1138,7 @@ class MetaTableImpactNode(BasePydanticModel):
|
|
|
1138
1138
|
)
|
|
1139
1139
|
can_write: bool | None = Field(
|
|
1140
1140
|
default=None,
|
|
1141
|
-
description="
|
|
1141
|
+
description="Whether the caller may write this table; None for updates.",
|
|
1142
1142
|
)
|
|
1143
1143
|
|
|
1144
1144
|
|