mainsequence-metatable 0.1.14__tar.gz → 0.1.15.dev27__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.14 → mainsequence_metatable-0.1.15.dev27}/.agents/skills/client/metatables-meta-tables/SKILL.md +19 -0
- {mainsequence_metatable-0.1.14/src/mainsequence_metatable.egg-info → mainsequence_metatable-0.1.15.dev27}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/pyproject.toml +1 -1
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/scripts/check_boundaries.py +2 -1
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27/src/mainsequence_metatable.egg-info}/PKG-INFO +1 -1
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/mainsequence_metatable.egg-info/SOURCES.txt +1 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_registration.py +28 -8
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/contracts/storage_layouts.py +32 -5
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/sqlalchemy_contracts.py +28 -0
- mainsequence_metatable-0.1.15.dev27/src/metatables/storage_layout_contract.py +27 -0
- mainsequence_metatable-0.1.15.dev27/tests/contracts/test_storage_layouts.py +216 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_remaining_client_routes.py +27 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/uv.lock +1 -1
- mainsequence_metatable-0.1.14/tests/contracts/test_storage_layouts.py +0 -77
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/.mainsequence/workflows/metatables-api.yaml +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/LICENSE +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/MANIFEST.in +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/README.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/alembic.ini +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/compose.database-tests.yml +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0004-approved-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0006-historical-run-graphs.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0007-database-enforced-table-access.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0009-shared-credential-store.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0013-application-owned-migrations.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/adr/index.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/api/authentication-and-errors.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/api/data-sources.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/api/openapi.json +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/api/overview.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/api/reference.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/api/tables-and-migrations.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/api/time-index-and-updates.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/assets/branding/metatables.svg +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/assets/diagrams/local-client-experience.svg +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/client/bounded-transfers.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/client/build-an-updater.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/client/define-and-migrate-tables.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/client/deploy-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/client/installation-and-connection.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/client/local-storage.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/client/query-and-mutate.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/client/quickstart.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/client/read-existing-time-index-tables.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/client/register-existing-tables.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/client/tutorial.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/client/upgrade-legacy-app.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/architecture.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/data-sources.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/identity-and-scope.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/permissions-namespaces-labels.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/runs-and-execution-graphs.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/time-index-tables-and-updates.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/contributing/architecture-and-boundaries.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/contributing/database-backends.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/contributing/documentation.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/contributing/releasing.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/contributing/testing.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/README.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/query.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/index.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/operations/catalog-migrations.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/operations/configuration.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/operations/hosted-runtime.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/operations/local-runtime.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/operations/recovery-and-observability.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/operations/run-history.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/operations/run-logs.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/reference/capabilities.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/reference/cli.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/reference/python.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/security/index.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/security/ownership-and-sharing.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/docs/security/permissions.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/mkdocs.yml +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/scripts/build_reference.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/scripts/check_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/scripts/check_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/scripts/check_docs.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/scripts/check_examples_debug.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/scripts/check_project.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/scripts/dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/scripts/test_databases.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/scripts/test_postgresql.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/setup.cfg +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/_admin_source.json +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/_build.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/_skill_bundle.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/auth/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/auth/boundary.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/auth/caller_assertions.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/auth/local_actor.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/bootstrap.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/configuration.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/credential_admin.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/development.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/development_client.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/main.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/platform_cache.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/column_search.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/contract_validation.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/data_sources.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/managed_finalize.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/namespaces.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/run_logs.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/security.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_cascade.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_crud.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_delete.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_filter.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_import.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_introspection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_patch.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_response.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_search_document.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_sql.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/time_index_reads.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_batch.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_constants.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_crud.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_details.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_graph.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_registration.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_runs.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_statistics.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/runtime.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/runtime_control.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/runtime_database.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/source_passwords.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/transfer.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/access.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/catalog.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/catalog_types.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/contracts.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/hosted.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/hosted_access.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/migration_connection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/native.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/operations.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/pages.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/postgresql_access.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/registry.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/relation_tables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/relational.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/sqlite_access.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/streaming.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/timescale.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/contracts/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/contracts/relation_import.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/contracts/values.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/index_statistics.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/label_rules.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/permission_rules.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/update_constants.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/credential_store.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/run_logs.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/source_validation.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/create_table.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/import_relations.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/introspect_table.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/read_time_index.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/register_catalog.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/search_documents.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/cascade.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/catalog.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/database.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/grants.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/labels.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/locking.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/models.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/projections.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/table_queries.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/table_response.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/update_graph.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/updates.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/metatables/configuration.yaml +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/admin_install.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/app.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/filters.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/local.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/migrations.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/project.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/skills.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/compiled_sql/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/compiled_sql/mssql.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/compiled_sql/v1.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/dtype_codec.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/endpoint.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/README.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/query.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/future_registry.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/hashing.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/instrumentation.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/local_connection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/local_files.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/log_contract.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/alembic.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/connection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/provider.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/runner.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/scaffold.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/sqlite.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/templates/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/templates/env.py.mako +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/templates/script.py.mako +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/tls.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/models.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/pydantic_metadata.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/run_logging.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/runtime.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/runtime_contract.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/schema_names.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/sdk_compat.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/time_index_table_refs.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/transfer.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/transfer_contract.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/transport.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/update_configuration_contract.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/configuration.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/dependencies.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/managers.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/namespacing.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/runner.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/updaters.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/utils.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/src/metatables/upload.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_bootstrap_failure_cause.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_caller_assertions.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_data_source_identity.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_development_client.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_hosted_environment_target.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_local_mode.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_platform_fact_cache.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_runtime_database.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_runtime_scaffold.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_runtime_selection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_runtime_storage_binding.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_source_passwords.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/catalog/test_catalog_foundation.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/catalog/test_contract_projection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/catalog/test_database_config.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/catalog/test_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/catalog/test_migration.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/conftest.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/capabilities.json +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/client_signatures.json +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/database_operations.json +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/test_bounded_transfer.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/test_compiler_runtime_source.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/test_relation_batching.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/test_table_contracts.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/Dockerfile +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/Dockerfile.dockerignore +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/conftest.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/provider/__init__.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/provider/env.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_api_contract.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_application_migration.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_bootstrap_recovery.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_catalog_contract.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_credential_catalog.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_physical_contract.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_sql_security.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_update_client.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_operations/test_physical_operations.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_operations/test_postgresql_operations.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/database_operations/test_runtime_and_temporal.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/documentation/test_project_checks.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_admin_installation.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_api_endpoint.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_application_owned_migrations.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_catalog_outage.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_api_contract.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_migration_scaffold.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_migration_tls.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_package.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_signatures.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_value_behaviors.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_data_source_registry.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_local_actor_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_local_cli_workflow.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_local_client_selection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_managed_finalize_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_namespaces_admin_http.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_public_imports.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_run_logs.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_runtime_transition.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_runtime_upgrade.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_sdk_local_startup.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_sqlite_runtime.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_filter_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_introspection_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_patch_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_search_document_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_stats_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_updates_http.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_time_index_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_time_index_reads_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_timescale_policies_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_update_batch_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_update_registration_client_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/examples/test_documented_examples.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/examples/test_postgresql_examples.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/examples/test_setup_launch.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/examples/test_tutorial.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_credential_store.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_local_data_sources.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_postgresql_sql.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_source_validation.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_sqlite_operations.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/labels/test_labels.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/operations/test_create_table_operation.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/operations/test_create_table_postgres.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/operations/test_physical_operation_journal.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/operations/test_register_catalog.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/operations/test_search_documents.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/operations/test_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/packaging/test_client_skills.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/packaging/test_dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/packaging/test_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/packaging/test_editable_build.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/packaging/test_installed_distribution.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_governed_sql_scope.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_local_actor_membership.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_migration_boundary.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_namespace_grants.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_security_api.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_table_grants.py +0 -0
- {mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_table_queries.py +0 -0
|
@@ -80,6 +80,25 @@ the time name for updater compatibility. The mixin automatically creates the
|
|
|
80
80
|
unique index for the full grain; add only additional lookup indexes. Declare
|
|
81
81
|
`__cadence__` when the stable observation interval is known.
|
|
82
82
|
|
|
83
|
+
The default storage layout names its lookup index by joining the identity
|
|
84
|
+
columns (`__index_names__[1:]`) with `_`. MetaTables never shortens that name: if
|
|
85
|
+
it exceeds 63 characters, registration raises and names the model. Declare an
|
|
86
|
+
explicit `__storage_layout__` with a short `secondary_indexes[0].name` (at most
|
|
87
|
+
59 characters, leaving room for the `_idx` suffix); the other fields must restate
|
|
88
|
+
the grain:
|
|
89
|
+
|
|
90
|
+
```python
|
|
91
|
+
__storage_layout__ = {
|
|
92
|
+
"version": 1,
|
|
93
|
+
"time_index": {"name": "time_index"},
|
|
94
|
+
"identity_dimensions": DIMENSIONS, # __index_names__[1:]
|
|
95
|
+
"index_progress": {"grain": DIMENSIONS},
|
|
96
|
+
"uniqueness": {"columns": ["time_index", *DIMENSIONS]},
|
|
97
|
+
"tail_delete": {"scope_dimensions": DIMENSIONS},
|
|
98
|
+
"secondary_indexes": [{"name": "portfolio_event_lookup", "columns": DIMENSIONS}],
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
83
102
|
Physical names remain stable across schema changes. Evolve through new Alembic
|
|
84
103
|
revisions; do not recompute identity from columns or rewrite applied history.
|
|
85
104
|
|
{mainsequence_metatable-0.1.14 → mainsequence_metatable-0.1.15.dev27}/scripts/check_boundaries.py
RENAMED
|
@@ -22,7 +22,8 @@ SDK_MODULES = frozenset({
|
|
|
22
22
|
'mainsequence.instrumentation', 'mainsequence.logconf', 'mainsequence.server.caller_assertions',
|
|
23
23
|
})
|
|
24
24
|
SHARED_MODULES = frozenset({'metatables.local_connection', 'metatables.local_files', 'metatables.sdk_compat', 'metatables.update_configuration_contract',
|
|
25
|
-
'metatables.transfer_contract', 'metatables.runtime_contract', 'metatables.log_contract', 'metatables.local_run_logs'
|
|
25
|
+
'metatables.transfer_contract', 'metatables.runtime_contract', 'metatables.log_contract', 'metatables.local_run_logs',
|
|
26
|
+
'metatables.storage_layout_contract'})
|
|
26
27
|
# Read-only platform provenance for initialization and endpoint discovery. These exact
|
|
27
28
|
# identifiers are allowed only at the SDK admission/display/discovery boundary; catalog
|
|
28
29
|
# models, constraints and storage policy remain forbidden from owning them.
|
|
@@ -158,6 +158,7 @@ src/metatables/runtime_contract.py
|
|
|
158
158
|
src/metatables/schema_names.py
|
|
159
159
|
src/metatables/sdk_compat.py
|
|
160
160
|
src/metatables/sqlalchemy_contracts.py
|
|
161
|
+
src/metatables/storage_layout_contract.py
|
|
161
162
|
src/metatables/time_index_table_refs.py
|
|
162
163
|
src/metatables/transfer.py
|
|
163
164
|
src/metatables/transfer_contract.py
|
|
@@ -23,6 +23,7 @@ from metatables.api.backend.backends.operations import (
|
|
|
23
23
|
create_physical_table,
|
|
24
24
|
)
|
|
25
25
|
from metatables.api.backend.backends.timescale import TimescaleError, convert_time_index_table
|
|
26
|
+
from metatables.api.backend.contracts.storage_layouts import StorageLayoutValidationError
|
|
26
27
|
from metatables.api.backend.contracts.table_contracts import ContractValidationError
|
|
27
28
|
from metatables.api.backend.domain.catalog_rules import CatalogInvariantError
|
|
28
29
|
from metatables.api.backend.domain.data_source_rules import DataSourceAdmissionError
|
|
@@ -158,16 +159,28 @@ def _registration(payload, *, indexed, actor, session, sources, creator, introsp
|
|
|
158
159
|
return result, source
|
|
159
160
|
|
|
160
161
|
|
|
161
|
-
def _failure(session, exc):
|
|
162
|
+
def _failure(session, exc, *, item=None):
|
|
162
163
|
session.rollback()
|
|
163
|
-
|
|
164
|
+
cause = exc
|
|
165
|
+
if isinstance(exc, HTTPException):
|
|
166
|
+
status, detail, cause = exc.status_code, exc.detail, exc.__cause__
|
|
167
|
+
elif isinstance(exc, DataSourceAdmissionError):
|
|
164
168
|
# Contract rejections name the offending column or index, as contract validation does.
|
|
169
|
+
status = exc.status_code
|
|
165
170
|
detail = exc.code if exc.field == "data_source" else {"code": exc.code, "field": exc.field, "message": str(exc)}
|
|
166
|
-
|
|
167
|
-
if isinstance(exc, (DataSourceIntegrationError, PhysicalConnectionUnavailable, PhysicalTableOutcomeUnknown, SQLAlchemyError)):
|
|
171
|
+
elif isinstance(exc, (DataSourceIntegrationError, PhysicalConnectionUnavailable, PhysicalTableOutcomeUnknown, SQLAlchemyError)):
|
|
168
172
|
raise HTTPException(503, 'Catalog or DataSource is unavailable.') from exc
|
|
169
|
-
|
|
170
|
-
|
|
173
|
+
else:
|
|
174
|
+
status = 409 if isinstance(exc, (PhysicalTableError, PhysicalIntrospectionError, TimescaleError)) else 422
|
|
175
|
+
detail = exc.errors if isinstance(exc, StorageLayoutValidationError) else getattr(exc, 'code', str(exc))
|
|
176
|
+
if item is not None:
|
|
177
|
+
# A bulk rejection names the table it rejects; nothing in the request is reserved.
|
|
178
|
+
position, request = item
|
|
179
|
+
detail = {'item': position, 'identifier': request.identifier,
|
|
180
|
+
'physical_table_name': request.physical_table_name
|
|
181
|
+
or (request.table_contract.get('physical') or {}).get('table_name'),
|
|
182
|
+
'detail': detail}
|
|
183
|
+
raise HTTPException(status, detail) from cause
|
|
171
184
|
|
|
172
185
|
|
|
173
186
|
def _register(payload, response, actor, session, sources, creator, introspector, *, indexed=False):
|
|
@@ -206,18 +219,25 @@ def reserve_tables(payload: list[ReservationRequest] | ReservationRequest, actor
|
|
|
206
219
|
payload = [payload] if single else payload
|
|
207
220
|
if not 1 <= len(payload) <= 200:
|
|
208
221
|
raise HTTPException(422, 'Reserve between 1 and 200 tables.')
|
|
222
|
+
current = None
|
|
209
223
|
try:
|
|
210
224
|
results = []
|
|
211
225
|
resolved_sources = {}
|
|
212
|
-
for item in payload:
|
|
226
|
+
for position, item in enumerate(payload):
|
|
227
|
+
current = (position, item)
|
|
213
228
|
indexed = bool(item.time_index_name or item.table_contract.get('table_kind') == 'time_indexed')
|
|
214
229
|
result, _source = _registration(item, indexed=indexed, actor=actor, session=session,
|
|
215
230
|
sources=sources, creator=None, introspector=None, reserve=True)
|
|
216
231
|
results.append(result.table)
|
|
217
232
|
resolved_sources[_source.uid] = _source
|
|
233
|
+
current = None
|
|
218
234
|
output = project_meta_tables(session, rows=tuple(results), actor=actor, sources=resolved_sources)
|
|
219
235
|
session.commit()
|
|
220
236
|
return output[0] if single else output
|
|
237
|
+
except HTTPException as exc:
|
|
238
|
+
if single or current is None:
|
|
239
|
+
raise
|
|
240
|
+
_failure(session, exc, item=current)
|
|
221
241
|
except (CatalogInvariantError, ContractValidationError, DataSourceAdmissionError,
|
|
222
242
|
DataSourceIntegrationError, PhysicalConnectionUnavailable, SQLAlchemyError, ValueError) as exc:
|
|
223
|
-
_failure(session, exc)
|
|
243
|
+
_failure(session, exc, item=None if single else current)
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import re
|
|
2
1
|
from typing import Any, Literal, Mapping, Optional, Sequence
|
|
3
2
|
|
|
4
3
|
from pydantic import BaseModel, ConfigDict, Field, ValidationError, model_validator
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
from metatables.storage_layout_contract import (
|
|
6
|
+
POSTGRESQL_IDENTIFIER_MAX_LENGTH,
|
|
7
|
+
POSTGRESQL_IDENTIFIER_RE,
|
|
8
|
+
SECONDARY_INDEX_PHYSICAL_SUFFIX,
|
|
9
|
+
default_secondary_index_name,
|
|
10
|
+
derived_secondary_index_name_error,
|
|
11
|
+
)
|
|
7
12
|
|
|
8
13
|
|
|
9
14
|
class StorageLayoutValidationError(ValueError):
|
|
@@ -48,7 +53,11 @@ class StorageLayoutSecondaryIndex(StrictStorageLayoutModel):
|
|
|
48
53
|
if not self.name:
|
|
49
54
|
raise ValueError("secondary index name is required")
|
|
50
55
|
if not POSTGRESQL_IDENTIFIER_RE.match(self.name):
|
|
51
|
-
raise ValueError(
|
|
56
|
+
raise ValueError(
|
|
57
|
+
f"secondary index name {self.name!r} ({len(self.name)} characters) must be "
|
|
58
|
+
"a valid PostgreSQL identifier: letters, digits and underscores, not "
|
|
59
|
+
f"starting with a digit, at most {POSTGRESQL_IDENTIFIER_MAX_LENGTH} characters"
|
|
60
|
+
)
|
|
52
61
|
if not self.columns:
|
|
53
62
|
raise ValueError("secondary index columns are required")
|
|
54
63
|
return self
|
|
@@ -157,7 +166,7 @@ def build_default_storage_layout(
|
|
|
157
166
|
if identity_dimensions:
|
|
158
167
|
secondary_indexes.append(
|
|
159
168
|
{
|
|
160
|
-
"name":
|
|
169
|
+
"name": default_secondary_index_name(identity_dimensions),
|
|
161
170
|
"columns": identity_dimensions,
|
|
162
171
|
"kind": "lookup",
|
|
163
172
|
}
|
|
@@ -190,6 +199,9 @@ def parse_storage_layout(
|
|
|
190
199
|
columns_by_name: Mapping[str, Any],
|
|
191
200
|
) -> DynamicTableStorageLayoutV1:
|
|
192
201
|
if not storage_layout:
|
|
202
|
+
derived_name_error = derived_secondary_index_name_error(list(index_names or [])[1:])
|
|
203
|
+
if derived_name_error:
|
|
204
|
+
raise StorageLayoutValidationError({"secondary_indexes": [derived_name_error]})
|
|
193
205
|
storage_layout = build_default_storage_layout(
|
|
194
206
|
time_index_name=time_index_name,
|
|
195
207
|
index_names=index_names,
|
|
@@ -225,7 +237,22 @@ def render_postgresql_physical_index_plan(
|
|
|
225
237
|
}
|
|
226
238
|
|
|
227
239
|
for secondary_index in storage_layout.secondary_indexes:
|
|
228
|
-
|
|
240
|
+
physical_name = f"{secondary_index.name}{SECONDARY_INDEX_PHYSICAL_SUFFIX}"
|
|
241
|
+
if len(physical_name) > POSTGRESQL_IDENTIFIER_MAX_LENGTH:
|
|
242
|
+
# PostgreSQL would silently truncate the name; raise instead.
|
|
243
|
+
raise StorageLayoutValidationError(
|
|
244
|
+
{
|
|
245
|
+
"secondary_indexes": [
|
|
246
|
+
f"Physical index name {physical_name!r} ({len(physical_name)} "
|
|
247
|
+
"characters) exceeds the PostgreSQL limit of "
|
|
248
|
+
f"{POSTGRESQL_IDENTIFIER_MAX_LENGTH} characters. Use a secondary "
|
|
249
|
+
"index name of at most "
|
|
250
|
+
f"{POSTGRESQL_IDENTIFIER_MAX_LENGTH - len(SECONDARY_INDEX_PHYSICAL_SUFFIX)} "
|
|
251
|
+
"characters."
|
|
252
|
+
]
|
|
253
|
+
}
|
|
254
|
+
)
|
|
255
|
+
plan[physical_name] = {
|
|
229
256
|
"type": "INDEX",
|
|
230
257
|
"query": (
|
|
231
258
|
f"USING {postgresql_hints.secondary_index_method.upper()} "
|
|
@@ -29,6 +29,7 @@ from metatables.models import (
|
|
|
29
29
|
SchemaManagementRequest,
|
|
30
30
|
TimeIndexMetaTable,
|
|
31
31
|
)
|
|
32
|
+
from metatables.storage_layout_contract import derived_secondary_index_name_error
|
|
32
33
|
|
|
33
34
|
from .hashing import build_meta_table_configured_storage_hash
|
|
34
35
|
from .schema_names import schema_index_name
|
|
@@ -526,6 +527,11 @@ def time_indexed_registration_request_from_sqlalchemy_model(
|
|
|
526
527
|
time_index_name=resolved_time_index_name,
|
|
527
528
|
index_names=resolved_index_names,
|
|
528
529
|
)
|
|
530
|
+
_validate_default_storage_layout(
|
|
531
|
+
model_or_table,
|
|
532
|
+
storage_layout=resolved_storage_layout,
|
|
533
|
+
index_names=resolved_index_names,
|
|
534
|
+
)
|
|
529
535
|
|
|
530
536
|
column_contracts = [
|
|
531
537
|
_column_contract(column, ordinal_position=position).model_dump(
|
|
@@ -1463,6 +1469,28 @@ def _validate_time_index_contract(
|
|
|
1463
1469
|
)
|
|
1464
1470
|
|
|
1465
1471
|
|
|
1472
|
+
def _validate_default_storage_layout(
|
|
1473
|
+
model_or_table: Any,
|
|
1474
|
+
*,
|
|
1475
|
+
storage_layout: Mapping[str, Any] | None,
|
|
1476
|
+
index_names: Sequence[str],
|
|
1477
|
+
) -> None:
|
|
1478
|
+
# The API applies the same rule; checking here names the model before any request.
|
|
1479
|
+
if storage_layout:
|
|
1480
|
+
return
|
|
1481
|
+
error = derived_secondary_index_name_error([str(name) for name in index_names][1:])
|
|
1482
|
+
if error:
|
|
1483
|
+
module, qualname = _resolve_model_path(
|
|
1484
|
+
model_or_table,
|
|
1485
|
+
table_model_module=None,
|
|
1486
|
+
table_model_qualname=None,
|
|
1487
|
+
)
|
|
1488
|
+
raise ValueError(
|
|
1489
|
+
f"PlatformTimeIndexMetaTable {module}.{qualname} cannot use the default "
|
|
1490
|
+
f"storage layout. {error}"
|
|
1491
|
+
)
|
|
1492
|
+
|
|
1493
|
+
|
|
1466
1494
|
def _ensure_time_index_unique_grain_index(
|
|
1467
1495
|
*,
|
|
1468
1496
|
table: Any,
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Storage-layout naming rules shared by the client and the API."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from typing import Sequence
|
|
5
|
+
|
|
6
|
+
POSTGRESQL_IDENTIFIER_MAX_LENGTH = 63
|
|
7
|
+
POSTGRESQL_IDENTIFIER_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_]{0,62}$")
|
|
8
|
+
SECONDARY_INDEX_PHYSICAL_SUFFIX = "_idx"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def default_secondary_index_name(identity_dimensions: Sequence[str]) -> str:
|
|
12
|
+
return "_".join(identity_dimensions)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def derived_secondary_index_name_error(identity_dimensions: Sequence[str]) -> str | None:
|
|
16
|
+
"""Explain why the default name is unusable; derived names are never shortened."""
|
|
17
|
+
name = default_secondary_index_name(identity_dimensions)
|
|
18
|
+
if not identity_dimensions or POSTGRESQL_IDENTIFIER_RE.match(name):
|
|
19
|
+
return None
|
|
20
|
+
return (
|
|
21
|
+
f"The default secondary index name {name!r} ({len(name)} characters) is derived "
|
|
22
|
+
f"by joining identity_dimensions {list(identity_dimensions)!r} and is not a valid "
|
|
23
|
+
f"PostgreSQL identifier of at most {POSTGRESQL_IDENTIFIER_MAX_LENGTH} characters. "
|
|
24
|
+
"MetaTables does not shorten derived names. Declare an explicit storage_layout "
|
|
25
|
+
"(__storage_layout__ on a PlatformTimeIndexMetaTable model) whose secondary index "
|
|
26
|
+
"has a valid name."
|
|
27
|
+
)
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"""Time-index table contract behavior."""
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from metatables.api.backend.contracts.storage_layouts import (
|
|
6
|
+
StorageLayoutValidationError,
|
|
7
|
+
normalize_storage_layout,
|
|
8
|
+
render_physical_index_plan,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_default_layout_preserves_time_first_identity_and_physical_index_plan():
|
|
13
|
+
columns = {"observation_time": "timestamptz", "asset_uid": "uuid", "price": "numeric"}
|
|
14
|
+
layout = normalize_storage_layout(
|
|
15
|
+
None,
|
|
16
|
+
time_index_name="observation_time",
|
|
17
|
+
index_names=["observation_time", "asset_uid"],
|
|
18
|
+
columns_by_name=columns,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
assert layout["identity_dimensions"] == ["asset_uid"]
|
|
22
|
+
assert layout["uniqueness"]["columns"] == ["observation_time", "asset_uid"]
|
|
23
|
+
assert layout["tail_delete"]["scope_dimensions"] == ["asset_uid"]
|
|
24
|
+
|
|
25
|
+
index_plan = render_physical_index_plan(
|
|
26
|
+
layout,
|
|
27
|
+
time_index_name="observation_time",
|
|
28
|
+
index_names=["observation_time", "asset_uid"],
|
|
29
|
+
columns_by_name=columns,
|
|
30
|
+
)
|
|
31
|
+
assert index_plan["time_idx"]["query"] == 'USING BRIN ("observation_time")'
|
|
32
|
+
assert index_plan["asset_uid_idx"]["query"] == 'USING BTREE ("asset_uid")'
|
|
33
|
+
assert index_plan["time_identifier_ev_idx"]["query"] == (
|
|
34
|
+
'("observation_time", "asset_uid")'
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_layout_rejects_dimensions_that_disagree_with_table_contract():
|
|
39
|
+
with pytest.raises(StorageLayoutValidationError) as error:
|
|
40
|
+
normalize_storage_layout(
|
|
41
|
+
{
|
|
42
|
+
"version": 1,
|
|
43
|
+
"time_index": {"name": "observation_time"},
|
|
44
|
+
"identity_dimensions": ["wrong_asset"],
|
|
45
|
+
"index_progress": {"grain": ["wrong_asset"]},
|
|
46
|
+
"uniqueness": {"columns": ["observation_time", "wrong_asset"]},
|
|
47
|
+
"tail_delete": {"scope_dimensions": ["wrong_asset"]},
|
|
48
|
+
},
|
|
49
|
+
time_index_name="observation_time",
|
|
50
|
+
index_names=["observation_time", "asset_uid"],
|
|
51
|
+
columns_by_name={"observation_time": "timestamptz", "asset_uid": "uuid"},
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
assert "identity_dimensions" in error.value.errors
|
|
55
|
+
assert "columns" in error.value.errors
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_layout_rejects_unknown_secondary_index_column():
|
|
59
|
+
with pytest.raises(StorageLayoutValidationError) as error:
|
|
60
|
+
normalize_storage_layout(
|
|
61
|
+
{
|
|
62
|
+
"version": 1,
|
|
63
|
+
"time_index": {"name": "observation_time"},
|
|
64
|
+
"identity_dimensions": [],
|
|
65
|
+
"index_progress": {"grain": []},
|
|
66
|
+
"uniqueness": {"columns": ["observation_time"]},
|
|
67
|
+
"tail_delete": {"scope_dimensions": []},
|
|
68
|
+
"secondary_indexes": [
|
|
69
|
+
{"name": "lookup_idx", "columns": ["missing_column"]}
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
time_index_name="observation_time",
|
|
73
|
+
index_names=["observation_time"],
|
|
74
|
+
columns_by_name={"observation_time": "timestamptz"},
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
assert "secondary_indexes" in error.value.errors
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
LEDGER_DIMENSIONS = ["portfolio_identifier", "event_identifier", "event_revision", "record_identifier"]
|
|
81
|
+
LEDGER_DERIVED_NAME = "portfolio_identifier_event_identifier_event_revision_record_identifier"
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def explicit_layout(dimensions, secondary_index_name):
|
|
85
|
+
return {
|
|
86
|
+
"version": 1,
|
|
87
|
+
"time_index": {"name": "time_index"},
|
|
88
|
+
"identity_dimensions": dimensions,
|
|
89
|
+
"index_progress": {"grain": dimensions},
|
|
90
|
+
"uniqueness": {"columns": ["time_index", *dimensions]},
|
|
91
|
+
"tail_delete": {"scope_dimensions": dimensions},
|
|
92
|
+
"secondary_indexes": [{"name": secondary_index_name, "columns": dimensions}],
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def columns_for(dimensions):
|
|
97
|
+
return {"time_index": "timestamptz", **{name: "text" for name in dimensions}}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def test_default_layout_raises_instead_of_shortening_a_derived_name_over_63_characters():
|
|
101
|
+
with pytest.raises(StorageLayoutValidationError) as error:
|
|
102
|
+
normalize_storage_layout(
|
|
103
|
+
None,
|
|
104
|
+
time_index_name="time_index",
|
|
105
|
+
index_names=["time_index", *LEDGER_DIMENSIONS],
|
|
106
|
+
columns_by_name=columns_for(LEDGER_DIMENSIONS),
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
[message] = error.value.errors["secondary_indexes"]
|
|
110
|
+
assert f"'{LEDGER_DERIVED_NAME}' (70 characters)" in message
|
|
111
|
+
assert "derived by joining identity_dimensions" in message
|
|
112
|
+
assert "does not shorten" in message
|
|
113
|
+
assert "__storage_layout__" in message
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
@pytest.mark.parametrize(
|
|
117
|
+
("dimensions", "valid"),
|
|
118
|
+
[(["a" * 63], True), (["a" * 31, "b" * 32], False)],
|
|
119
|
+
)
|
|
120
|
+
def test_default_layout_accepts_derived_names_up_to_63_characters(dimensions, valid):
|
|
121
|
+
def normalize():
|
|
122
|
+
return normalize_storage_layout(
|
|
123
|
+
None,
|
|
124
|
+
time_index_name="time_index",
|
|
125
|
+
index_names=["time_index", *dimensions],
|
|
126
|
+
columns_by_name=columns_for(dimensions),
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
if valid:
|
|
130
|
+
assert normalize()["secondary_indexes"][0]["name"] == "a" * 63
|
|
131
|
+
else:
|
|
132
|
+
with pytest.raises(StorageLayoutValidationError, match="64 characters"):
|
|
133
|
+
normalize()
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def test_explicit_secondary_index_name_unblocks_long_identity_dimensions():
|
|
137
|
+
layout = normalize_storage_layout(
|
|
138
|
+
explicit_layout(LEDGER_DIMENSIONS, "portfolio_event_record_lookup"),
|
|
139
|
+
time_index_name="time_index",
|
|
140
|
+
index_names=["time_index", *LEDGER_DIMENSIONS],
|
|
141
|
+
columns_by_name=columns_for(LEDGER_DIMENSIONS),
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
assert layout["secondary_indexes"][0]["name"] == "portfolio_event_record_lookup"
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def test_explicit_secondary_index_name_error_shows_the_declared_value():
|
|
148
|
+
with pytest.raises(StorageLayoutValidationError) as error:
|
|
149
|
+
normalize_storage_layout(
|
|
150
|
+
explicit_layout(LEDGER_DIMENSIONS, LEDGER_DERIVED_NAME),
|
|
151
|
+
time_index_name="time_index",
|
|
152
|
+
index_names=["time_index", *LEDGER_DIMENSIONS],
|
|
153
|
+
columns_by_name=columns_for(LEDGER_DIMENSIONS),
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
[message] = error.value.errors["secondary_indexes.0"]
|
|
157
|
+
assert f"'{LEDGER_DERIVED_NAME}' (70 characters)" in message
|
|
158
|
+
assert "derived" not in message
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def test_physical_index_plan_raises_when_the_idx_suffix_would_exceed_63_characters():
|
|
162
|
+
def plan(name):
|
|
163
|
+
return render_physical_index_plan(
|
|
164
|
+
explicit_layout(["asset_uid"], name),
|
|
165
|
+
time_index_name="time_index",
|
|
166
|
+
index_names=["time_index", "asset_uid"],
|
|
167
|
+
columns_by_name=columns_for(["asset_uid"]),
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
assert f"{'a' * 59}_idx" in plan("a" * 59)
|
|
171
|
+
with pytest.raises(StorageLayoutValidationError, match="at most 59 characters"):
|
|
172
|
+
plan("a" * 60)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def test_client_names_the_model_before_sending_an_invalid_derived_name():
|
|
176
|
+
from datetime import datetime
|
|
177
|
+
|
|
178
|
+
from sqlalchemy import DateTime, String
|
|
179
|
+
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
|
180
|
+
|
|
181
|
+
from metatables import (
|
|
182
|
+
PlatformTimeIndexMetaTable,
|
|
183
|
+
time_indexed_registration_request_from_sqlalchemy_model,
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
class Base(DeclarativeBase):
|
|
187
|
+
pass
|
|
188
|
+
|
|
189
|
+
class PortfolioEventLedger(PlatformTimeIndexMetaTable, Base):
|
|
190
|
+
__tablename__ = "ledger__portfolio_event"
|
|
191
|
+
__metatable_namespace__ = "ledger"
|
|
192
|
+
__metatable_identifier__ = "ledger.portfolio_event"
|
|
193
|
+
__index_names__ = ["time_index", *LEDGER_DIMENSIONS]
|
|
194
|
+
|
|
195
|
+
time_index: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False)
|
|
196
|
+
portfolio_identifier: Mapped[str] = mapped_column(String(64), nullable=False)
|
|
197
|
+
event_identifier: Mapped[str] = mapped_column(String(64), nullable=False)
|
|
198
|
+
event_revision: Mapped[str] = mapped_column(String(64), nullable=False)
|
|
199
|
+
record_identifier: Mapped[str] = mapped_column(String(64), nullable=False)
|
|
200
|
+
|
|
201
|
+
with pytest.raises(ValueError, match="cannot use the default storage layout") as error:
|
|
202
|
+
time_indexed_registration_request_from_sqlalchemy_model(
|
|
203
|
+
PortfolioEventLedger, data_source_uid="00000000-0000-0000-0000-000000000001"
|
|
204
|
+
)
|
|
205
|
+
assert f"{__name__}." in str(error.value)
|
|
206
|
+
assert ".PortfolioEventLedger cannot use the default storage layout" in str(error.value)
|
|
207
|
+
assert LEDGER_DERIVED_NAME in str(error.value)
|
|
208
|
+
|
|
209
|
+
PortfolioEventLedger.__storage_layout__ = explicit_layout(
|
|
210
|
+
LEDGER_DIMENSIONS, "portfolio_event_record_lookup"
|
|
211
|
+
)
|
|
212
|
+
request = time_indexed_registration_request_from_sqlalchemy_model(
|
|
213
|
+
PortfolioEventLedger, data_source_uid="00000000-0000-0000-0000-000000000001"
|
|
214
|
+
)
|
|
215
|
+
profile = request.table_contract["authoring"]["time_indexed"]
|
|
216
|
+
assert profile["storage_layout"]["secondary_indexes"][0]["name"] == "portfolio_event_record_lookup"
|
|
@@ -138,6 +138,33 @@ def test_public_registration_bulk_and_time_index_get_or_create(closed_app):
|
|
|
138
138
|
assert not [call for call in f.calls[before:] if call[0] in {'create', 'introspect'}]
|
|
139
139
|
|
|
140
140
|
|
|
141
|
+
|
|
142
|
+
def time_index_reservation(source_uid, name, dimensions):
|
|
143
|
+
columns = [{'name': 'time_index', 'data_type': 'datetime'}, *({'name': d, 'data_type': 'int64'} for d in dimensions)]
|
|
144
|
+
contract = {**CONTRACT, 'columns': columns, 'physical': {'schema': 'public', 'table_name': name},
|
|
145
|
+
'table_kind': 'time_indexed', 'authoring': {'time_indexed': {
|
|
146
|
+
'time_index_name': 'time_index', 'index_names': ['time_index', *dimensions]}}}
|
|
147
|
+
return {**reservation(source_uid, name), 'identifier': f'example.{name}', 'time_index_name': 'time_index',
|
|
148
|
+
'table_contract': contract}
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def test_bulk_reservation_rejection_names_the_failing_table(closed_app):
|
|
152
|
+
f = closed_app
|
|
153
|
+
ledger = time_index_reservation(f.source.uid, 'ledger',
|
|
154
|
+
['portfolio_identifier', 'event_identifier', 'event_revision', 'record_identifier'])
|
|
155
|
+
response = f.http.post('/time-index-meta-tables/', json=[
|
|
156
|
+
time_index_reservation(f.source.uid, 'prices', ['asset_uid']), ledger])
|
|
157
|
+
assert response.status_code == 422
|
|
158
|
+
detail = response.json()['detail']
|
|
159
|
+
assert {key: detail[key] for key in ('item', 'identifier', 'physical_table_name')} == {
|
|
160
|
+
'item': 1, 'identifier': 'example.ledger', 'physical_table_name': 'ledger'}
|
|
161
|
+
[message] = detail['detail']['secondary_indexes']
|
|
162
|
+
assert "'portfolio_identifier_event_identifier_event_revision_record_identifier' (70 characters)" in message
|
|
163
|
+
with Session(f.engine) as session:
|
|
164
|
+
assert session.scalars(select(StoredTable)).all() == []
|
|
165
|
+
single = f.http.post('/time-index-meta-tables/', json=ledger)
|
|
166
|
+
assert single.status_code == 422 and single.json()['detail'] == detail['detail']
|
|
167
|
+
|
|
141
168
|
def test_public_sql_and_migration_connection_check_local_scope(closed_app):
|
|
142
169
|
f = closed_app
|
|
143
170
|
table = MetaTable.register(data_source_uid=str(f.source.uid), management_mode='platform_managed', table_contract=CONTRACT)
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"""Time-index table contract behavior."""
|
|
2
|
-
|
|
3
|
-
import pytest
|
|
4
|
-
|
|
5
|
-
from metatables.api.backend.contracts.storage_layouts import (
|
|
6
|
-
StorageLayoutValidationError,
|
|
7
|
-
normalize_storage_layout,
|
|
8
|
-
render_physical_index_plan,
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def test_default_layout_preserves_time_first_identity_and_physical_index_plan():
|
|
13
|
-
columns = {"observation_time": "timestamptz", "asset_uid": "uuid", "price": "numeric"}
|
|
14
|
-
layout = normalize_storage_layout(
|
|
15
|
-
None,
|
|
16
|
-
time_index_name="observation_time",
|
|
17
|
-
index_names=["observation_time", "asset_uid"],
|
|
18
|
-
columns_by_name=columns,
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
assert layout["identity_dimensions"] == ["asset_uid"]
|
|
22
|
-
assert layout["uniqueness"]["columns"] == ["observation_time", "asset_uid"]
|
|
23
|
-
assert layout["tail_delete"]["scope_dimensions"] == ["asset_uid"]
|
|
24
|
-
|
|
25
|
-
index_plan = render_physical_index_plan(
|
|
26
|
-
layout,
|
|
27
|
-
time_index_name="observation_time",
|
|
28
|
-
index_names=["observation_time", "asset_uid"],
|
|
29
|
-
columns_by_name=columns,
|
|
30
|
-
)
|
|
31
|
-
assert index_plan["time_idx"]["query"] == 'USING BRIN ("observation_time")'
|
|
32
|
-
assert index_plan["asset_uid_idx"]["query"] == 'USING BTREE ("asset_uid")'
|
|
33
|
-
assert index_plan["time_identifier_ev_idx"]["query"] == (
|
|
34
|
-
'("observation_time", "asset_uid")'
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def test_layout_rejects_dimensions_that_disagree_with_table_contract():
|
|
39
|
-
with pytest.raises(StorageLayoutValidationError) as error:
|
|
40
|
-
normalize_storage_layout(
|
|
41
|
-
{
|
|
42
|
-
"version": 1,
|
|
43
|
-
"time_index": {"name": "observation_time"},
|
|
44
|
-
"identity_dimensions": ["wrong_asset"],
|
|
45
|
-
"index_progress": {"grain": ["wrong_asset"]},
|
|
46
|
-
"uniqueness": {"columns": ["observation_time", "wrong_asset"]},
|
|
47
|
-
"tail_delete": {"scope_dimensions": ["wrong_asset"]},
|
|
48
|
-
},
|
|
49
|
-
time_index_name="observation_time",
|
|
50
|
-
index_names=["observation_time", "asset_uid"],
|
|
51
|
-
columns_by_name={"observation_time": "timestamptz", "asset_uid": "uuid"},
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
assert "identity_dimensions" in error.value.errors
|
|
55
|
-
assert "columns" in error.value.errors
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def test_layout_rejects_unknown_secondary_index_column():
|
|
59
|
-
with pytest.raises(StorageLayoutValidationError) as error:
|
|
60
|
-
normalize_storage_layout(
|
|
61
|
-
{
|
|
62
|
-
"version": 1,
|
|
63
|
-
"time_index": {"name": "observation_time"},
|
|
64
|
-
"identity_dimensions": [],
|
|
65
|
-
"index_progress": {"grain": []},
|
|
66
|
-
"uniqueness": {"columns": ["observation_time"]},
|
|
67
|
-
"tail_delete": {"scope_dimensions": []},
|
|
68
|
-
"secondary_indexes": [
|
|
69
|
-
{"name": "lookup_idx", "columns": ["missing_column"]}
|
|
70
|
-
],
|
|
71
|
-
},
|
|
72
|
-
time_index_name="observation_time",
|
|
73
|
-
index_names=["observation_time"],
|
|
74
|
-
columns_by_name={"observation_time": "timestamptz"},
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
assert "secondary_indexes" in error.value.errors
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|