matrx-orm 3.1.237__tar.gz → 3.1.239__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.237 → matrx_orm-3.1.239}/.gitignore +5 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/PKG-INFO +2 -2
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/extended.py +41 -4
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/flush.py +20 -11
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/reads.py +51 -7
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/pyproject.toml +2 -2
- matrx_orm-3.1.239/tests/level1/test_fetch_on_init_holds_whole_table.py +116 -0
- matrx_orm-3.1.239/tests/session/test_a_grouped_update_writes_only_each_rows_own_fields.py +36 -0
- matrx_orm-3.1.239/tests/session/test_pending_insert_honors_operator_filters.py +65 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/AGENTS.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/BASE_CLASS_METHODS.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/CHANGELOG.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/CLAUDE.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/MODEL_API.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/database/orm/extended/managers/ai_model_base.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/docs/migrations.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/FEATURE.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/adapters/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/adapters/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/adapters/async_postgresql.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/adapters/base_adapter.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/adapters/supabase_adapter.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/admin/FEATURE.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/admin/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/admin/router.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/api/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/api/auth.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/api/config.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/api/handlers.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/api/protocol.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/api/server.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/associations.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/cache_debug.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/catalog.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/catalog_sql.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/postgres_connection.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/postgrest.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/supabase_auth.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/supabase_config.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/client/supabase_manager.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/EXTENDED-TASK.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/FEATURE.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/TASKS.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/admin_lane.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/async_db_manager.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/base.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/config.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/connections.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/db_function.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/diagnostics.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/expressions.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/fields.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/foreign_session_state.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/introspection.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/listen.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/loop_filters.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/model_dto.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/model_view.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/one_database.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/paginator.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/pool_maintenance.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/pool_watch.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/pooler_role.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/pydantic_bridge.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/read_write.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/registry.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/relations.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/resilience.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/rls_session.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/session_context.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/signals.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/statement_ceiling.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/tls.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/transaction.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/types.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/write_queue.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/core/write_retry.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/entity.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/error_handling.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/exceptions.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/extended/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/extended/app_error_handler.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/identity_rule.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/local_sqlite.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/middleware/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/middleware/base.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/cli.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/ddl.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/diff.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/executor.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/integration.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/loader.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/operations.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/state.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/migrations/table_filter.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/no_org_assignment.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/FEATURE.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/bulk_update_values.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/catalog_select.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/conflict.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/conflict_writes.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/create.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/db_functions.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/delete.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/dynamic_admin.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/dynamic_crud.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/graph_walk.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/latest_rows.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/queue_claim.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/read.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/relational_backfill.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/staging_load.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/operations/update.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/platform_access.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/platform_db.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/py.typed +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/pytest_lock_guard.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/pytest_plugin.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/python_sql/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/python_sql/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/python_sql/db_objects.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/query/FEATURE.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/query/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/query/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/query/builder.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/query/executor.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/resources/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/resources/additional-assigners-2026-09-12.json +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/resources/org_assignment_trigger_baseline.json +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/FEATURE.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/code_handler.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/codegen_writer.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/columns.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/common.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/diff_preview.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/excluded_targets.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/generator.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/package_wiring.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/relationships.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/runner.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/schema.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/schema_manager.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/tables.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/schema_builder/views.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/FEATURE.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/attachments.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/backup_restore.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/crypto.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/host_authorization.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/items.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/model.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/mutation_receipts.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/native_enable.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/native_lifecycle.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/native_passkeys.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/native_source.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/org_service.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/org_vault_gate.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/service.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/secrets_battery/vault_history.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/coalesce.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/dag.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/errors.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/fallback.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/lifecycle.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/managed.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/op.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/session.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/session/telemetry.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/executor.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/queries.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/registry.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/types.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/sql_executor/utils.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/state.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/utils/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/utils/sql_utils.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/utils/type_converters.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/matrx_orm/write_actor.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/scripts/git-branches.sh +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/scripts/publish.sh +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/scripts/release.sh +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/conftest.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_adapter_registry.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_admin_db_columns.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_admin_response_rendering.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_admin_search_negation.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_admin_search_sentinels.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_advisory_lock.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_agent_message.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_api_auth.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_api_config.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_api_handlers.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_api_protocol.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_array_agg_order_by.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_association_trigger_actor_naming.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_associations.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_associations_wiring.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_borrowed_role_never_reaches_server_calls.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_bulk_hydration_offload.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_bulk_update_by_pk.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_cache_debug.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_call_function.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_case_when.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_catalog.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_column_scoped_writes.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_committed_row_guard.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_composite_pk_filter.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_composite_pk_write_paths.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_config.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_conflict_target.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_conflict_writes.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_connection_codecs.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_connection_poison_guard.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_connection_primitives.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_count_composite_distinct.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_count_limit_param_leak.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_db_function_field.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_ddl_generator.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_deadlock_retry.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_derived_table.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_dirty_tracking.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_dynamic_crud.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_exceptions.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_execute_query_integrity_mapping.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_expression_primitives.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_fields.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_fk_cycle_resolution.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_from_alias.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_fts.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_func_expression_args.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_graph_walk.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_having_annotate_alias.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_introspect_rls_policies.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_join_and_aggregate.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_latest_rows.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_listen_notify.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_local_sqlite.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_lock_contention_retry.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_managed_write_guard.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_matrx_entity.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_migration_diff_types.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_migration_loader.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_model_instance.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_model_meta.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_optimistic_concurrency.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_order_by_expression.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_org_assignment_inventory.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_orm_banners_are_client_safe.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_parameter_name_hydration.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_patch_jsonb_path.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_percentile_cont.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_persisted_count.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_person_scoped_session_bypasses_shared_cache.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_pool_create_never_wedges.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_pool_holder_census.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_pool_loop_recreation.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_pool_maintenance.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_postgrest_filters.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_pydantic_bridge.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_query_builder.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_query_error_detail.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_query_executor_sql.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_query_timeout.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_queue_claim.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_read_connection_retry.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_read_write_declared.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_registry.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_registry_multi_database.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_registry_multi_schema.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_relational_backfill.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_relations.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_resilience.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_rls_session_scope.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_schema_exists.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_session_advisory_lock.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_standalone_write_session_context.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_state_cache.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_subquery_filter_raw.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_subquery_in_filter.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_subquery_nested_expressions.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_supabase_auth.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_supabase_config.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_tls.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_transaction_database_identity.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_transaction_gucs_one_round_trip.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_transaction_pool_release_sends_nothing.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_typed_join_projection.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_typed_predicates.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_update_case_expression.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_update_subquery.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_update_with_rebase.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_upsert_default_leak.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_upsert_with_conflict.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_values_jsonb_decode.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_watched_lifecycle.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_write_queue_deadline.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level1/test_write_retry_semantics.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/MODULE_README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/conftest.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_bulk_ops.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_cache_integration.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_crud.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_foreign_keys.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_m2m.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_manager.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_migrations_live.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_query_execution.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/test_schema_diff.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/level2/verify_committed_row_guard_pg17.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/live_pooler_role.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/native_source_cases.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/native_source_oracle.rs +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/.env.example +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/generate.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/generated/.gitkeep +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/matrx_orm.yaml +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project/test_schema_generation.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/.env.example +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/README.md +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/client_example.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/client_example.ts +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/client_supabase_example.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/sample_project_desktop/server.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/entity_tests.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_base_generation.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_composite_pk_fk_generation.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_composite_unique_generation.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_dto_identity_generation.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_entity_capability_generation.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_enum_ordering.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_excluded_fk_targets.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_generate_schema.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_junction_analysis.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_multi_schema_output.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_schema_analysis.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_sql_expression_defaults.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_table_relationships_query.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema/test_view_generation.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema_builder/test_array_default_parsing.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema_builder/test_enum_array_column.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema_builder/test_focused_generation_plan.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema_builder/test_host_models_aggregator.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/schema_builder/test_never_filter_columns.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/__init__.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/conftest.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_a_failed_capture_still_names_the_failure.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_cache_no_downgrade.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_capture_poison_proof.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_coalesce.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_dag.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_disk_spill_fallback.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_flush_individual_fallback.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_governed_write.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_managed.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_op_enqueue_site.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_reads.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_record_error_bounded_insert.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_record_error_storm.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_session.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_spill_guard_plugin.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/session/test_tests_never_write_live_system_error.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_a_backend_handed_over_mid_transaction_never_takes_our_writes.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_a_bulk_cache_never_stalls_the_loop.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_a_keyword_column_refuses_generation.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_a_list_of_uuids_binds_as_uuid_array.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_a_read_only_backend_never_refuses_our_writes.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_a_sealed_field_shows_no_character_of_its_value.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_array_arg_element_type.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_attachment_mutation_serialization.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_backup_alias_conflict.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_backup_history_restore.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_backup_restore_live.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_call_function_as.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_call_function_none_mode.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_composite_fk_is_not_a_column_fk.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_database_name_alias.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_db_functions.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_dsn_password_masking.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_dynamic_select_unregistered.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_first_asks_the_database_for_one_row.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_foreign_session_state.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_immutable_insert_or_exact_verify.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_keyed_digest.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_model_cls_refactor.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_native_enable.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_native_lifecycle.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_native_lifecycle_fences.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_native_passkey_receipts.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_native_source.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_no_blocking_asyncpg_tls.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_one_database.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_order_by_desc_nulls_last.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_org_vault_gate.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_package_wiring_views.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_pooler_role_guard.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_secret_audit_names_its_organization.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_secrets_battery.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_secrets_minting_keys.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_shared_lock_guard.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_sql_param_casts.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_state_cache_sweeps_stale.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_statement_ceiling_warning.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_sync_twins_guard.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_update_result_truthiness.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_user_visible_lookup.py +0 -0
- {matrx_orm-3.1.237 → matrx_orm-3.1.239}/tests/test_vault_aggregate_recovery_stateful.py +0 -0
|
@@ -355,3 +355,8 @@ apps/shared/zz-proof-*/
|
|
|
355
355
|
|
|
356
356
|
# tsup writes this temp file while it builds a config; never commit it
|
|
357
357
|
tsup.config.bundled_*.mjs
|
|
358
|
+
|
|
359
|
+
# db/tests/test_provision_pull.py writes a projection for a spec row it ALWAYS rolls back;
|
|
360
|
+
# if the test is interrupted before its scrub, a sweep commit must never pick it up
|
|
361
|
+
# (2026-10-19: one was swept in and failed 5 aidream releases with identity.token.taken).
|
|
362
|
+
db/migrations/*_provision_provision_pull_selftest.sql
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: matrx-orm
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.239
|
|
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
|
|
@@ -26,7 +26,7 @@ Requires-Dist: asyncpg>=0.31.0
|
|
|
26
26
|
Requires-Dist: cbor2<7,>=6.1.3
|
|
27
27
|
Requires-Dist: cryptography>=43.0
|
|
28
28
|
Requires-Dist: gitpython>=3.1.40
|
|
29
|
-
Requires-Dist: matrx-utils>=2.0.
|
|
29
|
+
Requires-Dist: matrx-utils>=2.0.79
|
|
30
30
|
Requires-Dist: psycopg-pool>=3.2.5
|
|
31
31
|
Requires-Dist: psycopg[binary]>=3.2.5
|
|
32
32
|
Requires-Dist: python-dotenv>=1.0
|
|
@@ -36,6 +36,9 @@ class BaseManager(Generic[ModelT]):
|
|
|
36
36
|
# for that manager. Has no effect when Pydantic is not installed.
|
|
37
37
|
validate_input: bool = True
|
|
38
38
|
|
|
39
|
+
# Knob: hard ceiling for fetch-on-init (rows). Reaching it raises; never truncates.
|
|
40
|
+
fetch_on_init_max_rows: int = 50_000
|
|
41
|
+
|
|
39
42
|
def __init__(
|
|
40
43
|
self,
|
|
41
44
|
model: type[ModelT],
|
|
@@ -1744,6 +1747,43 @@ class BaseManager(Generic[ModelT]):
|
|
|
1744
1747
|
|
|
1745
1748
|
run_sync(self._auto_fetch_on_init_async())
|
|
1746
1749
|
|
|
1750
|
+
async def _fetch_whole_table(self) -> list[ModelT]:
|
|
1751
|
+
"""Return EVERY row of the table, never a truncated prefix.
|
|
1752
|
+
|
|
1753
|
+
``fetch_on_init_limit`` is the PAGE SIZE (a knob), not a cap: a
|
|
1754
|
+
fetch-on-init cache that claims to hold the table must hold all of it
|
|
1755
|
+
(2026-10 defect: a 300 cap silently dropped 84 of 384 ai.model_definition
|
|
1756
|
+
rows). Single-PK tables page by keyset (``pk > last``); composite-PK
|
|
1757
|
+
tables page by offset over a full-PK order. Past
|
|
1758
|
+
``fetch_on_init_max_rows`` the fetch RAISES (loud at boot) instead of
|
|
1759
|
+
continuing with partial data — switch such a manager to load-on-miss.
|
|
1760
|
+
"""
|
|
1761
|
+
page = int(self.fetch_on_init_limit)
|
|
1762
|
+
pks = list(self.model._meta.primary_keys or ["id"])
|
|
1763
|
+
ceiling = int(self.fetch_on_init_max_rows)
|
|
1764
|
+
rows: list[ModelT] = []
|
|
1765
|
+
last: Any = None
|
|
1766
|
+
while True:
|
|
1767
|
+
qb = self.model.filter()
|
|
1768
|
+
if len(pks) == 1:
|
|
1769
|
+
if last is not None:
|
|
1770
|
+
qb = qb.filter(**{f"{pks[0]}__gt": last})
|
|
1771
|
+
qb = qb.order_by(pks[0]).limit(page)
|
|
1772
|
+
else:
|
|
1773
|
+
qb = qb.order_by(*pks).limit(page).offset(len(rows))
|
|
1774
|
+
batch = await qb.all()
|
|
1775
|
+
rows.extend(batch)
|
|
1776
|
+
if len(rows) > ceiling:
|
|
1777
|
+
raise RuntimeError(
|
|
1778
|
+
f"[{self.model.__name__}] fetch-on-init exceeded fetch_on_init_max_rows="
|
|
1779
|
+
f"{ceiling}; this table is too large to cache whole — make the manager "
|
|
1780
|
+
"load-on-miss (fetch_on_init_limit=0) or raise the knob deliberately."
|
|
1781
|
+
)
|
|
1782
|
+
if len(batch) < page:
|
|
1783
|
+
return rows
|
|
1784
|
+
if len(pks) == 1:
|
|
1785
|
+
last = getattr(batch[-1], pks[0])
|
|
1786
|
+
|
|
1747
1787
|
async def _auto_fetch_on_init_async(self) -> None:
|
|
1748
1788
|
"""Fetch items on initialization (async version with full DTO support)."""
|
|
1749
1789
|
if int(self.fetch_on_init_limit) <= 0:
|
|
@@ -1751,7 +1791,7 @@ class BaseManager(Generic[ModelT]):
|
|
|
1751
1791
|
|
|
1752
1792
|
start_time = time.perf_counter()
|
|
1753
1793
|
|
|
1754
|
-
items = await self.
|
|
1794
|
+
items = await self._fetch_whole_table()
|
|
1755
1795
|
initialized_items: list[ModelT] = []
|
|
1756
1796
|
for item in items:
|
|
1757
1797
|
result = await self._initialize_item_runtime(item)
|
|
@@ -1797,9 +1837,6 @@ class BaseManager(Generic[ModelT]):
|
|
|
1797
1837
|
color="red",
|
|
1798
1838
|
)
|
|
1799
1839
|
|
|
1800
|
-
if count >= (self.fetch_on_init_limit - 5):
|
|
1801
|
-
self._trigger_limit_reached_warning(count, initialized_items)
|
|
1802
|
-
|
|
1803
1840
|
if not warnings_suppressed and count > warning_limit_threshold:
|
|
1804
1841
|
self._trigger_fetch_warnings(count, initialized_items, warning_limit_threshold)
|
|
1805
1842
|
|
|
@@ -168,13 +168,17 @@ async def _execute_group(
|
|
|
168
168
|
pks = getattr(meta, "primary_keys", None) if meta else None
|
|
169
169
|
pk_field = pks[0] if pks else ops[0].pk_field
|
|
170
170
|
|
|
171
|
-
#
|
|
172
|
-
#
|
|
173
|
-
#
|
|
174
|
-
#
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
171
|
+
# bulk_update applies ONE fields list to every instance it is given,
|
|
172
|
+
# reading each field off the instance. A stub carries the Model's
|
|
173
|
+
# Python DEFAULT in every column its op never set, so a single call
|
|
174
|
+
# with the UNION of the group's keys wrote those defaults over real
|
|
175
|
+
# values (PB-08: a completed chat.tool_call row reset to
|
|
176
|
+
# status='pending', output_type='text', output_chars=0 because the
|
|
177
|
+
# parallel call's completion flushed in the same group). One call per
|
|
178
|
+
# distinct field set: every row writes exactly the fields its op set.
|
|
179
|
+
# Per-row, bulk_update skips None values, so clearing a field via this
|
|
180
|
+
# path is unsupported (acceptable for our use cases).
|
|
181
|
+
by_fields: dict[tuple[str, ...], list[object]] = {}
|
|
178
182
|
for op in ops:
|
|
179
183
|
kwargs = {pk_field: op.pk_value}
|
|
180
184
|
kwargs.update(op.payload)
|
|
@@ -184,10 +188,15 @@ async def _execute_group(
|
|
|
184
188
|
# entry and blank every other column for the TTL (this is the bug
|
|
185
189
|
# that made a saved conversation read back with no organization_id
|
|
186
190
|
# on its next turn). See matrx_orm.state.mark_partial.
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
+
fields = tuple(sorted(op.payload.keys()))
|
|
192
|
+
by_fields.setdefault(fields, []).append(mark_partial(model_cls(**kwargs), kwargs))
|
|
193
|
+
|
|
194
|
+
written = 0
|
|
195
|
+
for fields, instances in by_fields.items():
|
|
196
|
+
if fields:
|
|
197
|
+
await model_cls.bulk_update(instances, fields=list(fields))
|
|
198
|
+
written += len(instances)
|
|
199
|
+
return written
|
|
191
200
|
|
|
192
201
|
if op_type == "delete":
|
|
193
202
|
meta = getattr(model_cls, "_meta", None)
|
|
@@ -179,19 +179,63 @@ def merge_pending_with_db_one(
|
|
|
179
179
|
def _matches_simple_filter(payload: dict[str, Any], filters: dict[str, Any]) -> bool:
|
|
180
180
|
"""Return True if `payload` matches every (field, value) in `filters`.
|
|
181
181
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
182
|
+
Literal equality, plus the operators that can be judged exactly on an
|
|
183
|
+
in-memory payload: ``in`` / ``nin`` / ``not_in`` / ``ne`` / ``isnull`` and
|
|
184
|
+
ordered comparisons on comparable values. Only an operator that cannot be
|
|
185
|
+
judged here (JSON paths, text search, a field the payload does not carry)
|
|
186
|
+
answers "might match".
|
|
187
|
+
|
|
188
|
+
"Might match" for EVERY operator was a lie with a victim: an ``exists()``
|
|
189
|
+
asking "is a run live on conversation X?" (``id__in=[…],
|
|
190
|
+
status__in=['pending','processing']``) answered yes for ANY conversation
|
|
191
|
+
while the caller's own request INSERT was pending in its Session, so a
|
|
192
|
+
finished helper was steered instead of continued and never answered
|
|
193
|
+
(PB-08, conversation 6e3f85a3…, 2026-10-19).
|
|
188
194
|
"""
|
|
189
195
|
for key, expected in filters.items():
|
|
190
196
|
if "__" in key:
|
|
191
|
-
|
|
197
|
+
field, _, op = key.rpartition("__")
|
|
198
|
+
verdict = _judge_operator(payload, field, op, expected)
|
|
199
|
+
if verdict is False:
|
|
200
|
+
return False
|
|
192
201
|
continue
|
|
193
202
|
if key not in payload:
|
|
194
203
|
return False
|
|
195
204
|
if payload[key] != expected:
|
|
196
205
|
return False
|
|
197
206
|
return True
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def _same(a: Any, b: Any) -> bool:
|
|
210
|
+
"""Equality that treats a uuid and its string as the same value."""
|
|
211
|
+
return a == b or (a is not None and b is not None and str(a) == str(b))
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def _judge_operator(payload: dict[str, Any], field: str, op: str, expected: Any) -> bool | None:
|
|
215
|
+
"""True / False when the operator can be judged on ``payload``; None = cannot."""
|
|
216
|
+
if not field or "__" in field or field not in payload:
|
|
217
|
+
return None
|
|
218
|
+
value = payload[field]
|
|
219
|
+
if op == "isnull":
|
|
220
|
+
return (value is None) == bool(expected)
|
|
221
|
+
if op in ("in", "nin", "not_in"):
|
|
222
|
+
if isinstance(expected, (str, bytes)) or not hasattr(expected, "__iter__"):
|
|
223
|
+
return None
|
|
224
|
+
member = any(_same(value, e) for e in expected)
|
|
225
|
+
return member if op == "in" else not member
|
|
226
|
+
if op == "ne":
|
|
227
|
+
return not _same(value, expected)
|
|
228
|
+
if op in ("gt", "gte", "lt", "lte"):
|
|
229
|
+
if value is None or expected is None:
|
|
230
|
+
return None
|
|
231
|
+
try:
|
|
232
|
+
if op == "gt":
|
|
233
|
+
return value > expected
|
|
234
|
+
if op == "gte":
|
|
235
|
+
return value >= expected
|
|
236
|
+
if op == "lt":
|
|
237
|
+
return value < expected
|
|
238
|
+
return value <= expected
|
|
239
|
+
except TypeError:
|
|
240
|
+
return None
|
|
241
|
+
return None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "matrx-orm"
|
|
3
|
-
version = "3.1.
|
|
3
|
+
version = "3.1.239"
|
|
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.79",
|
|
45
45
|
"pyyaml>=6.0.3",
|
|
46
46
|
"python-dotenv>=1.0",
|
|
47
47
|
"cryptography>=43.0",
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""A fetch-on-init cache holds the WHOLE table or fails loudly — never a silent prefix.
|
|
2
|
+
|
|
3
|
+
Pins the 2026-10 defect: fetch_on_init_limit=300 on a 384-row table loaded 300
|
|
4
|
+
rows and only printed a banner. Plus a census of every fetch-on-init manager.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import re
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import pytest
|
|
11
|
+
from matrx_orm.core.base import Model, ModelMeta
|
|
12
|
+
from matrx_orm.core.extended import BaseManager
|
|
13
|
+
from matrx_orm.core.fields import CharField, IntegerField
|
|
14
|
+
from matrx_orm.core.registry import ModelRegistry
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@pytest.fixture(autouse=True)
|
|
18
|
+
def _clean_registry():
|
|
19
|
+
ModelRegistry.clear()
|
|
20
|
+
yield
|
|
21
|
+
ModelRegistry.clear()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class _FakeQB:
|
|
25
|
+
def __init__(self, rows, pk):
|
|
26
|
+
self.rows, self.pk = rows, pk
|
|
27
|
+
self._gt = None
|
|
28
|
+
self._limit = None
|
|
29
|
+
self._offset = 0
|
|
30
|
+
|
|
31
|
+
def filter(self, **kw):
|
|
32
|
+
for k, v in kw.items():
|
|
33
|
+
assert k == f"{self.pk}__gt"
|
|
34
|
+
self._gt = v
|
|
35
|
+
return self
|
|
36
|
+
|
|
37
|
+
def order_by(self, *a):
|
|
38
|
+
return self
|
|
39
|
+
|
|
40
|
+
def limit(self, n):
|
|
41
|
+
self._limit = n
|
|
42
|
+
return self
|
|
43
|
+
|
|
44
|
+
def offset(self, n):
|
|
45
|
+
self._offset = n
|
|
46
|
+
return self
|
|
47
|
+
|
|
48
|
+
async def all(self):
|
|
49
|
+
rows = sorted(self.rows, key=lambda r: getattr(r, self.pk))
|
|
50
|
+
if self._gt is not None:
|
|
51
|
+
rows = [r for r in rows if getattr(r, self.pk) > self._gt]
|
|
52
|
+
rows = rows[self._offset :]
|
|
53
|
+
return rows[: self._limit] if self._limit is not None else rows
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _manager(n, limit, max_rows=None):
|
|
57
|
+
M = ModelMeta(
|
|
58
|
+
"BigTable",
|
|
59
|
+
(Model,),
|
|
60
|
+
{"id": IntegerField(primary_key=True), "name": CharField(), "_table_name": "big", "_database": "t"},
|
|
61
|
+
)
|
|
62
|
+
rows = [M(id=i, name=str(i)) for i in range(n)]
|
|
63
|
+
M.filter = classmethod(lambda cls, **kw: _FakeQB(rows, "id"))
|
|
64
|
+
|
|
65
|
+
class Mgr(BaseManager):
|
|
66
|
+
async def _initialize_runtime_data(self, item):
|
|
67
|
+
pass
|
|
68
|
+
|
|
69
|
+
if max_rows is not None:
|
|
70
|
+
Mgr.fetch_on_init_max_rows = max_rows
|
|
71
|
+
return Mgr(M, fetch_on_init_limit=limit)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@pytest.mark.asyncio
|
|
75
|
+
async def test_more_rows_than_limit_are_all_loaded():
|
|
76
|
+
mgr = _manager(n=387, limit=300)
|
|
77
|
+
await mgr._auto_fetch_on_init_async()
|
|
78
|
+
assert len(mgr._active_items) == 387
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@pytest.mark.asyncio
|
|
82
|
+
async def test_exact_multiple_of_page_size_loads_all():
|
|
83
|
+
mgr = _manager(n=600, limit=300)
|
|
84
|
+
await mgr._auto_fetch_on_init_async()
|
|
85
|
+
assert len(mgr._active_items) == 600
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@pytest.mark.asyncio
|
|
89
|
+
async def test_ceiling_raises_instead_of_partial():
|
|
90
|
+
mgr = _manager(n=50, limit=10, max_rows=30)
|
|
91
|
+
with pytest.raises(RuntimeError, match="fetch_on_init_max_rows"):
|
|
92
|
+
await mgr._auto_fetch_on_init_async()
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# ---- census: every fetch-on-init manager, its limit, and its recorded size class ----
|
|
96
|
+
# size class = the largest table the limit is expected to cover per page; the page size
|
|
97
|
+
# is a knob only, because the loader pages through the whole table.
|
|
98
|
+
CENSUS = {
|
|
99
|
+
# file (relative to aidream/packages): (page size, table, size class)
|
|
100
|
+
"matrx-ai/matrx_ai/db/ai_models/_ai_model_manager_orm.py": (300, "ai.model_definition", "hundreds"),
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def test_census_lists_every_fetch_on_init_manager():
|
|
105
|
+
root = Path(__file__).resolve().parents[3] # aidream/packages
|
|
106
|
+
found = {}
|
|
107
|
+
for pkg in root.iterdir():
|
|
108
|
+
for f in pkg.rglob("*.py"):
|
|
109
|
+
if "/tests/" in str(f) or f.name.startswith("test_") or "/node_modules/" in str(f):
|
|
110
|
+
continue
|
|
111
|
+
for m in re.finditer(r"fetch_on_init_limit\s*=\s*([1-9]\d*)", f.read_text(errors="ignore")):
|
|
112
|
+
found[str(f.relative_to(root))] = int(m.group(1))
|
|
113
|
+
assert found == {k: v[0] for k, v in CENSUS.items()}, (
|
|
114
|
+
"A new fetch-on-init manager appeared (or a limit changed): add it to CENSUS with its "
|
|
115
|
+
"table and size class."
|
|
116
|
+
)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""A flushed UPDATE group writes, for each row, only the fields that row's op set.
|
|
2
|
+
|
|
3
|
+
PB-08 defect 58 (conversation 6e3f85a3…, 2026-10-19): two parallel ``agent``
|
|
4
|
+
calls flushed their ``chat.tool_call`` UPDATEs in one group. The flush handed
|
|
5
|
+
``bulk_update`` ONE field list — the union of every op's keys — and a stub
|
|
6
|
+
instance per row whose untouched columns held the Model's Python defaults. Tidewell's
|
|
7
|
+
row, whose op never set ``status``, got ``status='pending'``,
|
|
8
|
+
``output_type='text'``, ``output_chars=0``, ``execution_events=[]`` written over
|
|
9
|
+
its completed values (version 4, same ``updated_at`` as Ares's row), and no
|
|
10
|
+
sweep ever finalized a ``pending`` row.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import pytest
|
|
16
|
+
from matrx_orm.session import Session
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@pytest.mark.asyncio
|
|
20
|
+
async def test_each_row_is_updated_with_only_its_own_fields(FakeMessage) -> None:
|
|
21
|
+
async with Session() as s:
|
|
22
|
+
s.defer_update(
|
|
23
|
+
FakeMessage,
|
|
24
|
+
"ares",
|
|
25
|
+
{"status": "completed", "output": "{}", "output_type": "json", "output_chars": 2},
|
|
26
|
+
)
|
|
27
|
+
s.defer_update(FakeMessage, "tidewell", {"message_id": "msg-1"})
|
|
28
|
+
|
|
29
|
+
written: dict[str, set[str]] = {}
|
|
30
|
+
for instances, fields in FakeMessage._bulk_update_calls:
|
|
31
|
+
for inst in instances:
|
|
32
|
+
written.setdefault(inst.id, set()).update(fields)
|
|
33
|
+
assert written.get("tidewell") == {"message_id"}, (
|
|
34
|
+
f"row 'tidewell' was written fields it never set: {sorted(written.get('tidewell', set()))}"
|
|
35
|
+
)
|
|
36
|
+
assert written.get("ares") == {"status", "output", "output_type", "output_chars"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""A pending INSERT joins a read only when it matches the read's operator filters.
|
|
2
|
+
|
|
3
|
+
PB-08 defects 56/57 (conversation 6e3f85a3…, 2026-10-19): ``send_message`` to a
|
|
4
|
+
helper that had FINISHED answered ``delivered_to_running_agent``, and the steer
|
|
5
|
+
row stayed ``pending`` forever. The "is it running?" read is
|
|
6
|
+
``user_request.exists(id__in=[<the helper's request>], status__in=['pending',
|
|
7
|
+
'processing'])``. It ran inside the lead's own turn, whose own ``user_request``
|
|
8
|
+
INSERT was still pending in the Session, and the pending-aware merger treated
|
|
9
|
+
every operator-suffixed filter as "might match" — so the lead's own
|
|
10
|
+
unflushed request answered "yes, a run is live" for any conversation at all.
|
|
11
|
+
|
|
12
|
+
Operators the merger can evaluate exactly (in / nin / not_in / ne / isnull, and
|
|
13
|
+
ordered comparisons on comparable values) are evaluated; only a truly unknown
|
|
14
|
+
operator keeps the "might match" answer.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import uuid
|
|
20
|
+
|
|
21
|
+
from matrx_orm.session.op import make_insert
|
|
22
|
+
from matrx_orm.session.reads import merge_pending_with_db
|
|
23
|
+
|
|
24
|
+
OWN = str(uuid.uuid4())
|
|
25
|
+
HELPERS = str(uuid.uuid4())
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _pending_own_request(model):
|
|
29
|
+
return [make_insert(model, {"id": OWN, "status": "processing"})]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_an_in_filter_on_another_id_does_not_match_a_pending_insert(FakeMessage) -> None:
|
|
33
|
+
result = merge_pending_with_db(
|
|
34
|
+
[],
|
|
35
|
+
_pending_own_request(FakeMessage),
|
|
36
|
+
{"id__in": [HELPERS], "status__in": ["pending", "processing"]},
|
|
37
|
+
)
|
|
38
|
+
assert result == [], "a pending row matched an id__in filter that does not name it"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_an_in_filter_naming_the_pending_row_matches(FakeMessage) -> None:
|
|
42
|
+
result = merge_pending_with_db(
|
|
43
|
+
[],
|
|
44
|
+
_pending_own_request(FakeMessage),
|
|
45
|
+
{"id__in": [uuid.UUID(OWN)], "status__in": ["pending", "processing"]},
|
|
46
|
+
)
|
|
47
|
+
assert [r["id"] for r in result] == [OWN]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def test_status_in_excludes_a_pending_row_in_another_status(FakeMessage) -> None:
|
|
51
|
+
pending = [make_insert(FakeMessage, {"id": OWN, "status": "completed"})]
|
|
52
|
+
assert merge_pending_with_db([], pending, {"status__in": ["pending", "processing"]}) == []
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_ne_nin_and_isnull_are_evaluated(FakeMessage) -> None:
|
|
56
|
+
pending = [make_insert(FakeMessage, {"id": OWN, "status": "running", "deleted_at": None})]
|
|
57
|
+
assert merge_pending_with_db([], pending, {"status__ne": "running"}) == []
|
|
58
|
+
assert merge_pending_with_db([], pending, {"status__nin": ["running"]}) == []
|
|
59
|
+
assert merge_pending_with_db([], pending, {"deleted_at__isnull": False}) == []
|
|
60
|
+
assert len(merge_pending_with_db([], pending, {"deleted_at__isnull": True})) == 1
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_an_unknown_operator_still_might_match(FakeMessage) -> None:
|
|
64
|
+
pending = [make_insert(FakeMessage, {"id": OWN, "title": "x"})]
|
|
65
|
+
assert len(merge_pending_with_db([], pending, {"title__json_path": "$.a"})) == 1
|
|
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
|