matrx-orm 3.1.7__tar.gz → 3.1.8__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.7 → matrx_orm-3.1.8}/PKG-INFO +1 -1
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/__init__.py +2 -1
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/base.py +65 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/db_function.py +25 -1
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/query/builder.py +32 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/pyproject.toml +1 -1
- matrx_orm-3.1.8/tests/test_sync_twins_guard.py +52 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/.gitignore +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/BASE_CLASS_METHODS.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/CLAUDE.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/MODEL_API.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/database/orm/extended/managers/ai_model_base.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/docs/migrations.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/async_postgresql.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/base_adapter.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/postgresql.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/supabase_adapter.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/admin/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/admin/router.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/api/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/api/auth.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/api/config.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/api/handlers.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/api/protocol.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/api/server.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/associations.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/cache_debug.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/postgres_connection.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/postgrest.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/supabase_auth.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/supabase_config.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/supabase_manager.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/EXTENDED-TASK.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/TASKS.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/async_db_manager.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/config.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/diagnostics.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/expressions.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/extended.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/fields.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/introspection.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/listen.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/loop_filters.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/model_dto.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/model_view.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/paginator.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/pydantic_bridge.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/registry.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/relations.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/resilience.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/rls_session.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/signals.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/transaction.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/types.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/write_queue.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/entity.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/error_handling.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/exceptions.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/extended/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/extended/app_error_handler.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/middleware/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/middleware/base.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/cli.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/ddl.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/diff.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/executor.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/integration.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/loader.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/operations.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/state.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/table_filter.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/bulk_update_values.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/conflict.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/conflict_writes.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/create.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/delete.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/dynamic_admin.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/queue_claim.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/read.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/staging_load.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/update.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/py.typed +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/python_sql/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/python_sql/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/python_sql/db_objects.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/query/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/query/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/query/executor.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/code_handler.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/codegen_writer.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/columns.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/common.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/diff_preview.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/generator.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/package_wiring.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/relationships.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/runner.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/schema.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/schema_manager.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/tables.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/views.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/coalesce.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/dag.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/errors.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/fallback.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/flush.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/lifecycle.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/managed.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/op.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/reads.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/session.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/telemetry.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/executor.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/queries.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/registry.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/types.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/utils.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/state.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/utils/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/utils/sql_utils.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/utils/type_converters.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/scripts/git-branches.sh +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/scripts/publish.sh +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/scripts/release.sh +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/conftest.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_admin_db_columns.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_admin_search_sentinels.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_advisory_lock.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_agent_message.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_api_auth.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_api_config.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_api_handlers.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_api_protocol.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_array_agg_order_by.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_associations.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_bulk_update_by_pk.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_cache_debug.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_call_function.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_case_when.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_composite_pk_filter.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_composite_pk_write_paths.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_config.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_conflict_target.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_conflict_writes.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_connection_codecs.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_connection_poison_guard.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_count_composite_distinct.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_db_function_field.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_ddl_generator.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_dirty_tracking.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_exceptions.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_execute_admin_sql.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_expression_primitives.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_fields.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_filter_raw.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_from_alias.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_fts.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_func_expression_args.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_having_annotate_alias.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_introspect_rls_policies.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_join_and_aggregate.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_listen_notify.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_managed_write_guard.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_matrx_entity.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_migration_diff_types.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_migration_loader.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_model_instance.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_model_meta.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_order_by_expression.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_patch_jsonb_path.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_postgrest_filters.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_query_builder.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_query_error_detail.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_query_executor_sql.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_query_timeout.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_queue_claim.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_registry.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_registry_multi_database.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_registry_multi_schema.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_relations.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_resilience.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_schema_exists.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_session_advisory_lock.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_state_cache.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_subquery_filter_raw.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_subquery_in_filter.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_supabase_auth.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_supabase_config.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_update_case_expression.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_update_subquery.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_upsert_with_conflict.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_values_jsonb_decode.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_watched_lifecycle.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_write_retry_semantics.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/MODULE_README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/conftest.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_bulk_ops.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_cache_integration.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_crud.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_foreign_keys.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_m2m.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_manager.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_migrations_live.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_query_execution.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_schema_diff.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/.env.example +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/generate.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/generated/.gitkeep +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/matrx_orm.yaml +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/test_schema_generation.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/.env.example +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/README.md +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/client_example.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/client_example.ts +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/client_supabase_example.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/server.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/schema/entity_tests.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/schema/test_base_generation.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/schema/test_composite_pk_fk_generation.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/schema/test_generate_schema.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/schema/test_multi_schema_output.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/__init__.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/conftest.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_capture_poison_proof.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_coalesce.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_dag.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_disk_spill_fallback.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_flush_individual_fallback.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_governed_write.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_managed.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_op_enqueue_site.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_reads.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_session.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/test_database_name_alias.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/test_model_cls_refactor.py +0 -0
- {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/test_sql_param_casts.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: matrx-orm
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.8
|
|
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
|
|
@@ -27,7 +27,7 @@ from .core.config import (
|
|
|
27
27
|
resolve_database_name,
|
|
28
28
|
resolve_pool_mode,
|
|
29
29
|
)
|
|
30
|
-
from .core.db_function import ArrayArg, call_function
|
|
30
|
+
from .core.db_function import ArrayArg, call_function, call_function_sync
|
|
31
31
|
from .entity import EntityCapabilityError, MatrxEntity
|
|
32
32
|
from .core.diagnostics import collect_pool_diagnostics, log_pool_diagnostics
|
|
33
33
|
from .core.introspection import introspect_columns, introspect_rls_policies, schema_exists
|
|
@@ -318,6 +318,7 @@ __all__ = [
|
|
|
318
318
|
"install_asyncpg_idle_close_filter",
|
|
319
319
|
# ── DB-side function calls (RPC) ──────────────────────────────────────────
|
|
320
320
|
"call_function",
|
|
321
|
+
"call_function_sync",
|
|
321
322
|
"MatrxEntity",
|
|
322
323
|
"EntityCapabilityError",
|
|
323
324
|
"ArrayArg",
|
|
@@ -1263,6 +1263,71 @@ class Model(RuntimeMixin, metaclass=ModelMeta):
|
|
|
1263
1263
|
|
|
1264
1264
|
return run_sync(cls.filter(**kwargs).all())
|
|
1265
1265
|
|
|
1266
|
+
@classmethod
|
|
1267
|
+
def create_sync(cls, **kwargs: Any) -> Self:
|
|
1268
|
+
"""Synchronous twin of create(). Sync contexts only."""
|
|
1269
|
+
try:
|
|
1270
|
+
asyncio.get_running_loop()
|
|
1271
|
+
raise RuntimeError(
|
|
1272
|
+
"Model.create_sync() called in an async context. Use await Model.create(...) instead."
|
|
1273
|
+
)
|
|
1274
|
+
except RuntimeError as e:
|
|
1275
|
+
if "no running event loop" not in str(e):
|
|
1276
|
+
raise
|
|
1277
|
+
|
|
1278
|
+
return run_sync(cls.create(**kwargs))
|
|
1279
|
+
|
|
1280
|
+
@classmethod
|
|
1281
|
+
def upsert_sync(
|
|
1282
|
+
cls,
|
|
1283
|
+
data: dict[str, Any],
|
|
1284
|
+
conflict_fields: list[str] | None = None,
|
|
1285
|
+
update_fields: list[str] | None = None,
|
|
1286
|
+
*,
|
|
1287
|
+
on_conflict: list[str] | ConflictTarget | None = None, # noqa: F821
|
|
1288
|
+
) -> Self:
|
|
1289
|
+
"""Synchronous twin of upsert(). Sync contexts only."""
|
|
1290
|
+
try:
|
|
1291
|
+
asyncio.get_running_loop()
|
|
1292
|
+
raise RuntimeError(
|
|
1293
|
+
"Model.upsert_sync() called in an async context. Use await Model.upsert(...) instead."
|
|
1294
|
+
)
|
|
1295
|
+
except RuntimeError as e:
|
|
1296
|
+
if "no running event loop" not in str(e):
|
|
1297
|
+
raise
|
|
1298
|
+
|
|
1299
|
+
return run_sync(
|
|
1300
|
+
cls.upsert(data, conflict_fields, update_fields, on_conflict=on_conflict)
|
|
1301
|
+
)
|
|
1302
|
+
|
|
1303
|
+
@classmethod
|
|
1304
|
+
def update_where_sync(cls, filters: dict[str, Any], **updates: Any) -> UpdateResult:
|
|
1305
|
+
"""Synchronous twin of update_where(). Sync contexts only."""
|
|
1306
|
+
try:
|
|
1307
|
+
asyncio.get_running_loop()
|
|
1308
|
+
raise RuntimeError(
|
|
1309
|
+
"Model.update_where_sync() called in an async context. Use await Model.update_where(...) instead."
|
|
1310
|
+
)
|
|
1311
|
+
except RuntimeError as e:
|
|
1312
|
+
if "no running event loop" not in str(e):
|
|
1313
|
+
raise
|
|
1314
|
+
|
|
1315
|
+
return run_sync(cls.update_where(filters, **updates))
|
|
1316
|
+
|
|
1317
|
+
@classmethod
|
|
1318
|
+
def delete_where_sync(cls, **filters: Any) -> int:
|
|
1319
|
+
"""Synchronous twin of delete_where(). Sync contexts only."""
|
|
1320
|
+
try:
|
|
1321
|
+
asyncio.get_running_loop()
|
|
1322
|
+
raise RuntimeError(
|
|
1323
|
+
"Model.delete_where_sync() called in an async context. Use await Model.delete_where(...) instead."
|
|
1324
|
+
)
|
|
1325
|
+
except RuntimeError as e:
|
|
1326
|
+
if "no running event loop" not in str(e):
|
|
1327
|
+
raise
|
|
1328
|
+
|
|
1329
|
+
return run_sync(cls.delete_where(**filters))
|
|
1330
|
+
|
|
1266
1331
|
@classmethod
|
|
1267
1332
|
async def all(cls) -> list[Self]:
|
|
1268
1333
|
try:
|
|
@@ -70,7 +70,7 @@ from typing import Any, Literal
|
|
|
70
70
|
from matrx_orm.core.async_db_manager import AsyncDatabaseManager
|
|
71
71
|
from matrx_orm.core.transaction import get_active_connection
|
|
72
72
|
|
|
73
|
-
__all__ = ["call_function", "ArrayArg"]
|
|
73
|
+
__all__ = ["call_function", "call_function_sync", "ArrayArg"]
|
|
74
74
|
|
|
75
75
|
# Postgres unquoted-identifier shape. Deliberately strict — this is the only
|
|
76
76
|
# thing standing between a caller-supplied name and the query string, so a
|
|
@@ -195,3 +195,27 @@ async def call_function(
|
|
|
195
195
|
rows = await conn.fetch(sql, *bound_args)
|
|
196
196
|
return [dict(r) for r in rows]
|
|
197
197
|
return await conn.fetchval(sql, *bound_args)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def call_function_sync(
|
|
201
|
+
database: str,
|
|
202
|
+
schema: str,
|
|
203
|
+
function: str,
|
|
204
|
+
*args: Any,
|
|
205
|
+
mode: Literal["scalar", "none", "rows"] = "scalar",
|
|
206
|
+
field: str | None = None,
|
|
207
|
+
) -> Any:
|
|
208
|
+
"""Synchronous twin of :func:`call_function`. Sync contexts only."""
|
|
209
|
+
import asyncio
|
|
210
|
+
|
|
211
|
+
from matrx_orm.core.async_db_manager import run_sync
|
|
212
|
+
|
|
213
|
+
try:
|
|
214
|
+
asyncio.get_running_loop()
|
|
215
|
+
raise RuntimeError(
|
|
216
|
+
"call_function_sync() called in an async context. Use await call_function(...) instead."
|
|
217
|
+
)
|
|
218
|
+
except RuntimeError as e:
|
|
219
|
+
if "no running event loop" not in str(e):
|
|
220
|
+
raise
|
|
221
|
+
return run_sync(call_function(database, schema, function, *args, mode=mode, field=field))
|
|
@@ -1055,6 +1055,38 @@ class QueryBuilder(Generic[ModelT]):
|
|
|
1055
1055
|
# Synchronous wrappers
|
|
1056
1056
|
# ------------------------------------------------------------------
|
|
1057
1057
|
|
|
1058
|
+
def all_sync(self) -> list[ModelT]:
|
|
1059
|
+
"""Synchronous execution of the built query. Sync contexts only."""
|
|
1060
|
+
import asyncio
|
|
1061
|
+
|
|
1062
|
+
from matrx_orm.core.async_db_manager import run_sync
|
|
1063
|
+
|
|
1064
|
+
try:
|
|
1065
|
+
asyncio.get_running_loop()
|
|
1066
|
+
raise RuntimeError(
|
|
1067
|
+
"QueryBuilder.all_sync() called in an async context. Use await .all() instead."
|
|
1068
|
+
)
|
|
1069
|
+
except RuntimeError as e:
|
|
1070
|
+
if "no running event loop" not in str(e):
|
|
1071
|
+
raise
|
|
1072
|
+
return run_sync(self.all())
|
|
1073
|
+
|
|
1074
|
+
def first_sync(self) -> ModelT | None:
|
|
1075
|
+
"""Synchronous twin of first(). Sync contexts only."""
|
|
1076
|
+
import asyncio
|
|
1077
|
+
|
|
1078
|
+
from matrx_orm.core.async_db_manager import run_sync
|
|
1079
|
+
|
|
1080
|
+
try:
|
|
1081
|
+
asyncio.get_running_loop()
|
|
1082
|
+
raise RuntimeError(
|
|
1083
|
+
"QueryBuilder.first_sync() called in an async context. Use await .first() instead."
|
|
1084
|
+
)
|
|
1085
|
+
except RuntimeError as e:
|
|
1086
|
+
if "no running event loop" not in str(e):
|
|
1087
|
+
raise
|
|
1088
|
+
return run_sync(self.first())
|
|
1089
|
+
|
|
1058
1090
|
def values_sync(self, *fields: str) -> list[dict[str, Any]]:
|
|
1059
1091
|
"""Synchronous wrapper for values()."""
|
|
1060
1092
|
try:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "matrx-orm"
|
|
3
|
-
version = "3.1.
|
|
3
|
+
version = "3.1.8"
|
|
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" }
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Guard tests for the sync-twin surface added 2026-07-13 (matrx-files Phase 2).
|
|
2
|
+
|
|
3
|
+
The twins (Model.create_sync / upsert_sync / update_where_sync /
|
|
4
|
+
delete_where_sync, QueryBuilder.all_sync / first_sync, call_function_sync)
|
|
5
|
+
must exist and must REFUSE to run inside a live event loop — running a
|
|
6
|
+
blocking pool call on the loop is the bug class the guard exists for.
|
|
7
|
+
No database needed: the in-loop guard fires before any connection.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import asyncio
|
|
13
|
+
|
|
14
|
+
import pytest
|
|
15
|
+
|
|
16
|
+
from matrx_orm import call_function_sync
|
|
17
|
+
from matrx_orm.core.base import Model
|
|
18
|
+
from matrx_orm.core.fields import TextField
|
|
19
|
+
from matrx_orm.query.builder import QueryBuilder
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class _GuardModel(Model):
|
|
23
|
+
id = TextField(primary_key=True)
|
|
24
|
+
_database = "guard_test_db_never_registered"
|
|
25
|
+
_table_name = "guard_test_table"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_sync_twins_exist() -> None:
|
|
29
|
+
for name in ("create_sync", "upsert_sync", "update_where_sync", "delete_where_sync"):
|
|
30
|
+
assert callable(getattr(_GuardModel, name)), name
|
|
31
|
+
for name in ("all_sync", "first_sync"):
|
|
32
|
+
assert callable(getattr(QueryBuilder, name)), name
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_sync_twins_refuse_async_context() -> None:
|
|
36
|
+
async def run() -> None:
|
|
37
|
+
with pytest.raises(RuntimeError, match="async context"):
|
|
38
|
+
_GuardModel.create_sync(id="x")
|
|
39
|
+
with pytest.raises(RuntimeError, match="async context"):
|
|
40
|
+
_GuardModel.upsert_sync({"id": "x"}, on_conflict=["id"])
|
|
41
|
+
with pytest.raises(RuntimeError, match="async context"):
|
|
42
|
+
_GuardModel.update_where_sync({"id": "x"}, id="y")
|
|
43
|
+
with pytest.raises(RuntimeError, match="async context"):
|
|
44
|
+
_GuardModel.delete_where_sync(id="x")
|
|
45
|
+
with pytest.raises(RuntimeError, match="async context"):
|
|
46
|
+
_GuardModel.filter(id="x").all_sync()
|
|
47
|
+
with pytest.raises(RuntimeError, match="async context"):
|
|
48
|
+
_GuardModel.filter(id="x").first_sync()
|
|
49
|
+
with pytest.raises(RuntimeError, match="async context"):
|
|
50
|
+
call_function_sync("db", "public", "fn")
|
|
51
|
+
|
|
52
|
+
asyncio.run(run())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|