pydiverse-common 0.3.3__tar.gz → 0.3.5__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 (46) hide show
  1. pydiverse_common-0.3.5/.github/scripts/check_deps.sh +22 -0
  2. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/.github/workflows/tests.yml +2 -1
  3. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/PKG-INFO +3 -1
  4. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/docs/source/changelog.md +3 -0
  5. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/pixi.lock +136 -60
  6. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/pixi.toml +3 -2
  7. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/pyproject.toml +3 -1
  8. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/__init__.py +2 -0
  9. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/dtypes.py +46 -3
  10. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/tests/dtypes/test_dtype_pandas.py +26 -7
  11. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/tests/dtypes/test_dtype_polars.py +9 -1
  12. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/tests/dtypes/test_dtype_pyarrow.py +15 -2
  13. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/tests/dtypes/test_dtype_sqlalchemy.py +17 -8
  14. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/.gitattributes +0 -0
  15. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/.github/CODEOWNERS +0 -0
  16. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  17. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/.github/dependabot.yml +0 -0
  18. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/.github/workflows/release.yml +0 -0
  19. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/.github/workflows/update-lockfiles.yml +0 -0
  20. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/.gitignore +0 -0
  21. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/.pre-commit-config.yaml +0 -0
  22. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/.readthedocs.yaml +0 -0
  23. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/LICENSE +0 -0
  24. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/README.md +0 -0
  25. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/docs/Makefile +0 -0
  26. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/docs/make.bat +0 -0
  27. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/docs/package/README.md +0 -0
  28. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/docs/source/conf.py +0 -0
  29. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/docs/source/index.md +0 -0
  30. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/docs/source/license.md +0 -0
  31. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/docs/source/reference/api.rst +0 -0
  32. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/pytest.ini +0 -0
  33. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/errors/__init__.py +0 -0
  34. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/testing.py +0 -0
  35. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/util/__init__.py +0 -0
  36. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/util/computation_tracing.py +0 -0
  37. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/util/deep_map.py +0 -0
  38. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/util/deep_merge.py +0 -0
  39. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/util/disposable.py +0 -0
  40. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/util/hashing.py +0 -0
  41. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/util/import_.py +0 -0
  42. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/util/structlog.py +0 -0
  43. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/src/pydiverse/common/version.py +0 -0
  44. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/tests/conftest.py +0 -0
  45. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/tests/test_util.py +0 -0
  46. {pydiverse_common-0.3.3 → pydiverse_common-0.3.5}/tests/test_version.py +0 -0
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -euo pipefail
4
+
5
+ contains_dependency_all=true
6
+
7
+ while read -r package version; do
8
+ if [[ $package == "python" ]]; then
9
+ continue
10
+ fi
11
+
12
+ dependency="${package} ${version}"
13
+ contains_dependency=$(yq -r ".project.dependencies | map(. == \"${dependency}\") | any" pyproject.toml)
14
+ if [[ $contains_dependency == "false" ]]; then
15
+ echo "${dependency} not found in pyproject.toml"
16
+ contains_dependency_all=false
17
+ fi
18
+ done < <(yq -r '.dependencies | to_entries | .[] | "\(.key) \(.value)"' pixi.toml)
19
+
20
+ if [[ $contains_dependency_all == "false" ]]; then
21
+ exit 1
22
+ fi
@@ -23,7 +23,8 @@ jobs:
23
23
  run: pixi run postinstall
24
24
  - name: pre-commit
25
25
  run: pixi run pre-commit run -a --color=always --show-diff-on-failure
26
-
26
+ - name: Check pyproject.toml dependencies
27
+ run: pixi run check-deps
27
28
  test:
28
29
  name: pytest
29
30
  runs-on: ${{ matrix.os }}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydiverse-common
3
- Version: 0.3.3
3
+ Version: 0.3.5
4
4
  Summary: Common functionality shared between pydiverse libraries
5
5
  Author: QuantCo, Inc.
6
6
  Author-email: Martin Trautmann <windiana@users.sf.net>, Finn Rudolph <finn.rudolph@t-online.de>
@@ -47,6 +47,8 @@ Classifier: Programming Language :: SQL
47
47
  Classifier: Topic :: Database
48
48
  Classifier: Topic :: Scientific/Engineering
49
49
  Classifier: Topic :: Software Development
50
+ Requires-Python: <3.14,>=3.10
51
+ Requires-Dist: python-box<8,>=7.3.2
50
52
  Description-Content-Type: text/markdown
51
53
 
52
54
  # pydiverse.common
@@ -1,5 +1,8 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.4 (2025-06-10)
4
+ - fixed pypi package dependencies
5
+
3
6
  ## 0.3.3 (2025-06-08)
4
7
  - improved support of None and List type
5
8
  - bug fixes in type conversion functions
@@ -1180,6 +1180,7 @@ environments:
1180
1180
  - conda: https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.7-pyhd8ed1ab_0.conda
1181
1181
  - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda
1182
1182
  - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda
1183
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/go-yq-4.45.4-hdd9d35a_0.conda
1183
1184
  - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda
1184
1185
  - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda
1185
1186
  - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda
@@ -1276,6 +1277,7 @@ environments:
1276
1277
  - conda: https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.7-pyhd8ed1ab_0.conda
1277
1278
  - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda
1278
1279
  - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda
1280
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/go-yq-4.45.4-h86ecc28_0.conda
1279
1281
  - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda
1280
1282
  - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda
1281
1283
  - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda
@@ -1370,6 +1372,7 @@ environments:
1370
1372
  - conda: https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.7-pyhd8ed1ab_0.conda
1371
1373
  - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda
1372
1374
  - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda
1375
+ - conda: https://conda.anaconda.org/conda-forge/osx-64/go-yq-4.45.4-h6e16a3a_0.conda
1373
1376
  - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda
1374
1377
  - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda
1375
1378
  - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda
@@ -1458,6 +1461,7 @@ environments:
1458
1461
  - conda: https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.7-pyhd8ed1ab_0.conda
1459
1462
  - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda
1460
1463
  - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda
1464
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/go-yq-4.45.4-h5505292_0.conda
1461
1465
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda
1462
1466
  - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda
1463
1467
  - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda
@@ -1548,6 +1552,7 @@ environments:
1548
1552
  - conda: https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.7-pyhd8ed1ab_0.conda
