matrx-orm 3.1.141__tar.gz → 3.1.142__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.
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/CLAUDE.md +1 -1
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/PKG-INFO +1 -1
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/async_db_manager.py +31 -9
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/pyproject.toml +1 -1
- matrx_orm-3.1.142/tests/level1/test_standalone_write_session_context.py +139 -0
- matrx_orm-3.1.141/tests/level1/test_standalone_write_session_context.py +0 -81
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/.gitignore +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/AGENTS.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/BASE_CLASS_METHODS.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/MODEL_API.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/database/orm/extended/managers/ai_model_base.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/docs/migrations.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/FEATURE.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/adapters/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/adapters/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/adapters/async_postgresql.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/adapters/base_adapter.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/adapters/postgresql.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/adapters/supabase_adapter.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/admin/FEATURE.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/admin/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/admin/router.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/api/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/api/auth.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/api/config.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/api/handlers.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/api/protocol.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/api/server.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/associations.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/cache_debug.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/catalog.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/catalog_sql.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/client/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/client/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/client/postgres_connection.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/client/postgrest.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/client/supabase_auth.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/client/supabase_config.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/client/supabase_manager.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/EXTENDED-TASK.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/FEATURE.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/TASKS.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/base.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/config.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/connections.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/db_function.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/diagnostics.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/expressions.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/extended.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/fields.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/introspection.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/listen.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/loop_filters.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/model_dto.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/model_view.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/one_database.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/paginator.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/pool_maintenance.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/pool_watch.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/pooler_role.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/pydantic_bridge.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/registry.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/relations.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/resilience.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/rls_session.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/session_context.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/signals.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/tls.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/transaction.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/types.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/core/write_queue.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/entity.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/error_handling.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/exceptions.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/extended/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/extended/app_error_handler.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/identity_rule.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/local_sqlite.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/middleware/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/middleware/base.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/migrations/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/migrations/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/migrations/cli.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/migrations/ddl.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/migrations/diff.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/migrations/executor.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/migrations/integration.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/migrations/loader.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/migrations/operations.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/migrations/state.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/migrations/table_filter.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/no_org_assignment.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/FEATURE.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/bulk_update_values.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/catalog_select.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/conflict.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/conflict_writes.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/create.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/db_functions.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/delete.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/dynamic_admin.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/dynamic_crud.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/graph_walk.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/latest_rows.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/queue_claim.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/read.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/relational_backfill.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/staging_load.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/operations/update.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/platform_access.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/platform_db.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/py.typed +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/pytest_plugin.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/python_sql/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/python_sql/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/python_sql/db_objects.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/query/FEATURE.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/query/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/query/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/query/builder.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/query/executor.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/resources/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/resources/additional-assigners-2026-09-12.json +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/resources/org_assignment_trigger_baseline.json +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/FEATURE.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/code_handler.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/codegen_writer.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/columns.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/common.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/diff_preview.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/generator.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/package_wiring.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/relationships.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/runner.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/schema.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/schema_manager.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/tables.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/schema_builder/views.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/secrets_battery/FEATURE.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/secrets_battery/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/secrets_battery/attachments.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/secrets_battery/crypto.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/secrets_battery/host_authorization.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/secrets_battery/items.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/secrets_battery/model.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/secrets_battery/mutation_receipts.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/secrets_battery/org_service.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/secrets_battery/service.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/coalesce.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/dag.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/errors.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/fallback.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/flush.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/lifecycle.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/managed.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/op.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/reads.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/session.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/session/telemetry.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/sql_executor/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/sql_executor/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/sql_executor/executor.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/sql_executor/queries.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/sql_executor/registry.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/sql_executor/types.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/sql_executor/utils.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/state.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/utils/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/utils/sql_utils.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/matrx_orm/utils/type_converters.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/scripts/git-branches.sh +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/scripts/publish.sh +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/scripts/release.sh +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/conftest.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_adapter_registry.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_admin_db_columns.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_admin_response_rendering.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_admin_search_negation.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_admin_search_sentinels.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_advisory_lock.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_agent_message.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_api_auth.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_api_config.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_api_handlers.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_api_protocol.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_array_agg_order_by.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_associations.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_associations_wiring.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_bulk_hydration_offload.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_bulk_update_by_pk.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_cache_debug.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_call_function.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_case_when.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_catalog.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_composite_pk_filter.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_composite_pk_write_paths.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_config.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_conflict_target.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_conflict_writes.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_connection_codecs.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_connection_poison_guard.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_connection_primitives.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_count_composite_distinct.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_count_limit_param_leak.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_db_function_field.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_ddl_generator.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_derived_table.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_dirty_tracking.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_dynamic_crud.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_exceptions.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_execute_query_integrity_mapping.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_expression_primitives.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_fields.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_from_alias.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_fts.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_func_expression_args.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_graph_walk.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_having_annotate_alias.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_introspect_rls_policies.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_join_and_aggregate.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_latest_rows.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_listen_notify.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_local_sqlite.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_lock_contention_retry.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_managed_write_guard.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_matrx_entity.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_migration_diff_types.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_migration_loader.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_model_instance.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_model_meta.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_optimistic_concurrency.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_order_by_expression.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_org_assignment_inventory.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_parameter_name_hydration.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_patch_jsonb_path.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_persisted_count.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_pool_holder_census.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_pool_loop_recreation.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_pool_maintenance.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_postgrest_filters.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_pydantic_bridge.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_query_builder.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_query_error_detail.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_query_executor_sql.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_query_timeout.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_queue_claim.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_read_connection_retry.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_registry.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_registry_multi_database.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_registry_multi_schema.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_relational_backfill.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_relations.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_resilience.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_rls_session_scope.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_schema_exists.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_session_advisory_lock.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_state_cache.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_subquery_filter_raw.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_subquery_in_filter.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_subquery_nested_expressions.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_supabase_auth.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_supabase_config.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_tls.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_typed_join_projection.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_typed_predicates.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_update_case_expression.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_update_subquery.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_update_with_rebase.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_upsert_default_leak.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_upsert_with_conflict.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_values_jsonb_decode.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_watched_lifecycle.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_write_queue_deadline.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level1/test_write_retry_semantics.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level2/MODULE_README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level2/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level2/conftest.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level2/test_bulk_ops.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level2/test_cache_integration.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level2/test_crud.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level2/test_foreign_keys.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level2/test_m2m.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level2/test_manager.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level2/test_migrations_live.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level2/test_query_execution.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/level2/test_schema_diff.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/live_pooler_role.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project/.env.example +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project/README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project/generate.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project/generated/.gitkeep +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project/matrx_orm.yaml +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project/test_schema_generation.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project_desktop/.env.example +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project_desktop/README.md +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project_desktop/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project_desktop/client_example.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project_desktop/client_example.ts +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project_desktop/client_supabase_example.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/sample_project_desktop/server.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/entity_tests.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_base_generation.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_composite_pk_fk_generation.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_composite_unique_generation.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_dto_identity_generation.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_entity_capability_generation.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_enum_ordering.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_generate_schema.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_junction_analysis.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_multi_schema_output.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_schema_analysis.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_sql_expression_defaults.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_table_relationships_query.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema/test_view_generation.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema_builder/test_array_default_parsing.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema_builder/test_focused_generation_plan.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/schema_builder/test_host_models_aggregator.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/__init__.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/conftest.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_cache_no_downgrade.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_capture_poison_proof.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_coalesce.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_dag.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_disk_spill_fallback.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_flush_individual_fallback.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_governed_write.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_managed.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_op_enqueue_site.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_reads.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_record_error_bounded_insert.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_record_error_storm.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_session.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/session/test_spill_guard_plugin.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_array_arg_element_type.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_database_name_alias.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_db_functions.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_dynamic_select_unregistered.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_keyed_digest.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_model_cls_refactor.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_no_blocking_asyncpg_tls.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_one_database.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_order_by_desc_nulls_last.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_pooler_role_guard.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_secrets_battery.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_secrets_minting_keys.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_sql_param_casts.py +0 -0
- {matrx_orm-3.1.141 → matrx_orm-3.1.142}/tests/test_sync_twins_guard.py +0 -0
|
@@ -52,7 +52,7 @@ Every table that becomes a Model needs row identity: a single-column primary key
|
|
|
52
52
|
- **Schema builder** (`matrx_orm.schema_builder`): code generation for Python + TypeScript type definitions from the DB schema. Postgres **VIEWs** are emitted as **read-only `Model` classes** into the same schema models file (on by default; per-entry `output.include_views: false` opts a schema out, `output.exclude_views: [...]` skips individual views). View models get no manager/DTO/base-class/auto_config (views are not writable), synthesize `_primary_keys` from an `id` column (else the first column, for cache-key/`load_by_id` only), and emit plain typed fields with **no `ForeignKey`** (views carry no FK metadata — nothing cross-schema to resolve). Never hand-write a view model again.
|
|
53
53
|
- **Secrets battery** (`matrx_orm.secrets_battery`): the ONE canonical user-credential vault — `users.user_secrets` CRUD + the platform's single Fernet primitive, keyed by `CREDENTIALS_ENCRYPTION_KEY`. Any package: `configure_secrets(db_config_name=...)` once, then `await require_user_secret(user_id, key)`. No package ever calls another service to resolve a credential. Contract: [`matrx_orm/secrets_battery/FEATURE.md`](matrx_orm/secrets_battery/FEATURE.md).
|
|
54
54
|
- **Polymorphic associations** (`matrx_orm.associations`): `EntityRegistry` (token→Model) + `Associations` — a registry-driven, **access-gated** edge engine over a host's polymorphic edge table. Every `source→target` hop is org-scoped *and* each resolved endpoint is re-authorized against the ACTOR (fail-closed, screams on a genuine leak), so a hop can't widen access past what the actor may reach. 🚨 **The gate is `access_check` (wire `matrx_orm.platform_access_check` → `iam.has_access_for`), NEVER an org-column comparison** — a person belongs to several orgs on purpose, so org-equality denies her own data across her own workspaces (2026-08-30 incident) while granting any co-member of a private row. The edge's `org_id` is a TENANCY stamp, not a permission. Org-equality survives only for UNATTENDED writes (no actor) as an integrity guard, and **system vocabulary is exempt entirely** (existence still required): a model generated with `_rls_variant="system"` is platform-shared dictionary data (seo.keyword/topic) every tenant legitimately links to. Hardcodes no table names — the host wires its own edge + token-registry models.
|
|
55
|
-
- **The host's declared session context** (`matrx_orm.core.session_context`): `configure_session_context(provider)` once at startup, and every **top-level** `transaction()` — including the one `rls_session` opens, before it drops to the restricted role — emits whatever the provider returns as transaction-local GUCs. This is how an application-level declaration reaches Postgres at all: a GUC set outside a transaction has no meaning, so the BEGIN is the only place it can land. aidream wires it to its provenance declaration (`app.actor_tier` / `app.actor_system`, read by `platform.actor_tier()`, the history capture and the tier rule). A nested entry is a savepoint inside a transaction that already carries them and emits nothing
|
|
55
|
+
- **The host's declared session context** (`matrx_orm.core.session_context`): `configure_session_context(provider)` once at startup, and every **top-level** `transaction()` — including the one `rls_session` opens, before it drops to the restricted role — emits whatever the provider returns as transaction-local GUCs. This is how an application-level declaration reaches Postgres at all: a GUC set outside a transaction has no meaning, so the BEGIN is the only place it can land. aidream wires it to its provenance declaration (`app.actor_tier` / `app.actor_system`, read by `platform.actor_tier()`, the history capture and the tier rule). A nested entry is a savepoint inside a transaction that already carries them and emits nothing. A standalone write (`execute_write` outside any transaction) made while the provider has something to say opens its own transaction for that one statement — and still goes through the write queue, inside a copy of the caller's context, so the queue's concurrency gate is kept and the drain task's foreign context cannot hide the declaration (`tests/level1/test_standalone_write_session_context.py`). No provider configured ⇒ no GUCs (standalone behaviour unchanged); a provider that raises fails the transaction loudly rather than committing rows with a false provenance.
|
|
56
56
|
- **The platform access policy** (`matrx_orm.platform_access`): `platform_access_check(actor, token, id, level)` → `iam.has_access_for`. The ONE answer to "may this actor touch this row?", shared with RLS and the file-access gate. Fails closed. Never re-derive it from `organization_id` or `created_by` — both are strict subsets that deny legitimate access.
|
|
57
57
|
|
|
58
58
|
Public API is defined explicitly in `matrx_orm/__init__.py` (100+ exports). Treat changes there as semver-breaking.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: matrx-orm
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.142
|
|
4
4
|
Summary: Async-first PostgreSQL ORM with bidirectional migrations, schema introspection, many-to-many relationships, and built-in state caching
|
|
5
5
|
Project-URL: Homepage, https://github.com/AI-Matrix-Engine/aidream-current
|
|
6
6
|
Project-URL: Repository, https://github.com/AI-Matrix-Engine/aidream-current
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import contextvars
|
|
4
5
|
from dataclasses import dataclass
|
|
5
6
|
import json
|
|
6
7
|
import logging
|
|
@@ -1605,25 +1606,46 @@ class AsyncDatabaseManager:
|
|
|
1605
1606
|
except ImportError:
|
|
1606
1607
|
pass
|
|
1607
1608
|
|
|
1609
|
+
from matrx_orm.core.write_queue import get_write_queue_registry
|
|
1610
|
+
|
|
1611
|
+
config_name = resolve_database_name(config_name)
|
|
1612
|
+
wq = get_write_queue_registry().get(config_name)
|
|
1613
|
+
|
|
1608
1614
|
# A declared host session context (notably actor provenance) is made of
|
|
1609
1615
|
# transaction-local GUCs. A plain standalone write used to skip BEGIN,
|
|
1610
1616
|
# so its trigger saw the database default even though the caller had
|
|
1611
|
-
# explicitly declared an actor
|
|
1612
|
-
#
|
|
1613
|
-
#
|
|
1617
|
+
# explicitly declared an actor — so a declared write takes the
|
|
1618
|
+
# canonical transaction path (BEGIN → GUCs → statement → COMMIT).
|
|
1619
|
+
#
|
|
1620
|
+
# It still goes through the write queue. The queue's drain executes
|
|
1621
|
+
# each item in a task forked from the DRAIN's context, where the
|
|
1622
|
+
# caller's ContextVar declaration is invisible; so the item is run
|
|
1623
|
+
# inside a copy of the caller's context instead of skipping the
|
|
1624
|
+
# queue. Skipping was the first fix (2026-09-12) and it was fine while
|
|
1625
|
+
# only a few doors declared; once the request boundary declares for
|
|
1626
|
+
# EVERY authenticated request, skipping would have moved every
|
|
1627
|
+
# request write off the queue's concurrency gate and onto raw pool
|
|
1628
|
+
# acquires — the pool-storm class the queue exists to prevent.
|
|
1614
1629
|
from matrx_orm.core.session_context import session_context_gucs
|
|
1615
1630
|
|
|
1616
1631
|
if session_context_gucs():
|
|
1617
1632
|
from matrx_orm.core.transaction import transaction
|
|
1618
1633
|
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1634
|
+
async def _declared_write() -> list[dict[str, Any]]:
|
|
1635
|
+
async with transaction(config_name):
|
|
1636
|
+
return await cls.execute_query(config_name, query, *args, timeout=timeout)
|
|
1622
1637
|
|
|
1623
|
-
|
|
1638
|
+
if wq is None:
|
|
1639
|
+
return await _declared_write()
|
|
1624
1640
|
|
|
1625
|
-
|
|
1626
|
-
|
|
1641
|
+
caller_context = contextvars.copy_context()
|
|
1642
|
+
|
|
1643
|
+
async def _in_caller_context() -> list[dict[str, Any]]:
|
|
1644
|
+
# Awaited by the drain's item task; the inner task carries the
|
|
1645
|
+
# caller's context so the session provider sees the declaration.
|
|
1646
|
+
return await asyncio.create_task(_declared_write(), context=caller_context)
|
|
1647
|
+
|
|
1648
|
+
return await wq.submit(_in_caller_context)
|
|
1627
1649
|
|
|
1628
1650
|
if wq is not None:
|
|
1629
1651
|
return await wq.submit(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "matrx-orm"
|
|
3
|
-
version = "3.1.
|
|
3
|
+
version = "3.1.142"
|
|
4
4
|
description = "Async-first PostgreSQL ORM with bidirectional migrations, schema introspection, many-to-many relationships, and built-in state caching"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { text = "MIT" }
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"""A declared session context reaches a standalone write's transaction —
|
|
2
|
+
THROUGH the write queue, not around it.
|
|
3
|
+
|
|
4
|
+
History: the first fix (2026-09-12 12:36) bypassed the queue for a declared
|
|
5
|
+
write because the drain's task cannot see the caller's ContextVar. Once the
|
|
6
|
+
request boundary declares an actor for every authenticated request, that
|
|
7
|
+
bypass would have taken every request write off the queue's concurrency gate.
|
|
8
|
+
The queue is kept and the item runs in a copy of the caller's context.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import contextvars
|
|
14
|
+
from contextlib import asynccontextmanager
|
|
15
|
+
|
|
16
|
+
import asyncio
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
from matrx_orm.core.async_db_manager import AsyncDatabaseManager
|
|
20
|
+
from matrx_orm.core.session_context import (
|
|
21
|
+
configure_session_context,
|
|
22
|
+
declared_actor,
|
|
23
|
+
declared_actor_gucs,
|
|
24
|
+
session_context_gucs,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class _DrainLikeQueue:
|
|
29
|
+
"""Executes the factory the way the real drain does: in a task forked from
|
|
30
|
+
a FOREIGN context (one with no declaration), so a factory that relies on
|
|
31
|
+
the submitter's context being ambient would see nothing."""
|
|
32
|
+
|
|
33
|
+
def __init__(self) -> None:
|
|
34
|
+
self.submitted = 0
|
|
35
|
+
|
|
36
|
+
async def submit(self, coro_factory):
|
|
37
|
+
self.submitted += 1
|
|
38
|
+
foreign = contextvars.Context() # empty: no actor declared here
|
|
39
|
+
task = asyncio.create_task(coro_factory(), context=foreign)
|
|
40
|
+
return await task
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@pytest.mark.asyncio
|
|
44
|
+
async def test_declared_write_keeps_the_queue_and_lands_gucs_in_its_transaction(
|
|
45
|
+
monkeypatch,
|
|
46
|
+
) -> None:
|
|
47
|
+
events: list[object] = []
|
|
48
|
+
queue = _DrainLikeQueue()
|
|
49
|
+
|
|
50
|
+
@asynccontextmanager
|
|
51
|
+
async def fake_transaction(database: str):
|
|
52
|
+
# What the real TransactionContext does at BEGIN: ask the provider.
|
|
53
|
+
events.append(("begin", database, dict(session_context_gucs())))
|
|
54
|
+
yield
|
|
55
|
+
events.append(("commit", database))
|
|
56
|
+
|
|
57
|
+
async def fake_execute_query(_cls, config_name: str, query: str, *args, **kwargs):
|
|
58
|
+
events.append(("write", config_name, query))
|
|
59
|
+
return [{"id": 1}]
|
|
60
|
+
|
|
61
|
+
monkeypatch.setattr("matrx_orm.core.transaction.transaction", fake_transaction)
|
|
62
|
+
monkeypatch.setattr(AsyncDatabaseManager, "execute_query", classmethod(fake_execute_query))
|
|
63
|
+
monkeypatch.setattr(
|
|
64
|
+
"matrx_orm.core.write_queue.get_write_queue_registry",
|
|
65
|
+
lambda: {"test": queue},
|
|
66
|
+
)
|
|
67
|
+
configure_session_context(declared_actor_gucs)
|
|
68
|
+
try:
|
|
69
|
+
async with declared_actor("ai", "tool:instance_create"):
|
|
70
|
+
rows = await AsyncDatabaseManager.execute_write(
|
|
71
|
+
"test", "INSERT INTO content_ir.kind_instance DEFAULT VALUES RETURNING id"
|
|
72
|
+
)
|
|
73
|
+
finally:
|
|
74
|
+
configure_session_context(None)
|
|
75
|
+
|
|
76
|
+
assert rows == [{"id": 1}]
|
|
77
|
+
assert queue.submitted == 1, "a declared write must still be admitted through the queue"
|
|
78
|
+
assert events == [
|
|
79
|
+
(
|
|
80
|
+
"begin",
|
|
81
|
+
"test",
|
|
82
|
+
{"app.actor_tier": "ai", "app.actor_system": "tool:instance_create"},
|
|
83
|
+
),
|
|
84
|
+
("write", "test", "INSERT INTO content_ir.kind_instance DEFAULT VALUES RETURNING id"),
|
|
85
|
+
("commit", "test"),
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@pytest.mark.asyncio
|
|
90
|
+
async def test_declared_write_without_a_queue_opens_its_own_transaction(monkeypatch) -> None:
|
|
91
|
+
events: list[object] = []
|
|
92
|
+
|
|
93
|
+
@asynccontextmanager
|
|
94
|
+
async def fake_transaction(database: str):
|
|
95
|
+
events.append(("begin", database, dict(session_context_gucs())))
|
|
96
|
+
yield
|
|
97
|
+
events.append(("commit", database))
|
|
98
|
+
|
|
99
|
+
async def fake_execute_query(_cls, config_name: str, query: str, *args, **kwargs):
|
|
100
|
+
events.append(("write", config_name, query))
|
|
101
|
+
return [{"id": 3}]
|
|
102
|
+
|
|
103
|
+
monkeypatch.setattr("matrx_orm.core.transaction.transaction", fake_transaction)
|
|
104
|
+
monkeypatch.setattr(AsyncDatabaseManager, "execute_query", classmethod(fake_execute_query))
|
|
105
|
+
monkeypatch.setattr("matrx_orm.core.write_queue.get_write_queue_registry", lambda: {})
|
|
106
|
+
configure_session_context(declared_actor_gucs)
|
|
107
|
+
try:
|
|
108
|
+
async with declared_actor("human", "user-1"):
|
|
109
|
+
rows = await AsyncDatabaseManager.execute_write("test", "UPDATE t SET x = 1")
|
|
110
|
+
finally:
|
|
111
|
+
configure_session_context(None)
|
|
112
|
+
|
|
113
|
+
assert rows == [{"id": 3}]
|
|
114
|
+
assert events[0] == ("begin", "test", {"app.actor_tier": "human", "app.actor_system": "user-1"})
|
|
115
|
+
assert events[-1] == ("commit", "test")
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@pytest.mark.asyncio
|
|
119
|
+
async def test_write_without_session_context_keeps_queue_path(monkeypatch) -> None:
|
|
120
|
+
submitted = False
|
|
121
|
+
|
|
122
|
+
class Queue:
|
|
123
|
+
async def submit(self, _operation):
|
|
124
|
+
nonlocal submitted
|
|
125
|
+
submitted = True
|
|
126
|
+
return [{"id": 2}]
|
|
127
|
+
|
|
128
|
+
monkeypatch.setattr(
|
|
129
|
+
"matrx_orm.core.write_queue.get_write_queue_registry",
|
|
130
|
+
lambda: {"test": Queue()},
|
|
131
|
+
)
|
|
132
|
+
configure_session_context(None)
|
|
133
|
+
|
|
134
|
+
rows = await AsyncDatabaseManager.execute_write(
|
|
135
|
+
"test", "INSERT INTO public.example DEFAULT VALUES"
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
assert rows == [{"id": 2}]
|
|
139
|
+
assert submitted is True
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from contextlib import asynccontextmanager
|
|
4
|
-
|
|
5
|
-
import pytest
|
|
6
|
-
|
|
7
|
-
from matrx_orm.core.async_db_manager import AsyncDatabaseManager
|
|
8
|
-
from matrx_orm.core.session_context import configure_session_context
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
@pytest.mark.asyncio
|
|
12
|
-
async def test_declared_session_context_bypasses_queue_and_opens_transaction(monkeypatch) -> None:
|
|
13
|
-
events: list[object] = []
|
|
14
|
-
|
|
15
|
-
class Queue:
|
|
16
|
-
async def submit(self, _operation):
|
|
17
|
-
raise AssertionError("declared context must not move to the queue drain task")
|
|
18
|
-
|
|
19
|
-
@asynccontextmanager
|
|
20
|
-
async def fake_transaction(database: str):
|
|
21
|
-
events.append(("begin", database))
|
|
22
|
-
yield
|
|
23
|
-
events.append(("commit", database))
|
|
24
|
-
|
|
25
|
-
async def fake_execute_query(_cls, config_name: str, query: str, *args, **kwargs):
|
|
26
|
-
timeout = kwargs.get("timeout", 10.0)
|
|
27
|
-
events.append(("write", config_name, query, args, timeout))
|
|
28
|
-
return [{"id": 1}]
|
|
29
|
-
|
|
30
|
-
monkeypatch.setattr("matrx_orm.core.transaction.transaction", fake_transaction)
|
|
31
|
-
monkeypatch.setattr(AsyncDatabaseManager, "execute_query", classmethod(fake_execute_query))
|
|
32
|
-
monkeypatch.setattr(
|
|
33
|
-
"matrx_orm.core.write_queue.get_write_queue_registry",
|
|
34
|
-
lambda: {"test": Queue()},
|
|
35
|
-
)
|
|
36
|
-
configure_session_context(
|
|
37
|
-
lambda: {"app.actor_tier": "ai", "app.actor_system": "tool:instance_create"}
|
|
38
|
-
)
|
|
39
|
-
try:
|
|
40
|
-
rows = await AsyncDatabaseManager.execute_write(
|
|
41
|
-
"test", "INSERT INTO content_ir.kind_instance DEFAULT VALUES RETURNING id"
|
|
42
|
-
)
|
|
43
|
-
finally:
|
|
44
|
-
configure_session_context(None)
|
|
45
|
-
|
|
46
|
-
assert rows == [{"id": 1}]
|
|
47
|
-
assert events == [
|
|
48
|
-
("begin", "test"),
|
|
49
|
-
(
|
|
50
|
-
"write",
|
|
51
|
-
"test",
|
|
52
|
-
"INSERT INTO content_ir.kind_instance DEFAULT VALUES RETURNING id",
|
|
53
|
-
(),
|
|
54
|
-
10.0,
|
|
55
|
-
),
|
|
56
|
-
("commit", "test"),
|
|
57
|
-
]
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
@pytest.mark.asyncio
|
|
61
|
-
async def test_write_without_session_context_keeps_queue_path(monkeypatch) -> None:
|
|
62
|
-
submitted = False
|
|
63
|
-
|
|
64
|
-
class Queue:
|
|
65
|
-
async def submit(self, _operation):
|
|
66
|
-
nonlocal submitted
|
|
67
|
-
submitted = True
|
|
68
|
-
return [{"id": 2}]
|
|
69
|
-
|
|
70
|
-
monkeypatch.setattr(
|
|
71
|
-
"matrx_orm.core.write_queue.get_write_queue_registry",
|
|
72
|
-
lambda: {"test": Queue()},
|
|
73
|
-
)
|
|
74
|
-
configure_session_context(None)
|
|
75
|
-
|
|
76
|
-
rows = await AsyncDatabaseManager.execute_write(
|
|
77
|
-
"test", "INSERT INTO public.example DEFAULT VALUES"
|
|
78
|
-
)
|
|
79
|
-
|
|
80
|
-
assert rows == [{"id": 2}]
|
|
81
|
-
assert submitted is True
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|