sqlmodel-ext 0.5.3__tar.gz → 0.5.4__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 (268) hide show
  1. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/.github/workflows/ci.yml +148 -146
  2. sqlmodel_ext-0.5.4/.github/workflows/release.yml +90 -0
  3. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/.gitignore +36 -36
  4. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/CHANGELOG.md +352 -332
  5. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/LICENSE +21 -21
  6. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/PKG-INFO +3 -3
  7. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/README.md +1878 -1878
  8. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/README_zh.md +1878 -1878
  9. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/ai-rules/AGENTS.md +286 -286
  10. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/ai-rules/CLAUDE.md +6 -6
  11. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/ai-rules/README.md +58 -58
  12. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/.vitepress/config.mts +57 -57
  13. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/.vitepress/en.mts +126 -126
  14. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/.vitepress/theme/index.ts +12 -12
  15. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/.vitepress/theme/style/custom.css +3 -3
  16. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/.vitepress/zh.mts +126 -126
  17. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/cached-table.md +189 -189
  18. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/cascade-delete-semantics.md +155 -155
  19. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/crud-pipeline.md +279 -279
  20. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/index.md +48 -48
  21. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/metaclass.md +358 -358
  22. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/optimistic-lock.md +160 -160
  23. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/polymorphic-internals.md +242 -242
  24. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/prerequisites.md +187 -187
  25. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/relation-load-checker.md +184 -184
  26. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/relation-preload.md +224 -224
  27. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/single-source-of-truth.md +138 -138
  28. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/transactional-cache-transparency.md +145 -145
  29. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/explanation/unset-three-state.md +317 -317
  30. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/guide/cached-table.md +17 -17
  31. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/guide/crud.md +15 -15
  32. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/guide/field-types.md +13 -13
  33. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/guide/index.md +13 -13
  34. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/guide/optimistic-lock.md +14 -14
  35. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/guide/pagination.md +14 -14
  36. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/guide/polymorphic.md +17 -17
  37. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/guide/relation-load-checker.md +16 -16
  38. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/guide/relation-preload.md +17 -17
  39. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/aggregate-queries.md +133 -133
  40. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/cache-queries.md +177 -177
  41. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/check-partial-dtos.md +175 -175
  42. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/configure-cascade-delete.md +234 -234
  43. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/define-jti-models.md +122 -122
  44. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/define-sti-models.md +143 -143
  45. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/enforce-locking-and-isolation.md +227 -227
  46. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/extra-mixins.md +256 -256
  47. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/handle-concurrent-updates.md +123 -123
  48. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/handle-referenced-deletes.md +86 -86
  49. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/index.md +57 -57
  50. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/integrate-with-fastapi.md +179 -179
  51. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/keyset-pagination.md +102 -102
  52. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/migrate-to-0-5.md +319 -319
  53. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/paginate-a-list-endpoint.md +102 -102
  54. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/prevent-missing-greenlet.md +210 -210
  55. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/release-connection-during-long-io.md +183 -183
  56. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/type-check-with-basedpyright.md +258 -258
  57. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/use-with-ai-assistants.md +102 -102
  58. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/how-to/write-patch-endpoints.md +223 -223
  59. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/index.md +76 -76
  60. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/internals/cached-table.md +13 -13
  61. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/internals/crud.md +15 -15
  62. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/internals/index.md +13 -13
  63. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/internals/metaclass.md +13 -13
  64. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/internals/optimistic-lock.md +13 -13
  65. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/internals/polymorphic.md +13 -13
  66. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/internals/prerequisites.md +13 -13
  67. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/internals/relation-load-checker.md +13 -13
  68. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/internals/relation-preload.md +13 -13
  69. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/reference/base-classes.md +225 -225
  70. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/reference/crud-methods.md +392 -392
  71. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/reference/decorators.md +260 -260
  72. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/reference/field-types.md +410 -410
  73. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/reference/index.md +54 -54
  74. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/reference/mixins.md +404 -404
  75. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/reference/pagination-types.md +178 -178
  76. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/tutorials/01-getting-started.md +263 -263
  77. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/tutorials/02-building-a-blog-api.md +419 -419
  78. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/tutorials/03-adding-redis-cache.md +288 -288
  79. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/en/tutorials/index.md +32 -32
  80. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/cached-table.md +189 -189
  81. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/cascade-delete-semantics.md +155 -155
  82. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/crud-pipeline.md +279 -279
  83. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/index.md +48 -48
  84. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/metaclass.md +358 -358
  85. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/optimistic-lock.md +160 -160
  86. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/polymorphic-internals.md +231 -231
  87. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/prerequisites.md +187 -187
  88. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/relation-load-checker.md +184 -184
  89. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/relation-preload.md +224 -224
  90. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/single-source-of-truth.md +138 -138
  91. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/transactional-cache-transparency.md +145 -145
  92. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/explanation/unset-three-state.md +317 -317
  93. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/guide/cached-table.md +17 -17
  94. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/guide/crud.md +15 -15
  95. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/guide/field-types.md +13 -13
  96. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/guide/index.md +13 -13
  97. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/guide/optimistic-lock.md +14 -14
  98. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/guide/pagination.md +14 -14
  99. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/guide/polymorphic.md +17 -17
  100. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/guide/relation-load-checker.md +16 -16
  101. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/guide/relation-preload.md +17 -17
  102. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/aggregate-queries.md +133 -133
  103. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/cache-queries.md +177 -177
  104. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/check-partial-dtos.md +175 -175
  105. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/configure-cascade-delete.md +234 -234
  106. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/define-jti-models.md +122 -122
  107. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/define-sti-models.md +143 -143
  108. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/enforce-locking-and-isolation.md +227 -227
  109. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/extra-mixins.md +256 -256
  110. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/handle-concurrent-updates.md +123 -123
  111. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/handle-referenced-deletes.md +86 -86
  112. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/index.md +57 -57
  113. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/integrate-with-fastapi.md +179 -179
  114. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/keyset-pagination.md +102 -102
  115. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/migrate-to-0-5.md +319 -319
  116. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/paginate-a-list-endpoint.md +102 -102
  117. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/prevent-missing-greenlet.md +207 -207
  118. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/release-connection-during-long-io.md +183 -183
  119. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/type-check-with-basedpyright.md +258 -258
  120. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/use-with-ai-assistants.md +102 -102
  121. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/how-to/write-patch-endpoints.md +223 -223
  122. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/index.md +76 -76
  123. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/internals/cached-table.md +13 -13
  124. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/internals/crud.md +15 -15
  125. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/internals/index.md +13 -13
  126. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/internals/metaclass.md +13 -13
  127. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/internals/optimistic-lock.md +13 -13
  128. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/internals/polymorphic.md +13 -13
  129. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/internals/prerequisites.md +13 -13
  130. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/internals/relation-load-checker.md +13 -13
  131. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/internals/relation-preload.md +13 -13
  132. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/reference/base-classes.md +224 -224
  133. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/reference/crud-methods.md +392 -392
  134. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/reference/decorators.md +260 -260
  135. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/reference/field-types.md +410 -410
  136. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/reference/index.md +54 -54
  137. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/reference/mixins.md +404 -404
  138. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/reference/pagination-types.md +178 -178
  139. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/tutorials/01-getting-started.md +263 -263
  140. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/tutorials/02-building-a-blog-api.md +419 -419
  141. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/tutorials/03-adding-redis-cache.md +288 -288
  142. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/docs/tutorials/index.md +32 -32
  143. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/01_unset_patch.py +195 -195
  144. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/02_single_source_types.py +104 -104
  145. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/03_keyset_pagination.py +96 -96
  146. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/04_locking_and_isolation.py +155 -155
  147. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/05_aggregates.py +91 -91
  148. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/06_referenced_delete.py +118 -118
  149. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/07_transactional_cache.py +108 -108
  150. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/08_optimistic_lock.py +98 -98
  151. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/09_relation_preload_bulk.py +117 -117
  152. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/10_typed_select.py +103 -103
  153. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/11_type_errors_caught_by_basedpyright.py +80 -80
  154. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/README.md +154 -154
  155. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/check_derived_demo/pyrightconfig.json +4 -4
  156. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/check_derived_demo/shop/__init__.py +7 -7
  157. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/check_derived_demo/shop/handlers.py +16 -16
  158. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/check_derived_demo/shop/models.py +29 -29
  159. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/examples/consumer_integration/run.py +165 -165
  160. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/package.json +13 -13
  161. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/pnpm-lock.yaml +3096 -3096
  162. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/pyproject.toml +83 -81
  163. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/pyrightconfig.json +48 -48
  164. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/__init__.py +1 -1
  165. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/_compat.py +261 -261
  166. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/_exceptions.py +16 -16
  167. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/_type_unwrap.py +117 -117
  168. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/_utils.py +5 -5
  169. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/base.py +2178 -2178
  170. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/check_derived.py +565 -565
  171. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/constants.py +76 -76
  172. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/dependencies.py +178 -178
  173. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/derived_decls.py +818 -818
  174. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/__init__.py +997 -997
  175. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/_internal/path.py +72 -72
  176. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/_ssrf.py +81 -81
  177. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/dialects/__init__.py +7 -7
  178. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/dialects/postgresql/__init__.py +47 -47
  179. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/dialects/postgresql/array.py +232 -232
  180. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/dialects/postgresql/exceptions.py +38 -38
  181. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/dialects/postgresql/jsonb_types.py +266 -266
  182. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/dialects/postgresql/numpy_vector.py +443 -443
  183. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/ip_address.py +86 -86
  184. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/mixins/__init__.py +1 -1
  185. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/mixins/module_name_mixin.py +33 -33
  186. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/url.py +170 -170
  187. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/__init__.py +79 -79
  188. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/_uuid.py +69 -69
  189. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/constants.py +17 -17
  190. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/exceptions.py +84 -84
  191. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/info_response.py +47 -47
  192. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/migration_cache_invalidation.py +243 -243
  193. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/mixin_table_scan.py +96 -96
  194. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/optimistic_lock.py +161 -161
  195. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/relation_preload.py +918 -916
  196. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/resource_quota.py +318 -318
  197. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/table.py +2041 -2036
  198. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/trgm_searchable.py +230 -230
  199. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/pagination.py +291 -291
  200. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/relation_load_checker.py +6367 -6367
  201. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/select.py +471 -466
  202. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/session.py +633 -633
  203. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/unset.py +189 -189
  204. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/_models.py +69 -69
  205. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/conftest.py +58 -58
  206. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_annotated_default_factory_inheritance.py +307 -307
  207. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_array_explicit_field_sa_type.py +145 -145
  208. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_basic_crud.py +71 -71
  209. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_cached_commit_paths.py +300 -300
  210. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_cached_table.py +745 -745
  211. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_check_derived.py +239 -239
  212. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_crud_extended.py +822 -822
  213. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_decimal_types.py +431 -431
  214. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_deferred_index.py +50 -50
  215. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_derived_decls.py +159 -159
  216. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_enhanced_session.py +547 -547
  217. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_examples.py +52 -52
  218. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_field_types_aliases_extra.py +292 -292
  219. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_field_types_jsonb_limits.py +186 -186
  220. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_field_types_misc.py +189 -189
  221. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_field_types_str_num.py +400 -400
  222. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_field_types_url_ssrf.py +267 -267
  223. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_051_rereview.py +52 -52
  224. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_051_review.py +262 -262
  225. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_051_review2.py +72 -72
  226. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_check_derived_review2.py +91 -91
  227. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_check_derived_temp_root.py +40 -40
  228. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_nested_duplicate_names.py +38 -38
  229. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_omitted_sentinel_alias_modes.py +38 -38
  230. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_partial_alias_generator.py +20 -20
  231. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_partial_annotated_field_warnings.py +28 -28
  232. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_partial_discriminator.py +42 -42
  233. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_partial_frozen_field.py +21 -21
  234. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_partial_rhs_field_metadata.py +36 -36
  235. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_review4_followup.py +109 -109
  236. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_final_review5.py +145 -145
  237. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_inherited_column_attributes.py +666 -666
  238. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_metaclass_extra.py +396 -396
  239. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_metaclass_field_resolution_052.py +406 -406
  240. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_mixins_extra.py +323 -323
  241. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_optimistic_lock.py +243 -243
  242. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_pagination.py +492 -492
  243. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_partial.py +326 -326
  244. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_pg_dialect_types.py +432 -432
  245. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_polymorphic_jti.py +309 -309
  246. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_polymorphic_sti_query.py +472 -472
  247. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_query_dependency.py +326 -326
  248. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_query_dependency_metadata.py +154 -154
  249. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_relation_load_checker.py +232 -232
  250. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_relation_load_checker_load_resolution.py +1555 -1555
  251. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_relation_load_checker_sessions.py +563 -563
  252. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_relation_preload.py +499 -499
  253. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_relationship_pep604.py +115 -115
  254. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_review_mixed_version_cache.py +59 -59
  255. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_review_raw_insert_cache.py +50 -50
  256. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_review_raw_insert_edges.py +68 -68
  257. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_review_raw_insert_late_model.py +29 -29
  258. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_review_raw_insert_sti.py +56 -56
  259. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_select.py +156 -156
  260. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_smoke_imports.py +265 -265
  261. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_sti_default_isolation.py +132 -132
  262. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/test_unset.py +241 -241
  263. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/_sa_type.py +0 -0
  264. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/_internal/__init__.py +0 -0
  265. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/cached_table.py +0 -0
  266. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/polymorphic.py +0 -0
  267. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/py.typed +0 -0
  268. {sqlmodel_ext-0.5.3 → sqlmodel_ext-0.5.4}/tests/__init__.py +0 -0