1549
1553
  - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda
1550
1554
  - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda
1555
+ - conda: https://conda.anaconda.org/conda-forge/win-64/go-yq-4.45.4-h2466b09_0.conda
1551
1556
  - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda
1552
1557
  - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda
1553
1558
  - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda
@@ -6888,8 +6893,6 @@ packages:
6888
6893
  - pycparser
6889
6894
  - python >=3.10,<3.11.0a0
6890
6895
  - python_abi 3.10.* *_cp310
6891
- arch: x86_64
6892
- platform: linux
6893
6896
  license: MIT
6894
6897
  license_family: MIT
6895
6898
  size: 243532
@@ -6932,8 +6935,6 @@ packages:
6932
6935
  - pycparser
6933
6936
  - python >=3.13.0rc1,<3.14.0a0
6934
6937
  - python_abi 3.13.* *_cp313
6935
- arch: x86_64
6936
- platform: linux
6937
6938
  license: MIT
6938
6939
  license_family: MIT
6939
6940
  size: 295514
@@ -6947,8 +6948,6 @@ packages:
6947
6948
  - pycparser
6948
6949
  - python >=3.10,<3.11.0a0
6949
6950
  - python_abi 3.10.* *_cp310
6950
- arch: aarch64
6951
- platform: linux
6952
6951
  license: MIT
6953
6952
  license_family: MIT
6954
6953
  size: 260852
@@ -6988,8 +6987,6 @@ packages:
6988
6987
  - pycparser
6989
6988
  - python >=3.13.0rc1,<3.14.0a0
6990
6989
  - python_abi 3.13.* *_cp313
6991
- arch: aarch64
6992
- platform: linux
6993
6990
  license: MIT
6994
6991
  license_family: MIT
6995
6992
  size: 314846
@@ -7003,8 +7000,6 @@ packages:
7003
7000
  - pycparser
7004
7001
  - python >=3.10,<3.11.0a0
7005
7002
  - python_abi 3.10.* *_cp310
7006
- arch: x86_64
7007
- platform: osx
7008
7003
  license: MIT
7009
7004
  license_family: MIT
7010
7005
  size: 229844
@@ -7044,8 +7039,6 @@ packages:
7044
7039
  - pycparser
7045
7040
  - python >=3.13.0rc1,<3.14.0a0
7046
7041
  - python_abi 3.13.* *_cp313
7047
- arch: x86_64
7048
- platform: osx
7049
7042
  license: MIT
7050
7043
  license_family: MIT
7051
7044
  size: 284540
@@ -7060,8 +7053,6 @@ packages:
7060
7053
  - python >=3.10,<3.11.0a0
7061
7054
  - python >=3.10,<3.11.0a0 *_cpython
7062
7055
  - python_abi 3.10.* *_cp310
7063
- arch: arm64
7064
- platform: osx
7065
7056
  license: MIT
7066
7057
  license_family: MIT
7067
7058
  size: 229224
@@ -7104,8 +7095,6 @@ packages:
7104
7095
  - python >=3.13.0rc1,<3.14.0a0
7105
7096
  - python >=3.13.0rc1,<3.14.0a0 *_cp313
7106
7097
  - python_abi 3.13.* *_cp313
7107
- arch: arm64
7108
- platform: osx
7109
7098
  license: MIT
7110
7099
  license_family: MIT
7111
7100
  size: 282115
@@ -7120,8 +7109,6 @@ packages:
7120
7109
  - ucrt >=10.0.20348.0
7121
7110
  - vc >=14.2,<15
7122
7111
  - vc14_runtime >=14.29.30139
7123
- arch: x86_64
7124
- platform: win
7125
7112
  license: MIT
7126
7113
  license_family: MIT
7127
7114
  size: 238887
@@ -7164,8 +7151,6 @@ packages:
7164
7151
  - ucrt >=10.0.20348.0
7165
7152
  - vc >=14.2,<15
7166
7153
  - vc14_runtime >=14.29.30139
7167
- arch: x86_64
7168
- platform: win
7169
7154
  license: MIT
7170
7155
  license_family: MIT
7171
7156
  size: 291828
@@ -7629,6 +7614,57 @@ packages:
7629
7614
  license_family: BSD
7630
7615
  size: 112215
7631
7616
  timestamp: 1718284365403
7617
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/go-yq-4.45.4-hdd9d35a_0.conda
7618
+ sha256: 710d614cd37077a1b8cb473d9d18b52e7ad4167a40a480f57afdeb42e658f318
7619
+ md5: 0c3da887d37e71224d0077fbb26d1bc5
7620
+ depends:
7621
+ - __glibc >=2.17
7622
+ - __glibc >=2.17,<3.0.a0
7623
+ - libgcc >=13
7624
+ license: MIT
7625
+ license_family: MIT
7626
+ size: 3962140
7627
+ timestamp: 1746984672469
7628
+ - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/go-yq-4.45.4-h86ecc28_0.conda
7629
+ sha256: 5f7f6482aaa817807e43ec5e69967d2c2862687d4b683994b0f170521742c5a9
7630
+ md5: 550e6f0253305a62e99e113974502f14
7631
+ depends:
7632
+ - libgcc >=13
7633
+ license: MIT
7634
+ license_family: MIT
7635
+ size: 3574358
7636
+ timestamp: 1746984625484
7637
+ - conda: https://conda.anaconda.org/conda-forge/osx-64/go-yq-4.45.4-h6e16a3a_0.conda
7638
+ sha256: 446b4cf3173b27ba3bad51b57592e0ffd3345ffbae60e04d184b9e70c6172082
7639
+ md5: 34bec47340c1e15660de53e6ac2256ab
7640
+ depends:
7641
+ - __osx >=10.13
7642
+ constrains:
7643
+ - __osx>=10.12
7644
+ license: MIT
7645
+ license_family: MIT
7646
+ size: 3854128
7647
+ timestamp: 1746984683074
7648
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/go-yq-4.45.4-h5505292_0.conda
7649
+ sha256: 5749df601e7039b023481b3fede7cef428e05620f230e016103cd78373bde04f
7650
+ md5: 9e123f64b7084c63ae3c167e68efcfa7
7651
+ depends:
7652
+ - __osx >=11.0
7653
+ license: MIT
7654
+ license_family: MIT
7655
+ size: 3556744
7656
+ timestamp: 1746984719572
7657
+ - conda: https://conda.anaconda.org/conda-forge/win-64/go-yq-4.45.4-h2466b09_0.conda
7658
+ sha256: 7032ee8e93fb4f4af7a793df7d2166d226ae8a0b43580a5b4fa759b19af0e5e2
7659
+ md5: 571bc8198620709a5bcaa824fc467b57
7660
+ depends:
7661
+ - ucrt >=10.0.20348.0
7662
+ - vc >=14.2,<15
7663
+ - vc14_runtime >=14.29.30139
7664
+ license: MIT
7665
+ license_family: MIT
7666
+ size: 8291388
7667
+ timestamp: 1746984722615
7632
7668
  - conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.2.3-py310hf71b8c6_0.conda
