mainsequence-metatable 0.1.15__tar.gz → 0.1.16.dev28__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.15/src/mainsequence_metatable.egg-info → mainsequence_metatable-0.1.16.dev28}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/pyproject.toml +1 -1
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28/src/mainsequence_metatable.egg-info}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/mainsequence_metatable.egg-info/SOURCES.txt +1 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/bootstrap.py +16 -9
- mainsequence_metatable-0.1.16.dev28/src/metatables/api/app/error_logging.py +41 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/main.py +14 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/data_sources.py +12 -12
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/managed_finalize.py +6 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/run_logs.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/runtime_context.py +9 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/security.py +4 -4
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/table_delete.py +5 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/table_import.py +9 -9
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/table_introspection.py +1 -1
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/table_sql.py +1 -1
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/runtime.py +4 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/runtime_control.py +5 -5
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/runtime_database.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/source_passwords.py +5 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/access.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +12 -10
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +4 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +4 -4
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +4 -4
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +4 -4
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +3 -3
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +1 -1
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +3 -3
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/source_validation.py +4 -4
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +4 -4
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/catalog.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/hosted_access.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/postgresql_access.py +6 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/registry.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/relation_tables.py +20 -15
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/relational.py +18 -15
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/restricted_sql.py +6 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/timescale.py +10 -5
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/integrations/catalog_data_sources.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/integrations/credential_keys.py +14 -14
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/integrations/credential_store.py +6 -6
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/integrations/local_credentials.py +12 -8
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/integrations/platform_principals.py +6 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/integrations/run_logs.py +12 -6
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/integrations/runtime_binding.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/operations/import_relations.py +7 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/cli/admin_install.py +5 -5
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/cli/app.py +11 -7
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/cli/local.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/cli/project.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/local_connection.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/local_files.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/log_contract.py +7 -4
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/models.py +1 -1
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/run_logging.py +5 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/transfer_contract.py +4 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/updaters/runner.py +2 -2
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/updaters/updaters.py +2 -1
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_catalog_outage.py +5 -1
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/uv.lock +1 -1
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/.agents/skills/client/metatables-meta-tables/SKILL.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/.mainsequence/workflows/metatables-api.yaml +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/LICENSE +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/MANIFEST.in +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/README.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/alembic.ini +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/compose.database-tests.yml +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0004-approved-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0006-historical-run-graphs.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0007-database-enforced-table-access.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0009-shared-credential-store.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0013-application-owned-migrations.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/adr/index.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/api/authentication-and-errors.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/api/data-sources.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/api/openapi.json +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/api/overview.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/api/reference.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/api/tables-and-migrations.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/api/time-index-and-updates.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/assets/branding/metatables.svg +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/assets/diagrams/local-client-experience.svg +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/client/bounded-transfers.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/client/build-an-updater.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/client/define-and-migrate-tables.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/client/deploy-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/client/installation-and-connection.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/client/local-storage.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/client/query-and-mutate.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/client/quickstart.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/client/read-existing-time-index-tables.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/client/register-existing-tables.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/client/tutorial.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/client/upgrade-legacy-app.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/concepts/architecture.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/concepts/data-sources.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/concepts/identity-and-scope.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/concepts/permissions-namespaces-labels.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/concepts/runs-and-execution-graphs.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/concepts/time-index-tables-and-updates.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/contributing/architecture-and-boundaries.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/contributing/database-backends.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/contributing/documentation.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/contributing/releasing.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/contributing/testing.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/README.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/query.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/index.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/operations/catalog-migrations.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/operations/configuration.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/operations/hosted-runtime.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/operations/local-runtime.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/operations/recovery-and-observability.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/operations/run-history.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/operations/run-logs.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/reference/capabilities.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/reference/cli.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/reference/python.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/security/index.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/security/ownership-and-sharing.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/docs/security/permissions.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/mkdocs.yml +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/scripts/build_reference.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/scripts/check_boundaries.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/scripts/check_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/scripts/check_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/scripts/check_docs.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/scripts/check_examples_debug.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/scripts/check_project.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/scripts/dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/scripts/test_databases.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/scripts/test_postgresql.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/setup.cfg +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/_admin_source.json +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/_build.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/_skill_bundle.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/auth/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/auth/boundary.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/auth/caller_assertions.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/auth/local_actor.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/configuration.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/credential_admin.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/development.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/development_client.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/platform_cache.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/column_search.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/contract_validation.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/namespaces.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/table_cascade.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/table_crud.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/table_filter.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/table_patch.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/table_registration.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/table_response.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/table_search_document.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/time_index_reads.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/update_batch.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/update_constants.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/update_crud.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/update_details.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/update_graph.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/update_registration.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/update_runs.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/routes/update_statistics.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/transfer.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/catalog_types.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/contracts.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/hosted.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/native.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/operations.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/pages.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/sqlite_access.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/backends/streaming.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/contracts/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/contracts/relation_import.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/contracts/values.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/domain/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/domain/index_statistics.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/domain/label_rules.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/domain/permission_rules.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/domain/update_constants.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/integrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/integrations/source_validation.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/operations/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/operations/create_table.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/operations/introspect_table.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/operations/read_time_index.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/operations/register_catalog.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/operations/search_documents.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/cascade.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/catalog.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/database.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/grants.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/labels.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/locking.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/models.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/projections.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/table_queries.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/table_response.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/update_graph.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/updates.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/metatables/configuration.yaml +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/cli/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/cli/filters.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/cli/migrations.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/cli/skills.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/compiled_sql/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/compiled_sql/mssql.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/compiled_sql/v1.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/dtype_codec.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/endpoint.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/README.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/query.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/future_registry.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/hashing.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/instrumentation.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/alembic.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/connection.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/provider.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/runner.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/scaffold.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/sqlite.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/templates/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/templates/env.py.mako +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/templates/script.py.mako +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/migrations/tls.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/pydantic_metadata.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/runtime.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/runtime_contract.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/schema_names.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/sdk_compat.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/sqlalchemy_contracts.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/storage_layout_contract.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/time_index_table_refs.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/transfer.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/transport.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/update_configuration_contract.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/updaters/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/updaters/configuration.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/updaters/dependencies.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/updaters/managers.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/updaters/namespacing.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/updaters/utils.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/upload.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_bootstrap_failure_cause.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_caller_assertions.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_data_source_identity.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_development_client.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_hosted_environment_target.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_local_mode.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_platform_fact_cache.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_runtime_database.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_runtime_scaffold.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_runtime_selection.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_runtime_storage_binding.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/auth/test_source_passwords.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/catalog/test_catalog_foundation.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/catalog/test_contract_projection.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/catalog/test_database_config.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/catalog/test_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/catalog/test_migration.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/conftest.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/contracts/capabilities.json +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/contracts/client_signatures.json +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/contracts/database_operations.json +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/contracts/test_bounded_transfer.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/contracts/test_compiler_runtime_source.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/contracts/test_relation_batching.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/contracts/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/contracts/test_storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/contracts/test_table_contracts.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/Dockerfile +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/Dockerfile.dockerignore +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/conftest.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/provider/__init__.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/provider/env.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/test_api_contract.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/test_application_migration.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/test_bootstrap_recovery.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/test_catalog_contract.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/test_credential_catalog.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/test_physical_contract.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/test_sql_security.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_backend/test_update_client.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_operations/test_physical_operations.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_operations/test_postgresql_operations.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/database_operations/test_runtime_and_temporal.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/documentation/test_project_checks.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_admin_installation.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_api_endpoint.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_application_owned_migrations.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_client_api_contract.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_client_migration_scaffold.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_client_migration_tls.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_client_package.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_client_signatures.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_client_value_behaviors.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_data_source_registry.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_local_actor_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_local_cli_workflow.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_local_client_selection.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_managed_finalize_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_namespaces_admin_http.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_public_imports.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_remaining_client_routes.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_run_logs.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_runtime_transition.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_runtime_upgrade.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_sdk_local_startup.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_sqlite_runtime.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_table_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_table_filter_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_table_introspection_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_table_patch_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_table_search_document_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_table_stats_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_table_updates_http.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_time_index_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_time_index_reads_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_timescale_policies_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_update_batch_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/e2e/test_update_registration_client_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/examples/test_documented_examples.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/examples/test_postgresql_examples.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/examples/test_setup_launch.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/examples/test_tutorial.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/integrations/test_credential_store.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/integrations/test_data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/integrations/test_local_data_sources.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/integrations/test_local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/integrations/test_postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/integrations/test_postgresql_sql.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/integrations/test_postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/integrations/test_source_validation.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/integrations/test_sqlite_operations.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/labels/test_labels.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/operations/test_create_table_operation.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/operations/test_create_table_postgres.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/operations/test_physical_operation_journal.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/operations/test_register_catalog.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/operations/test_search_documents.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/operations/test_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/packaging/test_client_skills.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/packaging/test_dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/packaging/test_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/packaging/test_editable_build.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/packaging/test_installed_distribution.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/permissions/test_governed_sql_scope.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/permissions/test_local_actor_membership.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/permissions/test_migration_boundary.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/permissions/test_namespace_grants.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/permissions/test_security_api.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/permissions/test_table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/permissions/test_table_grants.py +0 -0
- {mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/tests/permissions/test_table_queries.py +0 -0
|
@@ -172,6 +172,7 @@ src/metatables/api/app/configuration.py
|
|
|
172
172
|
src/metatables/api/app/credential_admin.py
|
|
173
173
|
src/metatables/api/app/development.py
|
|
174
174
|
src/metatables/api/app/development_client.py
|
|
175
|
+
src/metatables/api/app/error_logging.py
|
|
175
176
|
src/metatables/api/app/main.py
|
|
176
177
|
src/metatables/api/app/platform_cache.py
|
|
177
178
|
src/metatables/api/app/runtime.py
|
|
@@ -177,6 +177,7 @@ class RuntimeBootstrap:
|
|
|
177
177
|
raise ValueError("Database heads do not match the migration files")
|
|
178
178
|
result["migration_status"] = "pending" if pending else "up_to_date"
|
|
179
179
|
except Exception:
|
|
180
|
+
logger.warning("Database revision is not compatible with the migration files", exc_info=True)
|
|
180
181
|
result.update(migration_status="incompatible",
|
|
181
182
|
migration_error="The database revision is not compatible with these migration files. Review the migration history before applying changes.")
|
|
182
183
|
return result
|
|
@@ -201,6 +202,7 @@ class RuntimeBootstrap:
|
|
|
201
202
|
self.error = "Multiple legacy local databases are saved. Choose the existing local runtime file in Settings; no database has been replaced."
|
|
202
203
|
return None
|
|
203
204
|
except (OSError, ValueError):
|
|
205
|
+
logger.warning("Saved runtime selection cannot be read", exc_info=True)
|
|
204
206
|
self.error = "Saved runtime selection cannot be read. Configure the DataSource again."
|
|
205
207
|
return None
|
|
206
208
|
if self.workspace:
|
|
@@ -214,9 +216,11 @@ class RuntimeBootstrap:
|
|
|
214
216
|
try:
|
|
215
217
|
self.declaration, candidate, self.credential_store = declared_database(self.config, self.credential_store)
|
|
216
218
|
except RuntimeDatabaseError as exc:
|
|
219
|
+
logger.warning("Declared runtime database is unavailable", exc_info=True)
|
|
217
220
|
self.status, self.error = exc.status, str(exc)
|
|
218
221
|
return None
|
|
219
222
|
except RuntimeError as exc:
|
|
223
|
+
logger.warning("Declared runtime database is incompatible", exc_info=True)
|
|
220
224
|
self.status, self.error = "incompatible", str(exc)
|
|
221
225
|
return None
|
|
222
226
|
return candidate
|
|
@@ -307,6 +311,7 @@ class RuntimeBootstrap:
|
|
|
307
311
|
if script.get_revision(revision) is None:
|
|
308
312
|
raise ValueError("Unknown revision")
|
|
309
313
|
except Exception:
|
|
314
|
+
logger.warning("Database has an unsupported MetaTables migration revision", exc_info=True)
|
|
310
315
|
self.status, self.error = "incompatible", "The database has an unsupported MetaTables migration revision. Earlier development databases require recreation."
|
|
311
316
|
return
|
|
312
317
|
if set(self.current) != set(self.expected):
|
|
@@ -345,8 +350,10 @@ class RuntimeBootstrap:
|
|
|
345
350
|
self.uid = row.uid
|
|
346
351
|
self.status = "ready"
|
|
347
352
|
except (BootstrapError, CatalogConfigurationError) as exc:
|
|
353
|
+
logger.warning("Runtime database is incompatible", exc_info=True)
|
|
348
354
|
self.status, self.error = "incompatible", str(exc)
|
|
349
355
|
except CredentialStoreError as exc:
|
|
356
|
+
logger.warning("Runtime credential store is unavailable", exc_info=True)
|
|
350
357
|
self.status, self.error = "unavailable", exc.message
|
|
351
358
|
except Exception as exc:
|
|
352
359
|
cause = log_failure("Cannot verify the selected database or its Alembic history", exc)
|
|
@@ -422,15 +429,15 @@ class RuntimeBootstrap:
|
|
|
422
429
|
self.inspect()
|
|
423
430
|
if isinstance(exc, CredentialStoreError):
|
|
424
431
|
self.error = exc.message
|
|
425
|
-
raise BootstrapError(exc.message) from
|
|
432
|
+
raise BootstrapError(exc.message) from exc
|
|
426
433
|
from metatables.api.backend.backends.contracts import SQLExecutionError
|
|
427
434
|
if isinstance(exc, SQLExecutionError):
|
|
428
435
|
self.error = f"Database access setup failed ({exc.code}). Check the DataSource password Secret and database permissions, then retry setup."
|
|
429
|
-
raise BootstrapError(self.error) from
|
|
436
|
+
raise BootstrapError(self.error) from exc
|
|
430
437
|
if privilege_error := insufficient_privilege(exc):
|
|
431
438
|
self.error = (f"Database setup failed: {privilege_error}. The DataSource login must own the runtime "
|
|
432
439
|
"database and every object in it; see the DataSource database privileges.")
|
|
433
|
-
raise BootstrapError(self.error) from
|
|
440
|
+
raise BootstrapError(self.error) from exc
|
|
434
441
|
cause = log_failure("MetaTables migration or registration failed", exc)
|
|
435
442
|
self.error = (f"MetaTables migration or registration failed ({cause}). The runtime was not activated; "
|
|
436
443
|
"inspect the database before retrying. The log has the full error.")
|
|
@@ -460,8 +467,8 @@ class RuntimeBootstrap:
|
|
|
460
467
|
stream = stack.enter_context(os.fdopen(descriptor, "a"))
|
|
461
468
|
try:
|
|
462
469
|
fcntl.flock(stream, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
|
463
|
-
except BlockingIOError:
|
|
464
|
-
raise BootstrapError("Another local initialization is in progress. Retry when it finishes.") from
|
|
470
|
+
except BlockingIOError as error:
|
|
471
|
+
raise BootstrapError("Another local initialization is in progress. Retry when it finishes.") from error
|
|
465
472
|
files = local_store_files(self.workspace)
|
|
466
473
|
saved = json.loads(self.saved_path.read_text()) if self.saved_path.exists() else {}
|
|
467
474
|
if "local" in saved:
|
|
@@ -484,7 +491,7 @@ class RuntimeBootstrap:
|
|
|
484
491
|
except BootstrapError:
|
|
485
492
|
raise
|
|
486
493
|
except RuntimeError as exc:
|
|
487
|
-
raise BootstrapError(str(exc)) from
|
|
494
|
+
raise BootstrapError(str(exc)) from exc
|
|
488
495
|
except Exception as exc:
|
|
489
496
|
cause = log_failure("Unable to finish local database destruction", exc)
|
|
490
497
|
message = f"Unable to finish local database destruction ({cause}). Check file access and retry."
|
|
@@ -580,7 +587,7 @@ def mutation(request, caller):
|
|
|
580
587
|
finally:
|
|
581
588
|
control.cancel()
|
|
582
589
|
except BootstrapError as exc:
|
|
583
|
-
raise HTTPException(409, str(exc)) from
|
|
590
|
+
raise HTTPException(409, str(exc)) from exc
|
|
584
591
|
finally:
|
|
585
592
|
value.lock.release()
|
|
586
593
|
|
|
@@ -599,8 +606,8 @@ def configure(body: RuntimeSourceInput, request: Request, caller: AdmittedCaller
|
|
|
599
606
|
value.configure(body, caller.user_uid)
|
|
600
607
|
except BootstrapError:
|
|
601
608
|
raise
|
|
602
|
-
except Exception:
|
|
603
|
-
raise BootstrapError("Invalid runtime DataSource configuration.") from
|
|
609
|
+
except Exception as exc:
|
|
610
|
+
raise BootstrapError("Invalid runtime DataSource configuration.") from exc
|
|
604
611
|
request.app.state.runtime = replace(request.app.state.runtime, data_sources=None, binding=RuntimeStorageBinding())
|
|
605
612
|
return value.descriptor(caller.user_uid, is_admin=caller.is_admin)
|
|
606
613
|
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""Server-side error logs: every failure the API translates keeps its traceback."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
from metatables.log_contract import redact_text
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger("metatables.api")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RedactingFormatter(logging.Formatter):
|
|
11
|
+
"""Mask credential patterns in the message and the rendered traceback."""
|
|
12
|
+
|
|
13
|
+
def format(self, record: logging.LogRecord) -> str:
|
|
14
|
+
return redact_text(super().format(record))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def configure_logging() -> None:
|
|
18
|
+
"""Emit ``metatables.*`` warnings and errors when the host configured no handler."""
|
|
19
|
+
package = logging.getLogger("metatables")
|
|
20
|
+
if package.hasHandlers():
|
|
21
|
+
return
|
|
22
|
+
handler = logging.StreamHandler()
|
|
23
|
+
handler.setFormatter(RedactingFormatter("%(asctime)s %(levelname)s %(name)s: %(message)s"))
|
|
24
|
+
package.addHandler(handler)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def translated_cause(error: BaseException) -> BaseException | None:
|
|
28
|
+
if error.__cause__ is not None:
|
|
29
|
+
return error.__cause__
|
|
30
|
+
return None if error.__suppress_context__ else error.__context__
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def log_translated(request, error: BaseException, status_code: int) -> None:
|
|
34
|
+
"""Log server failures and any exception translated into a client response."""
|
|
35
|
+
if status_code < 500 and translated_cause(error) is None:
|
|
36
|
+
return
|
|
37
|
+
logger.log(
|
|
38
|
+
logging.ERROR if status_code >= 500 else logging.WARNING,
|
|
39
|
+
"%s %s -> %s %s", request.method, request.url.path, status_code, type(error).__name__,
|
|
40
|
+
exc_info=error,
|
|
41
|
+
)
|
{mainsequence_metatable-0.1.15 → mainsequence_metatable-0.1.16.dev28}/src/metatables/api/app/main.py
RENAMED
|
@@ -4,12 +4,15 @@ from contextlib import asynccontextmanager
|
|
|
4
4
|
from uuid import UUID
|
|
5
5
|
|
|
6
6
|
from fastapi import Depends, FastAPI, HTTPException, Request
|
|
7
|
+
from fastapi.exception_handlers import http_exception_handler
|
|
7
8
|
from fastapi.responses import JSONResponse
|
|
8
9
|
from fastapi.routing import APIRoute
|
|
9
10
|
from sqlalchemy.orm import Session
|
|
11
|
+
from starlette.exceptions import HTTPException as StarletteHTTPException
|
|
10
12
|
|
|
11
13
|
from metatables.api.app.auth.boundary import trusted_actor_facts
|
|
12
14
|
from metatables.api.app.auth.local_actor import catalog_session
|
|
15
|
+
from metatables.api.app.error_logging import configure_logging, log_translated
|
|
13
16
|
from metatables.api.app.routes.column_search import router as column_search_router
|
|
14
17
|
from metatables.api.app.routes.contract_validation import router as contract_validation_router
|
|
15
18
|
from metatables.api.app.routes.data_sources import router as data_sources_router
|
|
@@ -99,6 +102,7 @@ from metatables.api.app.routes.update_crud import router as update_crud_router
|
|
|
99
102
|
|
|
100
103
|
|
|
101
104
|
def create_app(config: RuntimeConfig | None = None) -> FastAPI:
|
|
105
|
+
configure_logging()
|
|
102
106
|
selected = config or RuntimeConfig.from_environment()
|
|
103
107
|
|
|
104
108
|
@asynccontextmanager
|
|
@@ -120,12 +124,18 @@ def create_app(config: RuntimeConfig | None = None) -> FastAPI:
|
|
|
120
124
|
service = FastAPI(title="MetaTables API", version="0.1.0", lifespan=lifespan)
|
|
121
125
|
from metatables.api.backend.backends.contracts import SQLExecutionError
|
|
122
126
|
|
|
127
|
+
@service.exception_handler(StarletteHTTPException)
|
|
128
|
+
async def http_error(request, error):
|
|
129
|
+
log_translated(request, error, error.status_code)
|
|
130
|
+
return await http_exception_handler(request, error)
|
|
131
|
+
|
|
123
132
|
@service.exception_handler(SQLExecutionError)
|
|
124
133
|
async def database_access_error(request, error):
|
|
125
134
|
unavailable = error.code in {
|
|
126
135
|
"sql_security_not_initialized", "sql_identity_secret_required",
|
|
127
136
|
"sql_permission_reconciliation_pending", "sql_principal_permission_drift",
|
|
128
137
|
} or error.code.endswith("outcome_unknown")
|
|
138
|
+
log_translated(request, error, 503 if unavailable else 400)
|
|
129
139
|
return JSONResponse(status_code=503 if unavailable else 400,
|
|
130
140
|
content={"detail": {"code": error.code, "detail": error.detail}})
|
|
131
141
|
from metatables.api.app.transfer import TransferMiddleware
|
|
@@ -135,8 +145,9 @@ def create_app(config: RuntimeConfig | None = None) -> FastAPI:
|
|
|
135
145
|
|
|
136
146
|
@service.exception_handler(TransferError)
|
|
137
147
|
async def transfer_error(request, error):
|
|
138
|
-
|
|
139
|
-
|
|
148
|
+
status_code = 408 if isinstance(error, TransferDeadlineError) else 413
|
|
149
|
+
log_translated(request, error, status_code)
|
|
150
|
+
return JSONResponse(status_code=status_code, content={"detail": {"code": str(error)}})
|
|
140
151
|
|
|
141
152
|
service.state.runtime = RuntimeState(config=selected)
|
|
142
153
|
from metatables.api.app.runtime_control import RuntimeControl
|
|
@@ -154,6 +165,7 @@ def create_app(config: RuntimeConfig | None = None) -> FastAPI:
|
|
|
154
165
|
if control is not None:
|
|
155
166
|
control.enter(request)
|
|
156
167
|
except HTTPException as exc:
|
|
168
|
+
log_translated(request, exc, exc.status_code)
|
|
157
169
|
return JSONResponse(status_code=exc.status_code, content={"detail": exc.detail})
|
|
158
170
|
try:
|
|
159
171
|
return await call_next(request)
|
|
@@ -56,9 +56,9 @@ class SourceRoute(APIRoute):
|
|
|
56
56
|
try:
|
|
57
57
|
return await handler(request)
|
|
58
58
|
except RuntimeBindingError as exc:
|
|
59
|
-
raise HTTPException(409, exc.code) from
|
|
59
|
+
raise HTTPException(409, exc.code) from exc
|
|
60
60
|
except CredentialStoreError as exc:
|
|
61
|
-
raise HTTPException(503, exc.message) from
|
|
61
|
+
raise HTTPException(503, exc.message) from exc
|
|
62
62
|
except RequestValidationError as exc:
|
|
63
63
|
# Keep field diagnostics without echoing submitted credentials.
|
|
64
64
|
detail = [{key: error[key] for key in ("loc", "msg", "type")}
|
|
@@ -206,13 +206,13 @@ def test_source_connection(body: SourceCreate, request: Request, actor: TrustedA
|
|
|
206
206
|
source = replace(source, connection=replace(source.connection, **connection_tls))
|
|
207
207
|
validate_connection(source)
|
|
208
208
|
except CredentialStoreError as exc:
|
|
209
|
-
raise HTTPException(503, exc.message) from
|
|
209
|
+
raise HTTPException(503, exc.message) from exc
|
|
210
210
|
except DataSourceIntegrationError as exc:
|
|
211
211
|
if exc.code in {"mysql_driver_unavailable", "mssql_driver_unavailable"}:
|
|
212
|
-
raise HTTPException(503, f"Install the {body.class_type} driver dependencies on the MetaTables API server.") from
|
|
213
|
-
raise HTTPException(503, "Connection failed. Check the host, port, database name, credentials and TLS settings.") from
|
|
214
|
-
except Exception:
|
|
215
|
-
raise HTTPException(503, "Connection failed. Check the host, port, database name, credentials and TLS settings.") from
|
|
212
|
+
raise HTTPException(503, f"Install the {body.class_type} driver dependencies on the MetaTables API server.") from exc
|
|
213
|
+
raise HTTPException(503, "Connection failed. Check the host, port, database name, credentials and TLS settings.") from exc
|
|
214
|
+
except Exception as error:
|
|
215
|
+
raise HTTPException(503, "Connection failed. Check the host, port, database name, credentials and TLS settings.") from error
|
|
216
216
|
return {"ok": True, "message": "Connection succeeded."}
|
|
217
217
|
|
|
218
218
|
|
|
@@ -347,17 +347,17 @@ def validate_source(uid: UUID, request: Request, actor: TrustedActorFacts = Depe
|
|
|
347
347
|
source = resolve_source(row, request_credentials(request, session, actor), binding=binding)
|
|
348
348
|
validate_connection(source)
|
|
349
349
|
except CredentialStoreError as exc:
|
|
350
|
-
raise HTTPException(503, exc.message) from
|
|
350
|
+
raise HTTPException(503, exc.message) from exc
|
|
351
351
|
except DataSourceIntegrationError as exc:
|
|
352
352
|
row.status = "FAILED"
|
|
353
353
|
session.commit()
|
|
354
354
|
if exc.code in {"mysql_driver_unavailable", "mssql_driver_unavailable"}:
|
|
355
|
-
raise HTTPException(503, f"Install the {row.class_type} driver dependencies on the MetaTables API server.") from
|
|
356
|
-
raise HTTPException(503, "DataSource validation failed; check connection configuration and Secret access.") from
|
|
357
|
-
except Exception:
|
|
355
|
+
raise HTTPException(503, f"Install the {row.class_type} driver dependencies on the MetaTables API server.") from exc
|
|
356
|
+
raise HTTPException(503, "DataSource validation failed; check connection configuration and Secret access.") from exc
|
|
357
|
+
except Exception as error:
|
|
358
358
|
row.status = "FAILED"
|
|
359
359
|
session.commit()
|
|
360
|
-
raise HTTPException(503, "DataSource validation failed; check connection configuration and Secret access.") from
|
|
360
|
+
raise HTTPException(503, "DataSource validation failed; check connection configuration and Secret access.") from error
|
|
361
361
|
row.status = "AVAILABLE"
|
|
362
362
|
session.commit()
|
|
363
363
|
return payload(row, actor, binding)
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import logging
|
|
5
6
|
from collections.abc import Callable
|
|
6
7
|
from typing import Any
|
|
7
8
|
from uuid import UUID
|
|
@@ -47,6 +48,8 @@ from metatables.api.backend.persistence.projections import (
|
|
|
47
48
|
resolved_foreign_key_targets,
|
|
48
49
|
)
|
|
49
50
|
|
|
51
|
+
logger = logging.getLogger(__name__)
|
|
52
|
+
|
|
50
53
|
router = APIRouter(prefix="/meta-tables", tags=["MetaTables"])
|
|
51
54
|
|
|
52
55
|
|
|
@@ -157,6 +160,7 @@ def finalize_managed(
|
|
|
157
160
|
physical_table_name=table.physical_table_name,
|
|
158
161
|
)
|
|
159
162
|
except PhysicalIntrospectionError as exc:
|
|
163
|
+
logger.warning("Physical table introspection failed during finalization", exc_info=True)
|
|
160
164
|
if exc.code == "physical_table_not_found":
|
|
161
165
|
if uid == version_root:
|
|
162
166
|
rows.append(_row(table, uid, previous=previous, specialization=specialization,
|
|
@@ -220,6 +224,7 @@ def finalize_managed(
|
|
|
220
224
|
rows.append(_row(table, uid, previous=previous, specialization=specialization,
|
|
221
225
|
exists=True, finalized=previous != "active"))
|
|
222
226
|
except (CatalogInvariantError, ContractValidationError, IntegrityError) as exc:
|
|
227
|
+
logger.warning("Physical table contract could not be reconciled", exc_info=True)
|
|
223
228
|
rows.append(_row(
|
|
224
229
|
table, uid, previous=previous, specialization=specialization, exists=True,
|
|
225
230
|
error={
|
|
@@ -229,6 +234,7 @@ def finalize_managed(
|
|
|
229
234
|
))
|
|
230
235
|
continue
|
|
231
236
|
except (TimescaleError, PhysicalConnectionUnavailable) as exc:
|
|
237
|
+
logger.warning("TimescaleDB hypertable could not be created", exc_info=True)
|
|
232
238
|
rows.append(_row(
|
|
233
239
|
table, uid, previous=previous, specialization=specialization, exists=True,
|
|
234
240
|
error={
|
|
@@ -102,8 +102,8 @@ def update_logs(
|
|
|
102
102
|
if request.query_params.get("run_uid"):
|
|
103
103
|
try:
|
|
104
104
|
statement = statement.where(UpdateRun.uid == UUID(request.query_params["run_uid"]))
|
|
105
|
-
except ValueError:
|
|
106
|
-
raise HTTPException(422, "Invalid run UID.") from
|
|
105
|
+
except ValueError as exc:
|
|
106
|
+
raise HTTPException(422, "Invalid run UID.") from exc
|
|
107
107
|
runs = list(
|
|
108
108
|
session.scalars(statement.order_by(UpdateRun.started_at.desc(), UpdateRun.uid).limit(21))
|
|
109
109
|
)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Authenticated application initialization and effective storage settings."""
|
|
2
2
|
|
|
3
|
+
import logging
|
|
3
4
|
from uuid import UUID
|
|
4
5
|
|
|
5
6
|
from fastapi import APIRouter, Depends, Request, Response
|
|
@@ -13,6 +14,8 @@ from metatables.api.backend.integrations.local_workspace import source_descripto
|
|
|
13
14
|
from metatables.api.backend.integrations.runtime_data_sources import DataSourceIntegrationError
|
|
14
15
|
from metatables.runtime_contract import HostedEnvironment, RuntimeContext
|
|
15
16
|
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
16
19
|
router = APIRouter(tags=["Runtime"])
|
|
17
20
|
|
|
18
21
|
|
|
@@ -31,10 +34,12 @@ def verified_environment(uid: UUID | None) -> HostedEnvironment:
|
|
|
31
34
|
is_production=environment.is_production,
|
|
32
35
|
required_repository_branch=environment.required_repository_branch)
|
|
33
36
|
except ApiError as exc:
|
|
37
|
+
logger.warning("Hosted environment lookup failed", exc_info=True)
|
|
34
38
|
return HostedEnvironment(uid=str(uid), status="not_found" if exc.status_code == 404 else "unavailable")
|
|
35
39
|
except DoesNotExist:
|
|
36
40
|
return HostedEnvironment(uid=str(uid), status="not_found")
|
|
37
41
|
except Exception:
|
|
42
|
+
logger.exception("Hosted environment lookup failed")
|
|
38
43
|
return HostedEnvironment(uid=str(uid), status="unavailable")
|
|
39
44
|
|
|
40
45
|
|
|
@@ -52,6 +57,7 @@ def developer_hosted_environment(cache: PlatformCache[UUID, HostedEnvironment])
|
|
|
52
57
|
uid = get_code_repository_context().organization_environment_uid
|
|
53
58
|
return cached_environment(cache, UUID(uid) if uid else None)
|
|
54
59
|
except Exception:
|
|
60
|
+
logger.exception("Hosted environment resolution failed")
|
|
55
61
|
return HostedEnvironment(uid=None, status="unavailable")
|
|
56
62
|
|
|
57
63
|
|
|
@@ -103,9 +109,12 @@ def runtime_context(
|
|
|
103
109
|
uid = state.binding.source_uid or provider.default_uid()
|
|
104
110
|
metadata = provider.metadata(uid)
|
|
105
111
|
except DataSourceIntegrationError as exc:
|
|
112
|
+
if exc.code != "default_data_source_not_configured":
|
|
113
|
+
logger.warning("Runtime DataSource metadata is unavailable", exc_info=True)
|
|
106
114
|
result["data_source_error"] = "data_source_not_configured" if exc.code == "default_data_source_not_configured" else "data_source_unavailable"
|
|
107
115
|
return result
|
|
108
116
|
except (KeyError, ValueError, RuntimeError, SQLAlchemyError):
|
|
117
|
+
logger.warning("Runtime DataSource metadata is unavailable", exc_info=True)
|
|
109
118
|
result["data_source_error"] = "data_source_unavailable"
|
|
110
119
|
return result
|
|
111
120
|
if metadata is None:
|
|
@@ -74,9 +74,9 @@ def reconcile_database_permissions(actor=Depends(require_admin_actor),
|
|
|
74
74
|
try:
|
|
75
75
|
backend.access.initialize(session)
|
|
76
76
|
session.commit()
|
|
77
|
-
except Exception:
|
|
77
|
+
except Exception as exc:
|
|
78
78
|
session.rollback()
|
|
79
|
-
raise HTTPException(503, "Database permission reconciliation failed; caller SQL remains disabled.") from
|
|
79
|
+
raise HTTPException(503, "Database permission reconciliation failed; caller SQL remains disabled.") from exc
|
|
80
80
|
return {"ok": True, "data_source_uid": str(backend.source.uid)}
|
|
81
81
|
|
|
82
82
|
|
|
@@ -162,7 +162,7 @@ def replace_grants(session, actor, kind, uid, body):
|
|
|
162
162
|
try:
|
|
163
163
|
validate_principal(principal_kind, principal_uid)
|
|
164
164
|
except PrincipalUnavailable as exc:
|
|
165
|
-
raise HTTPException(422, str(exc)) from
|
|
165
|
+
raise HTTPException(422, str(exc)) from exc
|
|
166
166
|
lock_catalog(session)
|
|
167
167
|
session.expire_all()
|
|
168
168
|
row = authorize(session, actor, kind, uid, edit=True)
|
|
@@ -256,7 +256,7 @@ def effective_access(uid: UUID, user_uid: UUID | None = None, without_grant_uid:
|
|
|
256
256
|
identity = validate_principal("user", user_uid)
|
|
257
257
|
teams, _ = platform_facts(identity)
|
|
258
258
|
except PrincipalUnavailable as exc:
|
|
259
|
-
raise HTTPException(422, str(exc)) from
|
|
259
|
+
raise HTTPException(422, str(exc)) from exc
|
|
260
260
|
subject = TrustedActorFacts(user_uid=user_uid, user_active=True, active_team_uids=teams)
|
|
261
261
|
contributions = GrantRepository(session).contributions(table=table, actor=subject)
|
|
262
262
|
remaining = [g for g in contributions if g['grant_uid'] != str(without_grant_uid)]
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import logging
|
|
5
6
|
from collections.abc import Callable
|
|
6
7
|
from uuid import UUID
|
|
7
8
|
|
|
@@ -29,6 +30,8 @@ from metatables.api.backend.persistence.locking import lock_catalog
|
|
|
29
30
|
from metatables.api.backend.persistence.models import MetaTable, MetaTableForeignKey, MetaTableGrant
|
|
30
31
|
from metatables.api.backend.persistence.physical_operations import PhysicalOperationRepository
|
|
31
32
|
|
|
33
|
+
logger = logging.getLogger(__name__)
|
|
34
|
+
|
|
32
35
|
router = APIRouter(prefix="/meta-tables", tags=["MetaTables"])
|
|
33
36
|
|
|
34
37
|
|
|
@@ -41,6 +44,7 @@ def _journal_reconciliation(session: Session, operation_uid: UUID) -> None:
|
|
|
41
44
|
PhysicalOperationRepository(session).require_reconciliation(operation_uid=operation_uid)
|
|
42
45
|
session.commit()
|
|
43
46
|
except SQLAlchemyError:
|
|
47
|
+
logger.exception("Failed to record that the physical delete requires reconciliation")
|
|
44
48
|
session.rollback()
|
|
45
49
|
|
|
46
50
|
|
|
@@ -133,6 +137,7 @@ def destroy_meta_table(
|
|
|
133
137
|
repository.record_failed(operation_uid=operation_uid, safe_error_code=safe_code)
|
|
134
138
|
session.commit()
|
|
135
139
|
except SQLAlchemyError:
|
|
140
|
+
logger.exception("Failed to record the failed physical delete")
|
|
136
141
|
session.rollback()
|
|
137
142
|
status = exc.status_code if isinstance(exc, DataSourceAdmissionError) else 409
|
|
138
143
|
if isinstance(exc, (DataSourceIntegrationError, PhysicalConnectionUnavailable)):
|
|
@@ -40,22 +40,22 @@ def invoke(session, operation):
|
|
|
40
40
|
return operation()
|
|
41
41
|
except RelationError as exc:
|
|
42
42
|
session.rollback()
|
|
43
|
-
raise HTTPException(exc.status, {"code": exc.code}) from
|
|
43
|
+
raise HTTPException(exc.status, {"code": exc.code}) from exc
|
|
44
44
|
except CredentialStoreError as exc:
|
|
45
45
|
session.rollback()
|
|
46
|
-
raise HTTPException(503, {"code": exc.code, "detail": exc.message}) from
|
|
46
|
+
raise HTTPException(503, {"code": exc.code, "detail": exc.message}) from exc
|
|
47
47
|
except (DataSourceIntegrationError, DataSourceAdmissionError, SQLExecutionError) as exc:
|
|
48
48
|
session.rollback()
|
|
49
|
-
raise HTTPException(getattr(exc, "status_code", 409), {"code": exc.code}) from
|
|
50
|
-
except PhysicalConnectionUnavailable:
|
|
49
|
+
raise HTTPException(getattr(exc, "status_code", 409), {"code": exc.code}) from exc
|
|
50
|
+
except PhysicalConnectionUnavailable as error:
|
|
51
51
|
session.rollback()
|
|
52
|
-
raise HTTPException(503, {"code": "relation_access_failed"}) from
|
|
53
|
-
except SQLAlchemyError:
|
|
52
|
+
raise HTTPException(503, {"code": "relation_access_failed"}) from error
|
|
53
|
+
except SQLAlchemyError as error:
|
|
54
54
|
session.rollback()
|
|
55
|
-
raise HTTPException(503, {"code": "relation_catalog_unavailable"}) from
|
|
56
|
-
except ValueError:
|
|
55
|
+
raise HTTPException(503, {"code": "relation_catalog_unavailable"}) from error
|
|
56
|
+
except ValueError as error:
|
|
57
57
|
session.rollback()
|
|
58
|
-
raise HTTPException(422, {"code": "invalid_relation_contract"}) from
|
|
58
|
+
raise HTTPException(422, {"code": "invalid_relation_contract"}) from error
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
@source_router.get("/{source_uid}/relations/", response_model=RelationDiscovery)
|
|
@@ -80,7 +80,7 @@ def introspect_meta_table(
|
|
|
80
80
|
except DataSourceIntegrationError as exc:
|
|
81
81
|
raise HTTPException(status_code=503, detail="DataSource service is unavailable.") from exc
|
|
82
82
|
except RelationError as exc:
|
|
83
|
-
raise HTTPException(status_code=exc.status, detail={"code": exc.code}) from
|
|
83
|
+
raise HTTPException(status_code=exc.status, detail={"code": exc.code}) from exc
|
|
84
84
|
except PhysicalIntrospectionError as exc:
|
|
85
85
|
raise HTTPException(status_code=409, detail=exc.code) from exc
|
|
86
86
|
session.commit()
|
|
@@ -124,7 +124,7 @@ def execute_operation(
|
|
|
124
124
|
try:
|
|
125
125
|
backend.sql.check_wire_contract(payload.dialect, payload.statement.paramstyle)
|
|
126
126
|
except SQLExecutionError as exc:
|
|
127
|
-
raise HTTPException(422, exc.code) from
|
|
127
|
+
raise HTTPException(422, exc.code) from exc
|
|
128
128
|
result = _execute(
|
|
129
129
|
executor,
|
|
130
130
|
backend,
|
|
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import errno
|
|
6
6
|
import ipaddress
|
|
7
7
|
import json
|
|
8
|
+
import logging
|
|
8
9
|
import os
|
|
9
10
|
import socket
|
|
10
11
|
from dataclasses import dataclass, field, replace
|
|
@@ -39,6 +40,8 @@ from metatables.api.backend.integrations.runtime_binding import (
|
|
|
39
40
|
)
|
|
40
41
|
from metatables.runtime_contract import HostedEnvironment
|
|
41
42
|
|
|
43
|
+
logger = logging.getLogger(__name__)
|
|
44
|
+
|
|
42
45
|
LOCAL_TOKEN_HEADER = "X-MetaTables-Local-Token"
|
|
43
46
|
UNSAFE_METHODS = frozenset({"POST", "PUT", "PATCH", "DELETE"})
|
|
44
47
|
|
|
@@ -245,6 +248,7 @@ def initialize_runtime(config: RuntimeConfig) -> RuntimeState:
|
|
|
245
248
|
try:
|
|
246
249
|
bootstrap.configure(candidate, None)
|
|
247
250
|
except Exception:
|
|
251
|
+
logger.exception("Saved or declared runtime configuration is invalid")
|
|
248
252
|
bootstrap.status = "unavailable"
|
|
249
253
|
bootstrap.error = ("Saved runtime configuration is invalid. Configure the DataSource again in Settings."
|
|
250
254
|
if config.local_mode else "The declared runtime database configuration is invalid. "
|
|
@@ -153,7 +153,7 @@ def select_runtime(body: RuntimeSelection, request: Request, background: Backgro
|
|
|
153
153
|
try:
|
|
154
154
|
DeploymentConfiguration.load(control.configuration).require_development()
|
|
155
155
|
except RuntimeError as exc:
|
|
156
|
-
raise HTTPException(403, str(exc)) from
|
|
156
|
+
raise HTTPException(403, str(exc)) from exc
|
|
157
157
|
current = request.app.state.runtime.config.profile
|
|
158
158
|
if body.mode == current:
|
|
159
159
|
return {"mode": current, "restarting": False}
|
|
@@ -168,13 +168,13 @@ def select_runtime(body: RuntimeSelection, request: Request, background: Backgro
|
|
|
168
168
|
except HTTPException:
|
|
169
169
|
control.cancel()
|
|
170
170
|
raise
|
|
171
|
-
except Exception:
|
|
171
|
+
except Exception as error:
|
|
172
172
|
control.cancel()
|
|
173
|
-
raise HTTPException(409, "Unable to switch runtime mode. Check its current operations.") from
|
|
173
|
+
raise HTTPException(409, "Unable to switch runtime mode. Check its current operations.") from error
|
|
174
174
|
try:
|
|
175
175
|
write_state(control.directory / "request.json", {"mode": body.mode})
|
|
176
|
-
except OSError:
|
|
176
|
+
except OSError as error:
|
|
177
177
|
control.cancel()
|
|
178
|
-
raise HTTPException(503, "Unable to record the runtime switch; the current mode remains active.") from
|
|
178
|
+
raise HTTPException(503, "Unable to record the runtime switch; the current mode remains active.") from error
|
|
179
179
|
background.add_task(control.shutdown)
|
|
180
180
|
return {"mode": body.mode, "restarting": True}
|
|
@@ -46,9 +46,9 @@ def read_secret(name: str) -> tuple[UUID, str]:
|
|
|
46
46
|
if not secret.uid or not value:
|
|
47
47
|
raise ValueError("Empty Secret")
|
|
48
48
|
return UUID(str(secret.uid)), value
|
|
49
|
-
except Exception:
|
|
49
|
+
except Exception as exc:
|
|
50
50
|
raise RuntimeDatabaseError("unavailable", f"Cannot read the Environment Secret {name}. Create it in this "
|
|
51
|
-
"Environment, then deploy the API.") from
|
|
51
|
+
"Environment, then deploy the API.") from exc
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
def declaration(config):
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Persist write-only credential fields through the runtime's CredentialStore."""
|
|
2
2
|
|
|
3
|
+
import logging
|
|
3
4
|
from contextlib import contextmanager
|
|
4
5
|
from dataclasses import dataclass
|
|
5
6
|
|
|
@@ -11,6 +12,8 @@ from metatables.api.backend.integrations.credential_store import (
|
|
|
11
12
|
CredentialStoreError,
|
|
12
13
|
)
|
|
13
14
|
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
14
17
|
|
|
15
18
|
@dataclass
|
|
16
19
|
class PasswordConfiguration:
|
|
@@ -34,7 +37,7 @@ def password_configuration(configuration: dict, password: SecretStr | None, cred
|
|
|
34
37
|
prepared.values[field] = str(uid)
|
|
35
38
|
yield prepared
|
|
36
39
|
except CredentialStoreError as exc:
|
|
37
|
-
raise HTTPException(503, exc.message) from
|
|
40
|
+
raise HTTPException(503, exc.message) from exc
|
|
38
41
|
finally:
|
|
39
42
|
if not prepared.saved:
|
|
40
43
|
for uid in reversed(created):
|
|
@@ -43,4 +46,4 @@ def password_configuration(configuration: dict, password: SecretStr | None, cred
|
|
|
43
46
|
except Exception:
|
|
44
47
|
# Local rows roll back with the session. Hosted cleanup
|
|
45
48
|
# compensates only newly created Secrets, never old refs.
|
|
46
|
-
|
|
49
|
+
logger.exception("Failed to delete a newly created credential during rollback")
|
|
@@ -378,8 +378,8 @@ def _after_transaction_end(session, transaction):
|
|
|
378
378
|
if committed and access is not None:
|
|
379
379
|
try:
|
|
380
380
|
access.finish_pending(session.get_bind())
|
|
381
|
-
except Exception:
|
|
382
|
-
raise SQLExecutionError(code="sql_permission_reconciliation_pending") from
|
|
381
|
+
except Exception as exc:
|
|
382
|
+
raise SQLExecutionError(code="sql_permission_reconciliation_pending") from exc
|
|
383
383
|
|
|
384
384
|
|
|
385
385
|
event.listen(Session, "after_commit", _after_commit)
|