matrx-orm 3.1.161__tar.gz → 3.1.162__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.161 → matrx_orm-3.1.162}/PKG-INFO +1 -1
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/associations.py +48 -1
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/pyproject.toml +1 -1
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_associations.py +91 -1
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/.gitignore +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/AGENTS.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/BASE_CLASS_METHODS.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/CLAUDE.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/MODEL_API.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/database/orm/extended/managers/ai_model_base.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/docs/migrations.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/FEATURE.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/adapters/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/adapters/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/adapters/async_postgresql.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/adapters/base_adapter.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/adapters/supabase_adapter.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/admin/FEATURE.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/admin/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/admin/router.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/api/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/api/auth.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/api/config.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/api/handlers.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/api/protocol.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/api/server.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/cache_debug.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/catalog.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/catalog_sql.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/client/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/client/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/client/postgres_connection.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/client/postgrest.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/client/supabase_auth.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/client/supabase_config.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/client/supabase_manager.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/EXTENDED-TASK.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/FEATURE.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/TASKS.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/async_db_manager.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/base.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/config.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/connections.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/db_function.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/diagnostics.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/expressions.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/extended.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/fields.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/introspection.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/listen.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/loop_filters.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/model_dto.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/model_view.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/one_database.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/paginator.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/pool_maintenance.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/pool_watch.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/pooler_role.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/pydantic_bridge.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/registry.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/relations.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/resilience.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/rls_session.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/session_context.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/signals.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/tls.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/transaction.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/types.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/write_queue.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/core/write_retry.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/entity.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/error_handling.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/exceptions.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/extended/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/extended/app_error_handler.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/identity_rule.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/local_sqlite.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/middleware/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/middleware/base.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/migrations/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/migrations/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/migrations/cli.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/migrations/ddl.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/migrations/diff.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/migrations/executor.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/migrations/integration.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/migrations/loader.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/migrations/operations.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/migrations/state.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/migrations/table_filter.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/no_org_assignment.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/FEATURE.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/bulk_update_values.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/catalog_select.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/conflict.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/conflict_writes.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/create.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/db_functions.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/delete.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/dynamic_admin.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/dynamic_crud.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/graph_walk.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/latest_rows.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/queue_claim.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/read.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/relational_backfill.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/staging_load.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/operations/update.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/platform_access.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/platform_db.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/py.typed +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/pytest_lock_guard.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/pytest_plugin.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/python_sql/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/python_sql/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/python_sql/db_objects.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/query/FEATURE.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/query/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/query/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/query/builder.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/query/executor.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/resources/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/resources/additional-assigners-2026-09-12.json +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/resources/org_assignment_trigger_baseline.json +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/FEATURE.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/code_handler.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/codegen_writer.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/columns.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/common.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/diff_preview.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/generator.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/package_wiring.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/relationships.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/runner.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/schema.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/schema_manager.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/tables.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/views.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/secrets_battery/FEATURE.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/secrets_battery/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/secrets_battery/attachments.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/secrets_battery/crypto.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/secrets_battery/host_authorization.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/secrets_battery/items.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/secrets_battery/model.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/secrets_battery/mutation_receipts.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/secrets_battery/org_service.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/secrets_battery/service.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/coalesce.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/dag.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/errors.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/fallback.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/flush.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/lifecycle.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/managed.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/op.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/reads.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/session.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/session/telemetry.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/sql_executor/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/sql_executor/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/sql_executor/executor.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/sql_executor/queries.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/sql_executor/registry.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/sql_executor/types.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/sql_executor/utils.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/state.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/utils/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/utils/sql_utils.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/utils/type_converters.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/write_actor.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/scripts/git-branches.sh +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/scripts/publish.sh +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/scripts/release.sh +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/conftest.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_adapter_registry.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_admin_db_columns.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_admin_response_rendering.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_admin_search_negation.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_admin_search_sentinels.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_advisory_lock.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_agent_message.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_api_auth.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_api_config.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_api_handlers.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_api_protocol.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_array_agg_order_by.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_associations_wiring.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_bulk_hydration_offload.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_bulk_update_by_pk.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_cache_debug.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_call_function.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_case_when.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_catalog.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_committed_row_guard.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_composite_pk_filter.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_composite_pk_write_paths.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_config.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_conflict_target.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_conflict_writes.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_connection_codecs.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_connection_poison_guard.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_connection_primitives.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_count_composite_distinct.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_count_limit_param_leak.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_db_function_field.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_ddl_generator.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_deadlock_retry.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_derived_table.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_dirty_tracking.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_dynamic_crud.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_exceptions.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_execute_query_integrity_mapping.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_expression_primitives.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_fields.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_from_alias.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_fts.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_func_expression_args.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_graph_walk.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_having_annotate_alias.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_introspect_rls_policies.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_join_and_aggregate.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_latest_rows.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_listen_notify.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_local_sqlite.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_lock_contention_retry.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_managed_write_guard.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_matrx_entity.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_migration_diff_types.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_migration_loader.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_model_instance.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_model_meta.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_optimistic_concurrency.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_order_by_expression.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_org_assignment_inventory.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_orm_banners_are_client_safe.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_parameter_name_hydration.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_patch_jsonb_path.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_persisted_count.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_pool_holder_census.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_pool_loop_recreation.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_pool_maintenance.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_postgrest_filters.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_pydantic_bridge.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_query_builder.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_query_error_detail.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_query_executor_sql.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_query_timeout.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_queue_claim.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_read_connection_retry.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_registry.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_registry_multi_database.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_registry_multi_schema.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_relational_backfill.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_relations.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_resilience.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_rls_session_scope.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_schema_exists.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_session_advisory_lock.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_standalone_write_session_context.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_state_cache.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_subquery_filter_raw.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_subquery_in_filter.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_subquery_nested_expressions.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_supabase_auth.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_supabase_config.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_tls.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_transaction_database_identity.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_typed_join_projection.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_typed_predicates.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_update_case_expression.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_update_subquery.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_update_with_rebase.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_upsert_default_leak.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_upsert_with_conflict.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_values_jsonb_decode.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_watched_lifecycle.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_write_queue_deadline.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level1/test_write_retry_semantics.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/MODULE_README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/conftest.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/test_bulk_ops.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/test_cache_integration.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/test_crud.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/test_foreign_keys.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/test_m2m.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/test_manager.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/test_migrations_live.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/test_query_execution.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/test_schema_diff.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/level2/verify_committed_row_guard_pg17.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/live_pooler_role.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project/.env.example +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project/README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project/generate.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project/generated/.gitkeep +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project/matrx_orm.yaml +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project/test_schema_generation.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project_desktop/.env.example +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project_desktop/README.md +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project_desktop/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project_desktop/client_example.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project_desktop/client_example.ts +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project_desktop/client_supabase_example.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/sample_project_desktop/server.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/entity_tests.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_base_generation.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_composite_pk_fk_generation.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_composite_unique_generation.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_dto_identity_generation.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_entity_capability_generation.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_enum_ordering.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_generate_schema.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_junction_analysis.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_multi_schema_output.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_schema_analysis.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_sql_expression_defaults.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_table_relationships_query.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema/test_view_generation.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema_builder/test_array_default_parsing.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema_builder/test_focused_generation_plan.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/schema_builder/test_host_models_aggregator.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/__init__.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/conftest.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_cache_no_downgrade.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_capture_poison_proof.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_coalesce.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_dag.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_disk_spill_fallback.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_flush_individual_fallback.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_governed_write.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_managed.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_op_enqueue_site.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_reads.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_record_error_bounded_insert.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_record_error_storm.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_session.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/session/test_spill_guard_plugin.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_array_arg_element_type.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_database_name_alias.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_db_functions.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_dynamic_select_unregistered.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_immutable_insert_or_exact_verify.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_keyed_digest.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_model_cls_refactor.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_no_blocking_asyncpg_tls.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_one_database.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_order_by_desc_nulls_last.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_pooler_role_guard.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_secrets_battery.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_secrets_minting_keys.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_shared_lock_guard.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_sql_param_casts.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_sync_twins_guard.py +0 -0
- {matrx_orm-3.1.161 → matrx_orm-3.1.162}/tests/test_user_visible_lookup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: matrx-orm
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.162
|
|
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
|
|
@@ -614,6 +614,39 @@ class Associations:
|
|
|
614
614
|
f"can decide."
|
|
615
615
|
)
|
|
616
616
|
|
|
617
|
+
#: How many endpoint ids go into one ``pk IN (...)`` fetch. Bounded so a
|
|
618
|
+
#: Library of 5,810 sources does not build one statement with 5,810 bind
|
|
619
|
+
#: parameters; 500 is the same chunk the rest of this codebase uses for
|
|
620
|
+
#: set-based reads and writes.
|
|
621
|
+
_FETCH_CHUNK = 500
|
|
622
|
+
|
|
623
|
+
@classmethod
|
|
624
|
+
async def _fetch_many(cls, model: type[Model], ids: list[Any]) -> dict[str, Any]:
|
|
625
|
+
"""``{str(pk): row}`` for ``ids``, in a BOUNDED number of round trips.
|
|
626
|
+
|
|
627
|
+
One statement per :attr:`_FETCH_CHUNK` ids, through the same Model (so
|
|
628
|
+
the same RLS session, the same soft-delete filter and the same row
|
|
629
|
+
shape as a per-id load). Duplicate ids in the edge list cost nothing
|
|
630
|
+
extra. A composite-primary-key endpoint has no single-column ``IN``, so
|
|
631
|
+
it falls back to per-id loads — no association endpoint uses one today,
|
|
632
|
+
and this keeps the helper honest if one ever does.
|
|
633
|
+
"""
|
|
634
|
+
meta = getattr(model, "_meta", None)
|
|
635
|
+
pks = list(getattr(meta, "primary_keys", None) or ["id"])
|
|
636
|
+
unique = list(dict.fromkeys(str(i) for i in ids))
|
|
637
|
+
if len(pks) > 1:
|
|
638
|
+
found = [await model.load_by_id_or_none(i) for i in unique]
|
|
639
|
+
return {
|
|
640
|
+
str(getattr(row, pks[0])): row for row in found if row is not None
|
|
641
|
+
}
|
|
642
|
+
pk = pks[0]
|
|
643
|
+
out: dict[str, Any] = {}
|
|
644
|
+
for start in range(0, len(unique), cls._FETCH_CHUNK):
|
|
645
|
+
chunk = unique[start : start + cls._FETCH_CHUNK]
|
|
646
|
+
for row in await model.filter_items(**{f"{pk}__in": chunk}):
|
|
647
|
+
out[str(getattr(row, pk))] = row
|
|
648
|
+
return out
|
|
649
|
+
|
|
617
650
|
async def _load_gated(
|
|
618
651
|
self, token: str, ids: list[Any], org_id: str, actor_id: str | None = None
|
|
619
652
|
) -> list[Any]:
|
|
@@ -631,13 +664,27 @@ class Associations:
|
|
|
631
664
|
|
|
632
665
|
A row that fails BOTH is dropped and SCREAMS: with the edge org-scoped
|
|
633
666
|
by layer 1, reaching here means RLS or the edge filter already leaked.
|
|
667
|
+
|
|
668
|
+
🚨 THE ROWS ARE FETCHED IN BULK, NEVER ONE PER EDGE. This loop used to
|
|
669
|
+
call ``load_by_id_or_none`` per id, so a read of N targets cost N
|
|
670
|
+
round trips: measured 2026-09-18 against the live database on a
|
|
671
|
+
3-connection pool, one Library of 533 YouTube sources spent **177 s in
|
|
672
|
+
533 identical single-row SELECTs** out of a 182 s call — and the media
|
|
673
|
+
catalogue makes that call three times per selection job. The gate
|
|
674
|
+
itself is unchanged and still runs per row; only the FETCH is batched,
|
|
675
|
+
so nothing about what survives this method moved. Guard:
|
|
676
|
+
``packages/matrx-orm/tests/level1/test_associations.py::
|
|
677
|
+
test_load_gated_batches_the_fetch_instead_of_one_query_per_edge``.
|
|
634
678
|
"""
|
|
679
|
+
if not ids:
|
|
680
|
+
return []
|
|
635
681
|
model = await self._reg.require(token)
|
|
636
682
|
actor = self._resolve_actor(actor_id)
|
|
637
683
|
is_system = getattr(model, "_rls_variant", None) == "system" # orm-getattr-ok: generator-stamped capability flag
|
|
684
|
+
by_id = await self._fetch_many(model, ids)
|
|
638
685
|
out: list[Any] = []
|
|
639
686
|
for rid in ids:
|
|
640
|
-
entity =
|
|
687
|
+
entity = by_id.get(str(rid))
|
|
641
688
|
if entity is None:
|
|
642
689
|
continue # layer 1: RLS-filtered, soft-deleted, or absent
|
|
643
690
|
if is_system:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "matrx-orm"
|
|
3
|
-
version = "3.1.
|
|
3
|
+
version = "3.1.162"
|
|
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" }
|
|
@@ -64,9 +64,20 @@ class _FakeBase:
|
|
|
64
64
|
cls._rows[row.id] = row
|
|
65
65
|
return row, True
|
|
66
66
|
|
|
67
|
+
@classmethod
|
|
68
|
+
def _matches(cls, row, key, value):
|
|
69
|
+
if key.endswith("__in"):
|
|
70
|
+
return getattr(row, key[:-4], None) in value
|
|
71
|
+
return getattr(row, key, None) == value
|
|
72
|
+
|
|
67
73
|
@classmethod
|
|
68
74
|
async def filter_items(cls, **filters):
|
|
69
|
-
|
|
75
|
+
cls.filter_calls = getattr(cls, "filter_calls", 0) + 1
|
|
76
|
+
return [
|
|
77
|
+
r
|
|
78
|
+
for r in cls._rows.values()
|
|
79
|
+
if all(cls._matches(r, k, v) for k, v in filters.items())
|
|
80
|
+
]
|
|
70
81
|
|
|
71
82
|
@classmethod
|
|
72
83
|
async def load_by_id_or_none(cls, item_id):
|
|
@@ -721,3 +732,82 @@ async def test_verify_false_skips_the_policy_entirely():
|
|
|
721
732
|
)
|
|
722
733
|
assert edge.org_id == "org1"
|
|
723
734
|
assert policy.calls == []
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
# --------------------------------------------------------------------------- #
|
|
738
|
+
# Reads must cost a BOUNDED number of round trips, never one per edge
|
|
739
|
+
# --------------------------------------------------------------------------- #
|
|
740
|
+
|
|
741
|
+
@pytest.mark.asyncio
|
|
742
|
+
async def test_load_gated_batches_the_fetch_instead_of_one_query_per_edge():
|
|
743
|
+
"""500 targets must cost a handful of statements, not 500.
|
|
744
|
+
|
|
745
|
+
Run against the per-id loop this replaced, it fails with `500` — which is
|
|
746
|
+
exactly what it cost in production: measured 2026-09-18 on the live
|
|
747
|
+
database at a 3-connection pool, one Library of 533 YouTube sources spent
|
|
748
|
+
**177 s inside 533 identical single-row SELECTs**, and the media catalogue
|
|
749
|
+
reads that list three times per selection job.
|
|
750
|
+
"""
|
|
751
|
+
a = _assoc()
|
|
752
|
+
NoteModel.seed(id="n1", org_id="org1")
|
|
753
|
+
for i in range(500):
|
|
754
|
+
ProjectModel.seed(id=f"p{i}", org_id="org1")
|
|
755
|
+
AssociationRow.seed(
|
|
756
|
+
source_type="note", source_id="n1", target_type="project",
|
|
757
|
+
target_id=f"p{i}", org_id="org1",
|
|
758
|
+
)
|
|
759
|
+
|
|
760
|
+
ProjectModel.filter_calls = 0
|
|
761
|
+
per_row_loads = 0
|
|
762
|
+
original = ProjectModel.load_by_id_or_none.__func__
|
|
763
|
+
|
|
764
|
+
@classmethod
|
|
765
|
+
async def _counted(cls, item_id):
|
|
766
|
+
nonlocal per_row_loads
|
|
767
|
+
per_row_loads += 1
|
|
768
|
+
return await original(cls, item_id)
|
|
769
|
+
|
|
770
|
+
ProjectModel.load_by_id_or_none = _counted
|
|
771
|
+
try:
|
|
772
|
+
loaded = await a.targets_from(EntityRef("note", "n1"), "project", org_id="org1")
|
|
773
|
+
finally:
|
|
774
|
+
ProjectModel.load_by_id_or_none = classmethod(original)
|
|
775
|
+
|
|
776
|
+
assert len(loaded) == 500, "the batched fetch must return every gated row"
|
|
777
|
+
assert per_row_loads == 0, (
|
|
778
|
+
f"Reading 500 targets issued {per_row_loads} single-row loads. A read of N "
|
|
779
|
+
"targets must not cost N round trips — batch the fetch and keep the gate."
|
|
780
|
+
)
|
|
781
|
+
assert ProjectModel.filter_calls <= 5, (
|
|
782
|
+
f"Reading 500 targets took {ProjectModel.filter_calls} statements against the "
|
|
783
|
+
"target table; it must take at most 5."
|
|
784
|
+
)
|
|
785
|
+
|
|
786
|
+
|
|
787
|
+
@pytest.mark.asyncio
|
|
788
|
+
async def test_batched_fetch_chunks_and_still_drops_what_the_gate_refuses():
|
|
789
|
+
"""More rows than one chunk, and the gate's verdicts are unchanged by batching."""
|
|
790
|
+
a = _assoc()
|
|
791
|
+
NoteModel.seed(id="n1", org_id="org1")
|
|
792
|
+
total = Associations._FETCH_CHUNK * 2 + 3
|
|
793
|
+
for i in range(total):
|
|
794
|
+
# Every tenth row is cross-org, and one id has no row at all.
|
|
795
|
+
if i % 10 != 0:
|
|
796
|
+
ProjectModel.seed(id=f"p{i}", org_id="org2" if i % 10 == 5 else "org1")
|
|
797
|
+
AssociationRow.seed(
|
|
798
|
+
source_type="note", source_id="n1", target_type="project",
|
|
799
|
+
target_id=f"p{i}", org_id="org1",
|
|
800
|
+
)
|
|
801
|
+
|
|
802
|
+
ProjectModel.filter_calls = 0
|
|
803
|
+
loaded = await a.targets_from(EntityRef("note", "n1"), "project", org_id="org1")
|
|
804
|
+
|
|
805
|
+
expected = {f"p{i}" for i in range(total) if i % 10 not in (0, 5)}
|
|
806
|
+
assert {p.id for p in loaded} == expected, (
|
|
807
|
+
"batching the fetch changed WHICH rows survive the ownership gate"
|
|
808
|
+
)
|
|
809
|
+
import math
|
|
810
|
+
assert ProjectModel.filter_calls == math.ceil(total / Associations._FETCH_CHUNK), (
|
|
811
|
+
f"{total} targets took {ProjectModel.filter_calls} statements; it must take one "
|
|
812
|
+
"per chunk."
|
|
813
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/python_sql/table_detailed_relationships.py
RENAMED
|
File without changes
|
{matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/python_sql/table_typescript_relationship.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/resources/additional-assigners-2026-09-12.json
RENAMED
|
File without changes
|
{matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/resources/org_assignment_trigger_baseline.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matrx_orm-3.1.161 → matrx_orm-3.1.162}/matrx_orm/schema_builder/helpers/entity_generators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|