7633
7669
  sha256: 9d02287ff70b5734ee7a23acde4012df62f851e787aad4219d4259b591aeb054
7634
7670
  md5: 8455091aed2d84aa239354f67cbdfe74
@@ -14268,6 +14304,8 @@ packages:
14268
14304
  - tzdata
14269
14305
  constrains:
14270
14306
  - python_abi 3.10.* *_cp310
14307
+ arch: x86_64
14308
+ platform: linux
14271
14309
  license: Python-2.0
14272
14310
  size: 25042108
14273
14311
  timestamp: 1749049293621
@@ -14294,6 +14332,8 @@ packages:
14294
14332
  - tzdata
14295
14333
  constrains:
14296
14334
  - python_abi 3.11.* *_cp311
14335
+ arch: x86_64
14336
+ platform: linux
14297
14337
  license: Python-2.0
14298
14338
  size: 30629559
14299
14339
  timestamp: 1749050021812
@@ -14346,6 +14386,8 @@ packages:
14346
14386
  - tzdata
14347
14387
  constrains:
14348
14388
  - python_abi 3.12.* *_cp312
14389
+ arch: x86_64
14390
+ platform: linux
14349
14391
  license: Python-2.0
14350
14392
  size: 31445023
14351
14393
  timestamp: 1749050216615
@@ -14371,6 +14413,8 @@ packages:
14371
14413
  - readline >=8.2,<9.0a0
14372
14414
  - tk >=8.6.13,<8.7.0a0
14373
14415
  - tzdata
14416
+ arch: x86_64
14417
+ platform: linux
14374
14418
  license: Python-2.0
14375
14419
  size: 33268245
14376
14420
  timestamp: 1744665022734
@@ -14397,6 +14441,8 @@ packages:
14397
14441
  - tzdata
14398
14442
  constrains:
14399
14443
  - python_abi 3.10.* *_cp310
14444
+ arch: aarch64
14445
+ platform: linux
14400
14446
  license: Python-2.0
14401
14447
  size: 13039547
14402
14448
  timestamp: 1749048139656
@@ -14422,6 +14468,8 @@ packages:
14422
14468
  - tzdata
14423
14469
  constrains:
14424
14470
  - python_abi 3.11.* *_cp311
14471
+ arch: aarch64
14472
+ platform: linux
14425
14473
  license: Python-2.0
14426
14474
  size: 15306062
14427
14475
  timestamp: 1749048115706
@@ -14447,6 +14495,8 @@ packages:
14447
14495
  - tzdata
14448
14496
  constrains:
14449
14497
  - python_abi 3.12.* *_cp312
14498
+ arch: aarch64
14499
+ platform: linux
14450
14500
  license: Python-2.0
14451
14501
  size: 13738751
14452
14502
  timestamp: 1749047852768
@@ -14471,6 +14521,8 @@ packages:
14471
14521
  - readline >=8.2,<9.0a0
14472
14522
  - tk >=8.6.13,<8.7.0a0
14473
14523
  - tzdata
14524
+ arch: aarch64
14525
+ platform: linux
14474
14526
  license: Python-2.0
14475
14527
  size: 33727843
14476
14528
  timestamp: 1744663385273
@@ -14493,6 +14545,8 @@ packages:
14493
14545
  - tzdata
14494
14546
  constrains:
14495
14547
  - python_abi 3.10.* *_cp310
14548
+ arch: x86_64
14549
+ platform: osx
14496
14550
  license: Python-2.0
14497
14551
  size: 12921103
14498
14552
  timestamp: 1749048830353
@@ -14514,6 +14568,8 @@ packages:
14514
14568
  - tzdata
14515
14569
  constrains:
14516
14570
  - python_abi 3.11.* *_cp311
14571
+ arch: x86_64
14572
+ platform: osx
14517
14573
  license: Python-2.0
14518
14574
  size: 15423460
14519
14575
  timestamp: 1749049420299
@@ -14556,6 +14612,8 @@ packages:
14556
14612
  - tzdata
14557
14613
  constrains:
14558
14614
  - python_abi 3.12.* *_cp312
14615
+ arch: x86_64
14616
+ platform: osx
14559
14617
  license: Python-2.0
14560
14618
  size: 13571569
14561
14619
  timestamp: 1749049058713
@@ -14578,6 +14636,8 @@ packages:
14578
14636
  - readline >=8.2,<9.0a0
14579
14637
  - tk >=8.6.13,<8.7.0a0
14580
14638
  - tzdata
14639
+ arch: x86_64
14640
+ platform: osx
14581
14641
  license: Python-2.0
14582
14642
  size: 13875464
14583
14643
  timestamp: 1744664784298
@@ -14600,6 +14660,8 @@ packages:
14600
14660
  - tzdata
14601
14661
  constrains:
14602
14662
  - python_abi 3.10.* *_cp310
14663
+ arch: arm64
14664
+ platform: osx
14603
14665
  license: Python-2.0
14604
14666
  size: 12385306
14605
14667
  timestamp: 1749048585934
@@ -14621,6 +14683,8 @@ packages:
14621
14683
  - tzdata
14622
14684
  constrains:
14623
14685
  - python_abi 3.11.* *_cp311
14686
+ arch: arm64
14687
+ platform: osx
14624
14688
  license: Python-2.0
14625
14689
  size: 14573820
14626
14690
  timestamp: 1749048947732
@@ -14642,6 +14706,8 @@ packages:
14642
14706
  - tzdata
