matrx-orm 3.1.26__tar.gz → 3.1.28__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.26 → matrx_orm-3.1.28}/PKG-INFO +1 -1
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/MODULE_README.md +9 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/pydantic_bridge.py +7 -8
- matrx_orm-3.1.28/matrx_orm/operations/db_functions.py +78 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/pyproject.toml +1 -1
- matrx_orm-3.1.28/tests/level1/test_pydantic_bridge.py +33 -0
- matrx_orm-3.1.28/tests/test_db_functions.py +43 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/.gitignore +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/AGENTS.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/BASE_CLASS_METHODS.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/CLAUDE.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/MODEL_API.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/database/orm/extended/managers/ai_model_base.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/docs/migrations.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/MODULE_README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/adapters/MODULE_README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/adapters/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/adapters/async_postgresql.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/adapters/base_adapter.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/adapters/postgresql.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/adapters/supabase_adapter.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/admin/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/admin/router.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/api/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/api/auth.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/api/config.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/api/handlers.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/api/protocol.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/api/server.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/associations.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/cache_debug.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/client/MODULE_README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/client/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/client/postgres_connection.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/client/postgrest.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/client/supabase_auth.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/client/supabase_config.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/client/supabase_manager.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/EXTENDED-TASK.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/TASKS.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/async_db_manager.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/base.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/config.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/db_function.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/diagnostics.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/expressions.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/extended.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/fields.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/introspection.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/listen.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/loop_filters.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/model_dto.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/model_view.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/paginator.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/pool_maintenance.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/registry.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/relations.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/resilience.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/rls_session.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/signals.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/tls.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/transaction.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/types.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/core/write_queue.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/entity.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/error_handling.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/exceptions.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/extended/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/extended/app_error_handler.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/identity_rule.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/middleware/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/middleware/base.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/migrations/MODULE_README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/migrations/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/migrations/cli.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/migrations/ddl.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/migrations/diff.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/migrations/executor.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/migrations/integration.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/migrations/loader.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/migrations/operations.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/migrations/state.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/migrations/table_filter.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/operations/MODULE_README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/operations/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/operations/bulk_update_values.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/operations/conflict.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/operations/conflict_writes.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/operations/create.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/operations/delete.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/operations/dynamic_admin.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/operations/queue_claim.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/operations/read.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/operations/staging_load.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/operations/update.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/py.typed +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/python_sql/MODULE_README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/python_sql/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/python_sql/db_objects.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/query/MODULE_README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/query/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/query/builder.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/query/executor.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/MODULE_README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/code_handler.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/codegen_writer.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/columns.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/common.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/diff_preview.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/generator.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/package_wiring.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/relationships.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/runner.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/schema.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/schema_manager.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/tables.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/schema_builder/views.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/secrets_battery/FEATURE.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/secrets_battery/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/secrets_battery/crypto.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/secrets_battery/model.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/secrets_battery/org_service.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/secrets_battery/service.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/coalesce.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/dag.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/errors.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/fallback.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/flush.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/lifecycle.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/managed.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/op.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/reads.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/session.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/session/telemetry.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/sql_executor/MODULE_README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/sql_executor/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/sql_executor/executor.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/sql_executor/queries.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/sql_executor/registry.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/sql_executor/types.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/sql_executor/utils.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/state.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/utils/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/utils/sql_utils.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/matrx_orm/utils/type_converters.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/scripts/git-branches.sh +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/scripts/publish.sh +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/scripts/release.sh +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/MODULE_README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/conftest.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/MODULE_README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_admin_db_columns.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_admin_search_negation.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_admin_search_sentinels.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_advisory_lock.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_agent_message.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_api_auth.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_api_config.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_api_handlers.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_api_protocol.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_array_agg_order_by.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_associations.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_bulk_update_by_pk.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_cache_debug.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_call_function.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_case_when.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_composite_pk_filter.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_composite_pk_write_paths.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_config.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_conflict_target.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_conflict_writes.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_connection_codecs.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_connection_poison_guard.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_count_composite_distinct.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_db_function_field.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_ddl_generator.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_derived_table.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_dirty_tracking.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_exceptions.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_execute_admin_sql.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_expression_primitives.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_fields.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_filter_raw.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_from_alias.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_fts.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_func_expression_args.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_having_annotate_alias.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_introspect_rls_policies.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_join_and_aggregate.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_listen_notify.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_managed_write_guard.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_matrx_entity.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_migration_diff_types.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_migration_loader.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_model_instance.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_model_meta.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_order_by_expression.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_patch_jsonb_path.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_pool_maintenance.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_postgrest_filters.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_query_builder.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_query_error_detail.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_query_executor_sql.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_query_timeout.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_queue_claim.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_registry.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_registry_multi_database.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_registry_multi_schema.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_relations.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_resilience.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_schema_exists.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_session_advisory_lock.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_state_cache.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_subquery_filter_raw.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_subquery_in_filter.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_supabase_auth.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_supabase_config.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_tls.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_update_case_expression.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_update_subquery.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_upsert_with_conflict.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_values_jsonb_decode.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_watched_lifecycle.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level1/test_write_retry_semantics.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level2/MODULE_README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level2/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level2/conftest.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level2/test_bulk_ops.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level2/test_cache_integration.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level2/test_crud.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level2/test_foreign_keys.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level2/test_m2m.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level2/test_manager.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level2/test_migrations_live.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level2/test_query_execution.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/level2/test_schema_diff.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project/.env.example +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project/README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project/generate.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project/generated/.gitkeep +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project/matrx_orm.yaml +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project/test_schema_generation.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project_desktop/.env.example +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project_desktop/README.md +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project_desktop/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project_desktop/client_example.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project_desktop/client_example.ts +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project_desktop/client_supabase_example.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/sample_project_desktop/server.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/schema/entity_tests.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/schema/test_base_generation.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/schema/test_composite_pk_fk_generation.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/schema/test_composite_unique_generation.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/schema/test_dto_identity_generation.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/schema/test_entity_capability_generation.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/schema/test_generate_schema.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/schema/test_multi_schema_output.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/schema/test_sql_expression_defaults.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/schema/test_view_generation.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/schema_builder/test_focused_generation_plan.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/session/__init__.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/session/conftest.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/session/test_capture_poison_proof.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/session/test_coalesce.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/session/test_dag.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/session/test_disk_spill_fallback.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/session/test_flush_individual_fallback.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/session/test_governed_write.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/session/test_managed.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/session/test_op_enqueue_site.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/session/test_reads.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/session/test_session.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/test_database_name_alias.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/test_model_cls_refactor.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/test_no_blocking_asyncpg_tls.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/test_secrets_battery.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/test_sql_param_casts.py +0 -0
- {matrx_orm-3.1.26 → matrx_orm-3.1.28}/tests/test_sync_twins_guard.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.28
|
|
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
|
|
@@ -28,6 +28,15 @@ python utils/code_context/generate_module_readme.py src/matrx_orm/core --mode si
|
|
|
28
28
|
|
|
29
29
|
## Architecture
|
|
30
30
|
|
|
31
|
+
### Pydantic bridge default invariant
|
|
32
|
+
|
|
33
|
+
`pydantic_bridge.py` derives input/output schemas from ORM fields. Every
|
|
34
|
+
non-`None` static field default is normalized through that field's `to_python`
|
|
35
|
+
conversion before it is attached to the generated Pydantic schema. This keeps
|
|
36
|
+
defaults canonical even though Pydantic does not validate defaults by default
|
|
37
|
+
(for example, `DecimalField(default=0)` exposes `Decimal("0")`, not an `int`) and
|
|
38
|
+
prevents serializer type warnings at API boundaries.
|
|
39
|
+
|
|
31
40
|
> **Fill this in.** Describe the execution flow and layer map for this module.
|
|
32
41
|
> See `utils/code_context/MODULE_README_SPEC.md` for the recommended format.
|
|
33
42
|
>
|
|
@@ -210,7 +210,6 @@ def _field_annotation(field: Any, *, partial: bool) -> tuple[Any, Any]:
|
|
|
210
210
|
from matrx_orm.core.fields import ( # noqa: PLC0415
|
|
211
211
|
DateField,
|
|
212
212
|
DateTimeField,
|
|
213
|
-
EnumField,
|
|
214
213
|
ForeignKey,
|
|
215
214
|
TimeField,
|
|
216
215
|
)
|
|
@@ -218,15 +217,15 @@ def _field_annotation(field: Any, *, partial: bool) -> tuple[Any, Any]:
|
|
|
218
217
|
py_type = field.python_type()
|
|
219
218
|
|
|
220
219
|
def _default() -> Any:
|
|
221
|
-
"""ORM
|
|
222
|
-
|
|
223
|
-
re-validate defaults
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
220
|
+
"""Coerce ORM defaults into each field's canonical Python type.
|
|
221
|
+
|
|
222
|
+
Pydantic v2 does not re-validate defaults. Generated model defaults
|
|
223
|
+
therefore otherwise retain their DB-literal types (for example ``0``
|
|
224
|
+
on a DecimalField or ``"internal"`` on an EnumField), and
|
|
225
|
+
``model_dump()`` emits ``PydanticSerializationUnexpectedValue``.
|
|
227
226
|
"""
|
|
228
227
|
value = field.get_default()
|
|
229
|
-
if
|
|
228
|
+
if value is not None:
|
|
230
229
|
try:
|
|
231
230
|
return field.to_python(value)
|
|
232
231
|
except (TypeError, ValueError):
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Generic Postgres function-call primitive.
|
|
2
|
+
|
|
3
|
+
Databases increasingly own logic as ``schema.fn_*`` functions (identity
|
|
4
|
+
upserts, jsonb merges, ingestion RPCs). Application code must never
|
|
5
|
+
re-implement them and must never hand-write ``SELECT ... FROM schema.fn(...)``
|
|
6
|
+
strings — this module is the ONE place that renders that statement.
|
|
7
|
+
|
|
8
|
+
``call_db_function`` executes ``SELECT * FROM <schema.fn>($1, $2, ...)`` on a
|
|
9
|
+
model's database (or a named database config) and returns the result rows as
|
|
10
|
+
plain dicts. It routes through ``AsyncDatabaseManager.execute_write`` because
|
|
11
|
+
DB functions may write; a read-only function is simply a write that touches
|
|
12
|
+
nothing.
|
|
13
|
+
|
|
14
|
+
Argument encoding: scalars bind as-is; ``dict``/``list`` arguments are JSON
|
|
15
|
+
encoded and cast ``::jsonb`` in the rendered statement (the overwhelmingly
|
|
16
|
+
common composite argument type for these functions). A function needing a
|
|
17
|
+
different composite cast gets a new explicit parameter here — never a raw SQL
|
|
18
|
+
call site.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import json
|
|
24
|
+
import re
|
|
25
|
+
from typing import TYPE_CHECKING, Any
|
|
26
|
+
|
|
27
|
+
if TYPE_CHECKING: # pragma: no cover
|
|
28
|
+
from matrx_orm.core.base import Model
|
|
29
|
+
|
|
30
|
+
# schema-qualified (or bare) SQL function identifier — the only shape we ever
|
|
31
|
+
# interpolate into the statement. Everything else binds as a parameter.
|
|
32
|
+
_FUNCTION_NAME_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?$")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _render_call(function_name: str, args: tuple[Any, ...]) -> tuple[str, list[Any]]:
|
|
36
|
+
if not _FUNCTION_NAME_RE.match(function_name):
|
|
37
|
+
raise ValueError(f"call_db_function: invalid function name {function_name!r}")
|
|
38
|
+
placeholders: list[str] = []
|
|
39
|
+
values: list[Any] = []
|
|
40
|
+
for index, arg in enumerate(args, start=1):
|
|
41
|
+
if isinstance(arg, dict | list):
|
|
42
|
+
placeholders.append(f"${index}::jsonb")
|
|
43
|
+
values.append(json.dumps(arg, ensure_ascii=False, default=str))
|
|
44
|
+
else:
|
|
45
|
+
placeholders.append(f"${index}")
|
|
46
|
+
values.append(arg)
|
|
47
|
+
sql = f"SELECT * FROM {function_name}({', '.join(placeholders)})"
|
|
48
|
+
return sql, values
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
async def call_db_function(
|
|
52
|
+
database: type[Model] | str,
|
|
53
|
+
function_name: str,
|
|
54
|
+
*args: Any,
|
|
55
|
+
) -> list[dict[str, Any]]:
|
|
56
|
+
"""``SELECT * FROM <function_name>($1, ...)`` → ``list[dict]``.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
database: a matrx-orm ``Model`` subclass (the call runs on its
|
|
60
|
+
database) or a database config name string.
|
|
61
|
+
function_name: bare or schema-qualified function identifier
|
|
62
|
+
(e.g. ``"seo.fn_upsert_keyword"``). Validated — never user input.
|
|
63
|
+
*args: positional function arguments. ``dict``/``list`` values are
|
|
64
|
+
JSON-encoded and cast ``::jsonb``; everything else binds directly.
|
|
65
|
+
|
|
66
|
+
Returns the function's result set as plain dicts (a scalar-returning
|
|
67
|
+
function yields one row with one column named after the function).
|
|
68
|
+
"""
|
|
69
|
+
sql, values = _render_call(function_name, args)
|
|
70
|
+
|
|
71
|
+
from matrx_orm.core.async_db_manager import AsyncDatabaseManager
|
|
72
|
+
|
|
73
|
+
config = database if isinstance(database, str) else database.get_database_name()
|
|
74
|
+
rows = await AsyncDatabaseManager.execute_write(config, sql, *values)
|
|
75
|
+
return [dict(row) for row in rows]
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
__all__ = ["call_db_function"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "matrx-orm"
|
|
3
|
-
version = "3.1.
|
|
3
|
+
version = "3.1.28"
|
|
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,33 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import warnings
|
|
4
|
+
from decimal import Decimal
|
|
5
|
+
|
|
6
|
+
from matrx_orm import (
|
|
7
|
+
DecimalField,
|
|
8
|
+
Model,
|
|
9
|
+
TextField,
|
|
10
|
+
UUIDField,
|
|
11
|
+
build_input_schema,
|
|
12
|
+
validate_model_input,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CostedRecord(Model):
|
|
17
|
+
_table_name = "costed_record"
|
|
18
|
+
_database = "test"
|
|
19
|
+
|
|
20
|
+
id = UUIDField(primary_key=True)
|
|
21
|
+
name = TextField(null=False)
|
|
22
|
+
total_cost = DecimalField(null=False, default=0)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_decimal_default_is_canonical_before_pydantic_serialization() -> None:
|
|
26
|
+
with warnings.catch_warnings(record=True) as caught:
|
|
27
|
+
warnings.simplefilter("always")
|
|
28
|
+
validated = validate_model_input(CostedRecord, {"name": "example"})
|
|
29
|
+
|
|
30
|
+
assert validated == {"name": "example"}
|
|
31
|
+
schema = build_input_schema(CostedRecord)
|
|
32
|
+
assert schema(name="example").total_cost == Decimal("0")
|
|
33
|
+
assert not [w for w in caught if "Pydantic serializer warnings" in str(w.message)]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""Render-layer tests for the generic DB function-call primitive."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from matrx_orm.operations.db_functions import _render_call
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_scalar_args_bind_positionally():
|
|
11
|
+
sql, values = _render_call("seo.fn_upsert_keyword", ("botox cost", "en"))
|
|
12
|
+
assert sql == "SELECT * FROM seo.fn_upsert_keyword($1, $2)"
|
|
13
|
+
assert values == ["botox cost", "en"]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_dict_and_list_args_encode_as_jsonb():
|
|
17
|
+
research = {"primary": "botox", "children": ["botox cost"]}
|
|
18
|
+
sql, values = _render_call("seo.fn_ingest_keyword_research", (research, "en", None))
|
|
19
|
+
assert sql == "SELECT * FROM seo.fn_ingest_keyword_research($1::jsonb, $2, $3)"
|
|
20
|
+
assert json.loads(values[0]) == research
|
|
21
|
+
assert values[1:] == ["en", None]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_bare_function_name_allowed():
|
|
25
|
+
sql, values = _render_call("now", ())
|
|
26
|
+
assert sql == "SELECT * FROM now()"
|
|
27
|
+
assert values == []
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@pytest.mark.parametrize(
|
|
31
|
+
"bad",
|
|
32
|
+
[
|
|
33
|
+
"seo.fn_upsert_keyword; drop table x",
|
|
34
|
+
"seo.fn(*)",
|
|
35
|
+
"a.b.c",
|
|
36
|
+
"",
|
|
37
|
+
"seo.fn upsert",
|
|
38
|
+
"seo.fn_upsert_keyword()",
|
|
39
|
+
],
|
|
40
|
+
)
|
|
41
|
+
def test_invalid_function_names_rejected(bad):
|
|
42
|
+
with pytest.raises(ValueError):
|
|
43
|
+
_render_call(bad, ())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|