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.
- python_calamine-0.9.0/.github/pyodide/pylock.315.toml +57 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/.github/workflows/CI.yml +44 -33
- {python_calamine-0.8.2 → python_calamine-0.9.0}/Cargo.lock +13 -13
- {python_calamine-0.8.2 → python_calamine-0.9.0}/Cargo.toml +1 -1
- {python_calamine-0.8.2 → python_calamine-0.9.0}/PKG-INFO +3 -3
- {python_calamine-0.8.2 → python_calamine-0.9.0}/pyproject.toml +3 -3
- {python_calamine-0.8.2 → python_calamine-0.9.0}/src/types/sheet.rs +5 -1
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/test_base.py +18 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/uv.lock +195 -563
- {python_calamine-0.8.2 → python_calamine-0.9.0}/.github/dependabot.yml +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/.github/pyodide/pylock.314.toml +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/.github/pyodide/requirements.in +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/.gitignore +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/.pre-commit-config.yaml +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/LICENSE +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/README.md +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/build.rs +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/python/python_calamine/__init__.py +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/python/python_calamine/_python_calamine.pyi +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/python/python_calamine/py.typed +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/src/lib.rs +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/src/types/cell.rs +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/src/types/errors.rs +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/src/types/mod.rs +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/src/types/table.rs +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/src/types/workbook.rs +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/__init__.py +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/conftest.py +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/any_sheets.ods +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/any_sheets.xls +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/any_sheets.xlsb +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/any_sheets.xlsx +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/base.ods +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/base.xls +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/base.xlsb +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/base.xlsx +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/empty_file.ods +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/empty_file.xlsb +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/empty_file.xlsx +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/issue139.xlsx +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/password.ods +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/password.xls +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/password.xlsb +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/password.xlsx +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/data/table-multiple.xlsx +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/test_pandas.py +0 -0
- {python_calamine-0.8.2 → python_calamine-0.9.0}/tests/test_sheet_type.py +0 -0
- {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
|
-
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
158
|
+
uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
|
|
155
159
|
|
|
156
|
-
- uses: actions/setup-python@
|
|
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@
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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@
|
|
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@
|
|
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.
|
|
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@
|
|
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@
|
|
313
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
309
314
|
with:
|
|
310
315
|
persist-credentials: false
|
|
311
316
|
|
|
312
|
-
- uses: astral-sh/setup-uv@
|
|
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
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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.
|
|
50
|
+
version = "0.36.1"
|
|
51
51
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
52
|
-
checksum = "
|
|
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.
|
|
310
|
+
version = "0.29.3"
|
|
311
311
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
312
|
-
checksum = "
|
|
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.
|
|
325
|
+
version = "0.29.3"
|
|
326
326
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
327
|
-
checksum = "
|
|
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.
|
|
334
|
+
version = "0.29.3"
|
|
335
335
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
336
|
-
checksum = "
|
|
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.
|
|
352
|
+
version = "0.29.3"
|
|
353
353
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
354
|
-
checksum = "
|
|
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.
|
|
364
|
+
version = "0.29.3"
|
|
365
365
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
366
|
-
checksum = "
|
|
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.
|
|
376
|
+
version = "0.9.0"
|
|
377
377
|
dependencies = [
|
|
378
378
|
"calamine",
|
|
379
379
|
"chrono",
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-calamine
|
|
3
|
-
Version: 0.
|
|
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.
|
|
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.
|
|
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.
|
|
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().
|
|
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")
|