python-calamine-reducto 0.7.6__tar.gz → 0.7.15__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 (65) hide show
  1. python_calamine_reducto-0.7.15/.github/workflows/release.yml +140 -0
  2. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/Cargo.lock +83 -2
  3. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/Cargo.toml +2 -1
  4. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/PKG-INFO +1 -1
  5. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/src/types/grid.rs +396 -0
  6. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/src/types/workbook.rs +711 -66
  7. python_calamine_reducto-0.7.15/tests/data/table-multiple.xlsb +0 -0
  8. python_calamine_reducto-0.7.15/tests/data/temperature-table.xlsb +0 -0
  9. python_calamine_reducto-0.7.15/tests/test_band.py +343 -0
  10. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/test_grid.py +294 -0
  11. python_calamine_reducto-0.7.15/tests/test_tables.py +142 -0
  12. python_calamine_reducto-0.7.6/tests/test_tables.py +0 -73
  13. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/.github/workflows/CI.yml +0 -0
  14. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/.gitignore +0 -0
  15. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/.pre-commit-config.yaml +0 -0
  16. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/.python-version +0 -0
  17. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/CLAUDE.md +0 -0
  18. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/LICENSE +0 -0
  19. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/README.md +0 -0
  20. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/build.rs +0 -0
  21. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/pyproject.toml +0 -0
  22. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/python/python_calamine/__init__.py +0 -0
  23. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/python/python_calamine/_python_calamine.pyi +0 -0
  24. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/python/python_calamine/py.typed +0 -0
  25. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/renovate.json +0 -0
  26. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/src/lib.rs +0 -0
  27. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/src/types/cell.rs +0 -0
  28. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/src/types/errors.rs +0 -0
  29. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/src/types/mod.rs +0 -0
  30. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/src/types/sheet.rs +0 -0
  31. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/src/types/table.rs +0 -0
  32. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/__init__.py +0 -0
  33. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/conftest.py +0 -0
  34. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/create_empty_merge_fixture.py +0 -0
  35. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/create_richtext_fixture.py +0 -0
  36. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/create_test_fixture.py +0 -0
  37. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/any_sheets.ods +0 -0
  38. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/any_sheets.xls +0 -0
  39. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/any_sheets.xlsb +0 -0
  40. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/any_sheets.xlsx +0 -0
  41. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/base.ods +0 -0
  42. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/base.xls +0 -0
  43. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/base.xlsb +0 -0
  44. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/base.xlsx +0 -0
  45. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/dropdown_test.xlsx +0 -0
  46. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/empty_file.ods +0 -0
  47. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/empty_file.xlsb +0 -0
  48. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/empty_file.xlsx +0 -0
  49. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/empty_merge_test.xlsx +0 -0
  50. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/formula_test.xlsx +0 -0
  51. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/grid_test.xlsx +0 -0
  52. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/image_test.xlsx +0 -0
  53. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/issue139.xlsx +0 -0
  54. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/multi_image_test.xlsx +0 -0
  55. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/password.ods +0 -0
  56. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/password.xls +0 -0
  57. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/password.xlsb +0 -0
  58. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/password.xlsx +0 -0
  59. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/richtext_test.xlsx +0 -0
  60. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/data/table-multiple.xlsx +0 -0
  61. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/test_base.py +0 -0
  62. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/test_images.py +0 -0
  63. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/test_pandas.py +0 -0
  64. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/tests/test_sheet_type.py +0 -0
  65. {python_calamine_reducto-0.7.6 → python_calamine_reducto-0.7.15}/uv.lock +0 -0
