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