matrx-orm 3.1.208__tar.gz → 3.1.210__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.208 → matrx_orm-3.1.210}/.gitignore +5 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/CHANGELOG.md +7 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/CLAUDE.md +2 -2
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/PKG-INFO +2 -2
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/associations.py +31 -4
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/FEATURE.md +2 -2
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/items.py +1 -1
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/pyproject.toml +2 -2
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_associations.py +78 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_secrets_minting_keys.py +1 -1
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/AGENTS.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/BASE_CLASS_METHODS.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/MODEL_API.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/database/orm/extended/managers/ai_model_base.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/docs/migrations.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/FEATURE.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/adapters/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/adapters/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/adapters/async_postgresql.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/adapters/base_adapter.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/adapters/supabase_adapter.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/admin/FEATURE.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/admin/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/admin/router.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/api/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/api/auth.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/api/config.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/api/handlers.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/api/protocol.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/api/server.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/cache_debug.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/catalog.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/catalog_sql.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/client/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/client/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/client/postgres_connection.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/client/postgrest.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/client/supabase_auth.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/client/supabase_config.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/client/supabase_manager.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/EXTENDED-TASK.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/FEATURE.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/TASKS.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/admin_lane.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/async_db_manager.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/base.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/config.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/connections.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/db_function.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/diagnostics.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/expressions.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/extended.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/fields.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/introspection.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/listen.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/loop_filters.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/model_dto.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/model_view.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/one_database.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/paginator.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/pool_maintenance.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/pool_watch.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/pooler_role.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/pydantic_bridge.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/read_write.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/registry.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/relations.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/resilience.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/rls_session.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/session_context.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/signals.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/statement_ceiling.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/tls.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/transaction.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/types.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/write_queue.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/core/write_retry.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/entity.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/error_handling.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/exceptions.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/extended/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/extended/app_error_handler.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/identity_rule.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/local_sqlite.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/matrx_orm_production_door.pth +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/middleware/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/middleware/base.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/migrations/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/migrations/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/migrations/cli.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/migrations/ddl.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/migrations/diff.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/migrations/executor.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/migrations/integration.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/migrations/loader.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/migrations/operations.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/migrations/state.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/migrations/table_filter.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/no_org_assignment.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/FEATURE.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/bulk_update_values.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/catalog_select.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/conflict.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/conflict_writes.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/create.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/db_functions.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/delete.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/dynamic_admin.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/dynamic_crud.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/graph_walk.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/latest_rows.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/queue_claim.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/read.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/relational_backfill.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/staging_load.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/operations/update.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/platform_access.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/platform_db.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/py.typed +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/pytest_live_db_guard.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/pytest_lock_guard.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/pytest_plugin.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/pytest_production_door.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/python_sql/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/python_sql/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/python_sql/db_objects.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/query/FEATURE.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/query/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/query/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/query/builder.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/query/executor.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/resources/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/resources/additional-assigners-2026-09-12.json +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/resources/org_assignment_trigger_baseline.json +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/FEATURE.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/code_handler.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/codegen_writer.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/columns.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/common.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/diff_preview.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/excluded_targets.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/generator.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/package_wiring.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/relationships.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/runner.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/schema.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/schema_manager.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/tables.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/schema_builder/views.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/attachments.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/backup_restore.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/crypto.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/host_authorization.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/model.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/mutation_receipts.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/native_enable.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/native_lifecycle.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/native_passkeys.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/native_source.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/org_service.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/org_vault_gate.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/service.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/secrets_battery/vault_history.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/coalesce.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/dag.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/errors.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/fallback.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/flush.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/lifecycle.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/managed.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/op.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/reads.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/session.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/session/telemetry.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/sql_executor/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/sql_executor/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/sql_executor/executor.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/sql_executor/queries.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/sql_executor/registry.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/sql_executor/types.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/sql_executor/utils.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/state.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/utils/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/utils/sql_utils.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/utils/type_converters.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/matrx_orm/write_actor.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/scripts/git-branches.sh +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/scripts/publish.sh +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/scripts/release.sh +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/conftest.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_adapter_registry.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_admin_db_columns.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_admin_response_rendering.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_admin_search_negation.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_admin_search_sentinels.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_advisory_lock.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_agent_message.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_api_auth.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_api_config.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_api_handlers.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_api_protocol.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_array_agg_order_by.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_association_trigger_actor_naming.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_associations_wiring.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_bulk_hydration_offload.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_bulk_update_by_pk.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_cache_debug.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_call_function.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_case_when.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_catalog.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_column_scoped_writes.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_committed_row_guard.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_composite_pk_filter.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_composite_pk_write_paths.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_config.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_conflict_target.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_conflict_writes.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_connection_codecs.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_connection_poison_guard.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_connection_primitives.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_count_composite_distinct.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_count_limit_param_leak.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_db_function_field.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_ddl_generator.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_deadlock_retry.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_derived_table.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_dirty_tracking.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_dynamic_crud.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_exceptions.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_execute_query_integrity_mapping.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_expression_primitives.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_fields.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_fk_cycle_resolution.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_from_alias.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_fts.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_func_expression_args.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_graph_walk.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_having_annotate_alias.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_introspect_rls_policies.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_join_and_aggregate.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_latest_rows.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_listen_notify.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_local_sqlite.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_lock_contention_retry.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_managed_write_guard.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_matrx_entity.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_migration_diff_types.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_migration_loader.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_model_instance.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_model_meta.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_optimistic_concurrency.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_order_by_expression.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_org_assignment_inventory.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_orm_banners_are_client_safe.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_parameter_name_hydration.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_patch_jsonb_path.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_percentile_cont.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_persisted_count.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_person_scoped_session_bypasses_shared_cache.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_pool_create_never_wedges.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_pool_holder_census.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_pool_loop_recreation.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_pool_maintenance.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_postgrest_filters.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_pydantic_bridge.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_query_builder.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_query_error_detail.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_query_executor_sql.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_query_timeout.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_queue_claim.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_read_connection_retry.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_read_write_declared.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_registry.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_registry_multi_database.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_registry_multi_schema.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_relational_backfill.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_relations.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_resilience.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_rls_session_scope.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_schema_exists.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_session_advisory_lock.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_standalone_write_session_context.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_state_cache.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_subquery_filter_raw.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_subquery_in_filter.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_subquery_nested_expressions.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_supabase_auth.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_supabase_config.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_tls.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_transaction_database_identity.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_transaction_gucs_one_round_trip.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_transaction_pool_release_sends_nothing.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_typed_join_projection.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_typed_predicates.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_update_case_expression.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_update_subquery.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_update_with_rebase.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_upsert_default_leak.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_upsert_with_conflict.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_values_jsonb_decode.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_watched_lifecycle.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_write_queue_deadline.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level1/test_write_retry_semantics.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/MODULE_README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/conftest.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/test_bulk_ops.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/test_cache_integration.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/test_crud.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/test_foreign_keys.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/test_m2m.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/test_manager.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/test_migrations_live.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/test_query_execution.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/test_schema_diff.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/level2/verify_committed_row_guard_pg17.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/live_pooler_role.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/native_source_cases.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/native_source_oracle.rs +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project/.env.example +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project/README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project/generate.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project/generated/.gitkeep +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project/matrx_orm.yaml +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project/test_schema_generation.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project_desktop/.env.example +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project_desktop/README.md +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project_desktop/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project_desktop/client_example.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project_desktop/client_example.ts +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project_desktop/client_supabase_example.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/sample_project_desktop/server.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/entity_tests.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_base_generation.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_composite_pk_fk_generation.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_composite_unique_generation.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_dto_identity_generation.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_entity_capability_generation.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_enum_ordering.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_excluded_fk_targets.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_generate_schema.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_junction_analysis.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_multi_schema_output.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_schema_analysis.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_sql_expression_defaults.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_table_relationships_query.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema/test_view_generation.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema_builder/test_array_default_parsing.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema_builder/test_focused_generation_plan.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema_builder/test_host_models_aggregator.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/schema_builder/test_never_filter_columns.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/__init__.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/conftest.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_a_failed_capture_still_names_the_failure.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_cache_no_downgrade.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_capture_poison_proof.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_coalesce.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_dag.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_disk_spill_fallback.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_flush_individual_fallback.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_governed_write.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_live_db_guard_plugin.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_managed.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_op_enqueue_site.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_reads.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_record_error_bounded_insert.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_record_error_storm.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_session.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/session/test_spill_guard_plugin.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_a_backend_handed_over_mid_transaction_never_takes_our_writes.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_a_list_of_uuids_binds_as_uuid_array.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_a_read_only_backend_never_refuses_our_writes.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_array_arg_element_type.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_attachment_mutation_serialization.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_backup_alias_conflict.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_backup_history_restore.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_backup_restore_live.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_call_function_as.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_call_function_none_mode.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_composite_fk_is_not_a_column_fk.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_database_name_alias.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_db_functions.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_dsn_password_masking.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_dynamic_select_unregistered.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_immutable_insert_or_exact_verify.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_keyed_digest.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_model_cls_refactor.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_native_enable.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_native_lifecycle.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_native_lifecycle_fences.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_native_passkey_receipts.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_native_source.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_no_blocking_asyncpg_tls.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_one_database.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_order_by_desc_nulls_last.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_org_vault_gate.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_pooler_role_guard.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_secret_audit_names_its_organization.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_secrets_battery.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_shared_lock_guard.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_sql_param_casts.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_statement_ceiling_warning.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_sync_twins_guard.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_update_result_truthiness.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_user_visible_lookup.py +0 -0
- {matrx_orm-3.1.208 → matrx_orm-3.1.210}/tests/test_vault_aggregate_recovery_stateful.py +0 -0
|
@@ -338,3 +338,8 @@ apps/shared/.kit-*-witness.*/
|
|
|
338
338
|
.wt/
|
|
339
339
|
.matrx/fixer-dispatch.json
|
|
340
340
|
.matrx/fixer-ledger.json
|
|
341
|
+
|
|
342
|
+
# Release streak ledger (scripts/release_repeats.py): per-machine state, never committed
|
|
343
|
+
.matrx/release-repeats.json
|
|
344
|
+
.matrx/release-repeats.json.tmp
|
|
345
|
+
.matrx/fixer-ledger.json
|
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
- **Feature: entity doors in the associations engine.** A registry token may resolve to a
|
|
6
|
+
*door* (`__entity_door__ = True`, `async load_by_ids(ids, *, actor_id) -> {id: row}`) instead of
|
|
7
|
+
a Model, for nouns whose rows live behind the host's read doors (a record store). The engine
|
|
8
|
+
reads a door's rows AS THE ACTOR for the write-side existence gate and for `targets_from` /
|
|
9
|
+
`sources_to`; the access policy still decides on top; with no actor a door finds nothing and the
|
|
10
|
+
write is refused as not found. New export `matrx_orm.associations.is_entity_door`. Guard:
|
|
11
|
+
`tests/level1/test_associations.py` (door tests).
|
|
5
12
|
- **Fix: the shared-lock sampler no longer leaves its timeouts on a pooled backend.**
|
|
6
13
|
`pytest_lock_guard` sent session-level `set lock_timeout` / `set statement_timeout`
|
|
7
14
|
through the transaction pooler, where they stay on the backend for the next client
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# CLAUDE.md — matrx-orm
|
|
2
2
|
|
|
3
|
-
> 🟢 **RETIREMENT DECIDED 2026-08-22:** this package is being replaced by SQLAlchemy 2 + Alembic under a thin opinion layer and extracted to its own repo. Cross-repo system-of-record: /Users/armanisadeghi/code/common-docs/projects/orm-switch/PLAN.md — read it before touching this feature in ANY repo.
|
|
3
|
+
> 🟢 **RETIREMENT DECIDED 2026-08-22:** this package is being replaced by SQLAlchemy 2 + Alembic under a thin opinion layer and extracted to its own repo. Cross-repo system-of-record: /Users/armanisadeghi/code/common-docs/systems/architecture/database/orm-persistence/projects/orm-switch/PLAN.md — read it before touching this feature in ANY repo.
|
|
4
4
|
|
|
5
5
|
> **Operating Principle: Build the platform, not the artifact.** Every task is a probe that exposes a missing capability — build it, then consume it. Code that only serves one artifact is forbidden. Full doctrine: [/PRINCIPLES.md](../../PRINCIPLES.md).
|
|
6
6
|
|
|
@@ -51,7 +51,7 @@ Every table that becomes a Model needs row identity: a single-column primary key
|
|
|
51
51
|
- **Signals**: `pre_create`, `post_create`, `pre_save`, `post_save`, `pre_delete`, `post_delete`.
|
|
52
52
|
- **Schema builder** (`matrx_orm.schema_builder`): code generation for Python + TypeScript type definitions from the DB schema. Postgres **VIEWs** are emitted as **read-only `Model` classes** into the same schema models file (on by default; per-entry `output.include_views: false` opts a schema out, `output.exclude_views: [...]` skips individual views). View models get no manager/DTO/base-class/auto_config (views are not writable), synthesize `_primary_keys` from an `id` column (else the first column, for cache-key/`load_by_id` only), and emit plain typed fields with **no `ForeignKey`** (views carry no FK metadata — nothing cross-schema to resolve). Never hand-write a view model again.
|
|
53
53
|
- **Secrets battery** (`matrx_orm.secrets_battery`): the ONE canonical user-credential vault — `users.user_secrets` CRUD + the platform's single Fernet primitive, keyed by `CREDENTIALS_ENCRYPTION_KEY`. Any package: `configure_secrets(db_config_name=...)` once, then `await require_user_secret(user_id, key)`. No package ever calls another service to resolve a credential. Contract: [`matrx_orm/secrets_battery/FEATURE.md`](matrx_orm/secrets_battery/FEATURE.md).
|
|
54
|
-
- **Polymorphic associations** (`matrx_orm.associations`): `EntityRegistry` (token→Model) + `Associations` — a registry-driven, **access-gated** edge engine over a host's polymorphic edge table. Every `source→target` hop is org-scoped *and* each resolved endpoint is re-authorized against the ACTOR (fail-closed, screams on a genuine leak), so a hop can't widen access past what the actor may reach. 🚨 **The gate is `access_check` (wire `matrx_orm.platform_access_check` → `iam.has_access_for`), NEVER an org-column comparison** — a person belongs to several orgs on purpose, so org-equality denies her own data across her own workspaces (2026-08-30 incident) while granting any co-member of a private row. The edge's `org_id` is a TENANCY stamp, not a permission. Org-equality survives only for UNATTENDED writes (no actor) as an integrity guard, and **system vocabulary is exempt entirely** (existence still required): a model generated with `_rls_variant="system"` is platform-shared dictionary data (seo.keyword/topic) every tenant legitimately links to. Hardcodes no table names — the host wires its own edge + token-registry models.
|
|
54
|
+
- **Polymorphic associations** (`matrx_orm.associations`): `EntityRegistry` (token→Model) + `Associations` — a registry-driven, **access-gated** edge engine over a host's polymorphic edge table. Every `source→target` hop is org-scoped *and* each resolved endpoint is re-authorized against the ACTOR (fail-closed, screams on a genuine leak), so a hop can't widen access past what the actor may reach. 🚨 **The gate is `access_check` (wire `matrx_orm.platform_access_check` → `iam.has_access_for`), NEVER an org-column comparison** — a person belongs to several orgs on purpose, so org-equality denies her own data across her own workspaces (2026-08-30 incident) while granting any co-member of a private row. The edge's `org_id` is a TENANCY stamp, not a permission. Org-equality survives only for UNATTENDED writes (no actor) as an integrity guard, and **system vocabulary is exempt entirely** (existence still required): a model generated with `_rls_variant="system"` is platform-shared dictionary data (seo.keyword/topic) every tenant legitimately links to. Hardcodes no table names — the host wires its own edge + token-registry models. A token whose rows have no Model (a record store's Records) resolves to an **entity door** (`is_entity_door`: `load_by_ids(ids, *, actor_id)`), read as the actor — never by a service identity.
|
|
55
55
|
- **The host's declared session context** (`matrx_orm.core.session_context`): `configure_session_context(provider)` once at startup, and every **top-level** `transaction()` — including the one `rls_session` opens, before it drops to the restricted role — emits whatever the provider returns as transaction-local GUCs. This is how an application-level declaration reaches Postgres at all: a GUC set outside a transaction has no meaning, so the BEGIN is the only place it can land. aidream wires it to its provenance declaration (`app.actor_tier` / `app.actor_system`, read by `platform.actor_tier()`, the history capture and the tier rule). A nested entry is a savepoint inside a transaction that already carries them and emits nothing. A standalone write (`execute_write` outside any transaction) made while the provider has something to say opens its own transaction for that one statement — and still goes through the write queue, inside a copy of the caller's context, so the queue's concurrency gate is kept and the drain task's foreign context cannot hide the declaration (`tests/level1/test_standalone_write_session_context.py`). No provider configured ⇒ no GUCs (standalone behaviour unchanged); a provider that raises fails the transaction loudly rather than committing rows with a false provenance.
|
|
56
56
|
- **The platform access policy** (`matrx_orm.platform_access`): `platform_access_check(actor, token, id, level)` → `iam.has_access_for`. The ONE answer to "may this actor touch this row?", shared with RLS and the file-access gate. Fails closed. Never re-derive it from `organization_id` or `created_by` — both are strict subsets that deny legitimate access.
|
|
57
57
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: matrx-orm
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.210
|
|
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.63
|
|
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
|
|
@@ -79,6 +79,7 @@ __all__ = [
|
|
|
79
79
|
"EntityRegistry",
|
|
80
80
|
"Associations",
|
|
81
81
|
"UnknownEntityType",
|
|
82
|
+
"is_entity_door",
|
|
82
83
|
"CrossOrgAssociationError",
|
|
83
84
|
"EntityAccessError",
|
|
84
85
|
"AccessCheck",
|
|
@@ -131,6 +132,24 @@ class EntityRef:
|
|
|
131
132
|
id: str
|
|
132
133
|
|
|
133
134
|
|
|
135
|
+
def is_entity_door(endpoint: Any) -> bool:
|
|
136
|
+
"""True when a registry token resolves to an ENTITY DOOR rather than a Model.
|
|
137
|
+
|
|
138
|
+
Some nouns a host registers have no table a Model could be generated over — their rows live
|
|
139
|
+
behind the host's own read doors (a record store's RPCs, a remote service). Such a token
|
|
140
|
+
resolves to a *door*: any object with ``__entity_door__ = True`` and::
|
|
141
|
+
|
|
142
|
+
async def load_by_ids(ids: list[str], *, actor_id: str) -> dict[str, Any]
|
|
143
|
+
|
|
144
|
+
returning ``{str(id): row}`` for the ids the ACTOR can open (each row exposes ``id`` and, when
|
|
145
|
+
it has one, the host's org field as attributes). The engine treats a door exactly like a
|
|
146
|
+
Model — existence, the access policy, the org fast path — except that the read is made AS
|
|
147
|
+
the actor, so with no actor (an unattended write) a door finds nothing and the write is
|
|
148
|
+
refused as not found, never authorized by a service identity.
|
|
149
|
+
"""
|
|
150
|
+
return bool(getattr(endpoint, "__entity_door__", False))
|
|
151
|
+
|
|
152
|
+
|
|
134
153
|
def _registry_model_lookup(schema: str, table: str) -> type[Model] | None:
|
|
135
154
|
"""Default ``(schema, table) -> Model`` resolver: scan matrx-orm's model_registry."""
|
|
136
155
|
from matrx_orm.core.registry import model_registry
|
|
@@ -578,7 +597,10 @@ class Associations:
|
|
|
578
597
|
With an actor present and NO policy wired, we refuse rather than fall
|
|
579
598
|
back to org-equality — a host that authorizes user writes must say how.
|
|
580
599
|
"""
|
|
581
|
-
|
|
600
|
+
if is_entity_door(model):
|
|
601
|
+
entity = (await model.load_by_ids([str(ref.id)], actor_id=actor_id)).get(str(ref.id))
|
|
602
|
+
else:
|
|
603
|
+
entity = await model.load_by_id_or_none(ref.id)
|
|
582
604
|
if entity is None:
|
|
583
605
|
raise CrossOrgAssociationError(
|
|
584
606
|
f"cannot associate {ref.type}:{ref.id} — not found or not accessible"
|
|
@@ -621,7 +643,9 @@ class Associations:
|
|
|
621
643
|
_FETCH_CHUNK = 500
|
|
622
644
|
|
|
623
645
|
@classmethod
|
|
624
|
-
async def _fetch_many(
|
|
646
|
+
async def _fetch_many(
|
|
647
|
+
cls, model: type[Model], ids: list[Any], actor_id: str = ""
|
|
648
|
+
) -> dict[str, Any]:
|
|
625
649
|
"""``{str(pk): row}`` for ``ids``, in a BOUNDED number of round trips.
|
|
626
650
|
|
|
627
651
|
One statement per :attr:`_FETCH_CHUNK` ids, through the same Model (so
|
|
@@ -631,9 +655,12 @@ class Associations:
|
|
|
631
655
|
it falls back to per-id loads — no association endpoint uses one today,
|
|
632
656
|
and this keeps the helper honest if one ever does.
|
|
633
657
|
"""
|
|
658
|
+
unique = list(dict.fromkeys(str(i) for i in ids))
|
|
659
|
+
if is_entity_door(model):
|
|
660
|
+
# A door reads as the actor (see ``is_entity_door``); it batches on its own side.
|
|
661
|
+
return await model.load_by_ids(unique, actor_id=actor_id)
|
|
634
662
|
meta = getattr(model, "_meta", None)
|
|
635
663
|
pks = list(getattr(meta, "primary_keys", None) or ["id"])
|
|
636
|
-
unique = list(dict.fromkeys(str(i) for i in ids))
|
|
637
664
|
if len(pks) > 1:
|
|
638
665
|
found = [await model.load_by_id_or_none(i) for i in unique]
|
|
639
666
|
return {
|
|
@@ -681,7 +708,7 @@ class Associations:
|
|
|
681
708
|
model = await self._reg.require(token)
|
|
682
709
|
actor = self._resolve_actor(actor_id)
|
|
683
710
|
is_system = getattr(model, "_rls_variant", None) == "system" # orm-getattr-ok: generator-stamped capability flag
|
|
684
|
-
by_id = await self._fetch_many(model, ids)
|
|
711
|
+
by_id = await self._fetch_many(model, ids, actor)
|
|
685
712
|
out: list[Any] = []
|
|
686
713
|
for rid in ids:
|
|
687
714
|
entity = by_id.get(str(rid))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# matrx-orm secrets battery — the ONE credential vault
|
|
2
2
|
|
|
3
|
-
> Cross-repo plan (implementation authority): `/Users/armanisadeghi/code/common-docs/
|
|
3
|
+
> Cross-repo plan (implementation authority): `/Users/armanisadeghi/code/common-docs/systems/account/vault-secrets/FEATURE.md` — read it before expanding credential storage or package resolution in any repository. Phase 1 (schema) + Phase 2 (this battery's item layer, rotation script, unified aidream service) are live.
|
|
4
4
|
|
|
5
5
|
**One table, one key, everywhere.** Every platform credential — personal AND
|
|
6
6
|
organizational — lives in `users.user_secrets` (Fernet-encrypted). Every package
|
|
@@ -84,7 +84,7 @@ ownership/shape helper and does not decrypt.
|
|
|
84
84
|
|
|
85
85
|
**Native source admission (`native_source.py`).** `validate_native_source` is the server reader of the provider's exact source-v1 byte format; Rust remains the encoder and authenticator. It requires an explicit positive source-size limit, preserves nullable names and bytes, rejects duplicate/noncanonical JSON and COSE, and derives public metadata only after maintained P-256 key-pair validation. The result is provider-custody data, never a response model or generic field. `repr` and fixed failures omit material. `scripts/check_native_source_parity.py --rust-core <native-vault-provider/core>` compares the real compiled Rust reader against the server corpus; no mocked oracle. This prerequisite adds no creator, materializer, database row or native readiness. Verified September19 against132 focused tests and525 cross-language cases.
|
|
86
86
|
|
|
87
|
-
**Native lifecycle component (`native_lifecycle.py`).** The shared coordinator must supply locked parent/child projections from the exported field constants, current host management authority and its active transaction. Inspection locks the exact native metadata child; component delete/restore mutate only that child's tombstone and lifecycle. Deletion accepts active and restored-quarantined sources; recovery compares aware ISO manifest timestamps to database timestamps, then parses the already-validated manifest instant only at the typed native restore mutation boundary. Personal metadata provenance is enforced by the database guard, never inferred from the request scope. Coordinator/preview integration and actual aggregate database acceptance remain pending; these helpers alone do not enable protected recovery. Contract: [native lifecycle](../../../../../common-docs/projects/credential-sharing-browser-login/
|
|
87
|
+
**Native lifecycle component (`native_lifecycle.py`).** The shared coordinator must supply locked parent/child projections from the exported field constants, current host management authority and its active transaction. Inspection locks the exact native metadata child; component delete/restore mutate only that child's tombstone and lifecycle. Deletion accepts active and restored-quarantined sources; recovery compares aware ISO manifest timestamps to database timestamps, then parses the already-validated manifest instant only at the typed native restore mutation boundary. Personal metadata provenance is enforced by the database guard, never inferred from the request scope. Coordinator/preview integration and actual aggregate database acceptance remain pending; these helpers alone do not enable protected recovery. Contract: [native lifecycle](../../../../../common-docs/projects/credential-sharing-browser-login/REGISTER.md).
|
|
88
88
|
|
|
89
89
|
**`inject_into_sandbox=true` REQUIRES an env alias — refused otherwise.** A
|
|
90
90
|
container environment is a NAME→value map, so a field with `key IS NULL` has
|
|
@@ -55,7 +55,7 @@ copied into a fork.
|
|
|
55
55
|
A field lands here when possessing it MINTS future access rather than merely
|
|
56
56
|
holding a value someone already gave you — an authenticator seed generates
|
|
57
57
|
every future code for the account, forever, with nothing recording it. D-15
|
|
58
|
-
(``common-docs/
|
|
58
|
+
(``common-docs/systems/architecture/persistent-cloud-browser/VISION.md``) ruled that a
|
|
59
59
|
seed does not travel with an account handover: the new owner enrols again.
|
|
60
60
|
|
|
61
61
|
🚨 This is deliberately NOT "every ``sealed`` field". Sealed also covers OAuth
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "matrx-orm"
|
|
3
|
-
version = "3.1.
|
|
3
|
+
version = "3.1.210"
|
|
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.63",
|
|
45
45
|
"pyyaml>=6.0.3",
|
|
46
46
|
"python-dotenv>=1.0",
|
|
47
47
|
"cryptography>=43.0",
|
|
@@ -811,3 +811,81 @@ async def test_batched_fetch_chunks_and_still_drops_what_the_gate_refuses():
|
|
|
811
811
|
f"{total} targets took {ProjectModel.filter_calls} statements; it must take one "
|
|
812
812
|
"per chunk."
|
|
813
813
|
)
|
|
814
|
+
|
|
815
|
+
|
|
816
|
+
# --------------------------------------------------------------------------- #
|
|
817
|
+
# Entity doors — a noun whose rows live behind the host's read doors, not a Model
|
|
818
|
+
# --------------------------------------------------------------------------- #
|
|
819
|
+
|
|
820
|
+
|
|
821
|
+
class _ScopeDoor:
|
|
822
|
+
"""A noun with no Model (a record store's Records): rows are read AS the actor."""
|
|
823
|
+
|
|
824
|
+
__entity_door__ = True
|
|
825
|
+
rows = {"s1": {"id": "s1", "org_id": "org1", "owner": "alice"}}
|
|
826
|
+
calls: list = []
|
|
827
|
+
|
|
828
|
+
@classmethod
|
|
829
|
+
async def load_by_ids(cls, ids, *, actor_id):
|
|
830
|
+
from types import SimpleNamespace
|
|
831
|
+
|
|
832
|
+
cls.calls.append((tuple(ids), actor_id))
|
|
833
|
+
return {
|
|
834
|
+
i: SimpleNamespace(**cls.rows[i])
|
|
835
|
+
for i in ids
|
|
836
|
+
if i in cls.rows and cls.rows[i]["owner"] == actor_id
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
|
|
840
|
+
def _door_assoc(policy):
|
|
841
|
+
reg = EntityRegistry(token_map={"note": NoteModel, "scope": _ScopeDoor})
|
|
842
|
+
return Associations(association_model=AssociationRow, registry=reg, access_check=policy)
|
|
843
|
+
|
|
844
|
+
|
|
845
|
+
@pytest.mark.asyncio
|
|
846
|
+
async def test_a_door_endpoint_is_filed_when_the_actor_opens_it():
|
|
847
|
+
"""b9cf9424d7 dropped the scope model and every scope endpoint raised UnknownEntityType;
|
|
848
|
+
a door resolves the noun and reads its row as the actor."""
|
|
849
|
+
_ScopeDoor.calls = []
|
|
850
|
+
NoteModel.seed(id="n1", org_id="org1")
|
|
851
|
+
|
|
852
|
+
async def policy(actor, token, rid, level):
|
|
853
|
+
return actor == "alice"
|
|
854
|
+
|
|
855
|
+
edge = await _door_assoc(policy).associate(
|
|
856
|
+
EntityRef("note", "n1"), EntityRef("scope", "s1"), org_id="org1", actor_id="alice"
|
|
857
|
+
)
|
|
858
|
+
assert edge.target_type == "scope" and edge.target_id == "s1"
|
|
859
|
+
assert _ScopeDoor.calls == [(("s1",), "alice")]
|
|
860
|
+
|
|
861
|
+
|
|
862
|
+
@pytest.mark.asyncio
|
|
863
|
+
async def test_a_door_endpoint_the_actor_cannot_open_is_refused_and_unattended_finds_nothing():
|
|
864
|
+
NoteModel.seed(id="n1", org_id="org1")
|
|
865
|
+
|
|
866
|
+
async def policy(actor, token, rid, level):
|
|
867
|
+
return True # the door's own read is what refuses
|
|
868
|
+
|
|
869
|
+
with pytest.raises(CrossOrgAssociationError, match="not found"):
|
|
870
|
+
await _door_assoc(policy).associate(
|
|
871
|
+
EntityRef("note", "n1"), EntityRef("scope", "s1"), org_id="org1", actor_id="mallory"
|
|
872
|
+
)
|
|
873
|
+
with pytest.raises(CrossOrgAssociationError, match="not found"):
|
|
874
|
+
await _door_assoc(policy).associate(
|
|
875
|
+
EntityRef("note", "n1"), EntityRef("scope", "s1"), org_id="org1"
|
|
876
|
+
)
|
|
877
|
+
|
|
878
|
+
|
|
879
|
+
@pytest.mark.asyncio
|
|
880
|
+
async def test_a_door_endpoint_reads_back_through_the_door():
|
|
881
|
+
AssociationRow.seed(
|
|
882
|
+
source_type="note", source_id="n1", target_type="scope", target_id="s1", org_id="org1"
|
|
883
|
+
)
|
|
884
|
+
|
|
885
|
+
async def policy(actor, token, rid, level):
|
|
886
|
+
return True
|
|
887
|
+
|
|
888
|
+
rows = await _door_assoc(policy).targets_from(
|
|
889
|
+
EntityRef("note", "n1"), "scope", org_id="org1", actor_id="alice"
|
|
890
|
+
)
|
|
891
|
+
assert [r.id for r in rows] == ["s1"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Minting keys never change hands — D-15, enforced in the battery (no DB).
|
|
2
2
|
|
|
3
|
-
``common-docs/
|
|
3
|
+
``common-docs/systems/architecture/persistent-cloud-browser/VISION.md`` D-15: *"A seed
|
|
4
4
|
does NOT transfer with an account handover — the new owner enrolls again.
|
|
5
5
|
Otherwise two people generate valid codes forever with nothing recording it."*
|
|
6
6
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|