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.
Files changed (275) hide show
  1. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/PKG-INFO +1 -1
  2. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/__init__.py +2 -1
  3. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/base.py +65 -0
  4. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/db_function.py +25 -1
  5. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/query/builder.py +32 -0
  6. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/pyproject.toml +1 -1
  7. matrx_orm-3.1.8/tests/test_sync_twins_guard.py +52 -0
  8. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/.gitignore +0 -0
  9. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/BASE_CLASS_METHODS.md +0 -0
  10. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/CLAUDE.md +0 -0
  11. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/MODEL_API.md +0 -0
  12. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/README.md +0 -0
  13. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/database/orm/extended/managers/ai_model_base.py +0 -0
  14. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/docs/migrations.md +0 -0
  15. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/MODULE_README.md +0 -0
  16. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/MODULE_README.md +0 -0
  17. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/__init__.py +0 -0
  18. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/async_postgresql.py +0 -0
  19. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/base_adapter.py +0 -0
  20. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/postgresql.py +0 -0
  21. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
  22. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/adapters/supabase_adapter.py +0 -0
  23. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/admin/__init__.py +0 -0
  24. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/admin/router.py +0 -0
  25. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/api/__init__.py +0 -0
  26. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/api/auth.py +0 -0
  27. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/api/config.py +0 -0
  28. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/api/handlers.py +0 -0
  29. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/api/protocol.py +0 -0
  30. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/api/server.py +0 -0
  31. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/associations.py +0 -0
  32. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/cache_debug.py +0 -0
  33. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/MODULE_README.md +0 -0
  34. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/__init__.py +0 -0
  35. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/postgres_connection.py +0 -0
  36. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/postgrest.py +0 -0
  37. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/supabase_auth.py +0 -0
  38. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/supabase_config.py +0 -0
  39. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/client/supabase_manager.py +0 -0
  40. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/EXTENDED-TASK.md +0 -0
  41. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/MODULE_README.md +0 -0
  42. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
  43. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/TASKS.md +0 -0
  44. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/__init__.py +0 -0
  45. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/async_db_manager.py +0 -0
  46. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/config.py +0 -0
  47. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/diagnostics.py +0 -0
  48. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/expressions.py +0 -0
  49. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/extended.py +0 -0
  50. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/fields.py +0 -0
  51. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/introspection.py +0 -0
  52. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/listen.py +0 -0
  53. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/loop_filters.py +0 -0
  54. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/model_dto.py +0 -0
  55. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/model_view.py +0 -0
  56. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/paginator.py +0 -0
  57. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/pydantic_bridge.py +0 -0
  58. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/registry.py +0 -0
  59. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/relations.py +0 -0
  60. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/resilience.py +0 -0
  61. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/rls_session.py +0 -0
  62. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/signals.py +0 -0
  63. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/transaction.py +0 -0
  64. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/types.py +0 -0
  65. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/core/write_queue.py +0 -0
  66. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/entity.py +0 -0
  67. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/error_handling.py +0 -0
  68. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/exceptions.py +0 -0
  69. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/extended/__init__.py +0 -0
  70. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/extended/app_error_handler.py +0 -0
  71. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/middleware/__init__.py +0 -0
  72. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/middleware/base.py +0 -0
  73. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/MODULE_README.md +0 -0
  74. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/__init__.py +0 -0
  75. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/cli.py +0 -0
  76. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/ddl.py +0 -0
  77. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/diff.py +0 -0
  78. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/executor.py +0 -0
  79. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/integration.py +0 -0
  80. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/loader.py +0 -0
  81. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/operations.py +0 -0
  82. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/state.py +0 -0
  83. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/migrations/table_filter.py +0 -0
  84. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/MODULE_README.md +0 -0
  85. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/__init__.py +0 -0
  86. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/bulk_update_values.py +0 -0
  87. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/conflict.py +0 -0
  88. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/conflict_writes.py +0 -0
  89. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/create.py +0 -0
  90. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/delete.py +0 -0
  91. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/dynamic_admin.py +0 -0
  92. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/queue_claim.py +0 -0
  93. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/read.py +0 -0
  94. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/staging_load.py +0 -0
  95. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/operations/update.py +0 -0
  96. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/py.typed +0 -0
  97. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/python_sql/MODULE_README.md +0 -0
  98. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/python_sql/__init__.py +0 -0
  99. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/python_sql/db_objects.py +0 -0
  100. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
  101. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
  102. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/query/MODULE_README.md +0 -0
  103. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/query/__init__.py +0 -0
  104. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/query/executor.py +0 -0
  105. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/MODULE_README.md +0 -0
  106. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/__init__.py +0 -0
  107. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/code_handler.py +0 -0
  108. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/codegen_writer.py +0 -0
  109. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/columns.py +0 -0
  110. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/common.py +0 -0
  111. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/diff_preview.py +0 -0
  112. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
  113. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/generator.py +0 -0
  114. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
  115. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
  116. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
  117. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
  118. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/package_wiring.py +0 -0
  119. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/relationships.py +0 -0
  120. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/runner.py +0 -0
  121. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/schema.py +0 -0
  122. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/schema_manager.py +0 -0
  123. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/tables.py +0 -0
  124. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/schema_builder/views.py +0 -0
  125. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/README.md +0 -0
  126. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/__init__.py +0 -0
  127. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/coalesce.py +0 -0
  128. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/dag.py +0 -0
  129. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/errors.py +0 -0
  130. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/fallback.py +0 -0
  131. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/flush.py +0 -0
  132. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/lifecycle.py +0 -0
  133. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/managed.py +0 -0
  134. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/op.py +0 -0
  135. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/reads.py +0 -0
  136. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/session.py +0 -0
  137. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/session/telemetry.py +0 -0
  138. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/MODULE_README.md +0 -0
  139. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/__init__.py +0 -0
  140. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/executor.py +0 -0
  141. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/queries.py +0 -0
  142. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/registry.py +0 -0
  143. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/types.py +0 -0
  144. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/sql_executor/utils.py +0 -0
  145. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/state.py +0 -0
  146. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/utils/__init__.py +0 -0
  147. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/utils/sql_utils.py +0 -0
  148. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/matrx_orm/utils/type_converters.py +0 -0
  149. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/scripts/git-branches.sh +0 -0
  150. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/scripts/publish.sh +0 -0
  151. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/scripts/release.sh +0 -0
  152. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/MODULE_README.md +0 -0
  153. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/__init__.py +0 -0
  154. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/conftest.py +0 -0
  155. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/MODULE_README.md +0 -0
  156. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/__init__.py +0 -0
  157. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_admin_db_columns.py +0 -0
  158. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_admin_search_sentinels.py +0 -0
  159. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_advisory_lock.py +0 -0
  160. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_agent_message.py +0 -0
  161. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_api_auth.py +0 -0
  162. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_api_config.py +0 -0
  163. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_api_handlers.py +0 -0
  164. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_api_protocol.py +0 -0
  165. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_array_agg_order_by.py +0 -0
  166. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_associations.py +0 -0
  167. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_bulk_update_by_pk.py +0 -0
  168. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
  169. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_cache_debug.py +0 -0
  170. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_call_function.py +0 -0
  171. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_case_when.py +0 -0
  172. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_composite_pk_filter.py +0 -0
  173. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_composite_pk_write_paths.py +0 -0
  174. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_config.py +0 -0
  175. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_conflict_target.py +0 -0
  176. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_conflict_writes.py +0 -0
  177. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_connection_codecs.py +0 -0
  178. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_connection_poison_guard.py +0 -0
  179. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_count_composite_distinct.py +0 -0
  180. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_db_function_field.py +0 -0
  181. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_ddl_generator.py +0 -0
  182. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_dirty_tracking.py +0 -0
  183. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_exceptions.py +0 -0
  184. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_execute_admin_sql.py +0 -0
  185. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_expression_primitives.py +0 -0
  186. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_fields.py +0 -0
  187. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
  188. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_filter_raw.py +0 -0
  189. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_from_alias.py +0 -0
  190. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_fts.py +0 -0
  191. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_func_expression_args.py +0 -0
  192. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_having_annotate_alias.py +0 -0
  193. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
  194. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_introspect_rls_policies.py +0 -0
  195. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_join_and_aggregate.py +0 -0
  196. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_listen_notify.py +0 -0
  197. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_managed_write_guard.py +0 -0
  198. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_matrx_entity.py +0 -0
  199. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_migration_diff_types.py +0 -0
  200. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_migration_loader.py +0 -0
  201. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_model_instance.py +0 -0
  202. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_model_meta.py +0 -0
  203. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_order_by_expression.py +0 -0
  204. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_patch_jsonb_path.py +0 -0
  205. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_postgrest_filters.py +0 -0
  206. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_query_builder.py +0 -0
  207. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_query_error_detail.py +0 -0
  208. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_query_executor_sql.py +0 -0
  209. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_query_timeout.py +0 -0
  210. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
  211. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_queue_claim.py +0 -0
  212. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_registry.py +0 -0
  213. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_registry_multi_database.py +0 -0
  214. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_registry_multi_schema.py +0 -0
  215. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_relations.py +0 -0
  216. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_resilience.py +0 -0
  217. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_schema_exists.py +0 -0
  218. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_session_advisory_lock.py +0 -0
  219. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_state_cache.py +0 -0
  220. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_subquery_filter_raw.py +0 -0
  221. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_subquery_in_filter.py +0 -0
  222. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_supabase_auth.py +0 -0
  223. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_supabase_config.py +0 -0
  224. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_update_case_expression.py +0 -0
  225. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_update_subquery.py +0 -0
  226. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_upsert_with_conflict.py +0 -0
  227. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_values_jsonb_decode.py +0 -0
  228. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_watched_lifecycle.py +0 -0
  229. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level1/test_write_retry_semantics.py +0 -0
  230. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/MODULE_README.md +0 -0
  231. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/__init__.py +0 -0
  232. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/conftest.py +0 -0
  233. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_bulk_ops.py +0 -0
  234. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_cache_integration.py +0 -0
  235. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_crud.py +0 -0
  236. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_foreign_keys.py +0 -0
  237. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_m2m.py +0 -0
  238. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_manager.py +0 -0
  239. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_migrations_live.py +0 -0
  240. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_query_execution.py +0 -0
  241. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/level2/test_schema_diff.py +0 -0
  242. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/.env.example +0 -0
  243. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/README.md +0 -0
  244. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/__init__.py +0 -0
  245. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/generate.py +0 -0
  246. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/generated/.gitkeep +0 -0
  247. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/matrx_orm.yaml +0 -0
  248. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project/test_schema_generation.py +0 -0
  249. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/.env.example +0 -0
  250. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/README.md +0 -0
  251. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/__init__.py +0 -0
  252. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/client_example.py +0 -0
  253. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/client_example.ts +0 -0
  254. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/client_supabase_example.py +0 -0
  255. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/sample_project_desktop/server.py +0 -0
  256. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/schema/entity_tests.py +0 -0
  257. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/schema/test_base_generation.py +0 -0
  258. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/schema/test_composite_pk_fk_generation.py +0 -0
  259. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/schema/test_generate_schema.py +0 -0
  260. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/schema/test_multi_schema_output.py +0 -0
  261. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/__init__.py +0 -0
  262. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/conftest.py +0 -0
  263. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_capture_poison_proof.py +0 -0
  264. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_coalesce.py +0 -0
  265. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_dag.py +0 -0
  266. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_disk_spill_fallback.py +0 -0
  267. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_flush_individual_fallback.py +0 -0
  268. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_governed_write.py +0 -0
  269. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_managed.py +0 -0
  270. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_op_enqueue_site.py +0 -0
  271. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_reads.py +0 -0
  272. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/session/test_session.py +0 -0
  273. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/test_database_name_alias.py +0 -0
  274. {matrx_orm-3.1.7 → matrx_orm-3.1.8}/tests/test_model_cls_refactor.py +0 -0
  275. {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.7
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.7"
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