14643
14707
  constrains:
14644
14708
  - python_abi 3.12.* *_cp312
14709
+ arch: arm64
14710
+ platform: osx
14645
14711
  license: Python-2.0
14646
14712
  size: 13009234
14647
14713
  timestamp: 1749048134449
@@ -14664,6 +14730,8 @@ packages:
14664
14730
  - readline >=8.2,<9.0a0
14665
14731
  - tk >=8.6.13,<8.7.0a0
14666
14732
  - tzdata
14733
+ arch: arm64
14734
+ platform: osx
14667
14735
  license: Python-2.0
14668
14736
  size: 12136505
14669
14737
  timestamp: 1744663807953
@@ -14686,6 +14754,8 @@ packages:
14686
14754
  - vc14_runtime >=14.29.30139
14687
14755
  constrains:
14688
14756
  - python_abi 3.10.* *_cp310
14757
+ arch: x86_64
14758
+ platform: win
14689
14759
  license: Python-2.0
14690
14760
  size: 15832933
14691
14761
  timestamp: 1749048670944
@@ -14707,6 +14777,8 @@ packages:
14707
14777
  - vc14_runtime >=14.29.30139
14708
14778
  constrains:
14709
14779
  - python_abi 3.11.* *_cp311
14780
+ arch: x86_64
14781
+ platform: win
14710
14782
  license: Python-2.0
14711
14783
  size: 18242669
14712
14784
  timestamp: 1749048351218
@@ -14728,6 +14800,8 @@ packages:
14728
14800
  - vc14_runtime >=14.29.30139
14729
14801
  constrains:
14730
14802
  - python_abi 3.12.* *_cp312
14803
+ arch: x86_64
14804
+ platform: win
14731
14805
  license: Python-2.0
14732
14806
  size: 15829289
14733
14807
  timestamp: 1749047682640
@@ -14750,6 +14824,8 @@ packages:
14750
14824
  - ucrt >=10.0.20348.0
14751
14825
  - vc >=14.2,<15
14752
14826
  - vc14_runtime >=14.29.30139
14827
+ arch: x86_64
14828
+ platform: win
14753
14829
  license: Python-2.0
14754
14830
  size: 16614435
14755
14831
  timestamp: 1744663103022
@@ -14765,6 +14841,8 @@ packages:
14765
14841
  - python_abi 3.10.* *_cp310
14766
14842
  - ruamel.yaml
14767
14843
  - toml
14844
+ arch: x86_64
14845
+ platform: linux
14768
14846
  license: MIT
14769
14847
  license_family: MIT
14770
14848
  size: 752684
@@ -14780,6 +14858,8 @@ packages:
14780
14858
  - python_abi 3.11.* *_cp311
14781
14859
  - ruamel.yaml
14782
14860
  - toml
14861
+ arch: x86_64
14862
+ platform: linux
14783
14863
  license: MIT
14784
14864
  license_family: MIT
14785
14865
  size: 774302
@@ -14795,6 +14875,8 @@ packages:
14795
14875
  - python_abi 3.12.* *_cp312
14796
14876
  - ruamel.yaml
14797
14877
  - toml
14878
+ arch: x86_64
14879
+ platform: linux
14798
14880
  license: MIT
14799
14881
  license_family: MIT
14800
14882
  size: 768872
@@ -14810,6 +14892,8 @@ packages:
14810
14892
  - python_abi 3.13.* *_cp313
14811
14893
  - ruamel.yaml
14812
14894
  - toml
14895
+ arch: x86_64
14896
+ platform: linux
14813
14897
  license: MIT
14814
14898
  license_family: MIT
14815
14899
  size: 766775
@@ -14825,6 +14909,8 @@ packages:
14825
14909
  - python_abi 3.10.* *_cp310
14826
14910
  - ruamel.yaml
14827
14911
  - toml
14912
+ arch: aarch64
14913
+ platform: linux
14828
14914
  license: MIT
14829
14915
  license_family: MIT
14830
14916
  size: 715030
@@ -14840,6 +14926,8 @@ packages:
14840
14926
  - python_abi 3.11.* *_cp311
14841
14927
  - ruamel.yaml
14842
14928
  - toml
14929
+ arch: aarch64
14930
+ platform: linux
14843
14931
  license: MIT
14844
14932
  license_family: MIT
14845
14933
  size: 734401
@@ -14855,6 +14943,8 @@ packages:
14855
14943
  - python_abi 3.12.* *_cp312
14856
14944
  - ruamel.yaml
14857
14945
  - toml
14946
+ arch: aarch64
14947
+ platform: linux
14858
14948
  license: MIT
14859
14949
  license_family: MIT
14860
14950
  size: 726035
@@ -14870,6 +14960,8 @@ packages:
14870
14960
  - python_abi 3.13.* *_cp313
14871
14961
  - ruamel.yaml
14872
14962
  - toml
14963
+ arch: aarch64
14964
+ platform: linux
14873
14965
  license: MIT
14874
14966
  license_family: MIT
14875
14967
  size: 724285
@@ -14884,6 +14976,8 @@ packages:
14884
14976
  - python_abi 3.10.* *_cp310
14885
14977
  - ruamel.yaml
14886
14978
  - toml
14979
+ arch: x86_64
14980
+ platform: osx
14887
14981
  license: MIT
14888
14982
  license_family: MIT
14889
14983
  size: 686709
@@ -14898,6 +14992,8 @@ packages:
14898
14992
  - python_abi 3.11.* *_cp311
14899
14993
  - ruamel.yaml
14900
14994
  - toml
14995
+ arch: x86_64
14996
+ platform: osx
14901
14997
  license: MIT
14902
14998
  license_family: MIT
14903
14999
  size: 698995
@@ -14912,6 +15008,8 @@ packages:
14912
15008
  - python_abi 3.12.* *_cp312
14913
15009
  - ruamel.yaml
14914
15010
  - toml
15011
+ arch: x86_64
15012
+ platform: osx
14915
15013
  license: MIT
14916
15014
  license_family: MIT
14917
15015
  size: 685217
@@ -14926,6 +15024,8 @@ packages:
14926
15024
  - python_abi 3.13.* *_cp313
14927
15025
  - ruamel.yaml
14928
15026
  - toml
