dataframely 2.5.1__tar.gz → 2.6.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 (216) hide show
  1. {dataframely-2.5.1 → dataframely-2.6.0}/.github/workflows/ci.yml +6 -1
  2. {dataframely-2.5.1 → dataframely-2.6.0}/.pre-commit-config.yaml +8 -1
  3. {dataframely-2.5.1 → dataframely-2.6.0}/PKG-INFO +2 -2
  4. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_compat.py +17 -2
  5. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/filter_result.py +7 -3
  6. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/schema.py +3 -4
  7. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/faq.md +9 -0
  8. {dataframely-2.5.1 → dataframely-2.6.0}/pixi.lock +4644 -957
  9. {dataframely-2.5.1 → dataframely-2.6.0}/pixi.toml +35 -8
  10. {dataframely-2.5.1 → dataframely-2.6.0}/pyproject.toml +2 -2
  11. {dataframely-2.5.1 → dataframely-2.6.0}/.copier-answers.yml +0 -0
  12. {dataframely-2.5.1 → dataframely-2.6.0}/.envrc +0 -0
  13. {dataframely-2.5.1 → dataframely-2.6.0}/.gitattributes +0 -0
  14. {dataframely-2.5.1 → dataframely-2.6.0}/.github/CODEOWNERS +0 -0
  15. {dataframely-2.5.1 → dataframely-2.6.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  16. {dataframely-2.5.1 → dataframely-2.6.0}/.github/copilot-instructions.md +0 -0
  17. {dataframely-2.5.1 → dataframely-2.6.0}/.github/dependabot.yml +0 -0
  18. {dataframely-2.5.1 → dataframely-2.6.0}/.github/instructions/tests.instructions.md +0 -0
  19. {dataframely-2.5.1 → dataframely-2.6.0}/.github/release-drafter.yml +0 -0
  20. {dataframely-2.5.1 → dataframely-2.6.0}/.github/workflows/build.yml +0 -0
  21. {dataframely-2.5.1 → dataframely-2.6.0}/.github/workflows/chore.yml +0 -0
  22. {dataframely-2.5.1 → dataframely-2.6.0}/.github/workflows/copilot-setup-steps.yml +0 -0
  23. {dataframely-2.5.1 → dataframely-2.6.0}/.github/workflows/nightly.yml +0 -0
  24. {dataframely-2.5.1 → dataframely-2.6.0}/.github/workflows/scorecard.yml +0 -0
  25. {dataframely-2.5.1 → dataframely-2.6.0}/.gitignore +0 -0
  26. {dataframely-2.5.1 → dataframely-2.6.0}/.prettierignore +0 -0
  27. {dataframely-2.5.1 → dataframely-2.6.0}/.prettierrc +0 -0
  28. {dataframely-2.5.1 → dataframely-2.6.0}/.readthedocs.yml +0 -0
  29. {dataframely-2.5.1 → dataframely-2.6.0}/Cargo.lock +0 -0
  30. {dataframely-2.5.1 → dataframely-2.6.0}/Cargo.toml +0 -0
  31. {dataframely-2.5.1 → dataframely-2.6.0}/LICENSE +0 -0
  32. {dataframely-2.5.1 → dataframely-2.6.0}/README.md +0 -0
  33. {dataframely-2.5.1 → dataframely-2.6.0}/SECURITY.md +0 -0
  34. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/__init__.py +0 -0
  35. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_base_schema.py +0 -0
  36. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_deprecation.py +0 -0
  37. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_filter.py +0 -0
  38. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_match_to_schema.py +0 -0
  39. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_native.pyi +0 -0
  40. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_plugin.py +0 -0
  41. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_polars.py +0 -0
  42. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_pydantic.py +0 -0
  43. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_rule.py +0 -0
  44. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_serialization.py +0 -0
  45. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_storage/__init__.py +0 -0
  46. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_storage/_base.py +0 -0
  47. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_storage/_exc.py +0 -0
  48. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_storage/constants.py +0 -0
  49. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_storage/delta.py +0 -0
  50. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_storage/parquet.py +0 -0
  51. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/_typing.py +0 -0
  52. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/collection/__init__.py +0 -0
  53. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/collection/_base.py +0 -0
  54. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/collection/collection.py +0 -0
  55. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/collection/filter_result.py +0 -0
  56. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/__init__.py +0 -0
  57. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/_base.py +0 -0
  58. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/_mixins.py +0 -0
  59. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/_registry.py +0 -0
  60. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/_utils.py +0 -0
  61. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/any.py +0 -0
  62. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/array.py +0 -0
  63. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/binary.py +0 -0
  64. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/bool.py +0 -0
  65. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/categorical.py +0 -0
  66. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/datetime.py +0 -0
  67. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/decimal.py +0 -0
  68. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/enum.py +0 -0
  69. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/float.py +0 -0
  70. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/integer.py +0 -0
  71. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/list.py +0 -0
  72. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/object.py +0 -0
  73. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/string.py +0 -0
  74. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/columns/struct.py +0 -0
  75. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/config.py +0 -0
  76. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/exc.py +0 -0
  77. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/functional.py +0 -0
  78. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/py.typed +0 -0
  79. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/random.py +0 -0
  80. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/testing/__init__.py +0 -0
  81. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/testing/const.py +0 -0
  82. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/testing/factory.py +0 -0
  83. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/testing/mask.py +0 -0
  84. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/testing/rules.py +0 -0
  85. {dataframely-2.5.1 → dataframely-2.6.0}/dataframely/testing/storage.py +0 -0
  86. {dataframely-2.5.1 → dataframely-2.6.0}/docker-compose.yml +0 -0
  87. {dataframely-2.5.1 → dataframely-2.6.0}/docs/_static/custom.css +0 -0
  88. {dataframely-2.5.1 → dataframely-2.6.0}/docs/_static/favicon.ico +0 -0
  89. {dataframely-2.5.1 → dataframely-2.6.0}/docs/_templates/autosummary/class.rst +0 -0
  90. {dataframely-2.5.1 → dataframely-2.6.0}/docs/_templates/autosummary/method.rst +0 -0
  91. {dataframely-2.5.1 → dataframely-2.6.0}/docs/_templates/classes/column.rst +0 -0
  92. {dataframely-2.5.1 → dataframely-2.6.0}/docs/_templates/classes/error.rst +0 -0
  93. {dataframely-2.5.1 → dataframely-2.6.0}/docs/_templates/classes/filter_result.rst +0 -0
  94. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/collection/generation.rst +0 -0
  95. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/collection/index.rst +0 -0
  96. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/collection/io.rst +0 -0
  97. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/collection/metadata.rst +0 -0
  98. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/collection/operations.rst +0 -0
  99. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/collection/validation.rst +0 -0
  100. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/columns/index.rst +0 -0
  101. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/errors/index.rst +0 -0
  102. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/filter_result/failure_info.rst +0 -0
  103. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/filter_result/index.rst +0 -0
  104. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/index.rst +0 -0
  105. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/misc/index.rst +0 -0
  106. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/schema/conversion.rst +0 -0
  107. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/schema/generation.rst +0 -0
  108. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/schema/index.rst +0 -0
  109. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/schema/io.rst +0 -0
  110. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/schema/metadata.rst +0 -0
  111. {dataframely-2.5.1 → dataframely-2.6.0}/docs/api/schema/validation.rst +0 -0
  112. {dataframely-2.5.1 → dataframely-2.6.0}/docs/conf.py +0 -0
  113. {dataframely-2.5.1 → dataframely-2.6.0}/docs/css/custom.css +0 -0
  114. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/development.md +0 -0
  115. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/examples/index.md +0 -0
  116. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/examples/real-world.ipynb +0 -0
  117. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/features/column-metadata.md +0 -0
  118. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/features/data-generation.md +0 -0
  119. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/features/index.md +0 -0
  120. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/features/lazy-validation.md +0 -0
  121. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/features/primary-keys.md +0 -0
  122. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/features/serialization.md +0 -0
  123. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/features/sql-generation.md +0 -0
  124. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/index.md +0 -0
  125. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/migration/index.md +0 -0
  126. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/migration/v1-v2.md +0 -0
  127. {dataframely-2.5.1 → dataframely-2.6.0}/docs/guides/quickstart.md +0 -0
  128. {dataframely-2.5.1 → dataframely-2.6.0}/docs/index.md +0 -0
  129. {dataframely-2.5.1 → dataframely-2.6.0}/rust-toolchain.toml +0 -0
  130. {dataframely-2.5.1 → dataframely-2.6.0}/src/lib.rs +0 -0
  131. {dataframely-2.5.1 → dataframely-2.6.0}/src/polars_plugin/mod.rs +0 -0
  132. {dataframely-2.5.1 → dataframely-2.6.0}/src/polars_plugin/rule_failure.rs +0 -0
  133. {dataframely-2.5.1 → dataframely-2.6.0}/src/polars_plugin/utils.rs +0 -0
  134. {dataframely-2.5.1 → dataframely-2.6.0}/src/polars_plugin/validation_error.rs +0 -0
  135. {dataframely-2.5.1 → dataframely-2.6.0}/src/regex/errdefs.rs +0 -0
  136. {dataframely-2.5.1 → dataframely-2.6.0}/src/regex/mod.rs +0 -0
  137. {dataframely-2.5.1 → dataframely-2.6.0}/src/regex/repr.rs +0 -0
  138. {dataframely-2.5.1 → dataframely-2.6.0}/tests/benches/conftest.py +0 -0
  139. {dataframely-2.5.1 → dataframely-2.6.0}/tests/benches/test_collection.py +0 -0
  140. {dataframely-2.5.1 → dataframely-2.6.0}/tests/benches/test_failure.py +0 -0
  141. {dataframely-2.5.1 → dataframely-2.6.0}/tests/benches/test_schema.py +0 -0
  142. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_base.py +0 -0
  143. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_cast.py +0 -0
  144. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_collection_future_annotations.py +0 -0
  145. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_create_empty.py +0 -0
  146. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_filter_one_to_n.py +0 -0
  147. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_filter_validate.py +0 -0
  148. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_ignore_in_filter.py +0 -0
  149. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_implementation.py +0 -0
  150. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_join.py +0 -0
  151. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_matches.py +0 -0
  152. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_optional_members.py +0 -0
  153. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_propagate_row_failures.py +0 -0
  154. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_repr.py +0 -0
  155. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_sample.py +0 -0
  156. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_serialization.py +0 -0
  157. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_storage.py +0 -0
  158. {dataframely-2.5.1 → dataframely-2.6.0}/tests/collection/test_validate_input.py +0 -0
  159. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/__init__.py +0 -0
  160. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/test_any.py +0 -0
  161. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/test_array.py +0 -0
  162. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/test_binary.py +0 -0
  163. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/test_datetime.py +0 -0
  164. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/test_decimal.py +0 -0
  165. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/test_enum.py +0 -0
  166. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/test_float.py +0 -0
  167. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/test_integer.py +0 -0
  168. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/test_list.py +0 -0
  169. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/test_object.py +0 -0
  170. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/test_string.py +0 -0
  171. {dataframely-2.5.1 → dataframely-2.6.0}/tests/column_types/test_struct.py +0 -0
  172. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/__init__.py +0 -0
  173. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_alias.py +0 -0
  174. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_base.py +0 -0
  175. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_check.py +0 -0
  176. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_default_dtypes.py +0 -0
  177. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_matches.py +0 -0
  178. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_metadata.py +0 -0
  179. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_polars_schema.py +0 -0
  180. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_pyarrow.py +0 -0
  181. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_rules.py +0 -0
  182. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_sample.py +0 -0
  183. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_sqlalchemy_columns.py +0 -0
  184. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_str.py +0 -0
  185. {dataframely-2.5.1 → dataframely-2.6.0}/tests/columns/test_utils.py +0 -0
  186. {dataframely-2.5.1 → dataframely-2.6.0}/tests/conftest.py +0 -0
  187. {dataframely-2.5.1 → dataframely-2.6.0}/tests/core_validation/__init__.py +0 -0
  188. {dataframely-2.5.1 → dataframely-2.6.0}/tests/core_validation/test_match_to_schema.py +0 -0
  189. {dataframely-2.5.1 → dataframely-2.6.0}/tests/core_validation/test_rule_evaluation.py +0 -0
  190. {dataframely-2.5.1 → dataframely-2.6.0}/tests/failure_info/test_storage.py +0 -0
  191. {dataframely-2.5.1 → dataframely-2.6.0}/tests/functional/test_concat.py +0 -0
  192. {dataframely-2.5.1 → dataframely-2.6.0}/tests/functional/test_relationships.py +0 -0
  193. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_base.py +0 -0
  194. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_cast.py +0 -0
  195. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_create_empty.py +0 -0
  196. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_create_empty_if_none.py +0 -0
  197. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_filter.py +0 -0
  198. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_inheritance.py +0 -0
  199. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_matches.py +0 -0
  200. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_read_write_parquet.py +0 -0
  201. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_repr.py +0 -0
  202. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_rule_implementation.py +0 -0
  203. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_sample.py +0 -0
  204. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_serialization.py +0 -0
  205. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_storage.py +0 -0
  206. {dataframely-2.5.1 → dataframely-2.6.0}/tests/schema/test_validate.py +0 -0
  207. {dataframely-2.5.1 → dataframely-2.6.0}/tests/storage/test_delta.py +0 -0
  208. {dataframely-2.5.1 → dataframely-2.6.0}/tests/test_compat.py +0 -0
  209. {dataframely-2.5.1 → dataframely-2.6.0}/tests/test_config.py +0 -0
  210. {dataframely-2.5.1 → dataframely-2.6.0}/tests/test_deprecation.py +0 -0
  211. {dataframely-2.5.1 → dataframely-2.6.0}/tests/test_factory.py +0 -0
  212. {dataframely-2.5.1 → dataframely-2.6.0}/tests/test_native_regex.py +0 -0
  213. {dataframely-2.5.1 → dataframely-2.6.0}/tests/test_pydantic.py +0 -0
  214. {dataframely-2.5.1 → dataframely-2.6.0}/tests/test_random.py +0 -0
  215. {dataframely-2.5.1 → dataframely-2.6.0}/tests/test_serialization.py +0 -0
  216. {dataframely-2.5.1 → dataframely-2.6.0}/tests/test_typing.py +0 -0
@@ -26,7 +26,7 @@ jobs:
26
26
  - name: Set up pixi
27
27
  uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3
28
28
  with:
29
- environments: default lint
29
+ environments: default lint polars-minimal
30
30
  - name: Install Rust
31
31
  run: rustup show
32
32
  - name: Cache Rust dependencies
@@ -45,6 +45,7 @@ jobs:
45
45
  environment: [py310, py311, py312, py313, py314]
46
46
  with_optionals: [false]
47
47
  include:
48
+ # Test with optional dependencies across OSes
48
49
  - os: ubuntu-latest
49
50
  environment: py314-optionals
50
51
  with_optionals: true
@@ -54,6 +55,10 @@ jobs:
54
55
  - os: macos-latest
55
56
  environment: py314-optionals
56
57
  with_optionals: true
58
+ # Test polars backward compatibility, only one OS
59
+ - os: ubuntu-latest
60
+ environment: polars-minimal
61
+ with_optionals: false
57
62
  steps:
58
63
  - name: Checkout branch
59
64
  uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
@@ -6,7 +6,7 @@ repos:
6
6
  # workaround for https://github.com/prefix-dev/pixi/issues/1482
7
7
  - id: pixi-install
8
8
  name: pixi-install
9
- entry: pixi install -e default -e lint
9
+ entry: pixi install -e default -e lint -e polars-minimal
10
10
  language: system
11
11
  always_run: true
12
12
  require_serial: true
@@ -48,6 +48,13 @@ repos:
48
48
  language: system
49
49
  types: [python]
50
50
  require_serial: true
51
+ # mypy with oldest supported polars version
52
+ - id: mypy
53
+ name: mypy-polars-minimal
54
+ entry: pixi run -e default-polars-minimal mypy --cache-dir .mypy_cache_polars_minimal
55
+ language: system
56
+ types: [python]
57
+ require_serial: true
51
58
  # cargo-fmt
52
59
  - id: cargo-fmt
53
60
  name: cargo-fmt
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataframely
3
- Version: 2.5.1
3
+ Version: 2.6.0
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: 3.10
6
6
  Classifier: Programming Language :: Python :: 3.11
@@ -9,7 +9,7 @@ Classifier: Programming Language :: Python :: 3.13
9
9
  Classifier: Programming Language :: Python :: 3.14
10
10
  Requires-Dist: fsspec>=2025.9
11
11
  Requires-Dist: numpy
12
- Requires-Dist: polars>=1.36
12
+ Requires-Dist: polars>=1.35
13
13
  Requires-Dist: typing-extensions ; python_full_version < '3.11'
14
14
  Requires-Dist: deltalake ; extra == 'deltalake'
15
15
  Requires-Dist: pyarrow ; extra == 'pyarrow'
@@ -1,9 +1,10 @@
1
1
  # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
-
5
4
  from typing import Any
6
5
 
6
+ import polars as pl
7
+
7
8
 
8
9
  class _DummyModule: # pragma: no cover
9
10
  def __init__(self, module: str) -> None:
@@ -58,7 +59,6 @@ try:
58
59
  except ImportError:
59
60
  pa = _DummyModule("pyarrow")
60
61
 
61
-
62
62
  # -------------------------------------- PYDANTIC ------------------------------------ #
63
63
 
64
64
  try:
@@ -71,6 +71,20 @@ try:
71
71
  except ImportError:
72
72
  pydantic_core_schema = _DummyModule("pydantic_core_schema") # type: ignore
73
73
 
74
+ # --------------------------------------- POLARS ------------------------------------- #
75
+
76
+ _polars_version_tuple = tuple(
77
+ int(part) if part.isdigit() else part for part in pl.__version__.split(".")
78
+ )
79
+ if _polars_version_tuple < (1, 36):
80
+ from polars._typing import ( # type: ignore[attr-defined,unused-ignore]
81
+ PartitioningScheme as PartitionSchemeOrSinkDirectory,
82
+ )
83
+ else:
84
+ from polars.io.partition import ( # type: ignore[no-redef,attr-defined,unused-ignore]
85
+ _SinkDirectory as PartitionSchemeOrSinkDirectory,
86
+ )
87
+
74
88
  # ------------------------------------------------------------------------------------ #
75
89
 
76
90
  __all__ = [
@@ -78,6 +92,7 @@ __all__ = [
78
92
  "DeltaTable",
79
93
  "Dialect",
80
94
  "MSDialect_pyodbc",
95
+ "PartitionSchemeOrSinkDirectory",
81
96
  "pa",
82
97
  "PGDialect_psycopg2",
83
98
  "pydantic_core_schema",
@@ -10,11 +10,11 @@ from pathlib import Path
10
10
  from typing import IO, TYPE_CHECKING, Any, Generic, TypeVar
11
11
 
12
12
  import polars as pl
13
- from polars.io.partition import _SinkDirectory as SinkDirectory
14
13
 
15
14
  from dataframely._base_schema import BaseSchema
16
15
  from dataframely._compat import deltalake
17
16
 
17
+ from ._compat import PartitionSchemeOrSinkDirectory
18
18
  from ._storage import StorageBackend
19
19
  from ._storage.delta import DeltaStorageBackend
20
20
  from ._storage.parquet import ParquetStorageBackend
@@ -32,6 +32,7 @@ UNKNOWN_SCHEMA_NAME = "__DATAFRAMELY_UNKNOWN__"
32
32
 
33
33
  S = TypeVar("S", bound=BaseSchema)
34
34
 
35
+
35
36
  # ----------------------------------- FILTER RESULT ---------------------------------- #
36
37
 
37
38
 
@@ -73,7 +74,8 @@ class LazyFilterResult(NamedTuple, Generic[S]):
73
74
  [self.result.lazy(), self.failure._lf], **kwargs
74
75
  )
75
76
  return FilterResult(
76
- result=result_df, # type: ignore
77
+ # Whether the type ignore is necessary depends on the polars version.
78
+ result=result_df, # type: ignore[arg-type,unused-ignore]
77
79
  failure=FailureInfo(
78
80
  failure_df.lazy(), self.failure._rule_columns, self.failure.schema
79
81
  ),
@@ -164,7 +166,9 @@ class FailureInfo(Generic[S]):
164
166
  self._write(ParquetStorageBackend(), file=file, **kwargs)
165
167
 
166
168
  def sink_parquet(
167
- self, file: str | Path | IO[bytes] | SinkDirectory, **kwargs: Any
169
+ self,
170
+ file: str | Path | IO[bytes] | PartitionSchemeOrSinkDirectory,
171
+ **kwargs: Any,
168
172
  ) -> None:
169
173
  """Stream the failure info to a single parquet file.
170
174
 
@@ -15,12 +15,11 @@ from typing import IO, Any, Literal, overload
15
15
  import polars as pl
16
16
  import polars.exceptions as plexc
17
17
  from polars._typing import FileSource
18
- from polars.io.partition import _SinkDirectory as SinkDirectory
19
18
 
20
19
  from dataframely._compat import deltalake
21
20
 
22
21
  from ._base_schema import ORIGINAL_COLUMN_PREFIX, BaseSchema
23
- from ._compat import pa, sa
22
+ from ._compat import PartitionSchemeOrSinkDirectory, pa, sa
24
23
  from ._match_to_schema import match_to_schema
25
24
  from ._native import format_rule_failures
26
25
  from ._plugin import all_rules, all_rules_horizontal, all_rules_required
@@ -55,9 +54,9 @@ if sys.version_info >= (3, 11):
55
54
  else:
56
55
  from typing_extensions import Self
57
56
 
58
-
59
57
  _COLUMN_VALID = "__DATAFRAMELY_VALID__"
60
58
 
59
+
61
60
  # ------------------------------------------------------------------------------------ #
62
61
  # SCHEMA DEFINITION #
63
62
  # ------------------------------------------------------------------------------------ #
@@ -901,7 +900,7 @@ class Schema(BaseSchema, ABC):
901
900
  cls,
902
901
  lf: LazyFrame[Self],
903
902
  /,
904
- file: str | Path | IO[bytes] | SinkDirectory,
903
+ file: str | Path | IO[bytes] | PartitionSchemeOrSinkDirectory,
905
904
  **kwargs: Any,
906
905
  ) -> None:
907
906
  """Stream a typed lazy frame with this schema to a parquet file.
@@ -33,3 +33,12 @@ class UserSchema(dy.Schema):
33
33
  ## How do I fix the ruff error `First argument of a method should be named self`?
34
34
 
35
35
  See our documentation on [group rules](./quickstart.md#group-rules).
36
+
37
+ ## What versions of `polars` does `dataframely` support?
38
+
39
+ Our CI automatically tests `dataframely` for a minimal supported version of `polars`, which is currently `1.35.*`,
40
+ and the latest stable version.
41
+ We aim to extend support for new `polars` versions as they are released.
42
+
43
+ If your `polars` version is not in the range of supported versions, `dataframely` may still work, but you may
44
+ encounter unexpected issues.