@@ -0,0 +1,140 @@
1
+ name: Release
2
+
3
+ # Build wheels + sdist and (optionally) publish to PyPI.
4
+ #
5
+ # Manual only: trigger from the Actions tab -> "Release" -> "Run workflow".
6
+ # The version published is whatever `version` in Cargo.toml is on the ref you
7
+ # run from (maturin reads it from there), so run this from `main` after the
8
+ # version-bump PR has merged.
9
+ #
10
+ # - publish = "no" (default): builds all wheels + sdist as a dry run. Use
11
+ # this to verify the matrix before committing to a version.
12
+ # - publish = "yes": also uploads to PyPI using the PYPI_API_TOKEN secret.
13
+ #
14
+ # PyPI filenames are immutable: a version can never be re-uploaded once any
15
+ # file for it lands, and a deleted file's name is burned forever. Re-running
16
+ # with publish=yes for an already-published version is safe — `skip-existing`
17
+ # skips files already on PyPI instead of failing. To change a release you must
18
+ # bump the version.
19
+
20
+ on:
21
+ workflow_dispatch:
22
+ inputs:
23
+ publish:
24
+ description: "Upload to PyPI? 'no' = build-only dry run; 'yes' = publish."
25
+ type: choice
26
+ options:
27
+ - "no"
28
+ - "yes"
29
+ default: "no"
30
+
31
+ permissions:
32
+ contents: read
33
+
34
+ env:
35
+ # Private Rust deps (reductoai/calamine, reductoai/ssfmt) are fetched over
36
+ # https with a token-embedded insteadOf rewrite; the CLI fetcher mirrors CI.
37
+ CARGO_NET_GIT_FETCH_WITH_CLI: "true"
38
+
39
+ jobs:
40
+ build-linux:
41
+ name: wheels linux-${{ matrix.target }}
42
+ runs-on: ubuntu-latest
43
+ strategy:
44
+ fail-fast: false
45
+ matrix:
46
+ # x86_64 is what every prod container runs on (required).
47
+ # aarch64 is the Graviton / ARM Linux target.
48
+ target:
49
+ - x86_64
50
+ - aarch64
51
+ steps:
52
+ - uses: actions/checkout@v6
53
+
54
+ - name: Build wheels
55
+ uses: PyO3/maturin-action@v1
56
+ with:
57
+ target: ${{ matrix.target }}
58
+ # glibc/manylinux only — all Reducto images are Debian/Chainguard glibc.
59
+ manylinux: "2_17"
60
+ args: --release --out dist --interpreter 3.11 3.12 3.13
61
+ # Runs as root inside the manylinux container before the build, so
62
+ # cargo can fetch the private reductoai/* git deps.
63
+ before-script-linux: |
64
+ git config --global url."https://x-access-token:${{ secrets.GH_PAT }}@github.com/".insteadOf "https://github.com/"
65
+
66
+ - uses: actions/upload-artifact@v4
67
+ with:
68
+ name: wheels-linux-${{ matrix.target }}
69
+ path: dist
70
+
71
+ build-macos:
72
+ name: wheels macos-${{ matrix.target }}
73
+ runs-on: macos-14
74
+ strategy:
75
+ fail-fast: false
76
+ matrix:
77
+ # arm64 is what dev laptops (Apple Silicon) use (required).
78
+ # x86_64 covers Intel Macs (optional).
79
+ target:
80
+ - aarch64
81
+ - x86_64
82
+ steps:
83
+ - uses: actions/checkout@v6
84
+
85
+ - name: Configure git for private deps
86
+ run: git config --global url."https://x-access-token:${{ secrets.GH_PAT }}@github.com/".insteadOf "https://github.com/"
87
+
88
+ - name: Build wheels
89
+ uses: PyO3/maturin-action@v1
90
+ with:
91
+ target: ${{ matrix.target }}
92
+ args: --release --out dist --interpreter 3.11 3.12 3.13
93
+
94
+ - uses: actions/upload-artifact@v4
95
+ with:
96
+ name: wheels-macos-${{ matrix.target }}
97
+ path: dist
98
+
99
+ sdist:
100
+ name: sdist
101
+ runs-on: ubuntu-latest
102
+ steps:
103
+ - uses: actions/checkout@v6
104
+
105
+ # `maturin sdist` runs `cargo metadata`, which must resolve the private
106
+ # reductoai/* git deps — so it needs the same credential rewrite as the
107
+ # wheel builds.
108
+ - name: Configure git for private deps
109
+ run: git config --global url."https://x-access-token:${{ secrets.GH_PAT }}@github.com/".insteadOf "https://github.com/"
110
+
111
+ - name: Build sdist
112
+ uses: PyO3/maturin-action@v1
113
+ with:
114
+ command: sdist
115
+ args: --out dist
116
+
117
+ - uses: actions/upload-artifact@v4
118
+ with:
119
+ name: sdist
120
+ path: dist
121
+
122
+ publish:
123
+ name: publish to PyPI
124
+ # Only uploads when the operator explicitly chose publish=yes.
125
+ if: ${{ inputs.publish == 'yes' }}
126
+ needs: [build-linux, build-macos, sdist]
127
+ runs-on: ubuntu-latest
128
+ steps:
129
+ - uses: actions/download-artifact@v4
130
+ with:
131
+ path: dist
132
+ merge-multiple: true
133
+
134
+ - name: Publish to PyPI
135
+ uses: pypa/gh-action-pypi-publish@release/v1
136
+ with:
137
+ packages-dir: dist
138
+ password: ${{ secrets.PYPI_API_TOKEN }}
139
+ # Idempotent re-runs: skip files already on PyPI instead of failing.
140
+ skip-existing: true
@@ -80,7 +80,7 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
80
80
  [[package]]
81
81
  name = "calamine"
82
82
  version = "0.32.0"
