dataframely 2.4.0__tar.gz → 2.5.1__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.4.0 → dataframely-2.5.1}/.github/workflows/build.yml +8 -8
  2. {dataframely-2.4.0 → dataframely-2.5.1}/.github/workflows/ci.yml +7 -7
  3. {dataframely-2.4.0 → dataframely-2.5.1}/.github/workflows/copilot-setup-steps.yml +3 -3
  4. {dataframely-2.4.0 → dataframely-2.5.1}/.github/workflows/nightly.yml +2 -2
  5. {dataframely-2.4.0 → dataframely-2.5.1}/.github/workflows/scorecard.yml +3 -3
  6. {dataframely-2.4.0 → dataframely-2.5.1}/PKG-INFO +1 -1
  7. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/__init__.py +1 -1
  8. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_base_schema.py +1 -1
  9. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_compat.py +4 -1
  10. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_deprecation.py +1 -1
  11. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_filter.py +1 -1
  12. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_match_to_schema.py +1 -1
  13. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_plugin.py +1 -1
  14. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_polars.py +1 -1
  15. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_pydantic.py +1 -1
  16. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_rule.py +1 -1
  17. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_serialization.py +1 -1
  18. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_storage/__init__.py +1 -1
  19. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_storage/_base.py +1 -1
  20. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_storage/_exc.py +1 -1
  21. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_storage/constants.py +1 -1
  22. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_storage/delta.py +1 -1
  23. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_storage/parquet.py +1 -1
  24. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_typing.py +1 -1
  25. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/collection/__init__.py +1 -1
  26. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/collection/_base.py +6 -2
  27. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/collection/collection.py +1 -1
  28. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/collection/filter_result.py +1 -1
  29. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/__init__.py +1 -1
  30. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/_base.py +1 -1
  31. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/_mixins.py +1 -1
  32. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/_registry.py +1 -1
  33. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/_utils.py +1 -1
  34. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/any.py +1 -1
  35. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/array.py +12 -3
  36. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/binary.py +6 -4
  37. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/bool.py +1 -1
  38. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/categorical.py +1 -1
  39. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/datetime.py +1 -1
  40. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/decimal.py +1 -1
  41. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/enum.py +1 -1
  42. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/float.py +1 -1
  43. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/integer.py +1 -1
  44. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/list.py +8 -3
  45. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/object.py +1 -1
  46. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/string.py +1 -1
  47. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/columns/struct.py +7 -4
  48. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/config.py +1 -1
  49. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/exc.py +1 -1
  50. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/filter_result.py +1 -1
  51. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/functional.py +1 -1
  52. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/random.py +1 -1
  53. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/schema.py +1 -1
  54. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/testing/__init__.py +1 -1
  55. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/testing/const.py +1 -1
  56. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/testing/factory.py +1 -1
  57. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/testing/mask.py +1 -1
  58. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/testing/rules.py +1 -1
  59. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/testing/storage.py +1 -1
  60. {dataframely-2.4.0 → dataframely-2.5.1}/docs/conf.py +1 -1
  61. {dataframely-2.4.0 → dataframely-2.5.1}/pixi.lock +7506 -7616
  62. {dataframely-2.4.0 → dataframely-2.5.1}/pyproject.toml +1 -1
  63. {dataframely-2.4.0 → dataframely-2.5.1}/tests/benches/conftest.py +1 -1
  64. {dataframely-2.4.0 → dataframely-2.5.1}/tests/benches/test_collection.py +1 -1
  65. {dataframely-2.4.0 → dataframely-2.5.1}/tests/benches/test_failure.py +1 -1
  66. {dataframely-2.4.0 → dataframely-2.5.1}/tests/benches/test_schema.py +1 -1
  67. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_base.py +37 -1
  68. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_cast.py +1 -1
  69. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_collection_future_annotations.py +1 -1
  70. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_create_empty.py +1 -1
  71. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_filter_one_to_n.py +1 -1
  72. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_filter_validate.py +1 -1
  73. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_ignore_in_filter.py +1 -1
  74. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_implementation.py +1 -1
  75. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_join.py +1 -1
  76. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_matches.py +1 -1
  77. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_optional_members.py +1 -1
  78. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_propagate_row_failures.py +1 -1
  79. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_repr.py +1 -1
  80. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_sample.py +1 -1
  81. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_serialization.py +1 -1
  82. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_storage.py +1 -1
  83. {dataframely-2.4.0 → dataframely-2.5.1}/tests/collection/test_validate_input.py +1 -1
  84. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/__init__.py +1 -1
  85. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/test_any.py +1 -1
  86. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/test_array.py +1 -1
  87. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/test_binary.py +1 -1
  88. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/test_datetime.py +1 -1
  89. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/test_decimal.py +1 -1
  90. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/test_enum.py +1 -1
  91. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/test_float.py +1 -1
  92. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/test_integer.py +1 -1
  93. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/test_list.py +1 -1
  94. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/test_object.py +1 -1
  95. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/test_string.py +1 -1
  96. {dataframely-2.4.0 → dataframely-2.5.1}/tests/column_types/test_struct.py +1 -1
  97. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/__init__.py +1 -1
  98. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_alias.py +1 -1
  99. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_base.py +1 -1
  100. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_check.py +1 -1
  101. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_default_dtypes.py +1 -1
  102. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_matches.py +1 -1
  103. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_metadata.py +1 -1
  104. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_polars_schema.py +1 -1
  105. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_pyarrow.py +1 -1
  106. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_rules.py +1 -1
  107. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_sample.py +1 -1
  108. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_sqlalchemy_columns.py +9 -4
  109. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_str.py +1 -1
  110. {dataframely-2.4.0 → dataframely-2.5.1}/tests/columns/test_utils.py +1 -1
  111. {dataframely-2.4.0 → dataframely-2.5.1}/tests/conftest.py +1 -1
  112. {dataframely-2.4.0 → dataframely-2.5.1}/tests/core_validation/__init__.py +1 -1
  113. {dataframely-2.4.0 → dataframely-2.5.1}/tests/core_validation/test_match_to_schema.py +1 -1
  114. {dataframely-2.4.0 → dataframely-2.5.1}/tests/core_validation/test_rule_evaluation.py +1 -1
  115. {dataframely-2.4.0 → dataframely-2.5.1}/tests/failure_info/test_storage.py +1 -1
  116. {dataframely-2.4.0 → dataframely-2.5.1}/tests/functional/test_concat.py +1 -1
  117. {dataframely-2.4.0 → dataframely-2.5.1}/tests/functional/test_relationships.py +1 -1
  118. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_base.py +1 -1
  119. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_cast.py +1 -1
  120. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_create_empty.py +1 -1
  121. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_create_empty_if_none.py +1 -1
  122. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_filter.py +1 -1
  123. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_inheritance.py +1 -1
  124. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_matches.py +1 -1
  125. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_read_write_parquet.py +1 -1
  126. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_repr.py +1 -1
  127. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_rule_implementation.py +1 -1
  128. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_sample.py +1 -1
  129. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_serialization.py +1 -1
  130. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_storage.py +1 -1
  131. {dataframely-2.4.0 → dataframely-2.5.1}/tests/schema/test_validate.py +1 -1
  132. {dataframely-2.4.0 → dataframely-2.5.1}/tests/storage/test_delta.py +1 -1
  133. {dataframely-2.4.0 → dataframely-2.5.1}/tests/test_compat.py +1 -1
  134. {dataframely-2.4.0 → dataframely-2.5.1}/tests/test_config.py +1 -1
  135. {dataframely-2.4.0 → dataframely-2.5.1}/tests/test_deprecation.py +1 -1
  136. {dataframely-2.4.0 → dataframely-2.5.1}/tests/test_factory.py +1 -1
  137. {dataframely-2.4.0 → dataframely-2.5.1}/tests/test_native_regex.py +1 -1
  138. {dataframely-2.4.0 → dataframely-2.5.1}/tests/test_pydantic.py +1 -1
  139. {dataframely-2.4.0 → dataframely-2.5.1}/tests/test_random.py +1 -1
  140. {dataframely-2.4.0 → dataframely-2.5.1}/tests/test_serialization.py +1 -1
  141. {dataframely-2.4.0 → dataframely-2.5.1}/tests/test_typing.py +1 -1
  142. {dataframely-2.4.0 → dataframely-2.5.1}/.copier-answers.yml +0 -0
  143. {dataframely-2.4.0 → dataframely-2.5.1}/.envrc +0 -0
  144. {dataframely-2.4.0 → dataframely-2.5.1}/.gitattributes +0 -0
  145. {dataframely-2.4.0 → dataframely-2.5.1}/.github/CODEOWNERS +0 -0
  146. {dataframely-2.4.0 → dataframely-2.5.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  147. {dataframely-2.4.0 → dataframely-2.5.1}/.github/copilot-instructions.md +0 -0
  148. {dataframely-2.4.0 → dataframely-2.5.1}/.github/dependabot.yml +0 -0
  149. {dataframely-2.4.0 → dataframely-2.5.1}/.github/instructions/tests.instructions.md +0 -0
  150. {dataframely-2.4.0 → dataframely-2.5.1}/.github/release-drafter.yml +0 -0
  151. {dataframely-2.4.0 → dataframely-2.5.1}/.github/workflows/chore.yml +0 -0
  152. {dataframely-2.4.0 → dataframely-2.5.1}/.gitignore +0 -0
  153. {dataframely-2.4.0 → dataframely-2.5.1}/.pre-commit-config.yaml +0 -0
  154. {dataframely-2.4.0 → dataframely-2.5.1}/.prettierignore +0 -0
  155. {dataframely-2.4.0 → dataframely-2.5.1}/.prettierrc +0 -0
  156. {dataframely-2.4.0 → dataframely-2.5.1}/.readthedocs.yml +0 -0
  157. {dataframely-2.4.0 → dataframely-2.5.1}/Cargo.lock +0 -0
  158. {dataframely-2.4.0 → dataframely-2.5.1}/Cargo.toml +0 -0
  159. {dataframely-2.4.0 → dataframely-2.5.1}/LICENSE +0 -0
  160. {dataframely-2.4.0 → dataframely-2.5.1}/README.md +0 -0
  161. {dataframely-2.4.0 → dataframely-2.5.1}/SECURITY.md +0 -0
  162. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/_native.pyi +0 -0
  163. {dataframely-2.4.0 → dataframely-2.5.1}/dataframely/py.typed +0 -0
  164. {dataframely-2.4.0 → dataframely-2.5.1}/docker-compose.yml +0 -0
  165. {dataframely-2.4.0 → dataframely-2.5.1}/docs/_static/custom.css +0 -0
  166. {dataframely-2.4.0 → dataframely-2.5.1}/docs/_static/favicon.ico +0 -0
  167. {dataframely-2.4.0 → dataframely-2.5.1}/docs/_templates/autosummary/class.rst +0 -0
  168. {dataframely-2.4.0 → dataframely-2.5.1}/docs/_templates/autosummary/method.rst +0 -0
  169. {dataframely-2.4.0 → dataframely-2.5.1}/docs/_templates/classes/column.rst +0 -0
  170. {dataframely-2.4.0 → dataframely-2.5.1}/docs/_templates/classes/error.rst +0 -0
  171. {dataframely-2.4.0 → dataframely-2.5.1}/docs/_templates/classes/filter_result.rst +0 -0
  172. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/collection/generation.rst +0 -0
  173. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/collection/index.rst +0 -0
  174. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/collection/io.rst +0 -0
  175. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/collection/metadata.rst +0 -0
  176. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/collection/operations.rst +0 -0
  177. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/collection/validation.rst +0 -0
  178. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/columns/index.rst +0 -0
  179. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/errors/index.rst +0 -0
  180. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/filter_result/failure_info.rst +0 -0
  181. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/filter_result/index.rst +0 -0
  182. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/index.rst +0 -0
  183. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/misc/index.rst +0 -0
  184. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/schema/conversion.rst +0 -0
  185. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/schema/generation.rst +0 -0
  186. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/schema/index.rst +0 -0
  187. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/schema/io.rst +0 -0
  188. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/schema/metadata.rst +0 -0
  189. {dataframely-2.4.0 → dataframely-2.5.1}/docs/api/schema/validation.rst +0 -0
  190. {dataframely-2.4.0 → dataframely-2.5.1}/docs/css/custom.css +0 -0
  191. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/development.md +0 -0
  192. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/examples/index.md +0 -0
  193. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/examples/real-world.ipynb +0 -0
  194. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/faq.md +0 -0
  195. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/features/column-metadata.md +0 -0
  196. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/features/data-generation.md +0 -0
  197. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/features/index.md +0 -0
  198. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/features/lazy-validation.md +0 -0
  199. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/features/primary-keys.md +0 -0
  200. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/features/serialization.md +0 -0
  201. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/features/sql-generation.md +0 -0
  202. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/index.md +0 -0
  203. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/migration/index.md +0 -0
  204. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/migration/v1-v2.md +0 -0
  205. {dataframely-2.4.0 → dataframely-2.5.1}/docs/guides/quickstart.md +0 -0
  206. {dataframely-2.4.0 → dataframely-2.5.1}/docs/index.md +0 -0
  207. {dataframely-2.4.0 → dataframely-2.5.1}/pixi.toml +0 -0
  208. {dataframely-2.4.0 → dataframely-2.5.1}/rust-toolchain.toml +0 -0
  209. {dataframely-2.4.0 → dataframely-2.5.1}/src/lib.rs +0 -0
  210. {dataframely-2.4.0 → dataframely-2.5.1}/src/polars_plugin/mod.rs +0 -0
  211. {dataframely-2.4.0 → dataframely-2.5.1}/src/polars_plugin/rule_failure.rs +0 -0
  212. {dataframely-2.4.0 → dataframely-2.5.1}/src/polars_plugin/utils.rs +0 -0
  213. {dataframely-2.4.0 → dataframely-2.5.1}/src/polars_plugin/validation_error.rs +0 -0
  214. {dataframely-2.4.0 → dataframely-2.5.1}/src/regex/errdefs.rs +0 -0
  215. {dataframely-2.4.0 → dataframely-2.5.1}/src/regex/mod.rs +0 -0
  216. {dataframely-2.4.0 → dataframely-2.5.1}/src/regex/repr.rs +0 -0
@@ -13,11 +13,11 @@ jobs:
13
13
  permissions:
14
14
  contents: read
15
15
  steps:
16
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
16
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
17
17
  with:
18
18
  fetch-depth: 0
19
19
  - name: Set up pixi
20
- uses: prefix-dev/setup-pixi@28eb668aafebd9dede9d97c4ba1cd9989a4d0004 # v0.9.2
20
+ uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3
21
21
  with:
22
22
  environments: build
23
23
  - name: Set version
@@ -25,7 +25,7 @@ jobs:
25
25
  - name: Build project
26
26
  run: pixi run -e build build-sdist
27
27
  - name: Upload package
28
- uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
28
+ uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
29
29
  with:
30
30
  name: sdist
31
31
  path: dist/*
@@ -48,16 +48,16 @@ jobs:
48
48
  - target-platform: win-64
49
49
  os: windows-latest
50
50
  steps:
51
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
51
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
52
52
  with:
53
53
  fetch-depth: 0
54
54
  - name: Set up pixi
55
- uses: prefix-dev/setup-pixi@28eb668aafebd9dede9d97c4ba1cd9989a4d0004 # v0.9.2
55
+ uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3
56
56
  with:
57
57
  environments: build
58
58
  - name: Set version
59
59
  run: pixi run -e build set-version
60
- - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
60
+ - uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
61
61
  with:
62
62
  python-version: "3.10"
63
63
  - name: Build wheel
@@ -70,7 +70,7 @@ jobs:
70
70
  - name: Check package
71
71
  run: pixi run -e build check-wheel
72
72
  - name: Upload package
73
- uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
73
+ uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
74
74
  with:
75
75
  name: wheel-${{ matrix.target-platform }}
76
76
  path: dist/*
@@ -84,7 +84,7 @@ jobs:
84
84
  id-token: write
85
85
  environment: pypi
86
86
  steps:
87
- - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
87
+ - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
88
88
  with:
89
89
  path: dist
90
90
  merge-multiple: true
@@ -19,18 +19,18 @@ jobs:
19
19
  runs-on: ubuntu-latest
20
20
  steps:
21
21
  - name: Checkout branch
22
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
22
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
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@28eb668aafebd9dede9d97c4ba1cd9989a4d0004 # v0.9.2
27
+ uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3
28
28
  with:
29
29
  environments: default lint
30
30
  - name: Install Rust
31
31
  run: rustup show
32
32
  - name: Cache Rust dependencies
33
- uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # v2.8.1
33
+ uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
34
34
  - name: pre-commit
35
35
  run: pixi run pre-commit-run --color=always --show-diff-on-failure
36
36
 
@@ -56,9 +56,9 @@ jobs:
56
56
  with_optionals: true
57
57
  steps:
58
58
  - name: Checkout branch
59
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
59
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
60
60
  - name: Set up pixi
61
- uses: prefix-dev/setup-pixi@28eb668aafebd9dede9d97c4ba1cd9989a4d0004 # v0.9.2
61
+ uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3
62
62
  with:
63
63
  environments: ${{ matrix.environment }}
64
64
  # FIXME: Remove when `s3_server` fixture does not start a process anymore
@@ -66,13 +66,13 @@ jobs:
66
66
  - name: Install Rust
67
67
  run: rustup show
68
68
  - name: Cache Rust dependencies
69
- uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # v2.8.1
69
+ uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
70
70
  - name: Install repository
71
71
  run: pixi run -e ${{ matrix.environment }} postinstall
72
72
  - name: Run pytest
73
73
  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
74
74
  - name: Upload codecov
75
- uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
75
+ uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
76
76
  with:
77
77
  files: ./coverage.xml
78
78
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -13,14 +13,14 @@ jobs:
13
13
  id-token: write
14
14
  steps:
15
15
  - name: Checkout branch
16
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
16
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
17
17
  - name: Set up pixi
18
- uses: prefix-dev/setup-pixi@28eb668aafebd9dede9d97c4ba1cd9989a4d0004 # v0.9.2
18
+ uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3
19
19
  with:
20
20
  environments: default
21
21
  - name: Install Rust
22
22
  run: rustup show
23
23
  - name: Cache Rust dependencies
24
- uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # v2.8.1
24
+ uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
25
25
  - name: Install repository
26
26
  run: pixi run postinstall
@@ -23,9 +23,9 @@ jobs:
23
23
  os: [ubuntu-latest, windows-latest]
24
24
  steps:
25
25
  - name: Checkout branch
26
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
26
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
27
27
  - name: Set up pixi
28
- uses: prefix-dev/setup-pixi@28eb668aafebd9dede9d97c4ba1cd9989a4d0004 # v0.9.2
28
+ uses: prefix-dev/setup-pixi@82d477f15f3a381dbcc8adc1206ce643fe110fb7 # v0.9.3
29
29
  with:
30
30
  environments: nightly
31
31
  - name: Install polars nightly
@@ -35,7 +35,7 @@ jobs:
35
35
 
36
36
  steps:
37
37
  - name: "Checkout code"
38
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
38
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
39
39
  with:
40
40
  persist-credentials: false
41
41
 
@@ -65,7 +65,7 @@ jobs:
65
65
  # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
66
66
  # format to the repository Actions tab.
67
67
  - name: "Upload artifact"
68
- uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
68
+ uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
69
69
  with:
70
70
  name: SARIF file
71
71
  path: results.sarif
@@ -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@0499de31b99561a6d14a36a5f662c2a54f91beee # v3.29.5
77
+ uses: github/codeql-action/upload-sarif@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v3.29.5
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.4.0
3
+ Version: 2.5.1
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: 3.10
6
6
  Classifier: Programming Language :: Python :: 3.11
@@ -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,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
 
@@ -29,6 +29,7 @@ except ImportError:
29
29
  try:
30
30
  import sqlalchemy as sa
31
31
  import sqlalchemy.dialects.mssql as sa_mssql
32
+ import sqlalchemy.dialects.postgresql as sa_postgresql
32
33
  from sqlalchemy import Dialect
33
34
  from sqlalchemy.dialects.mssql.pyodbc import MSDialect_pyodbc
34
35
  from sqlalchemy.dialects.postgresql.psycopg2 import PGDialect_psycopg2
@@ -36,6 +37,7 @@ try:
36
37
  except ImportError:
37
38
  sa = _DummyModule("sqlalchemy") # type: ignore
38
39
  sa_mssql = _DummyModule("sqlalchemy") # type: ignore
40
+ sa_postgresql = _DummyModule("sqlalchemy") # type: ignore
39
41
 
40
42
  class sa_TypeEngine: # type: ignore # noqa: N801
41
43
  pass
@@ -81,6 +83,7 @@ __all__ = [
81
83
  "pydantic_core_schema",
82
84
  "pydantic",
83
85
  "sa_mssql",
86
+ "sa_postgresql",
84
87
  "sa_TypeEngine",
85
88
  "sa",
86
89
  ]
@@ -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
@@ -97,8 +97,17 @@ class Array(Column):
97
97
  }
98
98
 
99
99
  def sqlalchemy_dtype(self, dialect: sa.Dialect) -> sa_TypeEngine:
100
- # NOTE: We might want to add support for PostgreSQL's ARRAY type or use JSON in the future.
101
- raise NotImplementedError("SQL column cannot have 'Array' type.")
100
+ match dialect.name:
101
+ case "postgresql":
102
+ # Note that the length of the array in each dimension is not supported in SQLAlchemy
103
+ # That is because PostgreSQL does not enforce the length anyway
104
+ return sa.ARRAY(
105
+ self.inner.sqlalchemy_dtype(dialect), dimensions=len(self.shape)
106
+ )
107
+ case _:
108
+ raise NotImplementedError(
109
+ f"SQL column cannot have 'Array' type for dialect '{dialect}'."
110
+ )
102
111
 
103
112
  def _pyarrow_field_of_shape(self, shape: Sequence[int]) -> pa.Field:
104
113
  if shape:
@@ -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
@@ -21,9 +21,11 @@ class Binary(Column):
21
21
  return pl.Binary()
22
22
 
23
23
  def sqlalchemy_dtype(self, dialect: sa.Dialect) -> sa_TypeEngine:
24
- if dialect.name == "mssql":
25
- return sa.VARBINARY()
26
- return sa.LargeBinary()
24
+ match dialect.name:
25
+ case "mssql":
26
+ return sa.VARBINARY()
27
+ case _:
28
+ return sa.LargeBinary()
27
29
 
28
30
  @property
29
31
  def pyarrow_dtype(self) -> pa.DataType:
@@ -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
@@ -120,8 +120,13 @@ class List(Column):
120
120
  }
121
121
 
122
122
  def sqlalchemy_dtype(self, dialect: sa.Dialect) -> sa_TypeEngine:
123
- # NOTE: We might want to add support for PostgreSQL's ARRAY type or use JSON in the future.
124
- raise NotImplementedError("SQL column cannot have 'List' type.")
123
+ match dialect.name:
124
+ case "postgresql":
125
+ return sa.ARRAY(self.inner.sqlalchemy_dtype(dialect))
126
+ case _:
127
+ raise NotImplementedError(
128
+ f"SQL column cannot have 'List' type for dialect '{dialect}'."
129
+ )
125
130
 
126
131
  @property
127
132
  def pyarrow_dtype(self) -> pa.DataType:
@@ -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
@@ -8,7 +8,7 @@ from typing import Any, cast
8
8
 
9
9
  import polars as pl
10
10
 
11
- from dataframely._compat import pa, sa, sa_TypeEngine
11
+ from dataframely._compat import pa, sa, sa_postgresql, sa_TypeEngine
12
12
  from dataframely._polars import PolarsDataType
13
13
  from dataframely.random import Generator
14
14
 
@@ -107,8 +107,11 @@ class Struct(Column):
107
107
  }
108
108
 
109
109
  def sqlalchemy_dtype(self, dialect: sa.Dialect) -> sa_TypeEngine:
110
- # NOTE: We might want to add support for PostgreSQL's JSON in the future.
111
- raise NotImplementedError("SQL column cannot have 'Struct' type.")
110
+ match dialect.name:
111
+ case "postgresql":
112
+ return sa_postgresql.JSONB()
113
+ case _:
114
+ raise NotImplementedError("SQL column cannot have 'Struct' type.")
112
115
 
113
116
  @property
114
117
  def pyarrow_dtype(self) -> pa.DataType:
@@ -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
@@ -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
@@ -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 (