15027
+ arch: x86_64
15028
+ platform: osx
14929
15029
  license: MIT
14930
15030
  license_family: MIT
14931
15031
  size: 687987
@@ -14941,6 +15041,8 @@ packages:
14941
15041
  - python_abi 3.10.* *_cp310
14942
15042
  - ruamel.yaml
14943
15043
  - toml
15044
+ arch: arm64
15045
+ platform: osx
14944
15046
  license: MIT
14945
15047
  license_family: MIT
14946
15048
  size: 683806
@@ -14956,6 +15058,8 @@ packages:
14956
15058
  - python_abi 3.11.* *_cp311
14957
15059
  - ruamel.yaml
14958
15060
  - toml
15061
+ arch: arm64
15062
+ platform: osx
14959
15063
  license: MIT
14960
15064
  license_family: MIT
14961
15065
  size: 691227
@@ -14971,6 +15075,8 @@ packages:
14971
15075
  - python_abi 3.12.* *_cp312
14972
15076
  - ruamel.yaml
14973
15077
  - toml
15078
+ arch: arm64
15079
+ platform: osx
14974
15080
  license: MIT
14975
15081
  license_family: MIT
14976
15082
  size: 681412
@@ -14986,6 +15092,8 @@ packages:
14986
15092
  - python_abi 3.13.* *_cp313
14987
15093
  - ruamel.yaml
14988
15094
  - toml
15095
+ arch: arm64
15096
+ platform: osx
14989
15097
  license: MIT
14990
15098
  license_family: MIT
14991
15099
  size: 684872
@@ -15002,6 +15110,8 @@ packages:
15002
15110
  - ucrt >=10.0.20348.0
15003
15111
  - vc >=14.2,<15
15004
15112
  - vc14_runtime >=14.29.30139
15113
+ arch: x86_64
15114
+ platform: win
15005
15115
  license: MIT
15006
15116
  license_family: MIT
15007
15117
  size: 607423
@@ -15018,6 +15128,8 @@ packages:
15018
15128
  - ucrt >=10.0.20348.0
15019
15129
  - vc >=14.2,<15
15020
15130
  - vc14_runtime >=14.29.30139
15131
+ arch: x86_64
15132
+ platform: win
15021
15133
  license: MIT
15022
15134
  license_family: MIT
15023
15135
  size: 628594
@@ -15034,6 +15146,8 @@ packages:
15034
15146
  - ucrt >=10.0.20348.0
15035
15147
  - vc >=14.2,<15
15036
15148
  - vc14_runtime >=14.29.30139
15149
+ arch: x86_64
15150
+ platform: win
15037
15151
  license: MIT
15038
15152
  license_family: MIT
15039
15153
  size: 607016
@@ -15050,6 +15164,8 @@ packages:
15050
15164
  - ucrt >=10.0.20348.0
15051
15165
  - vc >=14.2,<15
15052
15166
  - vc14_runtime >=14.29.30139
15167
+ arch: x86_64
15168
+ platform: win
15053
15169
  license: MIT
15054
15170
  license_family: MIT
15055
15171
  size: 604818
@@ -15199,8 +15315,6 @@ packages:
15199
15315
  - python >=3.10,<3.11.0a0
15200
15316
  - python_abi 3.10.* *_cp310
15201
15317
  - yaml >=0.2.5,<0.3.0a0
15202
- arch: x86_64
15203
- platform: linux
15204
15318
  license: MIT
15205
15319
  license_family: MIT
15206
15320
  size: 182769
@@ -15240,8 +15354,6 @@ packages:
15240
15354
  - python >=3.13,<3.14.0a0
15241
15355
  - python_abi 3.13.* *_cp313
15242
15356
  - yaml >=0.2.5,<0.3.0a0
15243
- arch: x86_64
15244
- platform: linux
15245
15357
  license: MIT
15246
15358
  license_family: MIT
15247
15359
  size: 205919
@@ -15255,8 +15367,6 @@ packages:
15255
15367
  - python >=3.10,<3.11.0a0 *_cpython
15256
15368
  - python_abi 3.10.* *_cp310
15257
15369
  - yaml >=0.2.5,<0.3.0a0
15258
- arch: aarch64
15259
- platform: linux
15260
15370
  license: MIT
15261
15371
  license_family: MIT
15262
15372
  size: 174914
@@ -15296,8 +15406,6 @@ packages:
15296
15406
  - python >=3.13,<3.14.0a0 *_cp313
15297
15407
  - python_abi 3.13.* *_cp313
15298
15408
  - yaml >=0.2.5,<0.3.0a0
15299
- arch: aarch64
15300
- platform: linux
15301
15409
  license: MIT
15302
15410
  license_family: MIT
15303
15411
  size: 198985
@@ -15310,8 +15418,6 @@ packages:
15310
15418
  - python >=3.10,<3.11.0a0
15311
15419
  - python_abi 3.10.* *_cp310
15312
15420
  - yaml >=0.2.5,<0.3.0a0
15313
- arch: x86_64
15314
- platform: osx
15315
15421
  license: MIT
15316
15422
  license_family: MIT
15317
15423
  size: 168613
@@ -15348,8 +15454,6 @@ packages:
15348
15454
  - python >=3.13,<3.14.0a0
15349
15455
  - python_abi 3.13.* *_cp313
15350
15456
  - yaml >=0.2.5,<0.3.0a0
15351
- arch: x86_64
15352
- platform: osx
15353
15457
  license: MIT
15354
15458
  license_family: MIT
15355
15459
  size: 196573
@@ -15363,8 +15467,6 @@ packages:
15363
15467
  - python >=3.10,<3.11.0a0 *_cpython
15364
15468
  - python_abi 3.10.* *_cp310
15365
15469
  - yaml >=0.2.5,<0.3.0a0
15366
- arch: arm64
15367
- platform: osx
15368
15470
  license: MIT
15369
15471
  license_family: MIT
15370
15472
  size: 166853
@@ -15404,8 +15506,6 @@ packages:
15404
15506
  - python >=3.13,<3.14.0a0 *_cp313
15405
15507
  - python_abi 3.13.* *_cp313
15406
15508
  - yaml >=0.2.5,<0.3.0a0
15407
- arch: arm64
15408
- platform: osx
15409
15509
  license: MIT