83
- source = "git+https://github.com/reductoai/calamine.git?branch=main#5dd02dd06cc910f7ad6116da7eb540af0e1fcea6"
83
+ source = "git+https://github.com/reductoai/calamine.git?branch=main#89ef3e2e1cbbfe06cf61fd0ee1c7d54dff235a0e"
84
84
  dependencies = [
85
85
  "atoi_simd",
86
86
  "byteorder",
@@ -406,6 +406,16 @@ dependencies = [
406
406
  "hashbrown 0.16.1",
407
407
  ]
408
408
 
409
+ [[package]]
410
+ name = "matrixmultiply"
411
+ version = "0.3.10"
412
+ source = "registry+https://github.com/rust-lang/crates.io-index"
413
+ checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08"
414
+ dependencies = [
415
+ "autocfg",
416
+ "rawpointer",
417
+ ]
418
+
409
419
  [[package]]
410
420
  name = "memchr"
411
421
  version = "2.8.0"
@@ -422,6 +432,39 @@ dependencies = [
422
432
  "simd-adler32",
423
433
  ]
424
434
 
435
+ [[package]]
436
+ name = "ndarray"
437
+ version = "0.17.2"
438
+ source = "registry+https://github.com/rust-lang/crates.io-index"
439
+ checksum = "520080814a7a6b4a6e9070823bb24b4531daac8c4627e08ba5de8c5ef2f2752d"
440
+ dependencies = [
441
+ "matrixmultiply",
442
+ "num-complex",
443
+ "num-integer",
444
+ "num-traits",
445
+ "portable-atomic",
446
+ "portable-atomic-util",
447
+ "rawpointer",
448
+ ]
449
+
450
+ [[package]]
451
+ name = "num-complex"
452
+ version = "0.4.6"
453
+ source = "registry+https://github.com/rust-lang/crates.io-index"
454
+ checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
455
+ dependencies = [
456
+ "num-traits",
457
+ ]
458
+
459
+ [[package]]
460
+ name = "num-integer"
461
+ version = "0.1.46"
462
+ source = "registry+https://github.com/rust-lang/crates.io-index"
463
+ checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
464
+ dependencies = [
465
+ "num-traits",
466
+ ]
467
+
425
468
  [[package]]
426
469
  name = "num-traits"
427
470
  version = "0.2.19"
@@ -431,6 +474,22 @@ dependencies = [
431
474
  "autocfg",
432
475
  ]
433
476
 
477
+ [[package]]
478
+ name = "numpy"
479
+ version = "0.28.0"
480
+ source = "registry+https://github.com/rust-lang/crates.io-index"
481
+ checksum = "778da78c64ddc928ebf5ad9df5edf0789410ff3bdbf3619aed51cd789a6af1e2"
482
+ dependencies = [
483
+ "libc",
484
+ "ndarray",
485
+ "num-complex",
486
+ "num-integer",
487
+ "num-traits",
488
+ "pyo3",
489
+ "pyo3-build-config",
490
+ "rustc-hash",
491
+ ]
492
+
434
493
  [[package]]
435
494
  name = "once_cell"
436
495
  version = "1.21.4"
@@ -443,6 +502,15 @@ version = "1.13.1"
443
502
  source = "registry+https://github.com/rust-lang/crates.io-index"
444
503
  checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
445
504
 
505
+ [[package]]
506
+ name = "portable-atomic-util"
507
+ version = "0.2.6"
508
+ source = "registry+https://github.com/rust-lang/crates.io-index"
509
+ checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3"
510
+ dependencies = [
511
+ "portable-atomic",
512
+ ]
513
+
446
514
  [[package]]
447
515
  name = "prettyplease"
448
516
  version = "0.2.37"
@@ -544,10 +612,11 @@ dependencies = [
544
612
 
545
613
  [[package]]
546
614
  name = "python-calamine-reducto"
547
- version = "0.7.6"
615
+ version = "0.7.15"
548
616
  dependencies = [
549
617
  "calamine",
550
618
  "chrono",
619
+ "numpy",
551
620
  "pyo3",
552
621
  "pyo3-build-config",
553
622
  "pyo3-file",
@@ -588,6 +657,18 @@ version = "6.0.0"
588
657
  source = "registry+https://github.com/rust-lang/crates.io-index"
589
658
  checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
590
659
 
660
+ [[package]]
661
+ name = "rawpointer"
662
+ version = "0.2.1"
663
+ source = "registry+https://github.com/rust-lang/crates.io-index"
664
+ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
665
+
666
+ [[package]]
667
+ name = "rustc-hash"
668
+ version = "2.1.2"
669
+ source = "registry+https://github.com/rust-lang/crates.io-index"
670
+ checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
671
+
591
672
  [[package]]
592
673
  name = "rustix"
593
674
  version = "1.1.4"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "python-calamine-reducto"
3
- version = "0.7.6"
3
+ version = "0.7.15"
4
4
  edition = "2021"
5
5
  readme = "README.md"
6
6
 
@@ -18,6 +18,7 @@ pyo3 = { version = "0.28.2", features = [
18
18
  chrono = { version = "0.4.42", features = ["serde"] }
19
19
  ssfmt = { git = "https://github.com/reductoai/ssfmt", branch = "main", features = ["chrono"] }
20
20
  pyo3-file = { git = "https://github.com/dimastbk/pyo3-file.git", rev = "b0a5b260d13c6df14ea021b06c071a6f389fa805" }
21
+ numpy = "0.28"
21
22
 
22
23
  [build-dependencies]
23
24
  pyo3-build-config = "0.28.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-calamine-reducto
3
- Version: 0.7.6
3
+ Version: 0.7.15
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Programming Language :: Rust
6
6
  Classifier: Programming Language :: Python :: 3.11