mainsequence-metatable 0.1.8.dev15__tar.gz → 0.1.8.dev16__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 (523) hide show
  1. {mainsequence_metatable-0.1.8.dev15/src/mainsequence_metatable.egg-info → mainsequence_metatable-0.1.8.dev16}/PKG-INFO +1 -1
  2. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +10 -1
  3. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/api/data-sources.md +19 -0
  4. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/operations/catalog-migrations.md +1 -1
  5. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/pyproject.toml +1 -1
  6. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16/src/mainsequence_metatable.egg-info}/PKG-INFO +1 -1
  7. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/bootstrap.py +25 -0
  8. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/access.py +4 -0
  9. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/postgresql_access.py +46 -0
  10. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/auth/test_data_source_identity.py +86 -0
  11. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
  12. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/.agents/skills/client/metatables-meta-tables/SKILL.md +0 -0
  13. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
  14. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
  15. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
  16. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/.mainsequence/workflows/metatables-api.yaml +0 -0
  17. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/LICENSE +0 -0
  18. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/MANIFEST.in +0 -0
  19. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/README.md +0 -0
  20. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/alembic.ini +0 -0
  21. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/api/metatables/main.py +0 -0
  22. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/compose.database-tests.yml +0 -0
  23. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
  24. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0004-approved-application-migrations.md +0 -0
  25. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
  26. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0006-historical-run-graphs.md +0 -0
  27. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0007-database-enforced-table-access.md +0 -0
  28. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
  29. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
  30. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
  31. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0009-shared-credential-store.md +0 -0
  32. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
  33. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
  34. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0013-application-owned-migrations.md +0 -0
  35. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
  36. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
  37. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
  38. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/adr/index.md +0 -0
  39. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/api/authentication-and-errors.md +0 -0
  40. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/api/openapi.json +0 -0
  41. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/api/overview.md +0 -0
  42. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/api/reference.md +0 -0
  43. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/api/tables-and-migrations.md +0 -0
  44. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/api/time-index-and-updates.md +0 -0
  45. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/assets/branding/metatables.svg +0 -0
  46. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/assets/diagrams/local-client-experience.svg +0 -0
  47. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/client/bounded-transfers.md +0 -0
  48. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/client/build-an-updater.md +0 -0
  49. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/client/define-and-migrate-tables.md +0 -0
  50. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/client/installation-and-connection.md +0 -0
  51. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/client/local-storage.md +0 -0
  52. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/client/query-and-mutate.md +0 -0
  53. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/client/quickstart.md +0 -0
  54. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/client/read-existing-time-index-tables.md +0 -0
  55. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/client/register-existing-tables.md +0 -0
  56. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/client/tutorial.md +0 -0
  57. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/client/upgrade-legacy-app.md +0 -0
  58. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/concepts/architecture.md +0 -0
  59. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/concepts/data-sources.md +0 -0
  60. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/concepts/identity-and-scope.md +0 -0
  61. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/concepts/permissions-namespaces-labels.md +0 -0
  62. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/concepts/runs-and-execution-graphs.md +0 -0
  63. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
  64. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/concepts/time-index-tables-and-updates.md +0 -0
  65. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/contributing/architecture-and-boundaries.md +0 -0
  66. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/contributing/database-backends.md +0 -0
  67. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/contributing/documentation.md +0 -0
  68. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/contributing/releasing.md +0 -0
  69. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/contributing/testing.md +0 -0
  70. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/README.md +0 -0
  71. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/__init__.py +0 -0
  72. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/bounded_reader.py +0 -0
  73. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/data_sources/README.md +0 -0
  74. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/data_sources/mssql.json +0 -0
  75. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/data_sources/mysql.json +0 -0
  76. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/data_sources/postgresql.json +0 -0
  77. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/data_sources/register.py +0 -0
  78. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/external_table.py +0 -0
  79. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/local_app/README.md +0 -0
  80. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/local_app/__init__.py +0 -0
  81. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/local_app/__main__.py +0 -0
  82. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/local_app/migrations/__init__.py +0 -0
  83. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/local_app/migrations/env.py +0 -0
  84. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/local_app/migrations/script.py.mako +0 -0
  85. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  86. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/local_app/tables.py +0 -0
  87. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/query.py +0 -0
  88. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/quickstart.py +0 -0
  89. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/reader.py +0 -0
  90. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/scripts/__init__.py +0 -0
  91. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/scripts/setup_metatables.py +0 -0
  92. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tables.py +0 -0
  93. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/README.md +0 -0
  94. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/__init__.py +0 -0
  95. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/__main__.py +0 -0
  96. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/data/README.md +0 -0
  97. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
  98. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/frames.py +0 -0
  99. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/migrations/__init__.py +0 -0
  100. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/migrations/env.py +0 -0
  101. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/migrations/registry.py +0 -0
  102. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/migrations/script.py.mako +0 -0
  103. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
  104. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
  105. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
  106. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  107. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/operations.py +0 -0
  108. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/tables.py +0 -0
  109. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/tutorial/updaters.py +0 -0
  110. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/examples/updater.py +0 -0
  111. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/index.md +0 -0
  112. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/operations/configuration.md +0 -0
  113. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/operations/hosted-runtime.md +0 -0
  114. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/operations/local-runtime.md +0 -0
  115. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/operations/recovery-and-observability.md +0 -0
  116. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/operations/run-history.md +0 -0
  117. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/operations/run-logs.md +0 -0
  118. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/reference/capabilities.md +0 -0
  119. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/reference/cli.md +0 -0
  120. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/reference/python.md +0 -0
  121. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/security/index.md +0 -0
  122. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/security/ownership-and-sharing.md +0 -0
  123. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/docs/security/permissions.md +0 -0
  124. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/mkdocs.yml +0 -0
  125. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/scripts/__init__.py +0 -0
  126. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/scripts/build_reference.py +0 -0
  127. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/scripts/check_boundaries.py +0 -0
  128. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/scripts/check_client_api_coverage.py +0 -0
  129. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/scripts/check_distribution_sources.py +0 -0
  130. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/scripts/check_docs.py +0 -0
  131. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/scripts/check_examples_debug.py +0 -0
  132. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/scripts/check_project.py +0 -0
  133. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/scripts/dev_release_version.py +0 -0
  134. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/scripts/test_databases.py +0 -0
  135. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/scripts/test_postgresql.py +0 -0
  136. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/setup.cfg +0 -0
  137. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/mainsequence_metatable.egg-info/SOURCES.txt +0 -0
  138. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
  139. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
  140. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
  141. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
  142. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/__init__.py +0 -0
  143. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/_admin_source.json +0 -0
  144. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/_build.py +0 -0
  145. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/_skill_bundle.py +0 -0
  146. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/__init__.py +0 -0
  147. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/__init__.py +0 -0
  148. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/auth/__init__.py +0 -0
  149. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/auth/boundary.py +0 -0
  150. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/auth/caller_assertions.py +0 -0
  151. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/auth/local_actor.py +0 -0
  152. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/configuration.py +0 -0
  153. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/credential_admin.py +0 -0
  154. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/development.py +0 -0
  155. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/development_client.py +0 -0
  156. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/main.py +0 -0
  157. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/platform_cache.py +0 -0
  158. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/__init__.py +0 -0
  159. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/column_search.py +0 -0
  160. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/contract_validation.py +0 -0
  161. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/data_sources.py +0 -0
  162. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/managed_finalize.py +0 -0
  163. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/migration_connection.py +0 -0
  164. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/namespaces.py +0 -0
  165. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/run_logs.py +0 -0
  166. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/runtime_context.py +0 -0
  167. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/schema_graph.py +0 -0
  168. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/security.py +0 -0
  169. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/table_cascade.py +0 -0
  170. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/table_crud.py +0 -0
  171. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/table_delete.py +0 -0
  172. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/table_filter.py +0 -0
  173. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/table_import.py +0 -0
  174. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/table_introspection.py +0 -0
  175. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/table_patch.py +0 -0
  176. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/table_registration.py +0 -0
  177. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/table_response.py +0 -0
  178. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/table_search_document.py +0 -0
  179. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/table_sql.py +0 -0
  180. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
  181. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/time_index_delete.py +0 -0
  182. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/time_index_reads.py +0 -0
  183. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/time_index_stats.py +0 -0
  184. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/update_batch.py +0 -0
  185. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
  186. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/update_constants.py +0 -0
  187. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/update_crud.py +0 -0
  188. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/update_details.py +0 -0
  189. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/update_graph.py +0 -0
  190. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
  191. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/update_registration.py +0 -0
  192. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/update_runs.py +0 -0
  193. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/routes/update_statistics.py +0 -0
  194. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/runtime.py +0 -0
  195. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/runtime_control.py +0 -0
  196. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/source_passwords.py +0 -0
  197. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/source_registrations.py +0 -0
  198. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/app/transfer.py +0 -0
  199. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/__init__.py +0 -0
  200. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/__init__.py +0 -0
  201. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
  202. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
  203. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
  204. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
  205. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
  206. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
  207. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
  208. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
  209. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
  210. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
  211. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
  212. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
  213. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
  214. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
  215. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
  216. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
  217. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
  218. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
  219. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
  220. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
  221. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
  222. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/catalog.py +0 -0
  223. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
  224. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/catalog_types.py +0 -0
  225. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/contracts.py +0 -0
  226. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/hosted.py +0 -0
  227. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/hosted_access.py +0 -0
  228. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/migration_connection.py +0 -0
  229. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/native.py +0 -0
  230. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/operations.py +0 -0
  231. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/pages.py +0 -0
  232. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/registry.py +0 -0
  233. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/relation_tables.py +0 -0
  234. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/relational.py +0 -0
  235. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
  236. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/sqlite_access.py +0 -0
  237. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/backends/streaming.py +0 -0
  238. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/contracts/__init__.py +0 -0
  239. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/contracts/relation_import.py +0 -0
  240. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
  241. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
  242. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/contracts/values.py +0 -0
  243. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/domain/__init__.py +0 -0
  244. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
  245. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
  246. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/domain/index_statistics.py +0 -0
  247. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/domain/label_rules.py +0 -0
  248. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/domain/permission_rules.py +0 -0
  249. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/domain/update_constants.py +0 -0
  250. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/integrations/__init__.py +0 -0
  251. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
  252. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
  253. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/integrations/credential_store.py +0 -0
  254. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
  255. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
  256. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
  257. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
  258. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/integrations/run_logs.py +0 -0
  259. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
  260. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
  261. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/integrations/source_validation.py +0 -0
  262. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/migrations/__init__.py +0 -0
  263. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/migrations/env.py +0 -0
  264. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/migrations/script.py.mako +0 -0
  265. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
  266. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
  267. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
  268. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
  269. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
  270. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
  271. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
  272. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
  273. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
  274. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/operations/__init__.py +0 -0
  275. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
  276. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
  277. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/operations/create_table.py +0 -0
  278. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
  279. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/operations/import_relations.py +0 -0
  280. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/operations/introspect_table.py +0 -0
  281. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/operations/read_time_index.py +0 -0
  282. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/operations/register_catalog.py +0 -0
  283. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/operations/search_documents.py +0 -0
  284. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/__init__.py +0 -0
  285. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/cascade.py +0 -0
  286. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/catalog.py +0 -0
  287. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/database.py +0 -0
  288. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/grants.py +0 -0
  289. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/labels.py +0 -0
  290. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/locking.py +0 -0
  291. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/models.py +0 -0
  292. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
  293. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/projections.py +0 -0
  294. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
  295. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
  296. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
  297. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
  298. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/table_queries.py +0 -0
  299. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/table_response.py +0 -0
  300. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/update_graph.py +0 -0
  301. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
  302. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/updates.py +0 -0
  303. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
  304. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
  305. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/metatables/__init__.py +0 -0
  306. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/metatables/configuration.yaml +0 -0
  307. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/api/metatables/main.py +0 -0
  308. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/cli/__init__.py +0 -0
  309. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/cli/admin_install.py +0 -0
  310. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/cli/app.py +0 -0
  311. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/cli/filters.py +0 -0
  312. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/cli/local.py +0 -0
  313. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/cli/migrations.py +0 -0
  314. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/cli/project.py +0 -0
  315. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/cli/skills.py +0 -0
  316. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/compiled_sql/__init__.py +0 -0
  317. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/compiled_sql/mssql.py +0 -0
  318. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/compiled_sql/v1.py +0 -0
  319. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/dtype_codec.py +0 -0
  320. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/endpoint.py +0 -0
  321. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/README.md +0 -0
  322. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/__init__.py +0 -0
  323. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/bounded_reader.py +0 -0
  324. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/data_sources/README.md +0 -0
  325. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/data_sources/mssql.json +0 -0
  326. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/data_sources/mysql.json +0 -0
  327. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/data_sources/postgresql.json +0 -0
  328. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/data_sources/register.py +0 -0
  329. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/external_table.py +0 -0
  330. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/local_app/README.md +0 -0
  331. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/local_app/__init__.py +0 -0
  332. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/local_app/__main__.py +0 -0
  333. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
  334. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/local_app/migrations/env.py +0 -0
  335. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
  336. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  337. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/local_app/tables.py +0 -0
  338. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/query.py +0 -0
  339. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/quickstart.py +0 -0
  340. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/reader.py +0 -0
  341. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/scripts/__init__.py +0 -0
  342. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/scripts/setup_metatables.py +0 -0
  343. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tables.py +0 -0
  344. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/README.md +0 -0
  345. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/__init__.py +0 -0
  346. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/__main__.py +0 -0
  347. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/data/README.md +0 -0
  348. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
  349. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/frames.py +0 -0
  350. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
  351. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/migrations/env.py +0 -0
  352. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
  353. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
  354. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
  355. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
  356. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
  357. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  358. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/operations.py +0 -0
  359. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/tables.py +0 -0
  360. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/tutorial/updaters.py +0 -0
  361. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/examples/updater.py +0 -0
  362. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/future_registry.py +0 -0
  363. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/hashing.py +0 -0
  364. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/instrumentation.py +0 -0
  365. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/local_connection.py +0 -0
  366. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/local_files.py +0 -0
  367. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/local_run_logs.py +0 -0
  368. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/log_contract.py +0 -0
  369. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/migrations/__init__.py +0 -0
  370. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/migrations/alembic.py +0 -0
  371. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/migrations/connection.py +0 -0
  372. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/migrations/env.py +0 -0
  373. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/migrations/provider.py +0 -0
  374. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/migrations/registry.py +0 -0
  375. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/migrations/runner.py +0 -0
  376. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/migrations/scaffold.py +0 -0
  377. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/migrations/templates/__init__.py +0 -0
  378. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/migrations/templates/env.py.mako +0 -0
  379. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/migrations/templates/script.py.mako +0 -0
  380. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/migrations/tls.py +0 -0
  381. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/models.py +0 -0
  382. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/pydantic_metadata.py +0 -0
  383. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/run_logging.py +0 -0
  384. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/runtime.py +0 -0
  385. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/runtime_context.py +0 -0
  386. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/runtime_contract.py +0 -0
  387. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/schema_names.py +0 -0
  388. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/sdk_compat.py +0 -0
  389. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/sqlalchemy_contracts.py +0 -0
  390. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/time_index_table_refs.py +0 -0
  391. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/transfer.py +0 -0
  392. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/transfer_contract.py +0 -0
  393. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/transport.py +0 -0
  394. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/update_configuration_contract.py +0 -0
  395. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/updaters/__init__.py +0 -0
  396. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/updaters/configuration.py +0 -0
  397. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/updaters/dependencies.py +0 -0
  398. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/updaters/managers.py +0 -0
  399. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/updaters/namespacing.py +0 -0
  400. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/updaters/runner.py +0 -0
  401. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/updaters/updaters.py +0 -0
  402. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/updaters/utils.py +0 -0
  403. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/src/metatables/upload.py +0 -0
  404. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/auth/test_caller_assertions.py +0 -0
  405. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/auth/test_development_client.py +0 -0
  406. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/auth/test_hosted_environment_target.py +0 -0
  407. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/auth/test_local_mode.py +0 -0
  408. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/auth/test_platform_fact_cache.py +0 -0
  409. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/auth/test_runtime_bootstrap.py +0 -0
  410. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/auth/test_runtime_scaffold.py +0 -0
  411. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/auth/test_runtime_selection.py +0 -0
  412. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/auth/test_runtime_storage_binding.py +0 -0
  413. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/auth/test_source_passwords.py +0 -0
  414. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/catalog/test_catalog_foundation.py +0 -0
  415. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/catalog/test_contract_projection.py +0 -0
  416. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/catalog/test_database_config.py +0 -0
  417. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/catalog/test_index_statistics.py +0 -0
  418. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/catalog/test_migration.py +0 -0
  419. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/conftest.py +0 -0
  420. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/contracts/capabilities.json +0 -0
  421. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/contracts/client_signatures.json +0 -0
  422. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/contracts/database_operations.json +0 -0
  423. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/contracts/test_bounded_transfer.py +0 -0
  424. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/contracts/test_compiler_runtime_source.py +0 -0
  425. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/contracts/test_relation_batching.py +0 -0
  426. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/contracts/test_relation_import.py +0 -0
  427. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/contracts/test_storage_layouts.py +0 -0
  428. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/contracts/test_table_contracts.py +0 -0
  429. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/Dockerfile +0 -0
  430. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/Dockerfile.dockerignore +0 -0
  431. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/__init__.py +0 -0
  432. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/conftest.py +0 -0
  433. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/provider/__init__.py +0 -0
  434. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/provider/env.py +0 -0
  435. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
  436. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/test_api_contract.py +0 -0
  437. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/test_application_migration.py +0 -0
  438. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/test_bootstrap_recovery.py +0 -0
  439. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/test_catalog_contract.py +0 -0
  440. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/test_credential_catalog.py +0 -0
  441. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/test_physical_contract.py +0 -0
  442. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/test_relation_import.py +0 -0
  443. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/test_runtime_bootstrap.py +0 -0
  444. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/test_sql_security.py +0 -0
  445. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_backend/test_update_client.py +0 -0
  446. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_operations/test_physical_operations.py +0 -0
  447. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_operations/test_postgresql_operations.py +0 -0
  448. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/database_operations/test_runtime_and_temporal.py +0 -0
  449. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/documentation/test_project_checks.py +0 -0
  450. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_admin_installation.py +0 -0
  451. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_api_endpoint.py +0 -0
  452. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_application_owned_migrations.py +0 -0
  453. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_catalog_outage.py +0 -0
  454. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_client_api_contract.py +0 -0
  455. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_client_api_coverage.py +0 -0
  456. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_client_migration_scaffold.py +0 -0
  457. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_client_migration_tls.py +0 -0
  458. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_client_package.py +0 -0
  459. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_client_signatures.py +0 -0
  460. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_client_value_behaviors.py +0 -0
  461. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_data_source_registry.py +0 -0
  462. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_local_actor_client_api.py +0 -0
  463. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_local_cli_workflow.py +0 -0
  464. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_local_client_selection.py +0 -0
  465. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_managed_finalize_client_api.py +0 -0
  466. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_namespaces_admin_http.py +0 -0
  467. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_public_imports.py +0 -0
  468. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_remaining_client_routes.py +0 -0
  469. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_run_graphs.py +0 -0
  470. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_run_logs.py +0 -0
  471. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_runtime_transition.py +0 -0
  472. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_runtime_upgrade.py +0 -0
  473. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_sdk_local_startup.py +0 -0
  474. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_sqlite_runtime.py +0 -0
  475. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_table_delete_client_api.py +0 -0
  476. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_table_filter_client_api.py +0 -0
  477. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_table_introspection_client_api.py +0 -0
  478. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_table_patch_client_api.py +0 -0
  479. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_table_search_document_api.py +0 -0
  480. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_table_stats_api.py +0 -0
  481. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_table_update_pipeline.py +0 -0
  482. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_table_updates_http.py +0 -0
  483. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_time_index_delete_client_api.py +0 -0
  484. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_time_index_reads_client_api.py +0 -0
  485. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_update_batch_client_api.py +0 -0
  486. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
  487. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
  488. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
  489. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/e2e/test_update_registration_client_api.py +0 -0
  490. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/examples/test_documented_examples.py +0 -0
  491. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/examples/test_postgresql_examples.py +0 -0
  492. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/examples/test_setup_launch.py +0 -0
  493. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/examples/test_tutorial.py +0 -0
  494. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/integrations/test_credential_store.py +0 -0
  495. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/integrations/test_data_source_rules.py +0 -0
  496. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/integrations/test_local_data_sources.py +0 -0
  497. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/integrations/test_local_run_logs.py +0 -0
  498. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/integrations/test_postgresql_connection.py +0 -0
  499. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/integrations/test_postgresql_sql.py +0 -0
  500. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/integrations/test_postgresql_tables.py +0 -0
  501. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
  502. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/integrations/test_source_validation.py +0 -0
  503. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/integrations/test_sqlite_operations.py +0 -0
  504. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/labels/test_labels.py +0 -0
  505. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/operations/test_create_table_operation.py +0 -0
  506. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/operations/test_create_table_postgres.py +0 -0
  507. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/operations/test_physical_operation_journal.py +0 -0
  508. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/operations/test_register_catalog.py +0 -0
  509. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/operations/test_search_documents.py +0 -0
  510. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/packaging/test_client_skills.py +0 -0
  511. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/packaging/test_dev_release_version.py +0 -0
  512. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/packaging/test_distribution_sources.py +0 -0
  513. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/packaging/test_editable_build.py +0 -0
  514. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/packaging/test_installed_distribution.py +0 -0
  515. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/permissions/test_governed_sql_scope.py +0 -0
  516. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/permissions/test_local_actor_membership.py +0 -0
  517. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/permissions/test_migration_boundary.py +0 -0
  518. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/permissions/test_namespace_grants.py +0 -0
  519. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/permissions/test_security_api.py +0 -0
  520. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/permissions/test_table_body_filter.py +0 -0
  521. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/permissions/test_table_grants.py +0 -0
  522. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/tests/permissions/test_table_queries.py +0 -0
  523. {mainsequence_metatable-0.1.8.dev15 → mainsequence_metatable-0.1.8.dev16}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence-metatable