15410
15510
  license_family: MIT
15411
15511
  size: 194243
@@ -15420,8 +15520,6 @@ packages:
15420
15520
  - vc >=14.2,<15
15421
15521
  - vc14_runtime >=14.29.30139
15422
15522
  - yaml >=0.2.5,<0.3.0a0
15423
- arch: x86_64
15424
- platform: win
15425
15523
  license: MIT
15426
15524
  license_family: MIT
15427
15525
  size: 157941
@@ -15464,8 +15562,6 @@ packages:
15464
15562
  - vc >=14.2,<15
15465
15563
  - vc14_runtime >=14.29.30139
15466
15564
  - yaml >=0.2.5,<0.3.0a0
15467
- arch: x86_64
15468
- platform: win
15469
15565
  license: MIT
15470
15566
  license_family: MIT
15471
15567
  size: 182783
@@ -17377,8 +17473,6 @@ packages:
17377
17473
  - libstdcxx >=13
17378
17474
  - python >=3.10,<3.11.0a0
17379
17475
  - python_abi 3.10.* *_cp310
17380
- arch: x86_64
17381
- platform: linux
17382
17476
  license: MIT
17383
17477
  license_family: MIT
17384
17478
  size: 13756
@@ -17421,8 +17515,6 @@ packages:
17421
17515
  - libstdcxx >=13
17422
17516
  - python >=3.13.0rc1,<3.14.0a0
17423
17517
  - python_abi 3.13.* *_cp313
17424
- arch: x86_64
17425
- platform: linux
17426
17518
  license: MIT
17427
17519
  license_family: MIT
17428
17520
  size: 13916
@@ -17437,8 +17529,6 @@ packages:
17437
17529
  - python >=3.10,<3.11.0a0
17438
17530
  - python >=3.10,<3.11.0a0 *_cpython
17439
17531
  - python_abi 3.10.* *_cp310
17440
- arch: aarch64
17441
- platform: linux
17442
17532
  license: MIT
17443
17533
  license_family: MIT
17444
17534
  size: 14690
@@ -17481,8 +17571,6 @@ packages:
17481
17571
  - python >=3.13.0rc1,<3.14.0a0
17482
17572
  - python >=3.13.0rc1,<3.14.0a0 *_cp313
17483
17573
  - python_abi 3.13.* *_cp313
17484
- arch: aarch64
17485
- platform: linux
17486
17574
  license: MIT
17487
17575
  license_family: MIT
17488
17576
  size: 14819
@@ -17496,8 +17584,6 @@ packages:
17496
17584
  - libcxx >=17
17497
17585
  - python >=3.10,<3.11.0a0
17498
17586
  - python_abi 3.10.* *_cp310
17499
- arch: x86_64
17500
- platform: osx
17501
17587
  license: MIT
17502
17588
  license_family: MIT
17503
17589
  size: 12925
@@ -17537,8 +17623,6 @@ packages:
17537
17623
  - libcxx >=17
17538
17624
  - python >=3.13.0rc1,<3.14.0a0
17539
17625
  - python_abi 3.13.* *_cp313
17540
- arch: x86_64
17541
- platform: osx
17542
17626
  license: MIT
17543
17627
  license_family: MIT
17544
17628
  size: 13126
@@ -17553,8 +17637,6 @@ packages:
17553
17637
  - python >=3.10,<3.11.0a0
17554
17638
  - python >=3.10,<3.11.0a0 *_cpython
17555
17639
  - python_abi 3.10.* *_cp310
17556
- arch: arm64
17557
- platform: osx
17558
17640
  license: MIT
17559
17641
  license_family: MIT
17560
17642
  size: 13565
@@ -17597,8 +17679,6 @@ packages:
17597
17679
  - python >=3.13.0rc1,<3.14.0a0
17598
17680
  - python >=3.13.0rc1,<3.14.0a0 *_cp313
17599
17681
  - python_abi 3.13.* *_cp313
17600
- arch: arm64
17601
- platform: osx
17602
17682
  license: MIT
17603
17683
  license_family: MIT
17604
17684
  size: 13689
@@ -17613,8 +17693,6 @@ packages:
17613
17693
  - ucrt >=10.0.20348.0
17614
17694
  - vc >=14.2,<15
17615
17695
  - vc14_runtime >=14.29.30139
17616
- arch: x86_64
17617
- platform: win
17618
17696
  license: MIT
17619
17697
  license_family: MIT
17620
17698
  size: 17065
@@ -17657,8 +17735,6 @@ packages:
17657
17735
  - ucrt >=10.0.20348.0
17658
17736
  - vc >=14.2,<15
17659
17737
  - vc14_runtime >=14.29.30139
17660
- arch: x86_64
17661
- platform: win
17662
17738
  license: MIT
17663
17739
  license_family: MIT
17664
17740
  size: 17210
