dataframely 1.10.0__tar.gz → 1.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 (197) hide show
  1. {dataframely-1.10.0 → dataframely-1.11.0}/PKG-INFO +1 -1
  2. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/enum.py +17 -6
  3. {dataframely-1.10.0 → dataframely-1.11.0}/pyproject.toml +1 -1
  4. {dataframely-1.10.0 → dataframely-1.11.0}/tests/column_types/test_enum.py +48 -1
  5. {dataframely-1.10.0 → dataframely-1.11.0}/.copier-answers.yml +0 -0
  6. {dataframely-1.10.0 → dataframely-1.11.0}/.envrc +0 -0
  7. {dataframely-1.10.0 → dataframely-1.11.0}/.gitattributes +0 -0
  8. {dataframely-1.10.0 → dataframely-1.11.0}/.github/CODEOWNERS +0 -0
  9. {dataframely-1.10.0 → dataframely-1.11.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  10. {dataframely-1.10.0 → dataframely-1.11.0}/.github/dependabot.yml +0 -0
  11. {dataframely-1.10.0 → dataframely-1.11.0}/.github/release-drafter.yml +0 -0
  12. {dataframely-1.10.0 → dataframely-1.11.0}/.github/workflows/build.yml +0 -0
  13. {dataframely-1.10.0 → dataframely-1.11.0}/.github/workflows/chore.yml +0 -0
  14. {dataframely-1.10.0 → dataframely-1.11.0}/.github/workflows/ci.yml +0 -0
  15. {dataframely-1.10.0 → dataframely-1.11.0}/.github/workflows/nightly.yml +0 -0
  16. {dataframely-1.10.0 → dataframely-1.11.0}/.github/workflows/scorecard.yml +0 -0
  17. {dataframely-1.10.0 → dataframely-1.11.0}/.gitignore +0 -0
  18. {dataframely-1.10.0 → dataframely-1.11.0}/.pre-commit-config.yaml +0 -0
  19. {dataframely-1.10.0 → dataframely-1.11.0}/.prettierignore +0 -0
  20. {dataframely-1.10.0 → dataframely-1.11.0}/.prettierrc +0 -0
  21. {dataframely-1.10.0 → dataframely-1.11.0}/.readthedocs.yml +0 -0
  22. {dataframely-1.10.0 → dataframely-1.11.0}/Cargo.lock +0 -0
  23. {dataframely-1.10.0 → dataframely-1.11.0}/Cargo.toml +0 -0
  24. {dataframely-1.10.0 → dataframely-1.11.0}/LICENSE +0 -0
  25. {dataframely-1.10.0 → dataframely-1.11.0}/README.md +0 -0
  26. {dataframely-1.10.0 → dataframely-1.11.0}/SECURITY.md +0 -0
  27. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/__init__.py +0 -0
  28. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_base_collection.py +0 -0
  29. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_base_schema.py +0 -0
  30. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_compat.py +0 -0
  31. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_deprecation.py +0 -0
  32. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_extre.pyi +0 -0
  33. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_filter.py +0 -0
  34. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_polars.py +0 -0
  35. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_rule.py +0 -0
  36. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_serialization.py +0 -0
  37. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_storage/__init__.py +0 -0
  38. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_storage/_base.py +0 -0
  39. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_storage/_exc.py +0 -0
  40. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_storage/constants.py +0 -0
  41. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_storage/delta.py +0 -0
  42. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_storage/parquet.py +0 -0
  43. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_typing.py +0 -0
  44. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/_validation.py +0 -0
  45. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/collection.py +0 -0
  46. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/__init__.py +0 -0
  47. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/_base.py +0 -0
  48. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/_mixins.py +0 -0
  49. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/_registry.py +0 -0
  50. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/_utils.py +0 -0
  51. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/any.py +0 -0
  52. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/array.py +0 -0
  53. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/bool.py +0 -0
  54. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/categorical.py +0 -0
  55. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/datetime.py +0 -0
  56. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/decimal.py +0 -0
  57. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/float.py +0 -0
  58. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/integer.py +0 -0
  59. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/list.py +0 -0
  60. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/object.py +0 -0
  61. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/string.py +0 -0
  62. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/columns/struct.py +0 -0
  63. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/config.py +0 -0
  64. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/exc.py +0 -0
  65. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/failure.py +0 -0
  66. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/functional.py +0 -0
  67. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/mypy.py +0 -0
  68. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/py.typed +0 -0
  69. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/random.py +0 -0
  70. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/schema.py +0 -0
  71. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/testing/__init__.py +0 -0
  72. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/testing/const.py +0 -0
  73. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/testing/factory.py +0 -0
  74. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/testing/mask.py +0 -0
  75. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/testing/rules.py +0 -0
  76. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/testing/storage.py +0 -0
  77. {dataframely-1.10.0 → dataframely-1.11.0}/dataframely/testing/typing.py +0 -0
  78. {dataframely-1.10.0 → dataframely-1.11.0}/docker-compose.yml +0 -0
  79. {dataframely-1.10.0 → dataframely-1.11.0}/docs/Makefile +0 -0
  80. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.collection.rst +0 -0
  81. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.columns.any.rst +0 -0
  82. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.columns.bool.rst +0 -0
  83. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.columns.datetime.rst +0 -0
  84. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.columns.decimal.rst +0 -0
  85. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.columns.enum.rst +0 -0
  86. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.columns.float.rst +0 -0
  87. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.columns.integer.rst +0 -0
  88. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.columns.list.rst +0 -0
  89. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.columns.rst +0 -0
  90. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.columns.string.rst +0 -0
  91. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.columns.struct.rst +0 -0
  92. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.config.rst +0 -0
  93. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.exc.rst +0 -0
  94. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.failure.rst +0 -0
  95. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.functional.rst +0 -0
  96. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.mypy.rst +0 -0
  97. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.random.rst +0 -0
  98. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.rst +0 -0
  99. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.schema.rst +0 -0
  100. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.testing.const.rst +0 -0
  101. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.testing.factory.rst +0 -0
  102. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.testing.mask.rst +0 -0
  103. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.testing.rst +0 -0
  104. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.testing.rules.rst +0 -0
  105. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/dataframely.testing.typing.rst +0 -0
  106. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_api/modules.rst +0 -0
  107. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_static/custom.css +0 -0
  108. {dataframely-1.10.0 → dataframely-1.11.0}/docs/_static/favicon.ico +0 -0
  109. {dataframely-1.10.0 → dataframely-1.11.0}/docs/conf.py +0 -0
  110. {dataframely-1.10.0 → dataframely-1.11.0}/docs/index.rst +0 -0
  111. {dataframely-1.10.0 → dataframely-1.11.0}/docs/make.bat +0 -0
  112. {dataframely-1.10.0 → dataframely-1.11.0}/docs/sites/development.rst +0 -0
  113. {dataframely-1.10.0 → dataframely-1.11.0}/docs/sites/examples/real-world.ipynb +0 -0
  114. {dataframely-1.10.0 → dataframely-1.11.0}/docs/sites/faq.rst +0 -0
  115. {dataframely-1.10.0 → dataframely-1.11.0}/docs/sites/installation.rst +0 -0
  116. {dataframely-1.10.0 → dataframely-1.11.0}/docs/sites/quickstart.rst +0 -0
  117. {dataframely-1.10.0 → dataframely-1.11.0}/docs/sites/versioning.rst +0 -0
  118. {dataframely-1.10.0 → dataframely-1.11.0}/pixi.lock +0 -0
  119. {dataframely-1.10.0 → dataframely-1.11.0}/pixi.toml +0 -0
  120. {dataframely-1.10.0 → dataframely-1.11.0}/src/errdefs.rs +0 -0
  121. {dataframely-1.10.0 → dataframely-1.11.0}/src/lib.rs +0 -0
  122. {dataframely-1.10.0 → dataframely-1.11.0}/src/regex_repr.rs +0 -0
  123. {dataframely-1.10.0 → dataframely-1.11.0}/tests/benches/conftest.py +0 -0
  124. {dataframely-1.10.0 → dataframely-1.11.0}/tests/benches/test_collection.py +0 -0
  125. {dataframely-1.10.0 → dataframely-1.11.0}/tests/benches/test_failure.py +0 -0
  126. {dataframely-1.10.0 → dataframely-1.11.0}/tests/benches/test_schema.py +0 -0
  127. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_base.py +0 -0
  128. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_cast.py +0 -0
  129. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_collection_future_annotations.py +0 -0
  130. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_create_empty.py +0 -0
  131. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_filter_one_to_n.py +0 -0
  132. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_filter_validate.py +0 -0
  133. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_ignore_in_filter.py +0 -0
  134. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_implementation.py +0 -0
  135. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_join.py +0 -0
  136. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_matches.py +0 -0
  137. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_optional_members.py +0 -0
  138. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_repr.py +0 -0
  139. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_sample.py +0 -0
  140. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_serialization.py +0 -0
  141. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_storage.py +0 -0
  142. {dataframely-1.10.0 → dataframely-1.11.0}/tests/collection/test_validate_input.py +0 -0
  143. {dataframely-1.10.0 → dataframely-1.11.0}/tests/column_types/__init__.py +0 -0
  144. {dataframely-1.10.0 → dataframely-1.11.0}/tests/column_types/test_any.py +0 -0
  145. {dataframely-1.10.0 → dataframely-1.11.0}/tests/column_types/test_array.py +0 -0
  146. {dataframely-1.10.0 → dataframely-1.11.0}/tests/column_types/test_datetime.py +0 -0
  147. {dataframely-1.10.0 → dataframely-1.11.0}/tests/column_types/test_decimal.py +0 -0
  148. {dataframely-1.10.0 → dataframely-1.11.0}/tests/column_types/test_float.py +0 -0
  149. {dataframely-1.10.0 → dataframely-1.11.0}/tests/column_types/test_integer.py +0 -0
  150. {dataframely-1.10.0 → dataframely-1.11.0}/tests/column_types/test_list.py +0 -0
  151. {dataframely-1.10.0 → dataframely-1.11.0}/tests/column_types/test_object.py +0 -0
  152. {dataframely-1.10.0 → dataframely-1.11.0}/tests/column_types/test_string.py +0 -0
  153. {dataframely-1.10.0 → dataframely-1.11.0}/tests/column_types/test_struct.py +0 -0
  154. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/__init__.py +0 -0
  155. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/test_alias.py +0 -0
  156. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/test_check.py +0 -0
  157. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/test_default_dtypes.py +0 -0
  158. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/test_matches.py +0 -0
  159. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/test_metadata.py +0 -0
  160. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/test_polars_schema.py +0 -0
  161. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/test_pyarrow.py +0 -0
  162. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/test_rules.py +0 -0
  163. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/test_sample.py +0 -0
  164. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/test_sql_schema.py +0 -0
  165. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/test_str.py +0 -0
  166. {dataframely-1.10.0 → dataframely-1.11.0}/tests/columns/test_utils.py +0 -0
  167. {dataframely-1.10.0 → dataframely-1.11.0}/tests/core_validation/__init__.py +0 -0
  168. {dataframely-1.10.0 → dataframely-1.11.0}/tests/core_validation/test_column_validation.py +0 -0
  169. {dataframely-1.10.0 → dataframely-1.11.0}/tests/core_validation/test_dtype_validation.py +0 -0
  170. {dataframely-1.10.0 → dataframely-1.11.0}/tests/core_validation/test_rule_evaluation.py +0 -0
  171. {dataframely-1.10.0 → dataframely-1.11.0}/tests/failure_info/test_storage.py +0 -0
  172. {dataframely-1.10.0 → dataframely-1.11.0}/tests/functional/test_concat.py +0 -0
  173. {dataframely-1.10.0 → dataframely-1.11.0}/tests/functional/test_relationships.py +0 -0
  174. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_base.py +0 -0
  175. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_cast.py +0 -0
  176. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_create_empty.py +0 -0
  177. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_create_empty_if_none.py +0 -0
  178. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_filter.py +0 -0
  179. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_inheritance.py +0 -0
  180. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_matches.py +0 -0
  181. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_read_write_parquet.py +0 -0
  182. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_repr.py +0 -0
  183. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_rule_implementation.py +0 -0
  184. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_sample.py +0 -0
  185. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_serialization.py +0 -0
  186. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_storage.py +0 -0
  187. {dataframely-1.10.0 → dataframely-1.11.0}/tests/schema/test_validate.py +0 -0
  188. {dataframely-1.10.0 → dataframely-1.11.0}/tests/storage/test_delta.py +0 -0
  189. {dataframely-1.10.0 → dataframely-1.11.0}/tests/test_compat.py +0 -0
  190. {dataframely-1.10.0 → dataframely-1.11.0}/tests/test_config.py +0 -0
  191. {dataframely-1.10.0 → dataframely-1.11.0}/tests/test_deprecation.py +0 -0
  192. {dataframely-1.10.0 → dataframely-1.11.0}/tests/test_exc.py +0 -0
  193. {dataframely-1.10.0 → dataframely-1.11.0}/tests/test_extre.py +0 -0
  194. {dataframely-1.10.0 → dataframely-1.11.0}/tests/test_factory.py +0 -0
  195. {dataframely-1.10.0 → dataframely-1.11.0}/tests/test_random.py +0 -0
  196. {dataframely-1.10.0 → dataframely-1.11.0}/tests/test_serialization.py +0 -0
  197. {dataframely-1.10.0 → dataframely-1.11.0}/tests/test_typing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataframely
3
- Version: 1.10.0
3
+ Version: 1.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
@@ -3,7 +3,9 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
- from collections.abc import Sequence
6
+ import enum
7
+ from collections.abc import Iterable
8
+ from inspect import isclass
7
9
  from typing import Any
8
10
 
9
11
  import polars as pl
@@ -22,7 +24,7 @@ class Enum(Column):
22
24
 
23
25
  def __init__(
24
26
  self,
25
- categories: Sequence[str],
27
+ categories: pl.Series | Iterable[str] | type[enum.Enum],
26
28
  *,
27
29
  nullable: bool | None = None,
28
30
  primary_key: bool = False,
@@ -32,7 +34,8 @@ class Enum(Column):
32
34
  ):
33
35
  """
34
36
  Args:
35
- categories: The list of valid categories for the enum.
37
+ categories: The set of valid categories for the enum, or an existing Python
38
+ string-valued enum.
36
39
  nullable: Whether this column may contain null values.
37
40
  Explicitly set `nullable=True` if you want your column to be nullable.
38
41
  In a future release, `nullable=False` will be the default if `nullable`
@@ -63,7 +66,13 @@ class Enum(Column):
63
66
  alias=alias,
64
67
  metadata=metadata,
65
68
  )
66
- self.categories = list(categories)
69
+ if isclass(categories) and issubclass(categories, enum.Enum):
70
+ categories = pl.Series(
71
+ values=[getattr(v, "value", v) for v in categories.__members__.values()]
72
+ )
73
+ elif not isinstance(categories, pl.Series):
74
+ categories = pl.Series(values=categories)
75
+ self.categories = categories
67
76
 
68
77
  @property
69
78
  def dtype(self) -> pl.DataType:
@@ -72,7 +81,7 @@ class Enum(Column):
72
81
  def validate_dtype(self, dtype: PolarsDataType) -> bool:
73
82
  if not isinstance(dtype, pl.Enum):
74
83
  return False
75
- return self.categories == dtype.categories.to_list()
84
+ return self.categories.equals(dtype.categories)
76
85
 
77
86
  def sqlalchemy_dtype(self, dialect: sa.Dialect) -> sa_TypeEngine:
78
87
  category_lengths = [len(c) for c in self.categories]
@@ -92,5 +101,7 @@ class Enum(Column):
92
101
 
93
102
  def _sample_unchecked(self, generator: Generator, n: int) -> pl.Series:
94
103
  return generator.sample_choice(
95
- n, choices=self.categories, null_probability=self._null_probability
104
+ n,
105
+ choices=self.categories.to_list(),
106
+ null_probability=self._null_probability,
96
107
  ).cast(self.dtype)
@@ -25,7 +25,7 @@ description = "A declarative, polars-native data frame validation library"
25
25
  name = "dataframely"
26
26
  readme = "README.md"
27
27
  requires-python = ">=3.10"
28
- version = "1.10.0"
28
+ version = "1.11.0"
29
29
 
30
30
  [project.optional-dependencies]
31
31
  deltalake = ["deltalake"]
@@ -1,6 +1,8 @@
1
1
  # Copyright (c) QuantCo 2025-2025
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
-
3
+ import enum
4
+ from collections.abc import Iterable
5
+ from enum import Enum
4
6
  from typing import Any
5
7
 
6
8
  import polars as pl
@@ -61,3 +63,48 @@ def test_different_sequences(type1: type, type2: type) -> None:
61
63
  S = create_schema("test", {"x": dy.Enum(type1(allowed))})
62
64
  df = pl.DataFrame({"x": pl.Series(["a", "b"], dtype=pl.Enum(type2(allowed)))})
63
65
  S.validate(df)
66
+
67
+
68
+ def test_enum_of_enum_136() -> None:
69
+ class Categories(str, Enum):
70
+ a = "a"
71
+ b = "b"
72
+
73
+ assert pl.Enum(Categories) == dy.Enum(Categories).dtype
74
+
75
+
76
+ def test_enum_of_series() -> None:
77
+ categories = pl.Series(["a", "b"])
78
+ assert pl.Enum(categories) == dy.Enum(categories).dtype
79
+
80
+
81
+ def test_enum_of_iterable() -> None:
82
+ categories = (x for x in ["a", "b"])
83
+ assert pl.Enum(["a", "b"]) == dy.Enum(categories).dtype
84
+
85
+
86
+ @pytest.mark.parametrize(
87
+ "categories1",
88
+ [
89
+ ["a", "b"],
90
+ ("a", "b"),
91
+ pl.Series(["a", "b"]),
92
+ Enum("Categories", {"a": "a", "b": "b"}),
93
+ ],
94
+ )
95
+ @pytest.mark.parametrize(
96
+ "categories2",
97
+ [
98
+ ["a", "b"],
99
+ ("a", "b"),
100
+ pl.Series(["a", "b"]),
101
+ Enum("Categories", {"a": "a", "b": "b"}),
102
+ ],
103
+ )
104
+ def test_sequences_and_enums(
105
+ categories1: pl.Series | Iterable[str] | type[enum.Enum],
106
+ categories2: pl.Series | Iterable[str] | type[enum.Enum],
107
+ ) -> None:
108
+ S = create_schema("test", {"x": dy.Enum(categories1)})
109
+ df = pl.DataFrame({"x": pl.Series(["a", "b"], dtype=pl.Enum(categories2))})
110
+ S.validate(df)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes