dataframely 2.5.0__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.0 → dataframely-2.6.0}/.github/workflows/ci.yml +6 -1
  2. {dataframely-2.5.0 → dataframely-2.6.0}/.pre-commit-config.yaml +8 -1
  3. {dataframely-2.5.0 → dataframely-2.6.0}/PKG-INFO +2 -2
  4. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/__init__.py +1 -1
  5. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_base_schema.py +1 -1
  6. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_compat.py +17 -2
  7. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_deprecation.py +1 -1
  8. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_filter.py +1 -1
  9. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_match_to_schema.py +1 -1
  10. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_plugin.py +1 -1
  11. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_polars.py +1 -1
  12. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_pydantic.py +1 -1
  13. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_rule.py +1 -1
  14. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_serialization.py +1 -1
  15. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_storage/__init__.py +1 -1
  16. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_storage/_base.py +1 -1
  17. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_storage/_exc.py +1 -1
  18. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_storage/constants.py +1 -1
  19. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_storage/delta.py +1 -1
  20. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_storage/parquet.py +1 -1
  21. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_typing.py +1 -1
  22. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/collection/__init__.py +1 -1
  23. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/collection/_base.py +6 -2
  24. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/collection/collection.py +1 -1
  25. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/collection/filter_result.py +1 -1
  26. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/__init__.py +1 -1
  27. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/_base.py +1 -1
  28. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/_mixins.py +1 -1
  29. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/_registry.py +1 -1
  30. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/_utils.py +1 -1
  31. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/any.py +1 -1
  32. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/bool.py +1 -1
  33. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/categorical.py +1 -1
  34. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/datetime.py +1 -1
  35. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/decimal.py +1 -1
  36. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/enum.py +1 -1
  37. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/float.py +1 -1
  38. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/integer.py +1 -1
  39. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/object.py +1 -1
  40. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/string.py +1 -1
  41. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/config.py +1 -1
  42. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/exc.py +1 -1
  43. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/filter_result.py +8 -4
  44. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/functional.py +1 -1
  45. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/random.py +1 -1
  46. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/schema.py +4 -5
  47. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/testing/__init__.py +1 -1
  48. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/testing/const.py +1 -1
  49. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/testing/factory.py +1 -1
  50. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/testing/mask.py +1 -1
  51. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/testing/rules.py +1 -1
  52. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/testing/storage.py +1 -1
  53. {dataframely-2.5.0 → dataframely-2.6.0}/docs/conf.py +1 -1
  54. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/faq.md +9 -0
  55. {dataframely-2.5.0 → dataframely-2.6.0}/pixi.lock +4644 -957
  56. {dataframely-2.5.0 → dataframely-2.6.0}/pixi.toml +35 -8
  57. {dataframely-2.5.0 → dataframely-2.6.0}/pyproject.toml +2 -2
  58. {dataframely-2.5.0 → dataframely-2.6.0}/tests/benches/conftest.py +1 -1
  59. {dataframely-2.5.0 → dataframely-2.6.0}/tests/benches/test_collection.py +1 -1
  60. {dataframely-2.5.0 → dataframely-2.6.0}/tests/benches/test_failure.py +1 -1
  61. {dataframely-2.5.0 → dataframely-2.6.0}/tests/benches/test_schema.py +1 -1
  62. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_base.py +37 -1
  63. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_cast.py +1 -1
  64. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_collection_future_annotations.py +1 -1
  65. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_create_empty.py +1 -1
  66. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_filter_one_to_n.py +1 -1
  67. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_filter_validate.py +1 -1
  68. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_ignore_in_filter.py +1 -1
  69. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_implementation.py +1 -1
  70. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_join.py +1 -1
  71. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_matches.py +1 -1
  72. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_optional_members.py +1 -1
  73. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_propagate_row_failures.py +1 -1
  74. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_repr.py +1 -1
  75. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_sample.py +1 -1
  76. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_serialization.py +1 -1
  77. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_storage.py +1 -1
  78. {dataframely-2.5.0 → dataframely-2.6.0}/tests/collection/test_validate_input.py +1 -1
  79. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/__init__.py +1 -1
  80. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/test_any.py +1 -1
  81. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/test_array.py +1 -1
  82. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/test_binary.py +1 -1
  83. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/test_datetime.py +1 -1
  84. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/test_decimal.py +1 -1
  85. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/test_enum.py +1 -1
  86. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/test_float.py +1 -1
  87. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/test_integer.py +1 -1
  88. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/test_list.py +1 -1
  89. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/test_object.py +1 -1
  90. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/test_string.py +1 -1
  91. {dataframely-2.5.0 → dataframely-2.6.0}/tests/column_types/test_struct.py +1 -1
  92. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/__init__.py +1 -1
  93. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_alias.py +1 -1
  94. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_base.py +1 -1
  95. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_check.py +1 -1
  96. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_default_dtypes.py +1 -1
  97. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_matches.py +1 -1
  98. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_metadata.py +1 -1
  99. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_polars_schema.py +1 -1
  100. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_pyarrow.py +1 -1
  101. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_rules.py +1 -1
  102. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_sample.py +1 -1
  103. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_str.py +1 -1
  104. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_utils.py +1 -1
  105. {dataframely-2.5.0 → dataframely-2.6.0}/tests/conftest.py +1 -1
  106. {dataframely-2.5.0 → dataframely-2.6.0}/tests/core_validation/__init__.py +1 -1
  107. {dataframely-2.5.0 → dataframely-2.6.0}/tests/core_validation/test_match_to_schema.py +1 -1
  108. {dataframely-2.5.0 → dataframely-2.6.0}/tests/core_validation/test_rule_evaluation.py +1 -1
  109. {dataframely-2.5.0 → dataframely-2.6.0}/tests/failure_info/test_storage.py +1 -1
  110. {dataframely-2.5.0 → dataframely-2.6.0}/tests/functional/test_concat.py +1 -1
  111. {dataframely-2.5.0 → dataframely-2.6.0}/tests/functional/test_relationships.py +1 -1
  112. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_base.py +1 -1
  113. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_cast.py +1 -1
  114. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_create_empty.py +1 -1
  115. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_create_empty_if_none.py +1 -1
  116. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_filter.py +1 -1
  117. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_inheritance.py +1 -1
  118. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_matches.py +1 -1
  119. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_read_write_parquet.py +1 -1
  120. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_repr.py +1 -1
  121. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_rule_implementation.py +1 -1
  122. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_sample.py +1 -1
  123. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_serialization.py +1 -1
  124. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_storage.py +1 -1
  125. {dataframely-2.5.0 → dataframely-2.6.0}/tests/schema/test_validate.py +1 -1
  126. {dataframely-2.5.0 → dataframely-2.6.0}/tests/storage/test_delta.py +1 -1
  127. {dataframely-2.5.0 → dataframely-2.6.0}/tests/test_compat.py +1 -1
  128. {dataframely-2.5.0 → dataframely-2.6.0}/tests/test_config.py +1 -1
  129. {dataframely-2.5.0 → dataframely-2.6.0}/tests/test_deprecation.py +1 -1
  130. {dataframely-2.5.0 → dataframely-2.6.0}/tests/test_factory.py +1 -1
  131. {dataframely-2.5.0 → dataframely-2.6.0}/tests/test_native_regex.py +1 -1
  132. {dataframely-2.5.0 → dataframely-2.6.0}/tests/test_pydantic.py +1 -1
  133. {dataframely-2.5.0 → dataframely-2.6.0}/tests/test_random.py +1 -1
  134. {dataframely-2.5.0 → dataframely-2.6.0}/tests/test_serialization.py +1 -1
  135. {dataframely-2.5.0 → dataframely-2.6.0}/tests/test_typing.py +1 -1
  136. {dataframely-2.5.0 → dataframely-2.6.0}/.copier-answers.yml +0 -0
  137. {dataframely-2.5.0 → dataframely-2.6.0}/.envrc +0 -0
  138. {dataframely-2.5.0 → dataframely-2.6.0}/.gitattributes +0 -0
  139. {dataframely-2.5.0 → dataframely-2.6.0}/.github/CODEOWNERS +0 -0
  140. {dataframely-2.5.0 → dataframely-2.6.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  141. {dataframely-2.5.0 → dataframely-2.6.0}/.github/copilot-instructions.md +0 -0
  142. {dataframely-2.5.0 → dataframely-2.6.0}/.github/dependabot.yml +0 -0
  143. {dataframely-2.5.0 → dataframely-2.6.0}/.github/instructions/tests.instructions.md +0 -0
  144. {dataframely-2.5.0 → dataframely-2.6.0}/.github/release-drafter.yml +0 -0
  145. {dataframely-2.5.0 → dataframely-2.6.0}/.github/workflows/build.yml +0 -0
  146. {dataframely-2.5.0 → dataframely-2.6.0}/.github/workflows/chore.yml +0 -0
  147. {dataframely-2.5.0 → dataframely-2.6.0}/.github/workflows/copilot-setup-steps.yml +0 -0
  148. {dataframely-2.5.0 → dataframely-2.6.0}/.github/workflows/nightly.yml +0 -0
  149. {dataframely-2.5.0 → dataframely-2.6.0}/.github/workflows/scorecard.yml +0 -0
  150. {dataframely-2.5.0 → dataframely-2.6.0}/.gitignore +0 -0
  151. {dataframely-2.5.0 → dataframely-2.6.0}/.prettierignore +0 -0
  152. {dataframely-2.5.0 → dataframely-2.6.0}/.prettierrc +0 -0
  153. {dataframely-2.5.0 → dataframely-2.6.0}/.readthedocs.yml +0 -0
  154. {dataframely-2.5.0 → dataframely-2.6.0}/Cargo.lock +0 -0
  155. {dataframely-2.5.0 → dataframely-2.6.0}/Cargo.toml +0 -0
  156. {dataframely-2.5.0 → dataframely-2.6.0}/LICENSE +0 -0
  157. {dataframely-2.5.0 → dataframely-2.6.0}/README.md +0 -0
  158. {dataframely-2.5.0 → dataframely-2.6.0}/SECURITY.md +0 -0
  159. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/_native.pyi +0 -0
  160. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/array.py +0 -0
  161. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/binary.py +0 -0
  162. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/list.py +0 -0
  163. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/columns/struct.py +0 -0
  164. {dataframely-2.5.0 → dataframely-2.6.0}/dataframely/py.typed +0 -0
  165. {dataframely-2.5.0 → dataframely-2.6.0}/docker-compose.yml +0 -0
  166. {dataframely-2.5.0 → dataframely-2.6.0}/docs/_static/custom.css +0 -0
  167. {dataframely-2.5.0 → dataframely-2.6.0}/docs/_static/favicon.ico +0 -0
  168. {dataframely-2.5.0 → dataframely-2.6.0}/docs/_templates/autosummary/class.rst +0 -0
  169. {dataframely-2.5.0 → dataframely-2.6.0}/docs/_templates/autosummary/method.rst +0 -0
  170. {dataframely-2.5.0 → dataframely-2.6.0}/docs/_templates/classes/column.rst +0 -0
  171. {dataframely-2.5.0 → dataframely-2.6.0}/docs/_templates/classes/error.rst +0 -0
  172. {dataframely-2.5.0 → dataframely-2.6.0}/docs/_templates/classes/filter_result.rst +0 -0
  173. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/collection/generation.rst +0 -0
  174. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/collection/index.rst +0 -0
  175. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/collection/io.rst +0 -0
  176. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/collection/metadata.rst +0 -0
  177. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/collection/operations.rst +0 -0
  178. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/collection/validation.rst +0 -0
  179. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/columns/index.rst +0 -0
  180. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/errors/index.rst +0 -0
  181. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/filter_result/failure_info.rst +0 -0
  182. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/filter_result/index.rst +0 -0
  183. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/index.rst +0 -0
  184. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/misc/index.rst +0 -0
  185. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/schema/conversion.rst +0 -0
  186. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/schema/generation.rst +0 -0
  187. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/schema/index.rst +0 -0
  188. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/schema/io.rst +0 -0
  189. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/schema/metadata.rst +0 -0
  190. {dataframely-2.5.0 → dataframely-2.6.0}/docs/api/schema/validation.rst +0 -0
  191. {dataframely-2.5.0 → dataframely-2.6.0}/docs/css/custom.css +0 -0
  192. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/development.md +0 -0
  193. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/examples/index.md +0 -0
  194. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/examples/real-world.ipynb +0 -0
  195. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/features/column-metadata.md +0 -0
  196. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/features/data-generation.md +0 -0
  197. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/features/index.md +0 -0
  198. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/features/lazy-validation.md +0 -0
  199. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/features/primary-keys.md +0 -0
  200. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/features/serialization.md +0 -0
  201. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/features/sql-generation.md +0 -0
  202. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/index.md +0 -0
  203. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/migration/index.md +0 -0
  204. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/migration/v1-v2.md +0 -0
  205. {dataframely-2.5.0 → dataframely-2.6.0}/docs/guides/quickstart.md +0 -0
  206. {dataframely-2.5.0 → dataframely-2.6.0}/docs/index.md +0 -0
  207. {dataframely-2.5.0 → dataframely-2.6.0}/rust-toolchain.toml +0 -0
  208. {dataframely-2.5.0 → dataframely-2.6.0}/src/lib.rs +0 -0
  209. {dataframely-2.5.0 → dataframely-2.6.0}/src/polars_plugin/mod.rs +0 -0
  210. {dataframely-2.5.0 → dataframely-2.6.0}/src/polars_plugin/rule_failure.rs +0 -0
  211. {dataframely-2.5.0 → dataframely-2.6.0}/src/polars_plugin/utils.rs +0 -0
  212. {dataframely-2.5.0 → dataframely-2.6.0}/src/polars_plugin/validation_error.rs +0 -0
  213. {dataframely-2.5.0 → dataframely-2.6.0}/src/regex/errdefs.rs +0 -0
  214. {dataframely-2.5.0 → dataframely-2.6.0}/src/regex/mod.rs +0 -0
  215. {dataframely-2.5.0 → dataframely-2.6.0}/src/regex/repr.rs +0 -0
  216. {dataframely-2.5.0 → dataframely-2.6.0}/tests/columns/test_sqlalchemy_columns.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.0
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,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  import importlib.metadata
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -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",
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  import os
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from collections.abc import Callable
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from typing import Literal
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from collections.abc import Iterable
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  import datetime as dt
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
  from __future__ import annotations
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  import base64
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from ._base import StorageBackend
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from abc import ABC, abstractmethod
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  SCHEMA_METADATA_KEY = "dataframely_schema"
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
  from __future__ import annotations
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from collections.abc import Iterable
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from ._base import BaseCollection
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -202,7 +202,11 @@ class CollectionMeta(ABCMeta):
202
202
  annotations = source["__annotations__"]
203
203
  elif sys.version_info >= (3, 14):
204
204
  if "__annotate_func__" in source:
205
- annotations = source["__annotate_func__"](Format.VALUE)
205
+ annotate_func = source["__annotate_func__"]
206
+ # __annotate_func__ can be None in Python 3.14 when a class
207
+ # has no annotations or in certain metaclass scenarios
208
+ if annotate_func is not None and callable(annotate_func):
209
+ annotations = annotate_func(Format.VALUE)
206
210
  for attr, kls in annotations.items():
207
211
  result.members[attr] = CollectionMeta._derive_member_info(
208
212
  attr, kls, CollectionMember()
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from ._base import Column
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  import sys
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from typing import Any, TypeVar
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from collections.abc import Callable
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  import contextlib
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -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
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from collections.abc import Sequence
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  import datetime as dt
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from __future__ import annotations
@@ -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.
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from .const import (
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  import dataframely.columns as dc
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from typing import Any
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  import polars as pl
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  import polars as pl
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  from abc import ABC, abstractmethod
@@ -1,4 +1,4 @@
1
- # Copyright (c) QuantCo 2025-2025
1
+ # Copyright (c) QuantCo 2025-2026
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
3
 
4
4
  # Configuration file for the Sphinx documentation builder.
@@ -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.