matrx-orm 3.1.135__tar.gz → 3.1.136__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.135 → matrx_orm-3.1.136}/CLAUDE.md +1 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/PKG-INFO +2 -2
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/__init__.py +8 -0
- matrx_orm-3.1.136/matrx_orm/core/session_context.py +94 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/transaction.py +17 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/loader.py +9 -8
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/common.py +16 -5
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/package_wiring.py +10 -8
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/runner.py +13 -3
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/pyproject.toml +2 -2
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/.gitignore +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/AGENTS.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/BASE_CLASS_METHODS.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/MODEL_API.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/database/orm/extended/managers/ai_model_base.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/docs/migrations.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/FEATURE.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/async_postgresql.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/base_adapter.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/postgresql.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/adapters/supabase_adapter.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/admin/FEATURE.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/admin/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/admin/router.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/api/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/api/auth.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/api/config.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/api/handlers.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/api/protocol.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/api/server.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/associations.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/cache_debug.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/catalog.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/catalog_sql.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/postgres_connection.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/postgrest.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/supabase_auth.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/supabase_config.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/client/supabase_manager.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/EXTENDED-TASK.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/FEATURE.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/TASKS.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/async_db_manager.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/base.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/config.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/connections.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/db_function.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/diagnostics.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/expressions.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/extended.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/fields.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/introspection.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/listen.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/loop_filters.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/model_dto.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/model_view.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/one_database.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/paginator.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/pool_maintenance.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/pool_watch.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/pooler_role.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/pydantic_bridge.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/registry.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/relations.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/resilience.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/rls_session.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/signals.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/tls.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/types.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/core/write_queue.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/entity.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/error_handling.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/exceptions.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/extended/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/extended/app_error_handler.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/identity_rule.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/local_sqlite.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/middleware/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/middleware/base.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/cli.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/ddl.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/diff.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/executor.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/integration.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/operations.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/state.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/migrations/table_filter.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/FEATURE.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/bulk_update_values.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/catalog_select.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/conflict.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/conflict_writes.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/create.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/db_functions.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/delete.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/dynamic_admin.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/dynamic_crud.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/graph_walk.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/latest_rows.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/queue_claim.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/read.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/relational_backfill.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/staging_load.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/operations/update.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/platform_access.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/platform_db.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/py.typed +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/pytest_plugin.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/python_sql/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/python_sql/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/python_sql/db_objects.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/query/FEATURE.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/query/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/query/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/query/builder.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/query/executor.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/FEATURE.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/code_handler.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/codegen_writer.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/columns.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/diff_preview.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/generator.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/relationships.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/schema.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/schema_manager.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/tables.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/schema_builder/views.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/FEATURE.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/attachments.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/crypto.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/host_authorization.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/items.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/model.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/org_service.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/secrets_battery/service.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/coalesce.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/dag.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/errors.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/fallback.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/flush.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/lifecycle.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/managed.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/op.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/reads.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/session.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/session/telemetry.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/executor.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/queries.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/registry.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/types.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/sql_executor/utils.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/state.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/utils/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/utils/sql_utils.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/matrx_orm/utils/type_converters.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/scripts/git-branches.sh +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/scripts/publish.sh +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/scripts/release.sh +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/conftest.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_adapter_registry.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_admin_db_columns.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_admin_response_rendering.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_admin_search_negation.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_admin_search_sentinels.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_advisory_lock.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_agent_message.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_api_auth.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_api_config.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_api_handlers.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_api_protocol.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_array_agg_order_by.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_associations.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_associations_wiring.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_bulk_hydration_offload.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_bulk_update_by_pk.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_cache_debug.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_call_function.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_case_when.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_catalog.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_composite_pk_filter.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_composite_pk_write_paths.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_config.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_conflict_target.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_conflict_writes.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_connection_codecs.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_connection_poison_guard.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_connection_primitives.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_count_composite_distinct.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_db_function_field.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_ddl_generator.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_derived_table.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_dirty_tracking.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_dynamic_crud.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_exceptions.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_execute_query_integrity_mapping.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_expression_primitives.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_fields.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_from_alias.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_fts.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_func_expression_args.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_graph_walk.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_having_annotate_alias.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_introspect_rls_policies.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_join_and_aggregate.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_latest_rows.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_listen_notify.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_local_sqlite.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_managed_write_guard.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_matrx_entity.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_migration_diff_types.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_migration_loader.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_model_instance.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_model_meta.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_optimistic_concurrency.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_order_by_expression.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_parameter_name_hydration.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_patch_jsonb_path.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_persisted_count.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_pool_holder_census.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_pool_loop_recreation.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_pool_maintenance.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_postgrest_filters.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_pydantic_bridge.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_query_builder.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_query_error_detail.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_query_executor_sql.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_query_timeout.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_queue_claim.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_read_connection_retry.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_registry.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_registry_multi_database.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_registry_multi_schema.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_relational_backfill.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_relations.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_resilience.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_rls_session_scope.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_schema_exists.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_session_advisory_lock.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_state_cache.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_subquery_filter_raw.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_subquery_in_filter.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_subquery_nested_expressions.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_supabase_auth.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_supabase_config.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_tls.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_typed_join_projection.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_typed_predicates.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_update_case_expression.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_update_subquery.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_update_with_rebase.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_upsert_default_leak.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_upsert_with_conflict.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_values_jsonb_decode.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_watched_lifecycle.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_write_queue_deadline.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level1/test_write_retry_semantics.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/MODULE_README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/conftest.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_bulk_ops.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_cache_integration.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_crud.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_foreign_keys.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_m2m.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_manager.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_migrations_live.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_query_execution.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/level2/test_schema_diff.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/live_pooler_role.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/.env.example +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/generate.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/generated/.gitkeep +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/matrx_orm.yaml +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project/test_schema_generation.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/.env.example +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/README.md +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/client_example.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/client_example.ts +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/client_supabase_example.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/sample_project_desktop/server.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/entity_tests.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_base_generation.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_composite_pk_fk_generation.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_composite_unique_generation.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_dto_identity_generation.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_entity_capability_generation.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_enum_ordering.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_generate_schema.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_junction_analysis.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_multi_schema_output.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_schema_analysis.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_sql_expression_defaults.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_table_relationships_query.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema/test_view_generation.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema_builder/test_array_default_parsing.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema_builder/test_focused_generation_plan.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/schema_builder/test_host_models_aggregator.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/__init__.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/conftest.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_cache_no_downgrade.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_capture_poison_proof.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_coalesce.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_dag.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_disk_spill_fallback.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_flush_individual_fallback.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_governed_write.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_managed.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_op_enqueue_site.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_reads.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_record_error_bounded_insert.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_record_error_storm.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_session.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/session/test_spill_guard_plugin.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_array_arg_element_type.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_database_name_alias.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_db_functions.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_dynamic_select_unregistered.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_keyed_digest.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_model_cls_refactor.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_no_blocking_asyncpg_tls.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_one_database.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_pooler_role_guard.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_secrets_battery.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_secrets_minting_keys.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_sql_param_casts.py +0 -0
- {matrx_orm-3.1.135 → matrx_orm-3.1.136}/tests/test_sync_twins_guard.py +0 -0
|
@@ -52,6 +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 — and a write made **outside** any transaction carries no declaration at all, which is why a single-row write that must record its author still opens one. No provider configured ⇒ no GUCs (standalone behaviour unchanged); a provider that raises fails the transaction loudly rather than committing rows with a false provenance.
|
|
55
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.
|
|
56
57
|
|
|
57
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.136
|
|
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
|
|
@@ -25,7 +25,7 @@ Requires-Python: >=3.13
|
|
|
25
25
|
Requires-Dist: asyncpg>=0.31.0
|
|
26
26
|
Requires-Dist: cryptography>=43.0
|
|
27
27
|
Requires-Dist: gitpython>=3.1.40
|
|
28
|
-
Requires-Dist: matrx-utils>=2.0.
|
|
28
|
+
Requires-Dist: matrx-utils>=2.0.36
|
|
29
29
|
Requires-Dist: psycopg-pool>=3.2.5
|
|
30
30
|
Requires-Dist: psycopg[binary]>=3.2.5
|
|
31
31
|
Requires-Dist: python-dotenv>=1.0
|
|
@@ -240,6 +240,11 @@ from .core.registry import (
|
|
|
240
240
|
)
|
|
241
241
|
from .core.relations import ManyToManyField
|
|
242
242
|
from .core.rls_session import rls_session
|
|
243
|
+
from .core.session_context import (
|
|
244
|
+
SessionContextProvider,
|
|
245
|
+
configure_session_context,
|
|
246
|
+
session_context_gucs,
|
|
247
|
+
)
|
|
243
248
|
from .core.signals import (
|
|
244
249
|
Signal,
|
|
245
250
|
post_create,
|
|
@@ -632,6 +637,9 @@ __all__ = [
|
|
|
632
637
|
"transaction",
|
|
633
638
|
"acquire_connection",
|
|
634
639
|
"set_local_guc",
|
|
640
|
+
"SessionContextProvider",
|
|
641
|
+
"configure_session_context",
|
|
642
|
+
"session_context_gucs",
|
|
635
643
|
"advisory_xact_lock",
|
|
636
644
|
"try_advisory_xact_lock",
|
|
637
645
|
"advisory_lock",
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""The host's DECLARED session context — GUCs every transaction opens with.
|
|
2
|
+
|
|
3
|
+
Some facts about a block of work are known by the application and readable only
|
|
4
|
+
by the database: *which tier of actor* is authoring these writes, for instance.
|
|
5
|
+
Postgres learns them through transaction-local GUCs (``set_config(..., true)``),
|
|
6
|
+
and a GUC set outside a transaction has no meaning — so the ONE place that can
|
|
7
|
+
reliably apply them is the moment this package opens a transaction.
|
|
8
|
+
|
|
9
|
+
The host declares a provider once at startup::
|
|
10
|
+
|
|
11
|
+
from matrx_orm import configure_session_context
|
|
12
|
+
configure_session_context(lambda: {"app.actor_tier": "ai", "app.actor_system": "x"})
|
|
13
|
+
|
|
14
|
+
and from then on every TOP-LEVEL ``transaction()`` (which includes the one
|
|
15
|
+
``rls_session`` opens, before it drops to the restricted role) emits whatever
|
|
16
|
+
the provider returns at that instant. A savepoint (nested transaction) emits
|
|
17
|
+
nothing: it is already inside the transaction the GUCs were set on.
|
|
18
|
+
|
|
19
|
+
Why a provider and not a value: what is true changes per task — the provider is
|
|
20
|
+
normally a ContextVar read, so a block that declares "an AI is writing this"
|
|
21
|
+
affects exactly the work inside it and nothing running beside it.
|
|
22
|
+
|
|
23
|
+
The package NEVER imports the host: no provider configured ⇒ no GUCs, which is
|
|
24
|
+
exactly how matrx-orm behaves standalone. A provider that raises is a host bug
|
|
25
|
+
and it surfaces — the transaction fails loudly rather than silently committing
|
|
26
|
+
writes whose provenance is a lie.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from __future__ import annotations
|
|
30
|
+
|
|
31
|
+
import re
|
|
32
|
+
from collections.abc import Callable, Mapping
|
|
33
|
+
from typing import Any
|
|
34
|
+
|
|
35
|
+
# Same shape matrx_orm.core.transaction.set_local_guc accepts.
|
|
36
|
+
_GUC_NAME_RE = re.compile(r"^[a-z_][a-z0-9_.]*$")
|
|
37
|
+
|
|
38
|
+
SessionContextProvider = Callable[[], Mapping[str, str] | None]
|
|
39
|
+
|
|
40
|
+
_provider: SessionContextProvider | None = None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def configure_session_context(provider: SessionContextProvider | None) -> None:
|
|
44
|
+
"""Bind (or with ``None``, unbind) the host's session-context provider.
|
|
45
|
+
|
|
46
|
+
Call once at startup, alongside the other package ``configure_*`` calls.
|
|
47
|
+
``provider`` is invoked on every top-level transaction open and must return
|
|
48
|
+
a mapping of GUC name → value (or ``None`` / ``{}`` for "nothing to say").
|
|
49
|
+
"""
|
|
50
|
+
global _provider
|
|
51
|
+
if provider is not None and not callable(provider):
|
|
52
|
+
raise TypeError("configure_session_context(provider) requires a callable or None")
|
|
53
|
+
_provider = provider
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def session_context_gucs() -> dict[str, str]:
|
|
57
|
+
"""The GUCs to set on a transaction being opened right now.
|
|
58
|
+
|
|
59
|
+
Empty when no provider is configured. Raises when a configured provider
|
|
60
|
+
returns something unusable — a malformed declaration is a host defect, and
|
|
61
|
+
writing rows with a wrong (or absent) provenance stamp is worse than a loud
|
|
62
|
+
failure at BEGIN.
|
|
63
|
+
"""
|
|
64
|
+
provider = _provider
|
|
65
|
+
if provider is None:
|
|
66
|
+
return {}
|
|
67
|
+
declared = provider()
|
|
68
|
+
if not declared:
|
|
69
|
+
return {}
|
|
70
|
+
if not isinstance(declared, Mapping):
|
|
71
|
+
raise TypeError(
|
|
72
|
+
"the session-context provider must return a mapping of GUC name → value; "
|
|
73
|
+
f"got {type(declared).__name__}"
|
|
74
|
+
)
|
|
75
|
+
out: dict[str, str] = {}
|
|
76
|
+
for name, value in declared.items():
|
|
77
|
+
if not isinstance(name, str) or not _GUC_NAME_RE.match(name):
|
|
78
|
+
raise ValueError(f"invalid session-context GUC name: {name!r}")
|
|
79
|
+
out[name] = "" if value is None else str(value)
|
|
80
|
+
return out
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
async def apply_session_context(connection: Any) -> None:
|
|
84
|
+
"""Emit the declared GUCs on ``connection`` (already inside a BEGIN)."""
|
|
85
|
+
for name, value in session_context_gucs().items():
|
|
86
|
+
await connection.execute("SELECT set_config($1, $2, true)", name, value)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
__all__ = [
|
|
90
|
+
"SessionContextProvider",
|
|
91
|
+
"apply_session_context",
|
|
92
|
+
"configure_session_context",
|
|
93
|
+
"session_context_gucs",
|
|
94
|
+
]
|
|
@@ -249,6 +249,23 @@ class TransactionContext:
|
|
|
249
249
|
) from e
|
|
250
250
|
self._conn_token = _active_connection.set(conn)
|
|
251
251
|
self._depth_token = _savepoint_depth.set(0)
|
|
252
|
+
# THE HOST'S DECLARED SESSION CONTEXT (provenance and friends). A
|
|
253
|
+
# transaction-local GUC only has meaning inside a transaction, so
|
|
254
|
+
# this — the moment one opens — is the only place a declaration made
|
|
255
|
+
# in application code can reach Postgres. Set while still the
|
|
256
|
+
# privileged role: `rls_session` opens through here and drops to the
|
|
257
|
+
# restricted role afterwards. Nested entries are savepoints inside a
|
|
258
|
+
# transaction that already carries them, so they emit nothing.
|
|
259
|
+
from matrx_orm.core.session_context import apply_session_context
|
|
260
|
+
|
|
261
|
+
try:
|
|
262
|
+
await apply_session_context(conn)
|
|
263
|
+
except Exception as e:
|
|
264
|
+
await self.__aexit__(type(e), e, e.__traceback__)
|
|
265
|
+
raise DatabaseError(
|
|
266
|
+
message=f"Failed to apply the declared session context: {e}",
|
|
267
|
+
details={"database": self.database},
|
|
268
|
+
) from e
|
|
252
269
|
return self
|
|
253
270
|
|
|
254
271
|
async def __aexit__(
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
import importlib.util
|
|
6
5
|
import re
|
|
7
6
|
from dataclasses import dataclass
|
|
8
7
|
from pathlib import Path
|
|
@@ -124,15 +123,17 @@ class MigrationLoader:
|
|
|
124
123
|
|
|
125
124
|
def _load_module(self, filepath: Path, name: str) -> Any:
|
|
126
125
|
"""Dynamically import a migration file as a module."""
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
from matrx_utils.module_loading import ProviderModuleRefused, load_module_from_path
|
|
127
|
+
|
|
128
|
+
# Only "no such file" / "refused" become MigrationError; an error the
|
|
129
|
+
# migration raises while executing propagates raw, exactly as before.
|
|
130
|
+
try:
|
|
131
|
+
return load_module_from_path(filepath, module_name=f"matrx_migrations.{name}")
|
|
132
|
+
except (FileNotFoundError, ProviderModuleRefused) as exc:
|
|
129
133
|
raise MigrationError(
|
|
130
134
|
migration=name,
|
|
131
|
-
original_error=f"Could not load migration file: {filepath}",
|
|
132
|
-
)
|
|
133
|
-
module = importlib.util.module_from_spec(spec)
|
|
134
|
-
spec.loader.exec_module(module)
|
|
135
|
-
return module
|
|
135
|
+
original_error=f"Could not load migration file: {filepath} ({exc})",
|
|
136
|
+
) from exc
|
|
136
137
|
|
|
137
138
|
def _validate_graph(self) -> None:
|
|
138
139
|
"""Ensure all declared dependencies exist."""
|
|
@@ -117,15 +117,26 @@ class GenerationOutputOverrides:
|
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
# Central debug configuration for the entire schema builder.
|
|
120
|
-
#
|
|
121
|
-
#
|
|
120
|
+
#
|
|
121
|
+
# Values are set at runtime by run_schema_generation(), from its `info=` /
|
|
122
|
+
# `debug=` / `verbose=` arguments when given and otherwise from the yaml `debug`
|
|
123
|
+
# section. The defaults below are OFF, which is what every deployed and local
|
|
124
|
+
# run already produced: run_schema_generation() has always overwritten all three
|
|
125
|
+
# unconditionally, so the retired env vars could only ever have spoken to a
|
|
126
|
+
# direct importer.
|
|
127
|
+
#
|
|
128
|
+
# They were MATRX_INFO / MATRX_DEBUG / MATRX_VERBOSE until 2026-09-11. USD-5
|
|
129
|
+
# (Arman, 2026-09-10): "Never an env var. Env values are only for secrets, not
|
|
130
|
+
# for controlling behavior." Those three names are also generic enough to be set
|
|
131
|
+
# in a shell for something else entirely and silently turn a code generator
|
|
132
|
+
# chatty — the exact machine-disagrees-with-machine failure the law names.
|
|
122
133
|
DEBUG_CONFIG = {
|
|
123
134
|
"tables": [],
|
|
124
135
|
"columns": [],
|
|
125
136
|
"base_type": [],
|
|
126
|
-
"info":
|
|
127
|
-
"debug":
|
|
128
|
-
"verbose":
|
|
137
|
+
"info": False,
|
|
138
|
+
"debug": False,
|
|
139
|
+
"verbose": False,
|
|
129
140
|
}
|
|
130
141
|
|
|
131
142
|
# Names a generated model class can NEVER take, because the models file imports
|
|
@@ -41,7 +41,6 @@ Manifest schema (``DB_REQUIREMENTS`` dict in the package's manifest file):
|
|
|
41
41
|
from __future__ import annotations
|
|
42
42
|
|
|
43
43
|
import ast
|
|
44
|
-
import importlib.util
|
|
45
44
|
import os
|
|
46
45
|
import re
|
|
47
46
|
from dataclasses import dataclass, field
|
|
@@ -149,13 +148,16 @@ def _load_manifest(manifest_abs: Path) -> dict[str, Any]:
|
|
|
149
148
|
import) so no package __init__ side effects run during generation."""
|
|
150
149
|
if not manifest_abs.is_file():
|
|
151
150
|
raise PackageWiringError(f"package_wiring: manifest not found: {manifest_abs}")
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
151
|
+
from matrx_utils.module_loading import ProviderModuleRefused, load_module_from_path
|
|
152
|
+
|
|
153
|
+
try:
|
|
154
|
+
mod = load_module_from_path(
|
|
155
|
+
manifest_abs, module_name=f"_pkg_wiring_manifest_{manifest_abs.stem}"
|
|
156
|
+
)
|
|
157
|
+
except (FileNotFoundError, ProviderModuleRefused) as exc:
|
|
158
|
+
raise PackageWiringError(
|
|
159
|
+
f"package_wiring: cannot load manifest: {manifest_abs} ({exc})"
|
|
160
|
+
) from exc
|
|
159
161
|
req = getattr(mod, "DB_REQUIREMENTS", None)
|
|
160
162
|
if not isinstance(req, dict):
|
|
161
163
|
raise PackageWiringError(
|
|
@@ -112,6 +112,9 @@ def run_schema_generation(
|
|
|
112
112
|
*,
|
|
113
113
|
only_schemas: set[str] | None = None,
|
|
114
114
|
models_only: bool = False,
|
|
115
|
+
info: bool | None = None,
|
|
116
|
+
debug: bool | None = None,
|
|
117
|
+
verbose: bool | None = None,
|
|
115
118
|
) -> None:
|
|
116
119
|
"""
|
|
117
120
|
Read a matrx_orm.yaml config file, register all databases, apply debug
|
|
@@ -168,10 +171,17 @@ def run_schema_generation(
|
|
|
168
171
|
# -------------------------------------------------------------------------
|
|
169
172
|
# Debug settings
|
|
170
173
|
# -------------------------------------------------------------------------
|
|
174
|
+
# An explicit argument wins over the yaml, so a generate.py can expose
|
|
175
|
+
# --info/--debug/--verbose on its own command line for one run without
|
|
176
|
+
# editing the committed config. These were MATRX_INFO/MATRX_DEBUG/
|
|
177
|
+
# MATRX_VERBOSE until 2026-09-11 (USD-5): a caller's argument, never the
|
|
178
|
+
# environment.
|
|
171
179
|
debug_cfg = cfg.get("debug", {})
|
|
172
|
-
DEBUG_CONFIG["info"] = bool(debug_cfg.get("info", False))
|
|
173
|
-
DEBUG_CONFIG["debug"] = bool(debug_cfg.get("debug", False))
|
|
174
|
-
DEBUG_CONFIG["verbose"] =
|
|
180
|
+
DEBUG_CONFIG["info"] = bool(debug_cfg.get("info", False)) if info is None else info
|
|
181
|
+
DEBUG_CONFIG["debug"] = bool(debug_cfg.get("debug", False)) if debug is None else debug
|
|
182
|
+
DEBUG_CONFIG["verbose"] = (
|
|
183
|
+
bool(debug_cfg.get("verbose", False)) if verbose is None else verbose
|
|
184
|
+
)
|
|
175
185
|
|
|
176
186
|
# -------------------------------------------------------------------------
|
|
177
187
|
# Output config — all paths come from .env only, never from the yaml.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "matrx-orm"
|
|
3
|
-
version = "3.1.
|
|
3
|
+
version = "3.1.136"
|
|
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" }
|
|
@@ -41,7 +41,7 @@ dependencies = [
|
|
|
41
41
|
"gitpython>=3.1.40",
|
|
42
42
|
"psycopg[binary]>=3.2.5",
|
|
43
43
|
"psycopg-pool>=3.2.5",
|
|
44
|
-
"matrx-utils>=2.0.
|
|
44
|
+
"matrx-utils>=2.0.36",
|
|
45
45
|
"pyyaml>=6.0.3",
|
|
46
46
|
"python-dotenv>=1.0",
|
|
47
47
|
"cryptography>=43.0",
|
|
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
|