dataframely 2.10.1__tar.gz → 2.11.0__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 (231) hide show
  1. {dataframely-2.10.1 → dataframely-2.11.0}/.copier-answers.yml +1 -1
  2. {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/build.yml +4 -4
  3. {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/chore.yml +1 -1
  4. {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/ci.yml +5 -5
  5. {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/copilot-setup-steps.yml +2 -2
  6. {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/nightly.yml +2 -2
  7. {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/release-drafter.yml +1 -1
  8. {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/scorecard.yml +2 -2
  9. {dataframely-2.10.1 → dataframely-2.11.0}/PKG-INFO +1 -1
  10. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/enum.py +33 -0
  11. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/experimental/infer_schema.py +9 -0
  12. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/sql-generation.md +35 -0
  13. {dataframely-2.10.1 → dataframely-2.11.0}/pixi.lock +7835 -7909
  14. {dataframely-2.10.1 → dataframely-2.11.0}/pyproject.toml +1 -1
  15. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_enum.py +66 -0
  16. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_sqlalchemy_columns.py +63 -1
  17. {dataframely-2.10.1 → dataframely-2.11.0}/.claude/CLAUDE.md +0 -0
  18. {dataframely-2.10.1 → dataframely-2.11.0}/.envrc +0 -0
  19. {dataframely-2.10.1 → dataframely-2.11.0}/.gitattributes +0 -0
  20. {dataframely-2.10.1 → dataframely-2.11.0}/.github/CODEOWNERS +0 -0
  21. {dataframely-2.10.1 → dataframely-2.11.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  22. {dataframely-2.10.1 → dataframely-2.11.0}/.github/copilot-instructions.md +0 -0
  23. {dataframely-2.10.1 → dataframely-2.11.0}/.github/dependabot.yml +0 -0
  24. {dataframely-2.10.1 → dataframely-2.11.0}/.github/instructions/tests.instructions.md +0 -0
  25. {dataframely-2.10.1 → dataframely-2.11.0}/.github/release-drafter.yml +0 -0
  26. {dataframely-2.10.1 → dataframely-2.11.0}/.gitignore +0 -0
  27. {dataframely-2.10.1 → dataframely-2.11.0}/.lefthook.yaml +0 -0
  28. {dataframely-2.10.1 → dataframely-2.11.0}/.prettierignore +0 -0
  29. {dataframely-2.10.1 → dataframely-2.11.0}/.prettierrc +0 -0
  30. {dataframely-2.10.1 → dataframely-2.11.0}/.readthedocs.yml +0 -0
  31. {dataframely-2.10.1 → dataframely-2.11.0}/AGENTS.md +0 -0
  32. {dataframely-2.10.1 → dataframely-2.11.0}/Cargo.lock +0 -0
  33. {dataframely-2.10.1 → dataframely-2.11.0}/Cargo.toml +0 -0
  34. {dataframely-2.10.1 → dataframely-2.11.0}/LICENSE +0 -0
  35. {dataframely-2.10.1 → dataframely-2.11.0}/README.md +0 -0
  36. {dataframely-2.10.1 → dataframely-2.11.0}/SECURITY.md +0 -0
  37. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/__init__.py +0 -0
  38. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_base_schema.py +0 -0
  39. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_compat.py +0 -0
  40. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_deprecation.py +0 -0
  41. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_filter.py +0 -0
  42. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_match_to_schema.py +0 -0
  43. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_native.pyi +0 -0
  44. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_plugin.py +0 -0
  45. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_polars.py +0 -0
  46. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_pydantic.py +0 -0
  47. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_rule.py +0 -0
  48. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_serialization.py +0 -0
  49. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/__init__.py +0 -0
  50. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/_base.py +0 -0
  51. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/_exc.py +0 -0
  52. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/_fsspec.py +0 -0
  53. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/constants.py +0 -0
  54. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/delta.py +0 -0
  55. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/parquet.py +0 -0
  56. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_typing.py +0 -0
  57. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/collection/__init__.py +0 -0
  58. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/collection/_base.py +0 -0
  59. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/collection/collection.py +0 -0
  60. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/collection/filter_result.py +0 -0
  61. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/__init__.py +0 -0
  62. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/_base.py +0 -0
  63. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/_mixins.py +0 -0
  64. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/_registry.py +0 -0
  65. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/_utils.py +0 -0
  66. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/any.py +0 -0
  67. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/array.py +0 -0
  68. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/binary.py +0 -0
  69. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/bool.py +0 -0
  70. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/categorical.py +0 -0
  71. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/datetime.py +0 -0
  72. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/decimal.py +0 -0
  73. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/float.py +0 -0
  74. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/integer.py +0 -0
  75. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/list.py +0 -0
  76. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/object.py +0 -0
  77. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/string.py +0 -0
  78. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/struct.py +0 -0
  79. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/config.py +0 -0
  80. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/exc.py +0 -0
  81. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/experimental/__init__.py +0 -0
  82. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/filter_result.py +0 -0
  83. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/functional.py +0 -0
  84. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/py.typed +0 -0
  85. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/random.py +0 -0
  86. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/schema.py +0 -0
  87. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/testing/__init__.py +0 -0
  88. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/testing/const.py +0 -0
  89. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/testing/factory.py +0 -0
  90. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/testing/mask.py +0 -0
  91. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/testing/rules.py +0 -0
  92. {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/testing/storage.py +0 -0
  93. {dataframely-2.10.1 → dataframely-2.11.0}/docker-compose.yml +0 -0
  94. {dataframely-2.10.1 → dataframely-2.11.0}/docs/_static/custom.css +0 -0
  95. {dataframely-2.10.1 → dataframely-2.11.0}/docs/_static/favicon.ico +0 -0
  96. {dataframely-2.10.1 → dataframely-2.11.0}/docs/_templates/autosummary/class.rst +0 -0
  97. {dataframely-2.10.1 → dataframely-2.11.0}/docs/_templates/autosummary/method.rst +0 -0
  98. {dataframely-2.10.1 → dataframely-2.11.0}/docs/_templates/classes/column.rst +0 -0
  99. {dataframely-2.10.1 → dataframely-2.11.0}/docs/_templates/classes/error.rst +0 -0
  100. {dataframely-2.10.1 → dataframely-2.11.0}/docs/_templates/classes/filter_result.rst +0 -0
  101. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/collection/generation.rst +0 -0
  102. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/collection/index.rst +0 -0
  103. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/collection/io.rst +0 -0
  104. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/collection/metadata.rst +0 -0
  105. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/collection/operations.rst +0 -0
  106. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/collection/validation.rst +0 -0
  107. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/columns/index.rst +0 -0
  108. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/errors/index.rst +0 -0
  109. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/experimental/index.rst +0 -0
  110. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/filter_result/failure_info.rst +0 -0
  111. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/filter_result/index.rst +0 -0
  112. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/index.rst +0 -0
  113. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/misc/index.rst +0 -0
  114. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/schema/conversion.rst +0 -0
  115. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/schema/generation.rst +0 -0
  116. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/schema/index.rst +0 -0
  117. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/schema/io.rst +0 -0
  118. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/schema/metadata.rst +0 -0
  119. {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/schema/validation.rst +0 -0
  120. {dataframely-2.10.1 → dataframely-2.11.0}/docs/conf.py +0 -0
  121. {dataframely-2.10.1 → dataframely-2.11.0}/docs/css/custom.css +0 -0
  122. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/coding-agents.md +0 -0
  123. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/development.md +0 -0
  124. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/examples/index.md +0 -0
  125. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/examples/real-world.ipynb +0 -0
  126. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/faq.md +0 -0
  127. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/column-metadata.md +0 -0
  128. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/data-generation.md +0 -0
  129. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/index.md +0 -0
  130. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/lazy-validation.md +0 -0
  131. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/primary-keys.md +0 -0
  132. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/serialization.md +0 -0
  133. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/index.md +0 -0
  134. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/migration/index.md +0 -0
  135. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/migration/v1-v2.md +0 -0
  136. {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/quickstart.md +0 -0
  137. {dataframely-2.10.1 → dataframely-2.11.0}/docs/index.md +0 -0
  138. {dataframely-2.10.1 → dataframely-2.11.0}/pixi.toml +0 -0
  139. {dataframely-2.10.1 → dataframely-2.11.0}/rust-toolchain.toml +0 -0
  140. {dataframely-2.10.1 → dataframely-2.11.0}/skills/SKILL.md +0 -0
  141. {dataframely-2.10.1 → dataframely-2.11.0}/src/lib.rs +0 -0
  142. {dataframely-2.10.1 → dataframely-2.11.0}/src/polars_plugin/mod.rs +0 -0
  143. {dataframely-2.10.1 → dataframely-2.11.0}/src/polars_plugin/rule_failure.rs +0 -0
  144. {dataframely-2.10.1 → dataframely-2.11.0}/src/polars_plugin/utils.rs +0 -0
  145. {dataframely-2.10.1 → dataframely-2.11.0}/src/polars_plugin/validation_error.rs +0 -0
  146. {dataframely-2.10.1 → dataframely-2.11.0}/src/regex/errdefs.rs +0 -0
  147. {dataframely-2.10.1 → dataframely-2.11.0}/src/regex/mod.rs +0 -0
  148. {dataframely-2.10.1 → dataframely-2.11.0}/src/regex/repr.rs +0 -0
  149. {dataframely-2.10.1 → dataframely-2.11.0}/tests/benches/conftest.py +0 -0
  150. {dataframely-2.10.1 → dataframely-2.11.0}/tests/benches/test_collection.py +0 -0
  151. {dataframely-2.10.1 → dataframely-2.11.0}/tests/benches/test_failure.py +0 -0
  152. {dataframely-2.10.1 → dataframely-2.11.0}/tests/benches/test_schema.py +0 -0
  153. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_base.py +0 -0
  154. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_cast.py +0 -0
  155. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_collection_future_annotations.py +0 -0
  156. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_create_empty.py +0 -0
  157. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_dataframe_members.py +0 -0
  158. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_filter_one_to_n.py +0 -0
  159. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_filter_validate.py +0 -0
  160. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_ignore_in_filter.py +0 -0
  161. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_implementation.py +0 -0
  162. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_join.py +0 -0
  163. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_matches.py +0 -0
  164. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_optional_members.py +0 -0
  165. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_propagate_row_failures.py +0 -0
  166. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_repr.py +0 -0
  167. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_sample.py +0 -0
  168. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_serialization.py +0 -0
  169. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_storage.py +0 -0
  170. {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_validate_input.py +0 -0
  171. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/__init__.py +0 -0
  172. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_any.py +0 -0
  173. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_array.py +0 -0
  174. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_binary.py +0 -0
  175. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_datetime.py +0 -0
  176. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_decimal.py +0 -0
  177. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_float.py +0 -0
  178. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_integer.py +0 -0
  179. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_list.py +0 -0
  180. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_object.py +0 -0
  181. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_string.py +0 -0
  182. {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_struct.py +0 -0
  183. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/__init__.py +0 -0
  184. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_alias.py +0 -0
  185. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_base.py +0 -0
  186. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_check.py +0 -0
  187. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_default_dtypes.py +0 -0
  188. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_description.py +0 -0
  189. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_matches.py +0 -0
  190. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_metadata.py +0 -0
  191. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_polars_schema.py +0 -0
  192. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_pyarrow.py +0 -0
  193. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_pydantic.py +0 -0
  194. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_rules.py +0 -0
  195. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_sample.py +0 -0
  196. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_str.py +0 -0
  197. {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_utils.py +0 -0
  198. {dataframely-2.10.1 → dataframely-2.11.0}/tests/conftest.py +0 -0
  199. {dataframely-2.10.1 → dataframely-2.11.0}/tests/core_validation/__init__.py +0 -0
  200. {dataframely-2.10.1 → dataframely-2.11.0}/tests/core_validation/test_match_to_schema.py +0 -0
  201. {dataframely-2.10.1 → dataframely-2.11.0}/tests/core_validation/test_rule_evaluation.py +0 -0
  202. {dataframely-2.10.1 → dataframely-2.11.0}/tests/experimental/test_infer_schema.py +0 -0
  203. {dataframely-2.10.1 → dataframely-2.11.0}/tests/failure_info/test_storage.py +0 -0
  204. {dataframely-2.10.1 → dataframely-2.11.0}/tests/functional/test_concat.py +0 -0
  205. {dataframely-2.10.1 → dataframely-2.11.0}/tests/functional/test_relationships.py +0 -0
  206. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_base.py +0 -0
  207. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_cast.py +0 -0
  208. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_create_empty.py +0 -0
  209. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_create_empty_if_none.py +0 -0
  210. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_filter.py +0 -0
  211. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_inheritance.py +0 -0
  212. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_matches.py +0 -0
  213. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_pydantic_model.py +0 -0
  214. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_read_write_parquet.py +0 -0
  215. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_repr.py +0 -0
  216. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_rule_implementation.py +0 -0
  217. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_sample.py +0 -0
  218. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_serialization.py +0 -0
  219. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_storage.py +0 -0
  220. {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_validate.py +0 -0
  221. {dataframely-2.10.1 → dataframely-2.11.0}/tests/storage/test_delta.py +0 -0
  222. {dataframely-2.10.1 → dataframely-2.11.0}/tests/storage/test_fsspec.py +0 -0
  223. {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_compat.py +0 -0
  224. {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_config.py +0 -0
  225. {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_deprecation.py +0 -0
  226. {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_factory.py +0 -0
  227. {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_native_regex.py +0 -0
  228. {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_pydantic.py +0 -0
  229. {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_random.py +0 -0
  230. {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_serialization.py +0 -0
  231. {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_typing.py +0 -0
@@ -8,7 +8,7 @@
8
8
  #
9
9
  # If you want to run this as a one-off command, prefix with:
10
10
  # `pixi exec --spec copier --spec ruamel.yaml -- {command}`
11
- _commit: v0.5.2
11
+ _commit: v0.5.3
12
12
  _src_path: https://github.com/quantco/copier-template-python-open-source
13
13
  add_autobump_workflow: false
14
14
  author_email: oliver.borchert@quantco.com
@@ -13,11 +13,11 @@ jobs:
13
13
  permissions:
14
14
  contents: read
15
15
  steps:
16
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
16
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
17
17
  with:
18
18
  fetch-depth: 0
19
19
  - name: Set up pixi
20
- uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5
20
+ uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
21
21
  with:
22
22
  environments: build
23
23
  - name: Set version
@@ -48,11 +48,11 @@ jobs:
48
48
  - target-platform: win-64
49
49
  os: windows-latest
50
50
  steps:
51
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
51
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
52
52
  with:
53
53
  fetch-depth: 0
54
54
  - name: Set up pixi
55
- uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5
55
+ uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
56
56
  with:
57
57
  environments: build
58
58
  - name: Set version
@@ -54,6 +54,6 @@ jobs:
54
54
  pull-requests: write
55
55
  steps:
56
56
  - name: Assign labels
57
- uses: release-drafter/release-drafter/autolabeler@5de93583980a40bd78603b6dfdcda5b4df377b32 # v7.2.0
57
+ uses: release-drafter/release-drafter/autolabeler@ed4bc48ec97379be2258e7b7ac2624a3e26ab809 # v7.4.0
58
58
  with:
59
59
  token: ${{ github.token }}
@@ -19,12 +19,12 @@ jobs:
19
19
  runs-on: ubuntu-latest
20
20
  steps:
21
21
  - name: Checkout branch
22
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
22
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
23
23
  with:
24
24
  # needed for 'pre-commit-mirrors-insert-license'
25
25
  fetch-depth: 0
26
26
  - name: Set up pixi
27
- uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5
27
+ uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
28
28
  with:
29
29
  environments: default lint polars-minimal
30
30
  - name: Install Rust
@@ -63,9 +63,9 @@ jobs:
63
63
  with_optionals: false
64
64
  steps:
65
65
  - name: Checkout branch
66
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
66
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
67
67
  - name: Set up pixi
68
- uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5
68
+ uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
69
69
  with:
70
70
  environments: ${{ matrix.environment }}
71
71
  # FIXME: Remove when `s3_server` fixture does not start a process anymore
@@ -79,7 +79,7 @@ jobs:
79
79
  - name: Run pytest
80
80
  run: pixi run -e ${{ matrix.environment }} test-coverage --color=yes ${{ matrix.with_optionals && '-m with_optionals' || '-m "not with_optionals"'}} --cov=dataframely --cov-report=xml
81
81
  - name: Upload codecov
82
- uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
82
+ uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
83
83
  with:
84
84
  files: ./coverage.xml
85
85
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -13,9 +13,9 @@ jobs:
13
13
  id-token: write
14
14
  steps:
15
15
  - name: Checkout branch
16
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
16
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
17
17
  - name: Set up pixi
18
- uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5
18
+ uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
19
19
  with:
20
20
  environments: default
21
21
  - name: Install Rust
@@ -23,9 +23,9 @@ jobs:
23
23
  os: [ubuntu-latest, windows-latest]
24
24
  steps:
25
25
  - name: Checkout branch
26
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
26
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
27
27
  - name: Set up pixi
28
- uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5
28
+ uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
29
29
  with:
30
30
  environments: nightly
31
31
  - name: Install polars nightly
@@ -16,6 +16,6 @@ jobs:
16
16
  pull-requests: read
17
17
  steps:
18
18
  - name: Update release draft
19
- uses: release-drafter/release-drafter@5de93583980a40bd78603b6dfdcda5b4df377b32 # v7.2.0
19
+ uses: release-drafter/release-drafter@ed4bc48ec97379be2258e7b7ac2624a3e26ab809 # v7.4.0
20
20
  with:
21
21
  token: ${{ github.token }}
@@ -35,7 +35,7 @@ jobs:
35
35
 
36
36
  steps:
37
37
  - name: "Checkout code"
38
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
38
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
39
39
  with:
40
40
  persist-credentials: false
41
41
 
@@ -74,6 +74,6 @@ jobs:
74
74
  # Upload the results to GitHub's code scanning dashboard (optional).
75
75
  # Commenting out will disable upload of results to your repo's Code Scanning dashboard
76
76
  - name: "Upload to code-scanning"
77
- uses: github/codeql-action/upload-sarif@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4.35.4
77
+ uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
78
78
  with:
79
79
  sarif_file: results.sarif
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataframely
3
- Version: 2.10.1
3
+ Version: 2.11.0
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: 3.10
6
6
  Classifier: Programming Language :: Python :: 3.11
@@ -33,6 +33,8 @@ class Enum(Column):
33
33
  alias: str | None = None,
34
34
  metadata: dict[str, Any] | None = None,
35
35
  description: str | None = None,
36
+ sqlalchemy_use_enum: bool = False,
37
+ sqlalchemy_enum_name: str | None = None,
36
38
  ):
37
39
  """
38
40
  Args:
@@ -68,6 +70,15 @@ class Enum(Column):
68
70
  names, the specified alias is the only valid name.
69
71
  metadata: A dictionary of metadata to attach to the column.
70
72
  description: A human-readable description of the column.
73
+ sqlalchemy_use_enum: When ``True``, map this column to :class:`sqlalchemy.Enum`
74
+ in :meth:`~dataframely.Schema.to_sqlalchemy_columns` instead of
75
+ ``CHAR`` / ``VARCHAR``.
76
+ sqlalchemy_enum_name: Optional name for the SQLAlchemy / database enum type
77
+ when ``sqlalchemy_use_enum=True``. If omitted and ``categories`` is a
78
+ Python :class:`enum.Enum` subclass, the lowercased enum class is used.
79
+ Otherwise, the name of the column is used.
80
+ The persisted values are the enum members' ``.value`` strings (not
81
+ member names), matching :attr:`categories`.
71
82
  """
72
83
  super().__init__(
73
84
  nullable=nullable,
@@ -78,8 +89,26 @@ class Enum(Column):
78
89
  metadata=metadata,
79
90
  description=description,
80
91
  )
92
+ if sqlalchemy_enum_name and not sqlalchemy_use_enum:
93
+ raise ValueError(
94
+ "`sqlalchemy_enum_name` has no effect when `sqlalchemy_use_enum=False`."
95
+ )
96
+
97
+ self.sqlalchemy_use_enum = sqlalchemy_use_enum
98
+ self.sqlalchemy_enum_name = sqlalchemy_enum_name
81
99
  if isclass(categories) and issubclass(categories, enum.Enum):
100
+ # If the user passed an Enum type, we want to determine a default name
101
+ # based on the Enum class name, which is also what sqlalchemy does.
102
+ # One could instead keep a reference to the Enum class around and pass it
103
+ # to sqlalchemy later on, but that will interfere with the base-class implementations
104
+ # of `matches` and `to_dict` / `from_dict`.
105
+ if self.sqlalchemy_use_enum:
106
+ self.sqlalchemy_enum_name = (
107
+ self.sqlalchemy_enum_name or categories.__name__.lower()
108
+ )
109
+
82
110
  categories = (item.value for item in categories)
111
+
83
112
  self.categories = list(categories)
84
113
 
85
114
  @property
@@ -92,6 +121,10 @@ class Enum(Column):
92
121
  return self.categories == dtype.categories.to_list()
93
122
 
94
123
  def sqlalchemy_dtype(self, dialect: sa.Dialect) -> sa_TypeEngine:
124
+ if self.sqlalchemy_use_enum:
125
+ return sa.Enum(
126
+ *self.categories, name=self.sqlalchemy_enum_name or self._name
127
+ )
95
128
  category_lengths = [len(c) for c in self.categories]
96
129
  if all(length == category_lengths[0] for length in category_lengths):
97
130
  return sa.CHAR(category_lengths[0])
@@ -9,6 +9,8 @@ import re
9
9
 
10
10
  import polars as pl
11
11
 
12
+ from dataframely._compat import _polars_version_tuple
13
+
12
14
  _POLARS_DTYPE_MAP: dict[type[pl.DataType], str] = {
13
15
  pl.Boolean: "Bool",
14
16
  pl.Int8: "Int8",
@@ -147,9 +149,16 @@ def _get_dtype_args(dtype: pl.DataType, series: pl.Series) -> list[str]:
147
149
  return [repr(dtype.categories.to_list())]
148
150
 
149
151
  if isinstance(dtype, pl.List):
152
+ if _polars_version_tuple >= (1, 36, 0):
153
+ return [_dtype_to_column_code(series.explode(empty_as_null=False))]
150
154
  return [_dtype_to_column_code(series.explode())]
151
155
 
152
156
  if isinstance(dtype, pl.Array):
157
+ if _polars_version_tuple >= (1, 36, 0):
158
+ return [
159
+ _dtype_to_column_code(series.explode(empty_as_null=False)),
160
+ f"shape={dtype.size}",
161
+ ]
153
162
  return [_dtype_to_column_code(series.explode()), f"shape={dtype.size}"]
154
163
 
155
164
  if isinstance(dtype, pl.Struct):
@@ -81,6 +81,41 @@ the maximal length of the string is inferred from the regular expression if poss
81
81
  maximal lengths can be particularly important for primary key columns. Some database systems, such as Microsoft SQL Server, do not allow `VARCHAR(max)` columns (unbounded strings) to be used as primary keys.
82
82
  ```
83
83
 
84
+ ## Native SQL enums
85
+
86
+ By default, {class}`~dataframely.Enum` maps to `sa.CHAR` or `sa.String` columns so stored values remain plain strings. You may set `sqlalchemy_use_enum=True` to instead generate native enums:
87
+
88
+ ```python
89
+ from enum import Enum, auto
90
+
91
+ import sqlalchemy as sa
92
+ import dataframely as dy
93
+ from sqlalchemy.dialects.postgresql import dialect as pg_dialect
94
+ from sqlalchemy.dialects.mssql import dialect as mssql_dialect
95
+
96
+
97
+ class Status(str, Enum):
98
+ PENDING = auto()
99
+ APPROVED = auto()
100
+
101
+
102
+ class Staged(dy.Schema):
103
+ status = dy.Enum(Status, sqlalchemy_use_enum=True)
104
+ ```
105
+
106
+ This will translate the `~dataframely.Enum` to a `~sqlalchemy.Enum`:
107
+
108
+ ```python
109
+ >>> Staged.to_sqlalchemy_columns(pg_dialect())
110
+ [Column('status', Enum('1', '2', name='status'), table=None, nullable=False)]
111
+ ```
112
+
113
+ Depending on the database dialect you use, `sqlalchemy` will render this accordingly.
114
+ For example, `postgresql` supports native enums, and `sqlalchemy` will create a native enum column, while in MSSQL, where this is not supported, it will fall back to `VARCHAR`.
115
+
116
+ When `categories` is a Python `enum.Enum` subclass, `sqlalchemy` uses the enum class name (lowercased) as the database enum type name.
117
+ For string category lists, the SQL column name is used by default; override it with `sqlalchemy_enum_name` if needed.
118
+
84
119
  ## Collections of multiple tables
85
120
 
86
121
  If you have an entire `dy.Collection`, it's also easy to generate one table for each member table of the collection.