@@ -6,7 +6,6 @@ authors = [
6
6
  channels = ["conda-forge"]
7
7
  name = "pydiverse.common"
8
8
  platforms = ["linux-64", "osx-64", "osx-arm64", "win-64", "linux-aarch64"]
9
- version = "0.1.0"
10
9
 
11
10
  [tasks]
12
11
  postinstall = "pip install --no-build-isolation --no-deps --disable-pip-version-check -e ."
@@ -42,7 +41,7 @@ Sphinx = ">=7.3.7"
42
41
  furo = ">=2023.5.20"
43
42
  sphinxcontrib-apidoc = ">=0.3.0"
44
43
  myst-parser = ">=2.0.0"
45
- sphinx-autosummary-accessors = "2023.4.0"
44
+ sphinx-autosummary-accessors = ">=2023.4.0"
46
45
  sphinx-click = ">=4.4.0"
47
46
  sphinx-autobuild = ">=2021.3.14"
48
47
  sphinx-copybutton = ">=0.5.2"
@@ -64,6 +63,7 @@ taplo = "*"
64
63
  pre-commit-hooks = "*"
65
64
  typos = "*"
66
65
  conda-deny = "*"
66
+ go-yq = "*"
67
67
 
68
68
  [feature.lint.tasks]
69
69
  #commitit-install = "commitit install"
@@ -71,6 +71,7 @@ conda-deny = "*"
71
71
  pre-commit-install = "pre-commit install"
72
72
  pre-commit-run = "pre-commit run -a"
73
73
  conda-deny = "conda-deny check"
74
+ check-deps = "sh -c .github/scripts/check_deps.sh"
74
75
 
75
76
  [feature.py310.dependencies]
76
77
  python = "3.10.*"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pydiverse-common"
3
- version = "0.3.3"
3
+ version = "0.3.5"
4
4
  description = "Common functionality shared between pydiverse libraries"
5
5
  authors = [
6
6
  { name = "QuantCo, Inc." },
@@ -24,6 +24,8 @@ classifiers = [
24
24
  "Topic :: Scientific/Engineering",
25
25
  "Topic :: Software Development",
26
26
  ]
27
+ requires-python = ">=3.10,<3.14"
28
+ dependencies = ["python-box >=7.3.2,<8"]
27
29
 
28
30
  [tool.hatch.build.targets.wheel]
29
31
  packages = ["src/pydiverse"]
@@ -7,6 +7,7 @@ from .dtypes import (
7
7
  Decimal,
8
8
  Dtype,
9
9
  Duration,
10
+ Enum,
10
11
  Float,
11
12
  Float32,
12
13
  Float64,
@@ -51,5 +52,6 @@ __all__ = [
51
52
  "UInt32",
52
53
  "UInt64",
53
54
  "List",
55
+ "Enum",
54
56
  "PandasBackend",
55
57
  ]
@@ -1,9 +1,9 @@
1
1
  # Copyright (c) QuantCo and pydiverse contributors 2025-2025
2
2
  # SPDX-License-Identifier: BSD-3-Clause
3
- from enum import Enum
3
+ import enum
4
4
 
5
5
 
6
- class PandasBackend(str, Enum):
6
+ class PandasBackend(str, enum.Enum):
7
7
  NUMPY = "numpy"
8
8
  ARROW = "arrow"
9
9
 
@@ -141,6 +141,9 @@ class Dtype:
141
141
  # we don't know any decimal/time/null dtypes in pandas if column is not
142
142
  # arrow backed
143
143
 
144
+ if pandas_type.name == "category":
145
+ return Enum(*pandas_type.categories.to_list())
146
+
144
147
  raise TypeError
145
148
 
146
149
  @staticmethod
@@ -204,6 +207,8 @@ class Dtype:
204
207
 
205
208
  if isinstance(polars_type, pl.List):
206
209
  return List(Dtype.from_polars(polars_type.inner))
210
+ if isinstance(polars_type, pl.Enum):
211
+ return Enum(*polars_type.categories)
207
212
 
208
213
  return {
209
214
  pl.Int64: Int64(),
@@ -224,7 +229,6 @@ class Dtype:
224
229
  pl.Date: Date(),
225
230
  pl.Null: NullType(),
226
231
  pl.Duration: Duration(),
227
- pl.Enum: String(),
228
232
  }[polars_type.base_type()]
229
233
 
230
234
  def to_sql(self):
@@ -293,6 +297,9 @@ class Dtype:
293
297
  if isinstance(self, List):
294
298
  raise TypeError("pandas doesn't have a native list dtype")
295
299
 
300
+ if isinstance(self, Enum):
301
+ return pd.CategoricalDtype(self.categories)
302
+
296
303
  return {
297
304
  Int(): pd.Int64Dtype(), # we default to 64 bit
298
305
  Int8(): pd.Int8Dtype(),
@@ -319,6 +326,9 @@ class Dtype:
319
326
  """Convert this Dtype to a PyArrow type."""
320
327
  import pyarrow as pa
321
328
 
329
+ if isinstance(self, Enum):
330
+ return pa.string()
331
+
322
332
  return {
323
333
  Int(): pa.int64(), # we default to 64 bit
324
334
  Int8(): pa.int8(),
@@ -463,3 +473,36 @@ class List(Dtype):
463
473
  import pyarrow as pa
464
474
 
465
475
  return pa.list_(self.inner.to_arrow())
476
+
477
+
478
+ class Enum(String):
479
+ def __init__(self, *categories: str):
480
+ if not all(isinstance(c, str) for c in categories):
481
+ raise TypeError("arguments for `Enum` must have type `str`")
482
+ self.categories = list(categories)
483
+
484
+ def __eq__(self, rhs):
485
+ return isinstance(rhs, Enum) and self.categories == rhs.categories
486
+
487
+ def __repr__(self) -> str:
488
+ return f"Enum[{', '.join(repr(c) for c in self.categories)}]"
489
+
490
+ def __hash__(self):
491
+ return hash(tuple(self.categories))
492
+
493
+ def to_polars(self):
494
+ import polars as pl
495
+
496
+ return pl.Enum(self.categories)
497
+
498
+ def to_sql(self):
499
+ import sqlalchemy as sqa
500
+
501
+ return sqa.String()
502
+
503
+ def to_arrow(self):
504
+ import pyarrow as pa
505
+
506
+ # There is also pa.dictionary(), which seems to be kind of similar to an enum.
507
+ # Maybe it is better to convert to this.
508
+ return pa.string()
@@ -21,9 +21,13 @@ from pydiverse.common import (
21
21
  Bool,
22
22
  Date,
23
23
  Datetime,
24
+ Decimal,
24
25
  Dtype,
26
+ Enum,
27
+ Float,
25
28
  Float32,
26
29
  Float64,
30
+ Int,
27
31
  Int8,
28
32
  Int16,
29
33
  Int32,
@@ -154,8 +158,11 @@ def test_dtype_to_pandas_pyarrow():
154
158
  def test_all_types_numpy(type_):
155
159
  if type_ is pdc.List:
156
160
  type_obj = type_(pdc.Int64())
161
+ elif type_ is pdc.Enum:
162
+ type_obj = type_("a", "b", "c")
157
163
  else:
158
164
  type_obj = type_()
165
+
159
166
  if type_ is pdc.NullType:
160
167
  with pytest.raises(TypeError, match="pandas doesn't have a native null dtype"):
161
168
  type_obj.to_pandas(PandasBackend.NUMPY)
@@ -166,14 +173,17 @@ def test_all_types_numpy(type_):
166
173
  with pytest.raises(TypeError, match="pandas doesn't have a native list dtype"):
167
174
  type_obj.to_pandas(PandasBackend.NUMPY)
168
175
  else:
176
+ acceptance_map = {
177
+ Float: Float64(),
178
+ Int: Int64(),
179
+ Decimal: Float64(),
180
+ Date: Datetime(),
181
+ }
182
+
169
183
  dst_type = type_obj.to_pandas(PandasBackend.NUMPY)
170
184
  back_type = Dtype.from_pandas(dst_type)
171
- if type_ is pdc.Decimal:
172
- assert isinstance(back_type, pdc.Float64)
173
- elif type_ is pdc.Date:
174
- assert isinstance(back_type, pdc.Datetime)
175
- else:
176
- assert isinstance(back_type, type_)
185
+
186
+ assert back_type == acceptance_map.get(type_, type_obj)
177
187
 
178
188
 
179
189
  @pytest.mark.skipif(np is None, reason="requires pandas, numpy, and pyarrow")
@@ -184,8 +194,17 @@ def test_all_types_numpy(type_):
184
194
  def test_all_types_arrow(type_):
185
195
  if type_ is pdc.List:
186
196
  type_obj = type_(pdc.Int64())
197
+ elif type_ is pdc.Enum:
198
+ type_obj = type_("a", "b", "c")
187
199
  else:
188
200
  type_obj = type_()
201
+
202
+ acceptance_map = {
203
+ Enum: String(),
204
+ Float: Float64(),
205
+ Int: Int64(),
206
+ }
207
+
189
208
  dst_type = type_obj.to_pandas(PandasBackend.ARROW)
190
209
  back_type = Dtype.from_pandas(dst_type)
191
- assert isinstance(back_type, type_)
210
+ assert back_type == acceptance_map.get(type_, type_obj)
@@ -9,8 +9,10 @@ from pydiverse.common import (
9
9
  Date,
10
10
  Datetime,
11
11
  Dtype,
12
+ Float,
12
13
  Float32,
13
14
  Float64,
15
+ Int,
14
16
  Int8,
15
17
  Int16,
16
18
  Int32,
@@ -95,6 +97,12 @@ def test_all_types(type_):
95
97
  type_obj = type_(pdc.Int64())
96
98
  else:
97
99
  type_obj = type_()
100
+
101
+ acceptance_map = {
102
+ Float: Float64(),
103
+ Int: Int64(),
104
+ }
105
+
98
106
  dst_type = type_obj.to_polars()
99
107
  back_type = Dtype.from_polars(dst_type)
100
- assert isinstance(back_type, type_)
108
+ assert back_type == acceptance_map.get(type_, type_obj)
@@ -15,8 +15,11 @@ from pydiverse.common import (
15
15
  Date,
16
16
  Datetime,
17
17
  Dtype,
18
+ Enum,
19
+ Float,
18
20
  Float32,
19
21
  Float64,
22
+ Int,
20
23
  Int8,
21
24
  Int16,
22
25
  Int32,
@@ -92,7 +95,7 @@ def test_dtype_to_pyarrow():
92
95
  assert_conversion(Datetime(), pa.timestamp("us"))
93
96
 
94
97
 
95
- @pytest.mark.skipif(pa is None, reason="requires pandas, numpy, and pyarrow")
98
+ @pytest.mark.skipif(pa is None, reason="requires pyarrow")
96
99
  @pytest.mark.parametrize(
97
100
  "type_",
98
101
  ALL_TYPES,
@@ -100,8 +103,18 @@ def test_dtype_to_pyarrow():
100
103
  def test_all_types(type_):
101
104
  if type_ is pdc.List:
102
105
  type_obj = type_(pdc.Int64())
106
+ elif type_ is pdc.Enum:
107
+ type_obj = type_("a", "b", "c")
103
108
  else:
104
109
  type_obj = type_()
110
+
111
+ acceptance_map = {
112
+ Enum: String(),
113
+ Float: Float64(),
114
+ Int: Int64(),
115
+ }
116
+
105
117
  dst_type = type_obj.to_arrow()
106
118
  back_type = Dtype.from_arrow(dst_type)
107
- assert isinstance(back_type, type_)
119
+
120
+ assert back_type == acceptance_map.get(type_, type_obj)
@@ -9,8 +9,11 @@ from pydiverse.common import (
9
9
  Datetime,
10
10
  Decimal,
11
11
  Dtype,
12
+ Enum,
13
+ Float,
12
14
  Float32,
13
15
  Float64,
16
+ Int,
14
17
  Int8,
15
18
  Int16,
16
19
  Int32,
@@ -82,7 +85,7 @@ def test_dtype_to_sqlalchemy():
82
85
  assert_conversion(Datetime(), sa.DateTime)
83
86
 
84
87
 
85
- @pytest.mark.skipif(sa is None, reason="requires polars")
88
+ @pytest.mark.skipif(sa is None, reason="requires sqlalchemy")
86
89
  @pytest.mark.parametrize(
87
90
  "type_",
88
91
  ALL_TYPES,
@@ -90,19 +93,25 @@ def test_dtype_to_sqlalchemy():
90
93
  def test_all_types(type_):
91
94
  if type_ is pdc.List:
92
95
  type_obj = type_(pdc.Int64())
96
+ elif type_ is pdc.Enum:
97
+ type_obj = type_("a", "b", "c")
93
98
  else:
94
99
  type_obj = type_()
95
100
  dst_type = type_obj.to_sql()
96
101
  back_type = Dtype.from_sql(dst_type)
97
102
  acceptance_map = {
98
103
  # SQL is a bit less strict about integer precisions
99
- Int8: Int16,
100
- UInt8: Int16,
101
- UInt16: Int32,
102
- UInt32: Int64,
103
- UInt64: Int64,
104
+ Int8: Int16(),
105
+ UInt8: Int16(),
106
+ UInt16: Int32(),
107
+ UInt32: Int64(),
108
+ UInt64: Int64(),
104
109
  # we intentionally fetch Decimal as Float since Decimal is more a relational
105
110
  # database thing
106
- Decimal: Float64,
111
+ Decimal: Float64(),
112
+ Float: Float64(),
113
+ Int: Int64(),
114
+ # there is no Enum
115
+ Enum: String(),
107
116
  }
108
- assert isinstance(back_type, acceptance_map.get(type_, type_))
117
+ assert back_type == acceptance_map.get(type_, type_obj)