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