mainsequence-metatable 0.1.14.dev26__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.
Files changed (535) hide show
  1. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/.agents/skills/client/metatables-meta-tables/SKILL.md +19 -0
  2. {mainsequence_metatable-0.1.14.dev26/src/mainsequence_metatable.egg-info → mainsequence_metatable-0.1.15.dev27}/PKG-INFO +1 -1
  3. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/pyproject.toml +1 -1
  4. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/scripts/check_boundaries.py +2 -1
  5. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27/src/mainsequence_metatable.egg-info}/PKG-INFO +1 -1
  6. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/mainsequence_metatable.egg-info/SOURCES.txt +1 -0
  7. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_registration.py +28 -8
  8. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/contracts/storage_layouts.py +32 -5
  9. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/sqlalchemy_contracts.py +28 -0
  10. mainsequence_metatable-0.1.15.dev27/src/metatables/storage_layout_contract.py +27 -0
  11. mainsequence_metatable-0.1.15.dev27/tests/contracts/test_storage_layouts.py +216 -0
  12. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_remaining_client_routes.py +27 -0
  13. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/uv.lock +1 -1
  14. mainsequence_metatable-0.1.14.dev26/tests/contracts/test_storage_layouts.py +0 -77
  15. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
  16. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
  17. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
  18. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
  19. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/.mainsequence/workflows/metatables-api.yaml +0 -0
  20. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/LICENSE +0 -0
  21. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/MANIFEST.in +0 -0
  22. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/README.md +0 -0
  23. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/alembic.ini +0 -0
  24. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/api/metatables/main.py +0 -0
  25. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/compose.database-tests.yml +0 -0
  26. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
  27. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
  28. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0004-approved-application-migrations.md +0 -0
  29. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
  30. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0006-historical-run-graphs.md +0 -0
  31. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0007-database-enforced-table-access.md +0 -0
  32. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
  33. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
  34. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
  35. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0009-shared-credential-store.md +0 -0
  36. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
  37. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
  38. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0013-application-owned-migrations.md +0 -0
  39. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
  40. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
  41. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
  42. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
  43. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/adr/index.md +0 -0
  44. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/api/authentication-and-errors.md +0 -0
  45. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/api/data-sources.md +0 -0
  46. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/api/openapi.json +0 -0
  47. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/api/overview.md +0 -0
  48. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/api/reference.md +0 -0
  49. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/api/tables-and-migrations.md +0 -0
  50. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/api/time-index-and-updates.md +0 -0
  51. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/assets/branding/metatables.svg +0 -0
  52. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/assets/diagrams/local-client-experience.svg +0 -0
  53. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/client/bounded-transfers.md +0 -0
  54. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/client/build-an-updater.md +0 -0
  55. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/client/define-and-migrate-tables.md +0 -0
  56. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/client/deploy-application-migrations.md +0 -0
  57. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/client/installation-and-connection.md +0 -0
  58. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/client/local-storage.md +0 -0
  59. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/client/query-and-mutate.md +0 -0
  60. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/client/quickstart.md +0 -0
  61. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/client/read-existing-time-index-tables.md +0 -0
  62. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/client/register-existing-tables.md +0 -0
  63. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/client/tutorial.md +0 -0
  64. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/client/upgrade-legacy-app.md +0 -0
  65. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/architecture.md +0 -0
  66. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/data-sources.md +0 -0
  67. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/identity-and-scope.md +0 -0
  68. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/permissions-namespaces-labels.md +0 -0
  69. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/runs-and-execution-graphs.md +0 -0
  70. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
  71. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/concepts/time-index-tables-and-updates.md +0 -0
  72. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/contributing/architecture-and-boundaries.md +0 -0
  73. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/contributing/database-backends.md +0 -0
  74. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/contributing/documentation.md +0 -0
  75. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/contributing/releasing.md +0 -0
  76. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/contributing/testing.md +0 -0
  77. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/README.md +0 -0
  78. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/__init__.py +0 -0
  79. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/bounded_reader.py +0 -0
  80. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/data_sources/README.md +0 -0
  81. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/data_sources/mssql.json +0 -0
  82. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/data_sources/mysql.json +0 -0
  83. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/data_sources/postgresql.json +0 -0
  84. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/data_sources/register.py +0 -0
  85. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/external_table.py +0 -0
  86. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/README.md +0 -0
  87. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/__init__.py +0 -0
  88. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/__main__.py +0 -0
  89. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/migrations/__init__.py +0 -0
  90. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/migrations/env.py +0 -0
  91. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/migrations/script.py.mako +0 -0
  92. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  93. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/local_app/tables.py +0 -0
  94. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/query.py +0 -0
  95. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/quickstart.py +0 -0
  96. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/reader.py +0 -0
  97. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/scripts/__init__.py +0 -0
  98. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/scripts/setup_metatables.py +0 -0
  99. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tables.py +0 -0
  100. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/README.md +0 -0
  101. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/__init__.py +0 -0
  102. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/__main__.py +0 -0
  103. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/data/README.md +0 -0
  104. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
  105. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/frames.py +0 -0
  106. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/__init__.py +0 -0
  107. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/env.py +0 -0
  108. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/registry.py +0 -0
  109. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/script.py.mako +0 -0
  110. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
  111. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
  112. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
  113. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  114. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/operations.py +0 -0
  115. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/tables.py +0 -0
  116. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/tutorial/updaters.py +0 -0
  117. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/examples/updater.py +0 -0
  118. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/index.md +0 -0
  119. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/operations/catalog-migrations.md +0 -0
  120. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/operations/configuration.md +0 -0
  121. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/operations/hosted-runtime.md +0 -0
  122. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/operations/local-runtime.md +0 -0
  123. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/operations/recovery-and-observability.md +0 -0
  124. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/operations/run-history.md +0 -0
  125. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/operations/run-logs.md +0 -0
  126. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/reference/capabilities.md +0 -0
  127. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/reference/cli.md +0 -0
  128. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/reference/python.md +0 -0
  129. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/security/index.md +0 -0
  130. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/security/ownership-and-sharing.md +0 -0
  131. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/docs/security/permissions.md +0 -0
  132. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/mkdocs.yml +0 -0
  133. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/scripts/__init__.py +0 -0
  134. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/scripts/build_reference.py +0 -0
  135. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/scripts/check_client_api_coverage.py +0 -0
  136. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/scripts/check_distribution_sources.py +0 -0
  137. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/scripts/check_docs.py +0 -0
  138. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/scripts/check_examples_debug.py +0 -0
  139. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/scripts/check_project.py +0 -0
  140. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/scripts/dev_release_version.py +0 -0
  141. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/scripts/test_databases.py +0 -0
  142. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/scripts/test_postgresql.py +0 -0
  143. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/setup.cfg +0 -0
  144. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
  145. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
  146. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
  147. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
  148. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/__init__.py +0 -0
  149. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/_admin_source.json +0 -0
  150. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/_build.py +0 -0
  151. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/_skill_bundle.py +0 -0
  152. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/__init__.py +0 -0
  153. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/__init__.py +0 -0
  154. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/auth/__init__.py +0 -0
  155. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/auth/boundary.py +0 -0
  156. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/auth/caller_assertions.py +0 -0
  157. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/auth/local_actor.py +0 -0
  158. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/bootstrap.py +0 -0
  159. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/configuration.py +0 -0
  160. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/credential_admin.py +0 -0
  161. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/development.py +0 -0
  162. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/development_client.py +0 -0
  163. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/main.py +0 -0
  164. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/platform_cache.py +0 -0
  165. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/__init__.py +0 -0
  166. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/column_search.py +0 -0
  167. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/contract_validation.py +0 -0
  168. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/data_sources.py +0 -0
  169. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/managed_finalize.py +0 -0
  170. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/migration_connection.py +0 -0
  171. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/namespaces.py +0 -0
  172. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/run_logs.py +0 -0
  173. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/runtime_context.py +0 -0
  174. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/schema_graph.py +0 -0
  175. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/security.py +0 -0
  176. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_cascade.py +0 -0
  177. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_crud.py +0 -0
  178. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_delete.py +0 -0
  179. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_filter.py +0 -0
  180. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_import.py +0 -0
  181. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_introspection.py +0 -0
  182. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_patch.py +0 -0
  183. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_response.py +0 -0
  184. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_search_document.py +0 -0
  185. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_sql.py +0 -0
  186. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
  187. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/time_index_delete.py +0 -0
  188. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/time_index_reads.py +0 -0
  189. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/time_index_stats.py +0 -0
  190. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/timescale_policies.py +0 -0
  191. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_batch.py +0 -0
  192. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
  193. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_constants.py +0 -0
  194. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_crud.py +0 -0
  195. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_details.py +0 -0
  196. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_graph.py +0 -0
  197. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
  198. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_registration.py +0 -0
  199. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_runs.py +0 -0
  200. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/routes/update_statistics.py +0 -0
  201. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/runtime.py +0 -0
  202. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/runtime_control.py +0 -0
  203. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/runtime_database.py +0 -0
  204. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/source_passwords.py +0 -0
  205. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/app/transfer.py +0 -0
  206. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/__init__.py +0 -0
  207. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/__init__.py +0 -0
  208. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/access.py +0 -0
  209. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
  210. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
  211. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
  212. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
  213. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
  214. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
  215. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
  216. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
  217. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
  218. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
  219. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
  220. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
  221. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
  222. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
  223. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
  224. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
  225. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
  226. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
  227. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
  228. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
  229. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
  230. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/catalog.py +0 -0
  231. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
  232. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/catalog_types.py +0 -0
  233. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/contracts.py +0 -0
  234. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/hosted.py +0 -0
  235. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/hosted_access.py +0 -0
  236. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/migration_connection.py +0 -0
  237. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/native.py +0 -0
  238. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/operations.py +0 -0
  239. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/pages.py +0 -0
  240. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/postgresql_access.py +0 -0
  241. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/registry.py +0 -0
  242. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/relation_tables.py +0 -0
  243. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/relational.py +0 -0
  244. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
  245. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/sqlite_access.py +0 -0
  246. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/streaming.py +0 -0
  247. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/backends/timescale.py +0 -0
  248. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/contracts/__init__.py +0 -0
  249. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/contracts/relation_import.py +0 -0
  250. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
  251. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/contracts/values.py +0 -0
  252. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/__init__.py +0 -0
  253. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
  254. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
  255. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/index_statistics.py +0 -0
  256. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/label_rules.py +0 -0
  257. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/permission_rules.py +0 -0
  258. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/domain/update_constants.py +0 -0
  259. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/__init__.py +0 -0
  260. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
  261. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
  262. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/credential_store.py +0 -0
  263. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
  264. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
  265. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
  266. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
  267. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/run_logs.py +0 -0
  268. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
  269. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
  270. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/integrations/source_validation.py +0 -0
  271. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/__init__.py +0 -0
  272. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/env.py +0 -0
  273. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/script.py.mako +0 -0
  274. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
  275. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
  276. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
  277. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
  278. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
  279. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
  280. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
  281. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
  282. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
  283. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
  284. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/__init__.py +0 -0
  285. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
  286. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
  287. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/create_table.py +0 -0
  288. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
  289. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/import_relations.py +0 -0
  290. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/introspect_table.py +0 -0
  291. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/read_time_index.py +0 -0
  292. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/register_catalog.py +0 -0
  293. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/operations/search_documents.py +0 -0
  294. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/__init__.py +0 -0
  295. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/cascade.py +0 -0
  296. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/catalog.py +0 -0
  297. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/database.py +0 -0
  298. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/grants.py +0 -0
  299. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/labels.py +0 -0
  300. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/locking.py +0 -0
  301. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/models.py +0 -0
  302. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
  303. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/projections.py +0 -0
  304. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
  305. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
  306. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
  307. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
  308. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/table_queries.py +0 -0
  309. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/table_response.py +0 -0
  310. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/update_graph.py +0 -0
  311. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
  312. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/updates.py +0 -0
  313. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
  314. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
  315. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/metatables/__init__.py +0 -0
  316. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/metatables/configuration.yaml +0 -0
  317. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/api/metatables/main.py +0 -0
  318. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/__init__.py +0 -0
  319. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/admin_install.py +0 -0
  320. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/app.py +0 -0
  321. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/filters.py +0 -0
  322. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/local.py +0 -0
  323. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/migrations.py +0 -0
  324. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/project.py +0 -0
  325. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/cli/skills.py +0 -0
  326. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/compiled_sql/__init__.py +0 -0
  327. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/compiled_sql/mssql.py +0 -0
  328. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/compiled_sql/v1.py +0 -0
  329. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/dtype_codec.py +0 -0
  330. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/endpoint.py +0 -0
  331. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/README.md +0 -0
  332. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/__init__.py +0 -0
  333. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/bounded_reader.py +0 -0
  334. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/data_sources/README.md +0 -0
  335. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/data_sources/mssql.json +0 -0
  336. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/data_sources/mysql.json +0 -0
  337. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/data_sources/postgresql.json +0 -0
  338. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/data_sources/register.py +0 -0
  339. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/external_table.py +0 -0
  340. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/README.md +0 -0
  341. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/__init__.py +0 -0
  342. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/__main__.py +0 -0
  343. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
  344. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/migrations/env.py +0 -0
  345. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
  346. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  347. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/local_app/tables.py +0 -0
  348. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/query.py +0 -0
  349. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/quickstart.py +0 -0
  350. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/reader.py +0 -0
  351. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/scripts/__init__.py +0 -0
  352. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/scripts/setup_metatables.py +0 -0
  353. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tables.py +0 -0
  354. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/README.md +0 -0
  355. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/__init__.py +0 -0
  356. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/__main__.py +0 -0
  357. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/data/README.md +0 -0
  358. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
  359. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/frames.py +0 -0
  360. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
  361. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/env.py +0 -0
  362. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
  363. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
  364. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
  365. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
  366. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
  367. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  368. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/operations.py +0 -0
  369. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/tables.py +0 -0
  370. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/tutorial/updaters.py +0 -0
  371. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/examples/updater.py +0 -0
  372. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/future_registry.py +0 -0
  373. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/hashing.py +0 -0
  374. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/instrumentation.py +0 -0
  375. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/local_connection.py +0 -0
  376. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/local_files.py +0 -0
  377. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/local_run_logs.py +0 -0
  378. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/log_contract.py +0 -0
  379. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/__init__.py +0 -0
  380. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/alembic.py +0 -0
  381. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/connection.py +0 -0
  382. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/env.py +0 -0
  383. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/provider.py +0 -0
  384. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/registry.py +0 -0
  385. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/runner.py +0 -0
  386. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/scaffold.py +0 -0
  387. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/sqlite.py +0 -0
  388. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/templates/__init__.py +0 -0
  389. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/templates/env.py.mako +0 -0
  390. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/templates/script.py.mako +0 -0
  391. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/migrations/tls.py +0 -0
  392. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/models.py +0 -0
  393. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/pydantic_metadata.py +0 -0
  394. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/run_logging.py +0 -0
  395. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/runtime.py +0 -0
  396. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/runtime_context.py +0 -0
  397. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/runtime_contract.py +0 -0
  398. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/schema_names.py +0 -0
  399. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/sdk_compat.py +0 -0
  400. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/time_index_table_refs.py +0 -0
  401. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/transfer.py +0 -0
  402. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/transfer_contract.py +0 -0
  403. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/transport.py +0 -0
  404. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/update_configuration_contract.py +0 -0
  405. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/__init__.py +0 -0
  406. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/configuration.py +0 -0
  407. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/dependencies.py +0 -0
  408. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/managers.py +0 -0
  409. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/namespacing.py +0 -0
  410. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/runner.py +0 -0
  411. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/updaters.py +0 -0
  412. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/updaters/utils.py +0 -0
  413. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/src/metatables/upload.py +0 -0
  414. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_bootstrap_failure_cause.py +0 -0
  415. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_caller_assertions.py +0 -0
  416. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_data_source_identity.py +0 -0
  417. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_development_client.py +0 -0
  418. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_hosted_environment_target.py +0 -0
  419. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_local_mode.py +0 -0
  420. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_platform_fact_cache.py +0 -0
  421. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_runtime_bootstrap.py +0 -0
  422. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_runtime_database.py +0 -0
  423. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_runtime_scaffold.py +0 -0
  424. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_runtime_selection.py +0 -0
  425. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_runtime_storage_binding.py +0 -0
  426. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/auth/test_source_passwords.py +0 -0
  427. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/catalog/test_catalog_foundation.py +0 -0
  428. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/catalog/test_contract_projection.py +0 -0
  429. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/catalog/test_database_config.py +0 -0
  430. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/catalog/test_index_statistics.py +0 -0
  431. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/catalog/test_migration.py +0 -0
  432. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/conftest.py +0 -0
  433. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/capabilities.json +0 -0
  434. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/client_signatures.json +0 -0
  435. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/database_operations.json +0 -0
  436. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/test_bounded_transfer.py +0 -0
  437. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/test_compiler_runtime_source.py +0 -0
  438. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/test_relation_batching.py +0 -0
  439. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/test_relation_import.py +0 -0
  440. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/contracts/test_table_contracts.py +0 -0
  441. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/Dockerfile +0 -0
  442. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/Dockerfile.dockerignore +0 -0
  443. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/__init__.py +0 -0
  444. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/conftest.py +0 -0
  445. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/provider/__init__.py +0 -0
  446. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/provider/env.py +0 -0
  447. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
  448. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_api_contract.py +0 -0
  449. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_application_migration.py +0 -0
  450. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_bootstrap_recovery.py +0 -0
  451. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_catalog_contract.py +0 -0
  452. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_credential_catalog.py +0 -0
  453. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_physical_contract.py +0 -0
  454. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_relation_import.py +0 -0
  455. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_runtime_bootstrap.py +0 -0
  456. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_sql_security.py +0 -0
  457. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_backend/test_update_client.py +0 -0
  458. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_operations/test_physical_operations.py +0 -0
  459. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_operations/test_postgresql_operations.py +0 -0
  460. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/database_operations/test_runtime_and_temporal.py +0 -0
  461. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/documentation/test_project_checks.py +0 -0
  462. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_admin_installation.py +0 -0
  463. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_api_endpoint.py +0 -0
  464. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_application_owned_migrations.py +0 -0
  465. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_catalog_outage.py +0 -0
  466. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_api_contract.py +0 -0
  467. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_api_coverage.py +0 -0
  468. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_migration_scaffold.py +0 -0
  469. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_migration_tls.py +0 -0
  470. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_package.py +0 -0
  471. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_signatures.py +0 -0
  472. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_client_value_behaviors.py +0 -0
  473. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_data_source_registry.py +0 -0
  474. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_local_actor_client_api.py +0 -0
  475. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_local_cli_workflow.py +0 -0
  476. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_local_client_selection.py +0 -0
  477. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_managed_finalize_client_api.py +0 -0
  478. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_namespaces_admin_http.py +0 -0
  479. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_public_imports.py +0 -0
  480. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_run_graphs.py +0 -0
  481. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_run_logs.py +0 -0
  482. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_runtime_transition.py +0 -0
  483. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_runtime_upgrade.py +0 -0
  484. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_sdk_local_startup.py +0 -0
  485. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_sqlite_runtime.py +0 -0
  486. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_delete_client_api.py +0 -0
  487. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_filter_client_api.py +0 -0
  488. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_introspection_client_api.py +0 -0
  489. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_patch_client_api.py +0 -0
  490. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_search_document_api.py +0 -0
  491. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_stats_api.py +0 -0
  492. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_update_pipeline.py +0 -0
  493. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_table_updates_http.py +0 -0
  494. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_time_index_delete_client_api.py +0 -0
  495. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_time_index_reads_client_api.py +0 -0
  496. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_timescale_policies_client_api.py +0 -0
  497. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_update_batch_client_api.py +0 -0
  498. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
  499. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
  500. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
  501. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/e2e/test_update_registration_client_api.py +0 -0
  502. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/examples/test_documented_examples.py +0 -0
  503. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/examples/test_postgresql_examples.py +0 -0
  504. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/examples/test_setup_launch.py +0 -0
  505. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/examples/test_tutorial.py +0 -0
  506. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_credential_store.py +0 -0
  507. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_data_source_rules.py +0 -0
  508. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_local_data_sources.py +0 -0
  509. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_local_run_logs.py +0 -0
  510. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_postgresql_connection.py +0 -0
  511. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_postgresql_sql.py +0 -0
  512. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_postgresql_tables.py +0 -0
  513. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
  514. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_source_validation.py +0 -0
  515. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/integrations/test_sqlite_operations.py +0 -0
  516. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/labels/test_labels.py +0 -0
  517. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/operations/test_create_table_operation.py +0 -0
  518. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/operations/test_create_table_postgres.py +0 -0
  519. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/operations/test_physical_operation_journal.py +0 -0
  520. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/operations/test_register_catalog.py +0 -0
  521. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/operations/test_search_documents.py +0 -0
  522. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/operations/test_timescale_policies.py +0 -0
  523. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/packaging/test_client_skills.py +0 -0
  524. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/packaging/test_dev_release_version.py +0 -0
  525. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/packaging/test_distribution_sources.py +0 -0
  526. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/packaging/test_editable_build.py +0 -0
  527. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/packaging/test_installed_distribution.py +0 -0
  528. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_governed_sql_scope.py +0 -0
  529. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_local_actor_membership.py +0 -0
  530. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_migration_boundary.py +0 -0
  531. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_namespace_grants.py +0 -0
  532. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_security_api.py +0 -0
  533. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_table_body_filter.py +0 -0
  534. {mainsequence_metatable-0.1.14.dev26 → mainsequence_metatable-0.1.15.dev27}/tests/permissions/test_table_grants.py +0 -0
  535. {mainsequence_metatable-0.1.14.dev26 → 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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence-metatable
3
- Version: 0.1.14.dev26
3
+ Version: 0.1.15.dev27
4
4
  Summary: Main Sequence MetaTables Python client and standalone API
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence-metatable"
7
- version = "0.1.14.dev26"
7
+ version = "0.1.15.dev27"
8
8
  description = "Main Sequence MetaTables Python client and standalone API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence-metatable
3
- Version: 0.1.14.dev26
3
+ Version: 0.1.15.dev27
4
4
  Summary: Main Sequence MetaTables Python client and standalone API
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: MIT
@@ -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
- if isinstance(exc, DataSourceAdmissionError):
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
- raise HTTPException(exc.status_code, detail) from exc
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
- raise HTTPException(409 if isinstance(exc, (PhysicalTableError, PhysicalIntrospectionError, TimescaleError)) else 422,
170
- getattr(exc, 'code', str(exc))) from exc
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
- POSTGRESQL_IDENTIFIER_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_]{0,62}$")
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("secondary index name must be a valid PostgreSQL identifier")
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": "_".join(identity_dimensions),
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
- plan[f"{secondary_index.name}_idx"] = {
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)
@@ -632,7 +632,7 @@ server = [
632
632
 
633
633
  [[package]]
634
634
  name = "mainsequence-metatable"
635
- version = "0.1.14"
635
+ version = "0.1.15"
636
636
  source = { editable = "." }
637
637
  dependencies = [
638
638
  { name = "alembic" },
@@ -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