sqlmodel-ext 0.5.2__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.2 → 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.2 → sqlmodel_ext-0.5.4}/.gitignore +36 -36
  4. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/CHANGELOG.md +352 -314
  5. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/LICENSE +21 -21
  6. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/PKG-INFO +4 -4
  7. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/README.md +1878 -1878
  8. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/README_zh.md +1878 -1878
  9. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/ai-rules/AGENTS.md +286 -286
  10. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/ai-rules/CLAUDE.md +6 -6
  11. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/ai-rules/README.md +58 -58
  12. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/.vitepress/config.mts +57 -57
  13. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/.vitepress/en.mts +126 -126
  14. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/.vitepress/theme/index.ts +12 -12
  15. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/.vitepress/theme/style/custom.css +3 -3
  16. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/.vitepress/zh.mts +126 -126
  17. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/cached-table.md +189 -189
  18. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/cascade-delete-semantics.md +155 -155
  19. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/crud-pipeline.md +279 -279
  20. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/index.md +48 -48
  21. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/metaclass.md +358 -358
  22. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/optimistic-lock.md +160 -160
  23. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/polymorphic-internals.md +242 -242
  24. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/prerequisites.md +187 -187
  25. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/relation-load-checker.md +184 -184
  26. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/relation-preload.md +224 -224
  27. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/single-source-of-truth.md +138 -138
  28. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/transactional-cache-transparency.md +145 -145
  29. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/explanation/unset-three-state.md +317 -317
  30. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/guide/cached-table.md +17 -17
  31. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/guide/crud.md +15 -15
  32. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/guide/field-types.md +13 -13
  33. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/guide/index.md +13 -13
  34. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/guide/optimistic-lock.md +14 -14
  35. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/guide/pagination.md +14 -14
  36. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/guide/polymorphic.md +17 -17
  37. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/guide/relation-load-checker.md +16 -16
  38. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/guide/relation-preload.md +17 -17
  39. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/aggregate-queries.md +133 -133
  40. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/cache-queries.md +177 -177
  41. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/check-partial-dtos.md +175 -175
  42. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/configure-cascade-delete.md +234 -234
  43. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/define-jti-models.md +122 -122
  44. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/define-sti-models.md +143 -143
  45. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/enforce-locking-and-isolation.md +227 -227
  46. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/extra-mixins.md +256 -256
  47. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/handle-concurrent-updates.md +123 -123
  48. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/handle-referenced-deletes.md +86 -86
  49. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/index.md +57 -57
  50. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/integrate-with-fastapi.md +179 -179
  51. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/keyset-pagination.md +102 -102
  52. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/migrate-to-0-5.md +319 -319
  53. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/paginate-a-list-endpoint.md +102 -102
  54. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/prevent-missing-greenlet.md +210 -210
  55. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/release-connection-during-long-io.md +183 -183
  56. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/type-check-with-basedpyright.md +258 -258
  57. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/use-with-ai-assistants.md +102 -102
  58. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/how-to/write-patch-endpoints.md +223 -223
  59. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/index.md +76 -76
  60. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/internals/cached-table.md +13 -13
  61. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/internals/crud.md +15 -15
  62. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/internals/index.md +13 -13
  63. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/internals/metaclass.md +13 -13
  64. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/internals/optimistic-lock.md +13 -13
  65. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/internals/polymorphic.md +13 -13
  66. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/internals/prerequisites.md +13 -13
  67. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/internals/relation-load-checker.md +13 -13
  68. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/internals/relation-preload.md +13 -13
  69. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/reference/base-classes.md +225 -225
  70. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/reference/crud-methods.md +392 -392
  71. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/reference/decorators.md +260 -260
  72. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/reference/field-types.md +410 -410
  73. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/reference/index.md +54 -54
  74. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/reference/mixins.md +404 -404
  75. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/reference/pagination-types.md +178 -178
  76. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/tutorials/01-getting-started.md +263 -263
  77. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/tutorials/02-building-a-blog-api.md +419 -419
  78. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/tutorials/03-adding-redis-cache.md +288 -288
  79. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/en/tutorials/index.md +32 -32
  80. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/cached-table.md +189 -189
  81. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/cascade-delete-semantics.md +155 -155
  82. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/crud-pipeline.md +279 -279
  83. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/index.md +48 -48
  84. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/metaclass.md +358 -358
  85. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/optimistic-lock.md +160 -160
  86. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/polymorphic-internals.md +231 -231
  87. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/prerequisites.md +187 -187
  88. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/relation-load-checker.md +184 -184
  89. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/relation-preload.md +224 -224
  90. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/single-source-of-truth.md +138 -138
  91. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/transactional-cache-transparency.md +145 -145
  92. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/explanation/unset-three-state.md +317 -317
  93. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/guide/cached-table.md +17 -17
  94. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/guide/crud.md +15 -15
  95. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/guide/field-types.md +13 -13
  96. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/guide/index.md +13 -13
  97. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/guide/optimistic-lock.md +14 -14
  98. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/guide/pagination.md +14 -14
  99. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/guide/polymorphic.md +17 -17
  100. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/guide/relation-load-checker.md +16 -16
  101. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/guide/relation-preload.md +17 -17
  102. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/aggregate-queries.md +133 -133
  103. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/cache-queries.md +177 -177
  104. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/check-partial-dtos.md +175 -175
  105. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/configure-cascade-delete.md +234 -234
  106. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/define-jti-models.md +122 -122
  107. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/define-sti-models.md +143 -143
  108. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/enforce-locking-and-isolation.md +227 -227
  109. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/extra-mixins.md +256 -256
  110. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/handle-concurrent-updates.md +123 -123
  111. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/handle-referenced-deletes.md +86 -86
  112. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/index.md +57 -57
  113. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/integrate-with-fastapi.md +179 -179
  114. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/keyset-pagination.md +102 -102
  115. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/migrate-to-0-5.md +319 -319
  116. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/paginate-a-list-endpoint.md +102 -102
  117. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/prevent-missing-greenlet.md +207 -207
  118. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/release-connection-during-long-io.md +183 -183
  119. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/type-check-with-basedpyright.md +258 -258
  120. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/use-with-ai-assistants.md +102 -102
  121. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/how-to/write-patch-endpoints.md +223 -223
  122. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/index.md +76 -76
  123. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/internals/cached-table.md +13 -13
  124. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/internals/crud.md +15 -15
  125. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/internals/index.md +13 -13
  126. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/internals/metaclass.md +13 -13
  127. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/internals/optimistic-lock.md +13 -13
  128. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/internals/polymorphic.md +13 -13
  129. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/internals/prerequisites.md +13 -13
  130. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/internals/relation-load-checker.md +13 -13
  131. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/internals/relation-preload.md +13 -13
  132. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/reference/base-classes.md +224 -224
  133. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/reference/crud-methods.md +392 -392
  134. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/reference/decorators.md +260 -260
  135. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/reference/field-types.md +410 -410
  136. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/reference/index.md +54 -54
  137. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/reference/mixins.md +404 -404
  138. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/reference/pagination-types.md +178 -178
  139. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/tutorials/01-getting-started.md +263 -263
  140. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/tutorials/02-building-a-blog-api.md +419 -419
  141. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/tutorials/03-adding-redis-cache.md +288 -288
  142. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/docs/tutorials/index.md +32 -32
  143. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/01_unset_patch.py +195 -195
  144. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/02_single_source_types.py +104 -104
  145. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/03_keyset_pagination.py +96 -96
  146. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/04_locking_and_isolation.py +155 -155
  147. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/05_aggregates.py +91 -91
  148. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/06_referenced_delete.py +118 -118
  149. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/07_transactional_cache.py +108 -108
  150. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/08_optimistic_lock.py +98 -98
  151. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/09_relation_preload_bulk.py +117 -117
  152. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/10_typed_select.py +103 -103
  153. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/11_type_errors_caught_by_basedpyright.py +80 -80
  154. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/README.md +154 -154
  155. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/check_derived_demo/pyrightconfig.json +4 -4
  156. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/check_derived_demo/shop/__init__.py +7 -7
  157. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/check_derived_demo/shop/handlers.py +16 -16
  158. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/check_derived_demo/shop/models.py +29 -29
  159. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/examples/consumer_integration/run.py +165 -165
  160. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/package.json +13 -13
  161. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/pnpm-lock.yaml +3096 -3096
  162. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/pyproject.toml +83 -79
  163. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/pyrightconfig.json +48 -48
  164. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/__init__.py +1 -1
  165. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/_compat.py +261 -261
  166. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/_exceptions.py +16 -16
  167. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/_type_unwrap.py +117 -117
  168. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/_utils.py +5 -5
  169. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/base.py +2178 -2178
  170. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/check_derived.py +565 -565
  171. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/constants.py +76 -76
  172. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/dependencies.py +178 -178
  173. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/derived_decls.py +818 -818
  174. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/__init__.py +997 -997
  175. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/_internal/path.py +72 -72
  176. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/_ssrf.py +81 -81
  177. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/dialects/__init__.py +7 -7
  178. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/dialects/postgresql/__init__.py +47 -47
  179. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/dialects/postgresql/array.py +232 -232
  180. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/dialects/postgresql/exceptions.py +38 -38
  181. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/dialects/postgresql/jsonb_types.py +266 -266
  182. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/dialects/postgresql/numpy_vector.py +443 -443
  183. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/ip_address.py +86 -86
  184. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/mixins/__init__.py +1 -1
  185. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/mixins/module_name_mixin.py +33 -33
  186. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/url.py +170 -170
  187. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/__init__.py +79 -79
  188. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/_uuid.py +69 -69
  189. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/cached_table.py +18 -3
  190. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/constants.py +17 -17
  191. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/exceptions.py +84 -84
  192. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/info_response.py +47 -47
  193. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/migration_cache_invalidation.py +243 -243
  194. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/mixin_table_scan.py +96 -96
  195. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/optimistic_lock.py +161 -161
  196. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/relation_preload.py +918 -916
  197. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/resource_quota.py +318 -318
  198. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/table.py +2041 -2036
  199. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/trgm_searchable.py +230 -230
  200. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/pagination.py +291 -291
  201. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/relation_load_checker.py +6367 -6367
  202. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/select.py +471 -466
  203. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/session.py +633 -633
  204. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/unset.py +189 -189
  205. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/_models.py +69 -69
  206. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/conftest.py +58 -58
  207. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_annotated_default_factory_inheritance.py +307 -307
  208. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_array_explicit_field_sa_type.py +145 -145
  209. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_basic_crud.py +71 -71
  210. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_cached_commit_paths.py +300 -265
  211. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_cached_table.py +745 -745
  212. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_check_derived.py +239 -239
  213. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_crud_extended.py +822 -822
  214. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_decimal_types.py +431 -431
  215. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_deferred_index.py +50 -50
  216. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_derived_decls.py +159 -159
  217. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_enhanced_session.py +547 -526
  218. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_examples.py +52 -52
  219. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_field_types_aliases_extra.py +292 -292
  220. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_field_types_jsonb_limits.py +186 -186
  221. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_field_types_misc.py +189 -189
  222. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_field_types_str_num.py +400 -400
  223. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_field_types_url_ssrf.py +267 -267
  224. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_051_rereview.py +52 -52
  225. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_051_review.py +262 -262
  226. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_051_review2.py +72 -72
  227. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_check_derived_review2.py +91 -91
  228. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_check_derived_temp_root.py +40 -40
  229. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_nested_duplicate_names.py +38 -38
  230. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_omitted_sentinel_alias_modes.py +38 -38
  231. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_partial_alias_generator.py +20 -20
  232. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_partial_annotated_field_warnings.py +28 -28
  233. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_partial_discriminator.py +42 -42
  234. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_partial_frozen_field.py +21 -21
  235. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_partial_rhs_field_metadata.py +36 -36
  236. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_review4_followup.py +109 -109
  237. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_final_review5.py +145 -145
  238. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_inherited_column_attributes.py +666 -666
  239. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_metaclass_extra.py +396 -396
  240. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_metaclass_field_resolution_052.py +406 -406
  241. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_mixins_extra.py +323 -323
  242. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_optimistic_lock.py +243 -243
  243. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_pagination.py +492 -492
  244. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_partial.py +326 -326
  245. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_pg_dialect_types.py +432 -432
  246. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_polymorphic_jti.py +309 -309
  247. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_polymorphic_sti_query.py +472 -472
  248. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_query_dependency.py +326 -326
  249. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_query_dependency_metadata.py +154 -154
  250. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_relation_load_checker.py +232 -232
  251. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_relation_load_checker_load_resolution.py +1555 -1555
  252. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_relation_load_checker_sessions.py +563 -563
  253. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_relation_preload.py +499 -499
  254. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_relationship_pep604.py +115 -115
  255. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_review_mixed_version_cache.py +59 -59
  256. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_review_raw_insert_cache.py +50 -50
  257. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_review_raw_insert_edges.py +68 -68
  258. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_review_raw_insert_late_model.py +29 -29
  259. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_review_raw_insert_sti.py +56 -56
  260. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_select.py +156 -156
  261. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_smoke_imports.py +265 -265
  262. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_sti_default_isolation.py +132 -132
  263. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/tests/test_unset.py +241 -241
  264. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/_sa_type.py +0 -0
  265. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/field_types/_internal/__init__.py +0 -0
  266. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/mixins/polymorphic.py +0 -0
  267. {sqlmodel_ext-0.5.2 → sqlmodel_ext-0.5.4}/src/sqlmodel_ext/py.typed +0 -0
  268. {sqlmodel_ext-0.5.2 → 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