3
- Version: 0.1.8.dev15
3
+ Version: 0.1.8.dev16
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
@@ -28,7 +28,8 @@ does not cache this API's runtime context or select its runtime mode or DataSour
28
28
  Updated 2026-09-28: application Environment policy and relationships are removed.
29
29
  Amended 2026-09-29: one enforced runtime binding and explicit bootstrap select one
30
30
  database for system and user tables.
31
- Amended 2026-10-02: each runtime mode lists and selects only its own DataSources.
31
+ Amended 2026-10-02: each runtime mode lists and selects only its own DataSources,
32
+ and inspection checks the login's prerequisites before setup.
32
33
 
33
34
  Companion decision: [Main Sequence SDK ADR 0035: Independent Git source and platform execution context](https://github.com/mainsequence-sdk/mainsequence-sdk/blob/metatables_removal/docs/adr/0035-independent-git-source-and-platform-context.md).
34
35
  The SDK prerequisite is implemented on `metatables_removal`; the current local
@@ -172,6 +173,14 @@ configuration inserted as the runtime DataSource in that database. Failed work
172
173
  never activates a partially initialized runtime. A database already initialized
173
174
  and compatible can be selected without running migrations.
174
175
 
176
+ Amended 2026-10-02: before any runtime is registered, inspection also checks,
177
+ read-only, that the login can secure the database under
178
+ [ADR 0007](0007-database-enforced-table-access.md): it owns the database, has
179
+ `CREATEROLE`, and owns every non-system object. Unmet prerequisites make the
180
+ target incompatible, with each reason shown in Settings, so setup never leaves a
181
+ database half-initialized. A registered runtime is not rechecked, because it may
182
+ hold imported external objects.
183
+
175
184
  Settings, runtime context, mode selection and bootstrap actions do not depend on
176
185
  catalog sessions or catalog memberships. They retain the existing request admission.
177
186
  The caller who configures a pending target controls its initialization; an existing
@@ -181,6 +181,25 @@ other caller sessions. SQL Server requires login/user/role administration,
181
181
  `VIEW DEFINITION` and grant management. Managed database services must provide
182
182
  these capabilities; missing permissions leave caller SQL disabled.
183
183
 
184
+ Settings checks the PostgreSQL requirements as soon as you select a database
185
+ without a MetaTables runtime, before any migration runs. The login must own the
186
+ database, have `CREATEROLE`, and own, directly or through role membership, every
187
+ schema, table, view, sequence and routine outside the system catalogs, because
188
+ setup revokes `PUBLIC` access on each of them. Otherwise Settings shows
189
+ **Needs attention** with each reason, for example
190
+ `metatables_dev does not own database "development"` or
191
+ `291 object(s) are owned by postgres (extension timescaledb)`, and
192
+ **Run MetaTables migrations** stays unavailable. Nothing is written to that database.
193
+
194
+ A database operator prepares a qualifying database for the login, for example
195
+ `CREATE DATABASE metatables OWNER metatables_dev TEMPLATE template0;`. On
196
+ PostgreSQL 14 and earlier the `public` schema belongs to the bootstrap superuser,
197
+ so also run `ALTER SCHEMA public OWNER TO metatables_dev;` in that database.
198
+ Extensions such as TimescaleDB and pgvector install their objects as the
199
+ bootstrap superuser, so a database with those extensions cannot currently be
200
+ secured by a non-superuser login. Do not select a database other applications
201
+ share: setup would change their objects' `PUBLIC` access.
202
+
184
203
  Hosted sources require a password Secret to derive per-User database credentials.
185
204
  MySQL global mandatory roles are unsupported. Registration admits ordinary tables
186
205
  only; it does not transfer external ownership. Privileged routines and triggers
@@ -10,7 +10,7 @@ system tables, including `data_source`, alongside user tables. There is no separ
10
10
  catalog connection to configure. Local and hosted use the same initialization flow.
11
11
 
12
12
  1. For Hosted mode, register a PostgreSQL, TimescaleDB, MySQL or MSSQL connection under **MetaTables → Data Sources**. This registration is available before the hosted catalog is initialized.
13
- 2. Open **Settings**, choose Hosted runtime mode, and select that registered DataSource from the list. Local mode prefills the single local SQLite runtime file, shared across Git branches, and uses **Check DataSource**. Choosing a hosted DataSource and switching modes are separate actions.
13
+ 2. Open **Settings**, choose Hosted runtime mode, and select that registered DataSource from the list. Local mode prefills the single local SQLite runtime file, shared across Git branches, and uses **Check DataSource**. Choosing a hosted DataSource and switching modes are separate actions. For a database without a MetaTables runtime, selection also checks that the login can secure it; **Needs attention** lists what is missing ([database privileges](../api/data-sources.md#database-privileges-and-sql-behavior)) and no migration can run until another database is selected.
14
14
  3. For an empty or outdated database, click **Run MetaTables migrations**. This
15
15
  explicitly runs the packaged Alembic history. After success, the API saves the
16
16
  proposal as the runtime DataSource inside the newly initialized registry.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence-metatable"
7
- version = "0.1.8.dev15"
7
+ version = "0.1.8.dev16"
8
8
  description = "Main Sequence MetaTables Python client and standalone API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence-metatable
3
- Version: 0.1.8.dev15
3
+ Version: 0.1.8.dev16
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
@@ -58,6 +58,14 @@ class BootstrapError(RuntimeError):
58
58
  pass
59
59
 
60
60
 
61
+ def insufficient_privilege(exc):
62
+ """The database's own message for a missing privilege, never SQL text or parameters."""
63
+ orig = getattr(exc, "orig", None)
64
+ code = getattr(orig, "pgcode", None) or getattr(orig, "sqlstate", None)
65
+ message = getattr(getattr(orig, "diag", None), "message_primary", None)
66
+ return message if code == "42501" and message else None
67
+
68
+
61
69
  class DestroyLocalInput(BaseModel):
62
70
  model_config = ConfigDict(extra="forbid")
63
71
  path: str
@@ -254,6 +262,8 @@ class RuntimeBootstrap:
254
262
  return
255
263
  if set(self.current) != set(self.expected):
256
264
  self.status = "migration_required"
265
+ if not self.current:
266
+ self.require_prerequisites(connection)
257
267
  return
258
268
  from metatables.api.backend.operations.catalog_schema import validate_system_schema
259
269
  validate_system_schema(connection, self.backend.catalog)
@@ -261,6 +271,8 @@ class RuntimeBootstrap:
261
271
  row = session.scalar(select(DataSource).where(DataSource.is_runtime.__eq__(True)))
262
272
  if row is None:
263
273
  self.status = "registration_required"
274
+ with engine.connect() as connection:
275
+ self.require_prerequisites(connection)
264
276
  elif not self.matches(row):
265
277
  self.status = "incompatible"
266
278
  self.error = "The stored runtime DataSource does not match this connection."
@@ -286,6 +298,15 @@ class RuntimeBootstrap:
286
298
  self.status = "unavailable"
287
299
  self.error = "Cannot verify the selected database or its Alembic history. Check configuration, Secret access and the API's migration version."
288
300
 
301
+ def require_prerequisites(self, connection):
302
+ # Before any setup DDL: a database the login cannot secure must never be
303
+ # half-initialized. A registered runtime may hold external objects.
304
+ problems = self.backend.access.prerequisite_problems(connection)
305
+ if problems:
306
+ self.status = "incompatible"
307
+ self.error = ("MetaTables cannot secure this database: " + "; ".join(problems) + ". Select a database "
308
+ "owned by the DataSource login, as described in DataSource database privileges.")
309
+
289
310
  def matches(self, row):
290
311
  return (row.class_type == self.candidate["class_type"]
291
312
  and row.configuration == self.candidate["configuration"]
@@ -347,6 +368,10 @@ class RuntimeBootstrap:
347
368
  if isinstance(exc, SQLExecutionError):
348
369
  self.error = f"Database access setup failed ({exc.code}). Check the DataSource password Secret and database permissions, then retry setup."
349
370
  raise BootstrapError(self.error) from None
371
+ if privilege_error := insufficient_privilege(exc):
372
+ self.error = (f"Database setup failed: {privilege_error}. The DataSource login must own the runtime "
373
+ "database and every object in it; see the DataSource database privileges.")
374
+ raise BootstrapError(self.error) from None
350
375
  self.error = "MetaTables migration or registration failed. The runtime was not activated; inspect the database before retrying."
351
376
  raise BootstrapError(self.error) from None
352
377
 
@@ -60,6 +60,10 @@ class DatabaseAccess:
60
60
  ).hexdigest()
61
61
  )
62
62
 
63
+ def prerequisite_problems(self, connection):
64
+ """Read-only reasons this login cannot secure the database; checked before setup."""
65
+ return []
66
+
63
67
  def initialize(self, session):
64
68
  raise NotImplementedError
65
69
 
@@ -13,7 +13,53 @@ def quote(value):
13
13
  return '"' + str(value).replace('"', '""') + '"'
14
14
 
15
15
 
16
+ # Objects outside the system catalogs that the login neither owns nor inherits.
17
+ # Setup revokes PUBLIC access and changes default privileges on every one of
18
+ # them, which PostgreSQL permits only to their owner.
19
+ FOREIGN_OBJECTS = """
20
+ WITH objects AS (
21
+ SELECT 'schema' AS kind, n.nspname AS name, n.nspowner AS owner,
22
+ 'pg_namespace'::regclass AS classid, n.oid AS objid
23
+ FROM pg_namespace n
24
+ WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
25
+ UNION ALL
26
+ SELECT 'table', n.nspname || '.' || c.relname, c.relowner, 'pg_class'::regclass, c.oid
27
+ FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
28
+ WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
29
+ AND c.relkind IN ('r', 'p', 'v', 'm', 'S', 'f')
30
+ UNION ALL
31
+ SELECT 'routine', n.nspname || '.' || p.proname, p.proowner, 'pg_proc'::regclass, p.oid
32
+ FROM pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace
33
+ WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
34
+ )
35
+ SELECT pg_get_userbyid(o.owner) AS owner, e.extname AS extension, count(*) AS objects,
36
+ min(o.kind || ' ' || o.name) AS example
37
+ FROM objects o
38
+ LEFT JOIN pg_depend d ON d.classid = o.classid AND d.objid = o.objid AND d.deptype = 'e'
39
+ LEFT JOIN pg_extension e ON e.oid = d.refobjid
40
+ WHERE NOT pg_has_role(current_user, o.owner, 'MEMBER')
41
+ GROUP BY 1, 2
42
+ ORDER BY 3 DESC, 1
43
+ """
44
+
45
+
16
46
  class PostgreSQLAccess(DatabaseAccess):
47
+ def prerequisite_problems(self, connection):
48
+ login, database, owns_database, creates_roles = connection.execute(text(
49
+ "SELECT current_user, current_database(), pg_has_role(current_user, d.datdba, 'MEMBER'), "
50
+ "r.rolcreaterole OR r.rolsuper FROM pg_database d JOIN pg_roles r ON r.rolname = current_user "
51
+ "WHERE d.datname = current_database()"
52
+ )).one()
53
+ problems = []
54
+ if not owns_database:
55
+ problems.append(f'{login} does not own database "{database}"')
56
+ if not creates_roles:
57
+ problems.append(f"{login} lacks CREATEROLE")
58
+ for owner, extension, count, example in connection.execute(text(FOREIGN_OBJECTS)).all()[:3]:
59
+ source = f" (extension {extension})" if extension else ""
60
+ problems.append(f"{count} object(s) are owned by {owner}{source}, e.g. {example}")
61
+ return problems
62
+
17
63
  def initialize(self, session):
18
64
  self.identity_secret()
19
65
  connection = session.connection()
@@ -83,3 +83,89 @@ def test_legacy_runtime_alias_is_reconciled_without_losing_other_sources(tmp_pat
83
83
  restarted = RuntimeBootstrap(bootstrap.config, None)
84
84
  assert restarted.initial_candidate() == bootstrap.candidate
85
85
  assert restarted.selected_source_uid == str(canonical)
86
+
87
+
88
+ def test_setup_reports_the_database_privilege_error_without_sql_or_parameters(tmp_path, monkeypatch):
89
+ import pytest
90
+ from sqlalchemy.exc import ProgrammingError
91
+
92
+ from metatables.api.app.bootstrap import BootstrapError
93
+
94
+ bootstrap = RuntimeBootstrap(RuntimeConfig(local_mode=False,
95
+ configuration_path=tmp_path / "configuration.yaml"), None)
96
+ bootstrap.selected_source_uid = str(uuid4())
97
+ bootstrap.candidate = dict(display_name="Hosted", class_type="timescale_db", configuration={
98
+ "host": "db.example.invalid", "database_name": "tables", "database_user": "tables"})
99
+ engine = create_catalog_engine(f"sqlite:///{tmp_path / 'catalog.sqlite'}", allow_sqlite=True)
100
+ bootstrap.engine = engine
101
+ bootstrap.factory = sessionmaker(engine, expire_on_commit=False)
102
+
103
+ @dataclass
104
+ class Source:
105
+ uid: UUID | None = None
106
+
107
+ bootstrap.backend = SimpleNamespace(source=Source())
108
+ monkeypatch.setattr(bootstrap, "migration_lock", nullcontext)
109
+ monkeypatch.setattr(bootstrap, "inspect", lambda: setattr(bootstrap, "status", "registration_required"))
110
+ # A TimescaleDB runtime whose extension objects belong to the superuser.
111
+ denied = SimpleNamespace(pgcode="42501", diag=SimpleNamespace(message_primary="permission denied for table job_errors"))
112
+
113
+ def initialize(session):
114
+ raise ProgrammingError('REVOKE ALL ON ALL TABLES IN SCHEMA "_timescaledb_internal" FROM PUBLIC',
115
+ {"password": "do-not-show"}, denied)
116
+
117
+ monkeypatch.setattr("metatables.api.backend.backends.registry.backend_for", lambda source:
118
+ SimpleNamespace(access=SimpleNamespace(initialize=initialize)))
119
+ try:
120
+ with pytest.raises(BootstrapError) as raised:
121
+ bootstrap.migrate(uuid4())
122
+ finally:
123
+ bootstrap.close()
124
+ message = str(raised.value)
125
+ assert "permission denied for table job_errors" in message
126
+ assert "must own the runtime database" in message
127
+ assert "REVOKE" not in message and "do-not-show" not in message
128
+ assert bootstrap.error == message
129
+
130
+
131
+ def _fresh_hosted_bootstrap(tmp_path, problems):
132
+ bootstrap = RuntimeBootstrap(RuntimeConfig(local_mode=False,
133
+ configuration_path=tmp_path / "configuration.yaml"), None)
134
+ bootstrap.candidate = dict(display_name="Development", class_type="timescale_db", configuration={
135
+ "host": "db.example.invalid", "database_name": "development", "database_user": "metatables_dev"})
136
+ engine = create_catalog_engine(f"sqlite:///{tmp_path / 'catalog.sqlite'}", allow_sqlite=True)
137
+ bootstrap.engine = engine
138
+ bootstrap.factory = sessionmaker(engine, expire_on_commit=False)
139
+ bootstrap.backend = SimpleNamespace(access=SimpleNamespace(prerequisite_problems=lambda connection: problems))
140
+ return bootstrap
141
+
142
+
143
+ def test_unsecurable_database_is_blocked_before_any_setup_ddl(tmp_path, monkeypatch):
144
+ import pytest
145
+
146
+ from metatables.api.app.bootstrap import BootstrapError
147
+
148
+ bootstrap = _fresh_hosted_bootstrap(tmp_path, [
149
+ 'metatables_dev does not own database "development"',
150
+ "312 object(s) are owned by postgres (extension timescaledb), e.g. schema _timescaledb_internal",
151
+ ])
152
+ monkeypatch.setattr("metatables.api.app.bootstrap.upgrade_catalog",
153
+ lambda engine: pytest.fail("Setup DDL ran on a database the login cannot secure"))
154
+ try:
155
+ bootstrap.inspect()
156
+ assert bootstrap.status == "incompatible"
157
+ assert 'metatables_dev does not own database "development"' in bootstrap.error
158
+ assert "extension timescaledb" in bootstrap.error
159
+ with pytest.raises(BootstrapError, match="cannot secure this database"):
160
+ bootstrap.migrate(uuid4())
161
+ finally:
162
+ bootstrap.close()
163
+
164
+
165
+ def test_securable_fresh_database_still_requires_migrations(tmp_path):
166
+ bootstrap = _fresh_hosted_bootstrap(tmp_path, [])
167
+ try:
168
+ bootstrap.inspect()
169
+ assert bootstrap.status == "migration_required" and bootstrap.error is None
170
+ finally:
171
+ bootstrap.close()