@@ -1,146 +1,148 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [master]
6
- pull_request:
7
- branches: [master]
8
- workflow_dispatch:
9
-
10
- permissions:
11
- contents: read
12
-
13
- concurrency:
14
- group: ci-${{ github.ref }}
15
- cancel-in-progress: true
16
-
17
- jobs:
18
- # -------------------------------------------------------------------
19
- # Job 1: source-tree tests across supported Python versions.
20
- # Uses uv sync so the lockfile is honoured and runs are reproducible.
21
- # -------------------------------------------------------------------
22
- test:
23
- name: test (py${{ matrix.python-version }})
24
- runs-on: ubuntu-latest
25
- strategy:
26
- fail-fast: false
27
- matrix:
28
- python-version: ["3.12", "3.13", "3.14"]
29
- steps:
30
- - name: Checkout
31
- uses: actions/checkout@v4
32
-
33
- - name: Install uv
34
- uses: astral-sh/setup-uv@v5
35
- with:
36
- enable-cache: true
37
- cache-dependency-glob: "uv.lock"
38
-
39
- - name: Set up Python ${{ matrix.python-version }}
40
- run: uv python install ${{ matrix.python-version }}
41
-
42
- - name: Create venv and install project with dev extras
43
- # Dev extras: pytest, pytest-asyncio, aiosqlite, ruff. Editable install
44
- # keeps the wheel build separate for the consumer-integration job.
45
- run: |
46
- uv venv --python ${{ matrix.python-version }} .venv
47
- uv pip install --python .venv/bin/python -e ".[dev]"
48
-
49
- - name: Run pytest
50
- run: .venv/bin/python -m pytest tests/ -v
51
-
52
- # -------------------------------------------------------------------
53
- # Job 1b: static type check. basedpyright reads pyrightconfig.json from
54
- # the repository root (src only, pythonVersion 3.12 = lowest supported).
55
- # The gate is 0 errors and 0 warnings: pyrightconfig.json sets failOnWarnings,
56
- # so any warning makes basedpyright exit non-zero and fails the job.
57
- # The alembic extra is installed so the optional-import module
58
- # `mixins/migration_cache_invalidation.py` resolves its imports.
59
- # "0 errors" is also what an empty scan prints, so the job additionally
60
- # fails when the verbose log does not report a non-zero source-file count.
61
- # -------------------------------------------------------------------
62
- typecheck:
63
- name: basedpyright (py3.12)
64
- runs-on: ubuntu-latest
65
- steps:
66
- - name: Checkout
67
- uses: actions/checkout@v4
68
-
69
- - name: Install uv
70
- uses: astral-sh/setup-uv@v5
71
- with:
72
- enable-cache: true
73
- cache-dependency-glob: "uv.lock"
74
-
75
- - name: Set up Python 3.12
76
- run: uv python install 3.12
77
-
78
- - name: Create venv and install project with dev extras
79
- run: |
80
- uv venv --python 3.12 .venv
81
- uv pip install --python .venv/bin/python -e ".[dev,alembic]"
82
-
83
- - name: Run basedpyright
84
- # Activate the venv so basedpyright resolves imports against it.
85
- run: |
86
- source .venv/bin/activate
87
- status=0
88
- basedpyright --verbose > basedpyright.log 2>&1 || status=$?
89
- grep -E " - (error|warning)" basedpyright.log || true
90
- grep -E "^[0-9]+ errors?, [0-9]+ warnings?" basedpyright.log
91
- grep -E "^Found [0-9]+ source files" basedpyright.log
92
- if ! grep -qE "^Found [1-9][0-9]* source files" basedpyright.log; then
93
- echo "::error::basedpyright scanned no source files (check pyrightconfig.json include/exclude)"
94
- exit 1
95
- fi
96
- exit $status
97
-
98
- # -------------------------------------------------------------------
99
- # Job 2: build wheel + sdist, then install the wheel into a clean
100
- # virtualenv with zero dev deps and run the consumer integration
101
- # script. This simulates an external PyPI consumer.
102
- # -------------------------------------------------------------------
103
- consumer-integration:
104
- name: consumer integration (py${{ matrix.python-version }})
105
- runs-on: ubuntu-latest
106
- needs: test
107
- strategy:
108
- fail-fast: false
109
- matrix:
110
- python-version: ["3.12", "3.13", "3.14"]
111
- steps:
112
- - name: Checkout
113
- uses: actions/checkout@v4
114
-
115
- - name: Install uv
116
- uses: astral-sh/setup-uv@v5
117
- with:
118
- enable-cache: true
119
-
120
- - name: Set up Python ${{ matrix.python-version }}
121
- run: uv python install ${{ matrix.python-version }}
122
-
123
- - name: Build wheel and sdist
124
- run: uv tool run --from build python -m build
125
-
126
- - name: Create isolated consumer venv
127
- run: uv venv --python ${{ matrix.python-version }} /tmp/consumer-env
128
-
129
- - name: Install built wheel (no dev deps, only the wheel + aiosqlite driver)
130
- run: uv pip install --python /tmp/consumer-env/bin/python dist/*.whl aiosqlite
131
-
132
- - name: Confirm installed version matches wheel
133
- run: |
134
- /tmp/consumer-env/bin/python -c "import sqlmodel_ext; print('installed:', sqlmodel_ext.__version__ if hasattr(sqlmodel_ext, '__version__') else '(no __version__)')"
135
-
136
- - name: Run consumer integration scenario
137
- run: /tmp/consumer-env/bin/python examples/consumer_integration/run.py
138
-
139
- - name: Upload distribution artifacts
140
- if: matrix.python-version == '3.12'
141
- uses: actions/upload-artifact@v4
142
- with:
143
- name: dist
144
- path: dist/
145
- if-no-files-found: error
146
- retention-days: 14
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ branches: [master]
8
+ workflow_dispatch:
9
+ # Called by release.yml so a tag is published only after the same checks pass.
10
+ workflow_call:
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ concurrency:
16
+ group: ci-${{ github.ref }}
17
+ cancel-in-progress: true
18
+
19
+ jobs:
20
+ # -------------------------------------------------------------------
21
+ # Job 1: source-tree tests across supported Python versions.
22
+ # Uses uv sync so the lockfile is honoured and runs are reproducible.
23
+ # -------------------------------------------------------------------
24
+ test:
25
+ name: test (py${{ matrix.python-version }})
26
+ runs-on: ubuntu-latest
27
+ strategy:
28
+ fail-fast: false
29
+ matrix:
30
+ python-version: ["3.12", "3.13", "3.14"]
31
+ steps:
32
+ - name: Checkout
33
+ uses: actions/checkout@v4
34
+
35
+ - name: Install uv
36
+ uses: astral-sh/setup-uv@v5
37
+ with:
38
+ enable-cache: true
39
+ cache-dependency-glob: "uv.lock"
40
+
41
+ - name: Set up Python ${{ matrix.python-version }}
42
+ run: uv python install ${{ matrix.python-version }}
43
+
44
+ - name: Create venv and install project with dev extras
45
+ # Dev extras: pytest, pytest-asyncio, aiosqlite, ruff. Editable install
46
+ # keeps the wheel build separate for the consumer-integration job.
47
+ run: |
48
+ uv venv --python ${{ matrix.python-version }} .venv
49
+ uv pip install --python .venv/bin/python -e ".[dev]"
50
+
51
+ - name: Run pytest
52
+ run: .venv/bin/python -m pytest tests/ -v
53
+
54
+ # -------------------------------------------------------------------
55
+ # Job 1b: static type check. basedpyright reads pyrightconfig.json from
56
+ # the repository root (src only, pythonVersion 3.12 = lowest supported).
57
+ # The gate is 0 errors and 0 warnings: pyrightconfig.json sets failOnWarnings,
58
+ # so any warning makes basedpyright exit non-zero and fails the job.
59
+ # The alembic extra is installed so the optional-import module
60
+ # `mixins/migration_cache_invalidation.py` resolves its imports.
61
+ # "0 errors" is also what an empty scan prints, so the job additionally
62
+ # fails when the verbose log does not report a non-zero source-file count.
63
+ # -------------------------------------------------------------------
64
+ typecheck:
65
+ name: basedpyright (py3.12)
66
+ runs-on: ubuntu-latest
67
+ steps:
68
+ - name: Checkout
69
+ uses: actions/checkout@v4
70
+
71
+ - name: Install uv
72
+ uses: astral-sh/setup-uv@v5
73
+ with:
74
+ enable-cache: true
75
+ cache-dependency-glob: "uv.lock"
76
+
77
+ - name: Set up Python 3.12
78
+ run: uv python install 3.12
79
+
80
+ - name: Create venv and install project with dev extras
81
+ run: |
82
+ uv venv --python 3.12 .venv
83
+ uv pip install --python .venv/bin/python -e ".[dev,alembic]"
84
+
85
+ - name: Run basedpyright
86
+ # Activate the venv so basedpyright resolves imports against it.
87
+ run: |
88
+ source .venv/bin/activate
89
+ status=0
90
+ basedpyright --verbose > basedpyright.log 2>&1 || status=$?
91
+ grep -E " - (error|warning)" basedpyright.log || true
92
+ grep -E "^[0-9]+ errors?, [0-9]+ warnings?" basedpyright.log
93
+ grep -E "^Found [0-9]+ source files" basedpyright.log
94
+ if ! grep -qE "^Found [1-9][0-9]* source files" basedpyright.log; then
95
+ echo "::error::basedpyright scanned no source files (check pyrightconfig.json include/exclude)"
96
+ exit 1
97
+ fi
98
+ exit $status
99
+
100
+ # -------------------------------------------------------------------
101
+ # Job 2: build wheel + sdist, then install the wheel into a clean
102
+ # virtualenv with zero dev deps and run the consumer integration
103
+ # script. This simulates an external PyPI consumer.
104
+ # -------------------------------------------------------------------
105
+ consumer-integration:
106
+ name: consumer integration (py${{ matrix.python-version }})
107
+ runs-on: ubuntu-latest
108
+ needs: test
109
+ strategy:
110
+ fail-fast: false
111
+ matrix:
112
+ python-version: ["3.12", "3.13", "3.14"]
113
+ steps:
114
+ - name: Checkout
115
+ uses: actions/checkout@v4
116
+
117
+ - name: Install uv
118
+ uses: astral-sh/setup-uv@v5
119
+ with:
120
+ enable-cache: true
121
+
122
+ - name: Set up Python ${{ matrix.python-version }}
123
+ run: uv python install ${{ matrix.python-version }}
124
+
125
+ - name: Build wheel and sdist
126
+ run: uv tool run --from build python -m build
127
+
128
+ - name: Create isolated consumer venv
129
+ run: uv venv --python ${{ matrix.python-version }} /tmp/consumer-env
130
+
131
+ - name: Install built wheel (no dev deps, only the wheel + aiosqlite driver)
132
+ run: uv pip install --python /tmp/consumer-env/bin/python dist/*.whl aiosqlite
133
+
134
+ - name: Confirm installed version matches wheel
135
+ run: |
136
+ /tmp/consumer-env/bin/python -c "import sqlmodel_ext; print('installed:', sqlmodel_ext.__version__ if hasattr(sqlmodel_ext, '__version__') else '(no __version__)')"
137
+
138
+ - name: Run consumer integration scenario
139
+ run: /tmp/consumer-env/bin/python examples/consumer_integration/run.py
140
+
141
+ - name: Upload distribution artifacts
142
+ if: matrix.python-version == '3.12'
143
+ uses: actions/upload-artifact@v4
144
+ with:
145
+ name: dist
146
+ path: dist/
147
+ if-no-files-found: error
148
+ retention-days: 14
@@ -0,0 +1,90 @@
1
+ name: Release
2
+
3
+ # Publishes to PyPI when a version tag (v1.2.3) is pushed.
4
+ #
5
+ # Authentication is PyPI Trusted Publishing (OIDC): no API token is stored in this
6
+ # repository. The PyPI project must list this workflow as a trusted publisher
7
+ # (owner Foxerine, repository sqlmodel-ext, workflow release.yml, environment pypi).
8
+ #
9
+ # Release steps:
10
+ # 1. Bump `version` in pyproject.toml and `__version__` in src/sqlmodel_ext/__init__.py,
11
+ # and turn the CHANGELOG "[Unreleased]" heading into the new version.
12
+ # 2. Commit to master, then: git tag -a vX.Y.Z -m "sqlmodel-ext X.Y.Z" && git push origin vX.Y.Z
13
+
14
+ on:
15
+ push:
16
+ tags: ["v*"]
17
+
18
+ permissions:
19
+ contents: read
20
+
21
+ jobs:
22
+ # The full CI suite (tests on all supported Pythons, basedpyright, consumer
23
+ # integration) must pass on the tagged commit before anything is published.
24
+ ci:
25
+ uses: ./.github/workflows/ci.yml
26
+
27
+ # The tag, pyproject.toml and __version__ must name the same version; a mismatch
28
+ # would publish a package whose metadata disagrees with the tag.
29
+ verify-version:
30
+ name: verify tag matches package version
31
+ runs-on: ubuntu-latest
32
+ steps:
33
+ - name: Checkout
34
+ uses: actions/checkout@v4
35
+
36
+ - name: Compare tag, pyproject.toml and __version__
37
+ run: |
38
+ python3 - <<'PY'
39
+ import os, re, sys, tomllib
40
+ tag = os.environ["GITHUB_REF_NAME"].removeprefix("v")
41
+ with open("pyproject.toml", "rb") as f:
42
+ project = tomllib.load(f)["project"]["version"]
43
+ init = open("src/sqlmodel_ext/__init__.py", encoding="utf-8").read()
44
+ match = re.search(r'^__version__ = "([^"]+)"', init, re.M)
45
+ module = match.group(1) if match else None
46
+ print(f"tag={tag} pyproject={project} __version__={module}")
47
+ if not (tag == project == module):
48
+ print("::error::tag, pyproject.toml version and __version__ differ")
49
+ sys.exit(1)
50
+ PY
51
+
52
+ build:
53
+ name: build sdist and wheel
54
+ runs-on: ubuntu-latest
55
+ needs: [ci, verify-version]
56
+ steps:
57
+ - name: Checkout
58
+ uses: actions/checkout@v4
59
+
60
+ - name: Install uv
61
+ uses: astral-sh/setup-uv@v5
62
+
63
+ - name: Build
64
+ run: uv build
65
+
66
+ - name: Upload distributions
67
+ uses: actions/upload-artifact@v4
68
+ with:
69
+ name: release-dist
70
+ path: dist/
71
+ if-no-files-found: error
72
+
73
+ publish:
74
+ name: publish to PyPI
75
+ runs-on: ubuntu-latest
76
+ needs: build
77
+ environment:
78
+ name: pypi
79
+ url: https://pypi.org/project/sqlmodel-ext/
80
+ permissions:
81
+ id-token: write
82
+ steps:
83
+ - name: Download distributions
84
+ uses: actions/download-artifact@v4
85
+ with:
86
+ name: release-dist
87
+ path: dist/
88
+
89
+ - name: Publish
90
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -1,36 +1,36 @@
1
- # Python
2
- __pycache__/
3
- *.py[cod]
4
- *$py.class
5
- *.so
6
-
7
- # Distribution / packaging
8
- dist/
9
- build/
10
- *.egg-info/
11
- *.egg
12
-
13
- # Virtual environments
14
- .venv/
15
- venv/
16
- ENV/
17
- node_modules/
18
-
19
- # IDE
20
- .idea/
21
- .vscode/
22
- *.swp
23
- *.swo
24
-
25
- # Testing
26
- .pytest_cache/
27
- .coverage
28
- htmlcov/
29
-
30
- # VitePress
31
- docs/.vitepress/cache/
32
- docs/.vitepress/dist/
33
-
34
- # OS
35
- .DS_Store
36
- Thumbs.db
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+
7
+ # Distribution / packaging
8
+ dist/
9
+ build/
10
+ *.egg-info/
11
+ *.egg
12
+
13
+ # Virtual environments
14
+ .venv/
15
+ venv/
16
+ ENV/
17
+ node_modules/
18
+
19
+ # IDE
20
+ .idea/
21
+ .vscode/
22
+ *.swp
23
+ *.swo
24
+
25
+ # Testing
26
+ .pytest_cache/
27
+ .coverage
28
+ htmlcov/
29
+
30
+ # VitePress
31
+ docs/.vitepress/cache/
32
+ docs/.vitepress/dist/
33
+
34
+ # OS
35
+ .DS_Store
36
+ Thumbs.db