matrx-orm 3.1.148__tar.gz → 3.1.149__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.148 → matrx_orm-3.1.149}/PKG-INFO +2 -2
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/secrets_battery/__init__.py +2 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/secrets_battery/items.py +66 -1
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/pyproject.toml +2 -2
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_secrets_battery.py +93 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/.gitignore +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/AGENTS.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/BASE_CLASS_METHODS.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/CLAUDE.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/MODEL_API.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/database/orm/extended/managers/ai_model_base.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/docs/migrations.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/FEATURE.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/adapters/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/adapters/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/adapters/async_postgresql.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/adapters/base_adapter.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/adapters/postgresql.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/adapters/supabase_adapter.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/admin/FEATURE.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/admin/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/admin/router.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/api/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/api/auth.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/api/config.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/api/handlers.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/api/protocol.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/api/server.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/associations.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/cache_debug.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/catalog.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/catalog_sql.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/client/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/client/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/client/postgres_connection.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/client/postgrest.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/client/supabase_auth.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/client/supabase_config.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/client/supabase_manager.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/EXTENDED-TASK.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/FEATURE.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/TASKS.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/async_db_manager.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/base.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/config.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/connections.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/db_function.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/diagnostics.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/expressions.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/extended.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/fields.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/introspection.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/listen.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/loop_filters.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/model_dto.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/model_view.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/one_database.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/paginator.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/pool_maintenance.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/pool_watch.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/pooler_role.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/pydantic_bridge.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/registry.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/relations.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/resilience.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/rls_session.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/session_context.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/signals.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/tls.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/transaction.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/types.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/write_queue.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/core/write_retry.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/entity.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/error_handling.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/exceptions.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/extended/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/extended/app_error_handler.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/identity_rule.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/local_sqlite.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/middleware/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/middleware/base.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/migrations/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/migrations/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/migrations/cli.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/migrations/ddl.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/migrations/diff.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/migrations/executor.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/migrations/integration.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/migrations/loader.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/migrations/operations.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/migrations/state.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/migrations/table_filter.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/no_org_assignment.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/FEATURE.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/bulk_update_values.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/catalog_select.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/conflict.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/conflict_writes.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/create.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/db_functions.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/delete.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/dynamic_admin.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/dynamic_crud.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/graph_walk.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/latest_rows.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/queue_claim.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/read.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/relational_backfill.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/staging_load.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/operations/update.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/platform_access.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/platform_db.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/py.typed +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/pytest_plugin.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/python_sql/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/python_sql/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/python_sql/db_objects.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/query/FEATURE.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/query/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/query/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/query/builder.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/query/executor.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/resources/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/resources/additional-assigners-2026-09-12.json +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/resources/org_assignment_trigger_baseline.json +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/FEATURE.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/code_handler.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/codegen_writer.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/columns.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/common.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/diff_preview.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/generator.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/package_wiring.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/relationships.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/runner.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/schema.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/schema_manager.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/tables.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/schema_builder/views.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/secrets_battery/FEATURE.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/secrets_battery/attachments.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/secrets_battery/crypto.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/secrets_battery/host_authorization.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/secrets_battery/model.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/secrets_battery/mutation_receipts.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/secrets_battery/org_service.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/secrets_battery/service.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/coalesce.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/dag.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/errors.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/fallback.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/flush.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/lifecycle.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/managed.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/op.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/reads.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/session.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/session/telemetry.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/sql_executor/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/sql_executor/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/sql_executor/executor.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/sql_executor/queries.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/sql_executor/registry.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/sql_executor/types.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/sql_executor/utils.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/state.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/utils/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/utils/sql_utils.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/utils/type_converters.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/scripts/git-branches.sh +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/scripts/publish.sh +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/scripts/release.sh +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/conftest.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_adapter_registry.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_admin_db_columns.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_admin_response_rendering.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_admin_search_negation.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_admin_search_sentinels.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_advisory_lock.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_agent_message.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_api_auth.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_api_config.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_api_handlers.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_api_protocol.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_array_agg_order_by.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_associations.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_associations_wiring.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_bulk_hydration_offload.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_bulk_update_by_pk.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_cache_debug.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_call_function.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_case_when.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_catalog.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_committed_row_guard.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_composite_pk_filter.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_composite_pk_write_paths.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_config.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_conflict_target.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_conflict_writes.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_connection_codecs.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_connection_poison_guard.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_connection_primitives.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_count_composite_distinct.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_count_limit_param_leak.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_db_function_field.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_ddl_generator.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_deadlock_retry.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_derived_table.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_dirty_tracking.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_dynamic_crud.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_exceptions.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_execute_query_integrity_mapping.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_expression_primitives.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_fields.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_from_alias.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_fts.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_func_expression_args.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_graph_walk.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_having_annotate_alias.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_introspect_rls_policies.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_join_and_aggregate.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_latest_rows.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_listen_notify.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_local_sqlite.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_lock_contention_retry.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_managed_write_guard.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_matrx_entity.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_migration_diff_types.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_migration_loader.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_model_instance.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_model_meta.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_optimistic_concurrency.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_order_by_expression.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_org_assignment_inventory.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_parameter_name_hydration.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_patch_jsonb_path.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_persisted_count.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_pool_holder_census.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_pool_loop_recreation.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_pool_maintenance.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_postgrest_filters.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_pydantic_bridge.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_query_builder.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_query_error_detail.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_query_executor_sql.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_query_timeout.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_queue_claim.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_read_connection_retry.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_registry.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_registry_multi_database.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_registry_multi_schema.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_relational_backfill.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_relations.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_resilience.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_rls_session_scope.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_schema_exists.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_session_advisory_lock.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_standalone_write_session_context.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_state_cache.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_subquery_filter_raw.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_subquery_in_filter.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_subquery_nested_expressions.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_supabase_auth.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_supabase_config.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_tls.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_transaction_database_identity.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_typed_join_projection.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_typed_predicates.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_update_case_expression.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_update_subquery.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_update_with_rebase.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_upsert_default_leak.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_upsert_with_conflict.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_values_jsonb_decode.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_watched_lifecycle.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_write_queue_deadline.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level1/test_write_retry_semantics.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/MODULE_README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/conftest.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/test_bulk_ops.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/test_cache_integration.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/test_crud.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/test_foreign_keys.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/test_m2m.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/test_manager.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/test_migrations_live.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/test_query_execution.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/test_schema_diff.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/level2/verify_committed_row_guard_pg17.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/live_pooler_role.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project/.env.example +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project/README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project/generate.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project/generated/.gitkeep +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project/matrx_orm.yaml +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project/test_schema_generation.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project_desktop/.env.example +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project_desktop/README.md +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project_desktop/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project_desktop/client_example.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project_desktop/client_example.ts +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project_desktop/client_supabase_example.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/sample_project_desktop/server.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/entity_tests.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_base_generation.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_composite_pk_fk_generation.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_composite_unique_generation.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_dto_identity_generation.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_entity_capability_generation.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_enum_ordering.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_generate_schema.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_junction_analysis.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_multi_schema_output.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_schema_analysis.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_sql_expression_defaults.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_table_relationships_query.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema/test_view_generation.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema_builder/test_array_default_parsing.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema_builder/test_focused_generation_plan.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/schema_builder/test_host_models_aggregator.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/__init__.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/conftest.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_cache_no_downgrade.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_capture_poison_proof.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_coalesce.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_dag.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_disk_spill_fallback.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_flush_individual_fallback.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_governed_write.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_managed.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_op_enqueue_site.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_reads.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_record_error_bounded_insert.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_record_error_storm.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_session.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/session/test_spill_guard_plugin.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_array_arg_element_type.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_database_name_alias.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_db_functions.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_dynamic_select_unregistered.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_immutable_insert_or_exact_verify.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_keyed_digest.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_model_cls_refactor.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_no_blocking_asyncpg_tls.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_one_database.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_order_by_desc_nulls_last.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_pooler_role_guard.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_secrets_minting_keys.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_sql_param_casts.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/tests/test_sync_twins_guard.py +0 -0
- {matrx_orm-3.1.148 → matrx_orm-3.1.149}/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.149
|
|
4
4
|
Summary: Async-first PostgreSQL ORM with bidirectional migrations, schema introspection, many-to-many relationships, and built-in state caching
|
|
5
5
|
Project-URL: Homepage, https://github.com/AI-Matrix-Engine/aidream-current
|
|
6
6
|
Project-URL: Repository, https://github.com/AI-Matrix-Engine/aidream-current
|
|
@@ -25,7 +25,7 @@ Requires-Python: >=3.13
|
|
|
25
25
|
Requires-Dist: asyncpg>=0.31.0
|
|
26
26
|
Requires-Dist: cryptography>=43.0
|
|
27
27
|
Requires-Dist: gitpython>=3.1.40
|
|
28
|
-
Requires-Dist: matrx-utils>=2.0.
|
|
28
|
+
Requires-Dist: matrx-utils>=2.0.41
|
|
29
29
|
Requires-Dist: psycopg-pool>=3.2.5
|
|
30
30
|
Requires-Dist: psycopg[binary]>=3.2.5
|
|
31
31
|
Requires-Dist: python-dotenv>=1.0
|
|
@@ -80,6 +80,7 @@ from .items import (
|
|
|
80
80
|
FieldSpec,
|
|
81
81
|
ItemGrantSpec,
|
|
82
82
|
SandboxInjectionWithoutEnvKeyError,
|
|
83
|
+
SealedBrowserFillPasswordError,
|
|
83
84
|
SealedFieldError,
|
|
84
85
|
TransferResult,
|
|
85
86
|
add_credential_field,
|
|
@@ -215,6 +216,7 @@ __all__ = [
|
|
|
215
216
|
"FieldSpec",
|
|
216
217
|
"ItemGrantSpec",
|
|
217
218
|
"SandboxInjectionWithoutEnvKeyError",
|
|
219
|
+
"SealedBrowserFillPasswordError",
|
|
218
220
|
"SealedFieldError",
|
|
219
221
|
"URI_MATCH_MODES",
|
|
220
222
|
"add_credential_field",
|
|
@@ -110,6 +110,21 @@ class SandboxInjectionWithoutEnvKeyError(ValueError):
|
|
|
110
110
|
together) or leave injection off."""
|
|
111
111
|
|
|
112
112
|
|
|
113
|
+
class SealedBrowserFillPasswordError(ValueError):
|
|
114
|
+
"""A ``password`` field is (or would become) ``handling='sealed'`` on an
|
|
115
|
+
item with ``browser_fill_enabled=true``. A sealed value has NO reveal
|
|
116
|
+
path anywhere — including the browser-fill boundary itself
|
|
117
|
+
(``vault.py`` ``_prepare_fill_payload`` / ``vault_resolve_for_browser``
|
|
118
|
+
both refuse a sealed field with "is sealed and cannot be filled into a
|
|
119
|
+
page"), so a browser-fill login built this way can never actually fill
|
|
120
|
+
a page: it looks saved but is permanently unusable.
|
|
121
|
+
|
|
122
|
+
Refused LOUDLY at every write path instead of accepted-and-broken —
|
|
123
|
+
'revealable' is the canonical handling for a browser-fill password: it
|
|
124
|
+
still requires reveal capability + recent auth to resolve, but (unlike
|
|
125
|
+
'sealed') it is allowed to cross the browser-fill boundary at all."""
|
|
126
|
+
|
|
127
|
+
|
|
113
128
|
class ProtectedSecretPurposeError(PermissionError):
|
|
114
129
|
"""A generic path reached a native-provider-only secret before decrypt."""
|
|
115
130
|
|
|
@@ -255,6 +270,24 @@ def _validate_sandbox_injectable(
|
|
|
255
270
|
)
|
|
256
271
|
|
|
257
272
|
|
|
273
|
+
def _refuse_sealed_browser_fill_password(
|
|
274
|
+
*, browser_fill_enabled: bool, field_key: str, handling: str
|
|
275
|
+
) -> None:
|
|
276
|
+
"""Catch the sealed/browser-fill contradiction at the write boundary —
|
|
277
|
+
see :class:`SealedBrowserFillPasswordError`. Scoped to the ``password``
|
|
278
|
+
field key: that is the one the browser-fill path actually needs, and
|
|
279
|
+
the one the live incident hit (a ``website_login`` created with a
|
|
280
|
+
sealed password was silently unusable)."""
|
|
281
|
+
if browser_fill_enabled and field_key == "password" and handling == "sealed":
|
|
282
|
+
raise SealedBrowserFillPasswordError(
|
|
283
|
+
"field 'password' cannot be handling='sealed' on an item with "
|
|
284
|
+
"browser_fill_enabled=true — a sealed value is refused at fill "
|
|
285
|
+
"time, so this login would be saved but could never actually "
|
|
286
|
+
"fill a page. Use handling='revealable' for a browser-fill "
|
|
287
|
+
"login instead."
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
|
|
258
291
|
def _validate_uri_match_mode(mode: str) -> None:
|
|
259
292
|
if mode not in URI_MATCH_MODES:
|
|
260
293
|
raise ValueError(f"uri_match_mode must be one of {URI_MATCH_MODES}; got {mode!r}")
|
|
@@ -588,6 +621,11 @@ async def create_credential_bundle(
|
|
|
588
621
|
env_key=spec.env_key,
|
|
589
622
|
inject_into_sandbox=spec.inject_into_sandbox,
|
|
590
623
|
)
|
|
624
|
+
_refuse_sealed_browser_fill_password(
|
|
625
|
+
browser_fill_enabled=bool(browser_fill_enabled),
|
|
626
|
+
field_key=spec.field_key,
|
|
627
|
+
handling=spec.handling,
|
|
628
|
+
)
|
|
591
629
|
if not isinstance(spec.value, str):
|
|
592
630
|
raise ValueError(f"field {spec.field_key!r}: value must be a string")
|
|
593
631
|
if spec.field_key in seen:
|
|
@@ -709,6 +747,21 @@ async def update_credential_item(
|
|
|
709
747
|
touches ciphertext."""
|
|
710
748
|
if status is not None and status not in ITEM_STATUSES:
|
|
711
749
|
raise ValueError(f"status must be one of {ITEM_STATUSES}; got {status!r}")
|
|
750
|
+
if browser_fill_enabled:
|
|
751
|
+
sealed_password = await UserSecret.filter(
|
|
752
|
+
credential_item_id=item_id,
|
|
753
|
+
field_key="password",
|
|
754
|
+
handling="sealed",
|
|
755
|
+
is_active=True,
|
|
756
|
+
deleted_at__isnull=True,
|
|
757
|
+
).values("id")
|
|
758
|
+
if sealed_password:
|
|
759
|
+
raise SealedBrowserFillPasswordError(
|
|
760
|
+
"cannot set browser_fill_enabled=true — this item's 'password' field is "
|
|
761
|
+
"handling='sealed', which is refused at fill time, so the login would be "
|
|
762
|
+
"saved but could never actually fill a page. Rotate/replace the password "
|
|
763
|
+
"field with handling='revealable' first."
|
|
764
|
+
)
|
|
712
765
|
updates: dict[str, Any] = {"updated_by": actor_id, "updated_at": datetime.now(UTC)}
|
|
713
766
|
if display_name is not None:
|
|
714
767
|
updates["display_name"] = display_name
|
|
@@ -827,6 +880,11 @@ async def add_credential_field(
|
|
|
827
880
|
raise ValueError("value must be a string")
|
|
828
881
|
async with transaction(PACKAGE_DB_NAME):
|
|
829
882
|
raw = await _lock_item_raw(item_id)
|
|
883
|
+
_refuse_sealed_browser_fill_password(
|
|
884
|
+
browser_fill_enabled=bool(raw.get("browser_fill_enabled")),
|
|
885
|
+
field_key=spec.field_key,
|
|
886
|
+
handling=spec.handling,
|
|
887
|
+
)
|
|
830
888
|
instance = await UserSecret.create(
|
|
831
889
|
user_id=raw.get("user_id"),
|
|
832
890
|
organization_id=raw.get("organization_id"),
|
|
@@ -999,8 +1057,9 @@ async def update_field_metadata(
|
|
|
999
1057
|
rows = await UserSecret.filter(id=field_id, deleted_at__isnull=True).values("credential_item_id")
|
|
1000
1058
|
if not rows:
|
|
1001
1059
|
raise SecretNotFoundError(f"credential field {field_id} not found")
|
|
1060
|
+
item_raw: dict[str, Any] | None = None
|
|
1002
1061
|
if rows[0].get("credential_item_id"):
|
|
1003
|
-
await _lock_item_raw(str(rows[0]["credential_item_id"]))
|
|
1062
|
+
item_raw = await _lock_item_raw(str(rows[0]["credential_item_id"]))
|
|
1004
1063
|
rows = await UserSecret.filter(id=field_id, deleted_at__isnull=True).select_for_update().values(
|
|
1005
1064
|
*_FIELD_FIELDS, "user_id", "organization_id"
|
|
1006
1065
|
)
|
|
@@ -1014,6 +1073,12 @@ async def update_field_metadata(
|
|
|
1014
1073
|
f"field {raw.get('field_key') or raw.get('key')!r} is sealed — sealing is "
|
|
1015
1074
|
"a one-way door; rotate/replace the field instead of unsealing it"
|
|
1016
1075
|
)
|
|
1076
|
+
if handling is not None:
|
|
1077
|
+
_refuse_sealed_browser_fill_password(
|
|
1078
|
+
browser_fill_enabled=bool((item_raw or {}).get("browser_fill_enabled")),
|
|
1079
|
+
field_key=str(raw.get("field_key") or ""),
|
|
1080
|
+
handling=handling,
|
|
1081
|
+
)
|
|
1017
1082
|
|
|
1018
1083
|
# The POST-patch state is what matters: enabling injection on a keyless
|
|
1019
1084
|
# field AND clearing the alias of an already-injecting field are the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "matrx-orm"
|
|
3
|
-
version = "3.1.
|
|
3
|
+
version = "3.1.149"
|
|
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.41",
|
|
45
45
|
"pyyaml>=6.0.3",
|
|
46
46
|
"python-dotenv>=1.0",
|
|
47
47
|
"cryptography>=43.0",
|
|
@@ -923,3 +923,96 @@ def test_error_taxonomy():
|
|
|
923
923
|
assert issubclass(SealedFieldError, PermissionError)
|
|
924
924
|
assert issubclass(FieldNotEditableError, PermissionError)
|
|
925
925
|
assert issubclass(CredentialItemNotFoundError, LookupError)
|
|
926
|
+
|
|
927
|
+
|
|
928
|
+
# ── Sealed password on a browser-fill item (live incident: a website_login
|
|
929
|
+
# created with handling='sealed' was accepted, then unusable — vault.py's
|
|
930
|
+
# browser-fill path refuses any sealed field at fill time) ─────────────────
|
|
931
|
+
|
|
932
|
+
|
|
933
|
+
def test_refuse_sealed_browser_fill_password_helper():
|
|
934
|
+
"""Direct coverage of the boundary check: only the exact combination
|
|
935
|
+
(browser_fill_enabled AND field_key == 'password' AND handling ==
|
|
936
|
+
'sealed') is refused — every other combination is fine."""
|
|
937
|
+
from matrx_orm.secrets_battery.items import (
|
|
938
|
+
SealedBrowserFillPasswordError,
|
|
939
|
+
_refuse_sealed_browser_fill_password,
|
|
940
|
+
)
|
|
941
|
+
|
|
942
|
+
with pytest.raises(SealedBrowserFillPasswordError, match="cannot be handling='sealed'"):
|
|
943
|
+
_refuse_sealed_browser_fill_password(
|
|
944
|
+
browser_fill_enabled=True, field_key="password", handling="sealed"
|
|
945
|
+
)
|
|
946
|
+
|
|
947
|
+
# A sealed field that is not 'password' does not collide with browser fill.
|
|
948
|
+
_refuse_sealed_browser_fill_password(
|
|
949
|
+
browser_fill_enabled=True, field_key="totp_seed", handling="sealed"
|
|
950
|
+
)
|
|
951
|
+
# A sealed password is fine when the item never fills into a browser.
|
|
952
|
+
_refuse_sealed_browser_fill_password(
|
|
953
|
+
browser_fill_enabled=False, field_key="password", handling="sealed"
|
|
954
|
+
)
|
|
955
|
+
# 'revealable' is exactly the handling the browser-fill path accepts.
|
|
956
|
+
_refuse_sealed_browser_fill_password(
|
|
957
|
+
browser_fill_enabled=True, field_key="password", handling="revealable"
|
|
958
|
+
)
|
|
959
|
+
|
|
960
|
+
|
|
961
|
+
def test_create_credential_bundle_refuses_sealed_password_with_browser_fill_enabled():
|
|
962
|
+
"""RED before the fix: a website_login created with browser_fill_enabled
|
|
963
|
+
plus a sealed password field used to be accepted silently and was then
|
|
964
|
+
permanently unfillable (vault.py ~1741 'is sealed and cannot be filled
|
|
965
|
+
into a page'). All field validation in create_credential_bundle runs
|
|
966
|
+
BEFORE the DB transaction opens, so this raises with no DB configured —
|
|
967
|
+
proof the refusal happens at the write boundary, not deep in a query."""
|
|
968
|
+
import asyncio
|
|
969
|
+
|
|
970
|
+
from matrx_orm.secrets_battery import FieldSpec
|
|
971
|
+
from matrx_orm.secrets_battery.items import (
|
|
972
|
+
SealedBrowserFillPasswordError,
|
|
973
|
+
create_credential_bundle,
|
|
974
|
+
)
|
|
975
|
+
|
|
976
|
+
with pytest.raises(SealedBrowserFillPasswordError, match="password.*browser_fill_enabled"):
|
|
977
|
+
asyncio.run(
|
|
978
|
+
create_credential_bundle(
|
|
979
|
+
user_id="u1",
|
|
980
|
+
display_name="AI Matrx",
|
|
981
|
+
browser_fill_enabled=True,
|
|
982
|
+
login_urls=["https://www.aimatrx.com/login"],
|
|
983
|
+
fields=[
|
|
984
|
+
FieldSpec("username", "me@example.com"),
|
|
985
|
+
FieldSpec("password", "hunter2", handling="sealed"),
|
|
986
|
+
],
|
|
987
|
+
)
|
|
988
|
+
)
|
|
989
|
+
|
|
990
|
+
|
|
991
|
+
def test_create_credential_bundle_validation_accepts_revealable_password():
|
|
992
|
+
"""The canonical fix: 'revealable' clears the same validation loop and
|
|
993
|
+
the function proceeds past field validation toward the DB transaction
|
|
994
|
+
(which then fails for lack of a configured database in this DB-free
|
|
995
|
+
test) — proof the guard targets 'sealed' specifically, not every
|
|
996
|
+
browser-fill password."""
|
|
997
|
+
import asyncio
|
|
998
|
+
|
|
999
|
+
from matrx_orm.secrets_battery import FieldSpec
|
|
1000
|
+
from matrx_orm.secrets_battery.items import (
|
|
1001
|
+
SealedBrowserFillPasswordError,
|
|
1002
|
+
create_credential_bundle,
|
|
1003
|
+
)
|
|
1004
|
+
|
|
1005
|
+
with pytest.raises(Exception) as excinfo:
|
|
1006
|
+
asyncio.run(
|
|
1007
|
+
create_credential_bundle(
|
|
1008
|
+
user_id="u1",
|
|
1009
|
+
display_name="AI Matrx",
|
|
1010
|
+
browser_fill_enabled=True,
|
|
1011
|
+
login_urls=["https://www.aimatrx.com/login"],
|
|
1012
|
+
fields=[
|
|
1013
|
+
FieldSpec("username", "me@example.com"),
|
|
1014
|
+
FieldSpec("password", "hunter2", handling="revealable"),
|
|
1015
|
+
],
|
|
1016
|
+
)
|
|
1017
|
+
)
|
|
1018
|
+
assert not isinstance(excinfo.value, SealedBrowserFillPasswordError)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.148 → matrx_orm-3.1.149}/matrx_orm/python_sql/table_detailed_relationships.py
RENAMED
|
File without changes
|
{matrx_orm-3.1.148 → matrx_orm-3.1.149}/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.148 → matrx_orm-3.1.149}/matrx_orm/resources/additional-assigners-2026-09-12.json
RENAMED
|
File without changes
|
{matrx_orm-3.1.148 → matrx_orm-3.1.149}/matrx_orm/resources/org_assignment_trigger_baseline.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|