python-calamine 0.8.2__tar.gz → 0.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. python_calamine-0.9.0/.github/pyodide/pylock.315.toml +57 -0
  2. {python_calamine-0.8.2 → python_calamine-0.9.0}/.github/workflows/CI.yml +44 -33
  3. {python_calamine-0.8.2 → python_calamine-0.9.0}/Cargo.lock +13 -13
  4. {python_calamine-0.8.2 → python_calamine-0.9.0}/Cargo.toml +1 -1
  5. {python_calamine-0.8.2 → python_calamine-0.9.0}/PKG-INFO +3 -3
  6. {python_calamine-0.8.2 → python_calamine-0.9.0}/pyproject.toml +3 -3
  7. {python_calamine-0.8.2 → python_calamine-0.9.0}/src/types/sheet.rs +5 -1
  8. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/test_base.py +18 -0
  9. {python_calamine-0.8.2 → python_calamine-0.9.0}/uv.lock +195 -563
  10. {python_calamine-0.8.2 → python_calamine-0.9.0}/.github/dependabot.yml +0 -0
  11. {python_calamine-0.8.2 → python_calamine-0.9.0}/.github/pyodide/pylock.314.toml +0 -0
  12. {python_calamine-0.8.2 → python_calamine-0.9.0}/.github/pyodide/requirements.in +0 -0
  13. {python_calamine-0.8.2 → python_calamine-0.9.0}/.gitignore +0 -0
  14. {python_calamine-0.8.2 → python_calamine-0.9.0}/.pre-commit-config.yaml +0 -0
  15. {python_calamine-0.8.2 → python_calamine-0.9.0}/LICENSE +0 -0
  16. {python_calamine-0.8.2 → python_calamine-0.9.0}/README.md +0 -0
  17. {python_calamine-0.8.2 → python_calamine-0.9.0}/build.rs +0 -0
  18. {python_calamine-0.8.2 → python_calamine-0.9.0}/python/python_calamine/__init__.py +0 -0
  19. {python_calamine-0.8.2 → python_calamine-0.9.0}/python/python_calamine/_python_calamine.pyi +0 -0
  20. {python_calamine-0.8.2 → python_calamine-0.9.0}/python/python_calamine/py.typed +0 -0
  21. {python_calamine-0.8.2 → python_calamine-0.9.0}/src/lib.rs +0 -0
  22. {python_calamine-0.8.2 → python_calamine-0.9.0}/src/types/cell.rs +0 -0
  23. {python_calamine-0.8.2 → python_calamine-0.9.0}/src/types/errors.rs +0 -0
  24. {python_calamine-0.8.2 → python_calamine-0.9.0}/src/types/mod.rs +0 -0
  25. {python_calamine-0.8.2 → python_calamine-0.9.0}/src/types/table.rs +0 -0
  26. {python_calamine-0.8.2 → python_calamine-0.9.0}/src/types/workbook.rs +0 -0
  27. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/__init__.py +0 -0
  28. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/conftest.py +0 -0
  29. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/any_sheets.ods +0 -0
  30. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/any_sheets.xls +0 -0
  31. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/any_sheets.xlsb +0 -0
  32. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/any_sheets.xlsx +0 -0
  33. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/base.ods +0 -0
  34. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/base.xls +0 -0
  35. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/base.xlsb +0 -0
  36. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/base.xlsx +0 -0
  37. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/empty_file.ods +0 -0
  38. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/empty_file.xlsb +0 -0
  39. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/empty_file.xlsx +0 -0
  40. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/issue139.xlsx +0 -0
  41. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/password.ods +0 -0
  42. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/password.xls +0 -0
  43. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/password.xlsb +0 -0
  44. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/password.xlsx +0 -0
  45. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/table-multiple.xlsx +0 -0
  46. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/test_pandas.py +0 -0
  47. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/test_sheet_type.py +0 -0
  48. {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/test_tables.py +0 -0
@@ -0,0 +1,57 @@
1
+ lock-version = "1.0"
2
+ created-by = "pip"
3
+
4
+ [[packages]]
5
+ name = "iniconfig"
6
+ version = "2.3.1"
7
+
8
+ [[packages.wheels]]
9
+ name = "iniconfig-2.3.1-py3-none-any.whl"
10
+ url = "https://files.pythonhosted.org/packages/56/43/4ca9e49d27a1fcf6bece6f6aec0ea46bb9112489b93d4b688fb415457bdb/iniconfig-2.3.1-py3-none-any.whl"
11
+
12
+ [packages.wheels.hashes]
13
+ sha256 = "9121e2c1fdb355232495be3194c8dfe87ccc2d5dee45947b78e68f499790d7a7"
14
+
15
+ [[packages]]
16
+ name = "packaging"
17
+ version = "26.3"
18
+
19
+ [[packages.wheels]]
20
+ name = "packaging-26.3-py3-none-any.whl"
21
+ url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl"
22
+
23
+ [packages.wheels.hashes]
24
+ sha256 = "d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c"
25
+
26
+ [[packages]]
27
+ name = "pluggy"
28
+ version = "1.7.0"
29
+
30
+ [[packages.wheels]]
31
+ name = "pluggy-1.7.0-py3-none-any.whl"
32
+ url = "https://files.pythonhosted.org/packages/40/9e/2b38731e0fc536806f16490e1a12d7f0dc2a1235aa8cc07bcc75416a7daa/pluggy-1.7.0-py3-none-any.whl"
33
+
34
+ [packages.wheels.hashes]
35
+ sha256 = "7dd7b0d8832ba3cb632c306926ded123429211b83641b35dc5c41ad2d34f9bec"
36
+
37
+ [[packages]]
38
+ name = "pygments"
39
+ version = "2.21.0"
40
+
41
+ [[packages.wheels]]
42
+ name = "pygments-2.21.0-py3-none-any.whl"
43
+ url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl"
44
+
45
+ [packages.wheels.hashes]
46
+ sha256 = "2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9"
47
+
48
+ [[packages]]
49
+ name = "pytest"
50
+ version = "9.1.1"
51
+
52
+ [[packages.wheels]]
53
+ name = "pytest-9.1.1-py3-none-any.whl"
54
+ url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl"
55
+
56
+ [packages.wheels.hashes]
57
+ sha256 = "37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c"
@@ -26,11 +26,11 @@ jobs:
26
26
  fail-fast: false
27
27
  matrix:
28
28
  python-version:
29
- - "3.10"
30
29
  - "3.11"
31
30
  - "3.12"
32
31
  - "3.13"
33
32
  - "3.14"
33
+ - "3.15"
34
34
  pandas-version:
35
35
  - "2.3.*"
36
36
  - "3.0.*"
@@ -40,9 +40,11 @@ jobs:
40
40
  pandas-version: "none"
41
41
  - python-version: "3.14t"
42
42
  pandas-version: "3.0.*"
43
- exclude:
44
- - python-version: "3.10"
43
+ - python-version: "3.15t"
45
44
  pandas-version: "3.0.*"
45
+ exclude:
46
+ - python-version: "3.15"
47
+ pandas-version: "2.3.*"
46
48
 
47
49
  runs-on: ubuntu-latest
48
50
 
@@ -50,7 +52,7 @@ jobs:
50
52
  PYTHON: ${{ matrix.python-version }}
51
53
 
52
54
  steps:
53
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
55
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
54
56
  with:
55
57
  persist-credentials: false
56
58
 
@@ -61,12 +63,12 @@ jobs:
61
63
 
62
64
  - id: cache-rust
63
65
  name: cache rust
64
- uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
66
+ uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
65
67
  with:
66
68
  key: v3
67
69
 
68
70
  - name: set up python
69
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
71
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
70
72
  with:
71
73
  python-version: ${{ matrix.python-version }}
72
74
  allow-prereleases: true
@@ -108,20 +110,22 @@ jobs:
108
110
  include:
109
111
  - python-version: "3.14"
110
112
  pylock-suffix: "314"
113
+ - python-version: "3.15"
114
+ pylock-suffix: "315"
111
115
 
112
116
  steps:
113
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
117
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
114
118
  with:
115
119
  persist-credentials: false
116
120
 
117
121
  - name: install uv
118
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
122
+ uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
119
123
  with:
120
124
  python-version: ${{ matrix.python-version }}
121
125
  enable-cache: true # zizmor: ignore[cache-poisoning] -- Job does not produce release artifacts and does not have sensitive permissions
122
126
 
123
127
  - name: get dist artifacts
124
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
128
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
125
129
  with:
126
130
  name: python_calamine_pypi_files_pyemscripten_${{ matrix.python-version }}
127
131
  path: dist
@@ -141,7 +145,7 @@ jobs:
141
145
  runs-on: ubuntu-latest
142
146
 
143
147
  steps:
144
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
148
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
145
149
  with:
146
150
  persist-credentials: false
147
151
 
@@ -151,9 +155,9 @@ jobs:
151
155
  components: rustfmt, clippy
152
156
 
153
157
  - name: cache rust
154
- uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
158
+ uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
155
159
 
156
- - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
160
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
157
161
  with:
158
162
  python-version: "3.14"
159
163
 
@@ -183,7 +187,7 @@ jobs:
183
187
  runs-on: ubuntu-latest
184
188
  steps:
185
189
  - name: Decide whether the needed jobs succeeded or failed
186
- uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2
190
+ uses: re-actors/alls-green@b5b5b37504aa4183270bd3d855c52a67f212be35 # v1.3.0
187
191
  with:
188
192
  jobs: ${{ toJSON(needs) }}
189
193
 
@@ -212,15 +216,15 @@ jobs:
212
216
  - os: linux
213
217
  manylinux: auto
214
218
  target: armv7
215
- interpreter: 3.10 3.11 3.12 3.13 3.14 3.14t
219
+ interpreter: 3.11 3.12 3.13 3.14 3.14t 3.15 3.15t
216
220
  - os: linux
217
221
  manylinux: auto
218
222
  target: ppc64le
219
- interpreter: 3.10 3.11 3.12 3.13 3.14 3.14t
223
+ interpreter: 3.11 3.12 3.13 3.14 3.14t 3.15 3.15t
220
224
  - os: linux
221
225
  manylinux: auto
222
226
  target: s390x
223
- interpreter: 3.10 3.11 3.12 3.13 3.14 3.14t
227
+ interpreter: 3.11 3.12 3.13 3.14 3.14t 3.15 3.15t
224
228
 
225
229
  # musllinux
226
230
  - os: linux
@@ -242,10 +246,10 @@ jobs:
242
246
  # windows
243
247
  - os: windows
244
248
  target: x86_64
245
- interpreter: 3.10 3.11 3.12 3.13 3.14 3.14t
249
+ interpreter: 3.11 3.12 3.13 3.14 3.14t 3.15 3.15t
246
250
  - os: windows
247
251
  target: i686
248
- interpreter: 3.10 3.11 3.12 3.13 3.14
252
+ interpreter: 3.11 3.12 3.13 3.14 3.15
249
253
  - os: windows
250
254
  target: aarch64
251
255
  runs-on: windows-11-arm
@@ -257,12 +261,12 @@ jobs:
257
261
 
258
262
  runs-on: ${{ matrix.runs-on || format('{0}-latest', (matrix.os == 'linux' && 'ubuntu') || matrix.os) }}
259
263
  steps:
260
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
264
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
261
265
  with:
262
266
  persist-credentials: false
263
267
 
264
268
  - name: set up python
265
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
269
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
266
270
  with:
267
271
  python-version: "3.14"
268
272
 
@@ -284,14 +288,14 @@ jobs:
284
288
  with:
285
289
  target: ${{ matrix.target }}
286
290
  manylinux: ${{ matrix.manylinux || 'auto' }}
287
- args: --release --out dist --interpreter ${{ matrix.interpreter || '3.10 3.11 3.12 3.13 3.14 3.14t pypy3.11' }}
291
+ args: --release --out dist --interpreter ${{ matrix.interpreter || '3.11 3.12 3.13 3.14 3.14t 3.15 3.15t pypy3.11' }}
288
292
  rust-toolchain: stable
289
293
 
290
294
  - run: ${{ (matrix.os == 'windows' && 'dir') || 'ls -lh' }} dist/
291
295
 
292
296
  - run: twine check --strict dist/*
293
297
 
294
- - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
298
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
295
299
  with:
296
300
  name: python_calamine_pypi_files_${{ matrix.os }}_${{ matrix.target }}_${{ matrix.manylinux || 'auto' }}
297
301
  path: dist
@@ -304,12 +308,13 @@ jobs:
304
308
  matrix:
305
309
  include:
306
310
  - python-version: "3.14"
311
+ - python-version: "3.15"
307
312
  steps:
308
- - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
313
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
309
314
  with:
310
315
  persist-credentials: false
311
316
 
312
- - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
317
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
313
318
  with:
314
319
  python-version: ${{ matrix.python-version }}
315
320
  enable-cache: ${{ !startsWith(github.ref, 'refs/tags/') }} # zizmor: ignore[cache-poisoning]
@@ -319,10 +324,16 @@ jobs:
319
324
  - name: Get pyodide config
320
325
  id: pyodide-config
321
326
  run: |
322
- echo "rust-toolchain=$(uv run pyodide config get rust_toolchain)" >> "$GITHUB_OUTPUT"
323
- echo "emscripten-version=$(uv run pyodide config get emscripten_version)" >> "$GITHUB_OUTPUT"
324
- echo "pyodide-abi-version=$(uv run pyodide config get pyodide_abi_version)" >> "$GITHUB_OUTPUT"
325
- echo "rustflags=$(uv run pyodide config get rustflags)" >> "$GITHUB_OUTPUT"
327
+ rust_toolchain=$(uv run pyodide config get rust_toolchain)
328
+ emscripten_version=$(uv run pyodide config get emscripten_version)
329
+ pyodide_abi_version=$(uv run pyodide config get pyodide_abi_version)
330
+ rustflags=$(uv run pyodide config get rustflags)
331
+ {
332
+ echo "rust-toolchain=$rust_toolchain"
333
+ echo "emscripten-version=$emscripten_version"
334
+ echo "pyodide-abi-version=$pyodide_abi_version"
335
+ echo "rustflags=$rustflags"
336
+ } >> "$GITHUB_OUTPUT"
326
337
 
327
338
  - uses: emscripten-core/setup-emsdk@4528d102f7230f0e7b276855c01ea1159be0e984 # v16
328
339
  with:
@@ -343,7 +354,7 @@ jobs:
343
354
 
344
355
  - run: ls -lh dist/
345
356
 
346
- - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
357
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
347
358
  with:
348
359
  name: python_calamine_pypi_files_pyemscripten_${{ matrix.python-version }}
349
360
  path: dist
@@ -363,14 +374,14 @@ jobs:
363
374
 
364
375
  steps:
365
376
  - name: Download All Artifacts
366
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
377
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
367
378
  with:
368
379
  path: dist
369
380
  pattern: python_calamine_pypi_files_*
370
381
  merge-multiple: true
371
382
 
372
383
  - name: Publish package distributions to PyPI
373
- uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1.14
384
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1.14
374
385
 
375
386
  gh-release:
376
387
  needs: [build, build-pyemscripten, check]
@@ -383,14 +394,14 @@ jobs:
383
394
 
384
395
  steps:
385
396
  - name: Download All Artifacts
386
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
397
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
387
398
  with:
388
399
  path: dist
389
400
  pattern: python_calamine_pypi_files_*
390
401
  merge-multiple: true
391
402
 
392
403
  - name: Upload to GitHub
393
- uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1
404
+ uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3
394
405
  with:
395
406
  generate_release_notes: true
396
407
  files: |
@@ -47,9 +47,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
47
47
 
48
48
  [[package]]
49
49
  name = "calamine"
50
- version = "0.36.0"
50
+ version = "0.36.1"
51
51
  source = "registry+https://github.com/rust-lang/crates.io-index"
52
- checksum = "6975084f43060e56343ffba7f9731fa52a7dcf2e1cd8e2459fd4c6bf4a1bff59"
52
+ checksum = "5fa68281b1a76b54a62156474adb06bb380a67e07dd60656e3217152b42183f3"
53
53
  dependencies = [
54
54
  "atoi_simd",
55
55
  "byteorder",
@@ -307,9 +307,9 @@ dependencies = [
307
307
 
308
308
  [[package]]
309
309
  name = "pyo3"
310
- version = "0.29.0"
310
+ version = "0.29.3"
311
311
  source = "registry+https://github.com/rust-lang/crates.io-index"
312
- checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c"
312
+ checksum = "700d18fa267b73b9b521fd7e13580e2f446916f176cacee1ab63fcc8191f1655"
313
313
  dependencies = [
314
314
  "chrono",
315
315
  "libc",
@@ -322,18 +322,18 @@ dependencies = [
322
322
 
323
323
  [[package]]
324
324
  name = "pyo3-build-config"
325
- version = "0.29.0"
325
+ version = "0.29.3"
326
326
  source = "registry+https://github.com/rust-lang/crates.io-index"
327
- checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078"
327
+ checksum = "7b3fc0c4d08f6bb10e71fe39dfb9e2f59c6eb6854e22ec8092f50c69a4499adb"
328
328
  dependencies = [
329
329
  "target-lexicon",
330
330
  ]
331
331
 
332
332
  [[package]]
333
333
  name = "pyo3-ffi"
334
- version = "0.29.0"
334
+ version = "0.29.3"
335
335
  source = "registry+https://github.com/rust-lang/crates.io-index"
336
- checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b"
336
+ checksum = "dfc0b8e19df29aad7086cf977bb0c2a2f143e30567eb113e9cf72b62ca698330"
337
337
  dependencies = [
338
338
  "libc",
339
339
  "pyo3-build-config",
@@ -349,9 +349,9 @@ dependencies = [
349
349
 
350
350
  [[package]]
351
351
  name = "pyo3-macros"
352
- version = "0.29.0"
352
+ version = "0.29.3"
353
353
  source = "registry+https://github.com/rust-lang/crates.io-index"
354
- checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771"
354
+ checksum = "6100e8a4b5eba53afaa5ed078364851a0b2499c553a44c31026b929049b49dc6"
355
355
  dependencies = [
356
356
  "proc-macro2",
357
357
  "pyo3-macros-backend",
@@ -361,9 +361,9 @@ dependencies = [
361
361
 
362
362
  [[package]]
363
363
  name = "pyo3-macros-backend"
364
- version = "0.29.0"
364
+ version = "0.29.3"
365
365
  source = "registry+https://github.com/rust-lang/crates.io-index"
366
- checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362"
366
+ checksum = "6143877a16e82b5a727b7127ff4cd86858a24a28d745d72f43e6f227c7b1bdb3"
367
367
  dependencies = [
368
368
  "heck",
369
369
  "proc-macro2",
@@ -373,7 +373,7 @@ dependencies = [
373
373
 
374
374
  [[package]]
375
375
  name = "python-calamine"
376
- version = "0.8.2"
376
+ version = "0.9.0"
377
377
  dependencies = [
378
378
  "calamine",
379
379
  "chrono",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "python-calamine"
3
- version = "0.8.2"
3
+ version = "0.9.0"
4
4
  edition = "2021"
5
5
  readme = "README.md"
6
6
 
@@ -1,18 +1,18 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-calamine
3
- Version: 0.8.2
3
+ Version: 0.9.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Programming Language :: Rust
6
- Classifier: Programming Language :: Python :: 3.10
7
6
  Classifier: Programming Language :: Python :: 3.11
8
7
  Classifier: Programming Language :: Python :: 3.12
9
8
  Classifier: Programming Language :: Python :: 3.13
10
9
  Classifier: Programming Language :: Python :: 3.14
10
+ Classifier: Programming Language :: Python :: 3.15
11
11
  License-File: LICENSE
12
12
  Summary: Python binding for Rust's library for reading excel and odf file - calamine
13
13
  Author-email: Dmitriy <dimastbk@proton.me>
14
14
  License-Expression: MIT
15
- Requires-Python: >=3.10
15
+ Requires-Python: >=3.11
16
16
  Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
17
17
  Project-URL: homepage, https://github.com/dimastbk/python-calamine
18
18
  Project-URL: source, https://github.com/dimastbk/python-calamine
@@ -2,17 +2,17 @@
2
2
  name = "python-calamine"
3
3
  description = "Python binding for Rust's library for reading excel and odf file - calamine"
4
4
  readme = "README.md"
5
- requires-python = ">=3.10"
5
+ requires-python = ">=3.11"
6
6
  license = "MIT"
7
7
  authors = [{ name = "Dmitriy", email = "dimastbk@proton.me" }]
8
8
  classifiers = [
9
9
  "Development Status :: 4 - Beta",
10
10
  "Programming Language :: Rust",
11
- "Programming Language :: Python :: 3.10",
12
11
  "Programming Language :: Python :: 3.11",
13
12
  "Programming Language :: Python :: 3.12",
14
13
  "Programming Language :: Python :: 3.13",
15
14
  "Programming Language :: Python :: 3.14",
15
+ "Programming Language :: Python :: 3.15",
16
16
  ]
17
17
  dynamic = ["version"]
18
18
 
@@ -37,7 +37,7 @@ multi_line_output = 3
37
37
  profile = "black"
38
38
 
39
39
  [tool.mypy]
40
- python_version = "3.10"
40
+ python_version = "3.11"
41
41
  packages = ["python_calamine"]
42
42
  ignore_missing_imports = false
43
43
  disallow_untyped_defs = true
@@ -250,7 +250,7 @@ impl CalamineCellIterator {
250
250
  CalamineCellIterator {
251
251
  empty_row,
252
252
  position: 0,
253
- start: range.start().unwrap(),
253
+ start: range.start().unwrap_or_default(),
254
254
  iter: unsafe {
255
255
  std::mem::transmute::<
256
256
  calamine::Rows<'_, calamine::Data>,
@@ -269,6 +269,10 @@ impl CalamineCellIterator {
269
269
  }
270
270
 
271
271
  fn __next__(mut slf: PyRefMut<'_, Self>) -> PyResult<Option<Bound<'_, PyList>>> {
272
+ if slf.range.is_empty() {
273
+ return Ok(None);
274
+ }
275
+
272
276
  slf.position += 1;
273
277
  if slf.position > slf.start.0 {
274
278
  slf.iter
@@ -222,6 +222,24 @@ def test_xlsx_iter_rows():
222
222
  assert data == list(reader.get_sheet_by_index(0).iter_rows())
223
223
 
224
224
 
225
+ @pytest.mark.parametrize("filename", ["base.xlsx", "base.xls", "base.xlsb", "base.ods"])
226
+ def test_iter_rows_empty_sheet(filename):
227
+ reader = CalamineWorkbook.from_object(PATH / filename)
228
+ sheet = reader.get_sheet_by_index(1)
229
+
230
+ assert sheet.start is None
231
+ assert sheet.end is None
232
+ rows = sheet.iter_rows()
233
+
234
+ assert list(rows) == []
235
+ for _ in range(3):
236
+ with pytest.raises(StopIteration):
237
+ next(rows)
238
+
239
+ sentinel = object()
240
+ assert next(rows, sentinel) is sentinel
241
+
242
+
225
243
  def test_nrows():
226
244
  reader = CalamineWorkbook.from_object(PATH / "base.xlsx")
227
245
  sheet = reader.get_sheet_by_name("Sheet3")