Skip to content

Commit 8f3e861

Browse files
authored
fix: filter empty rows in get_data_rows_after_start to prevent ValueError on pagination boundary (#3878)
* fix: filter empty rows in get_data_rows_after_start to prevent ValueError on pagination boundary * fix: issue * fix: issue
1 parent 410d0d4 commit 8f3e861

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

sheets/utils.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,12 @@ def get_data_rows_after_start(
350350
**kwargs,
351351
)
352352
request_count += 1
353-
yield from values
353+
# Filter out empty trailing rows that pygsheets fails to strip when
354+
# returnas="matrix" (its include_tailing_empty_rows flag is a no-op
355+
# for matrix mode). Only trailing empty rows are expected here.
356+
for row in values:
357+
if row[0].strip():
358+
yield row
354359
start_row = end_row + 1
355360

356361

sheets/utils_test.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,34 @@ def test_get_data_rows(mocker):
5151
assert data_rows == non_header_rows
5252

5353

54+
def test_get_data_rows_after_start_filters_empty_rows(mocker):
55+
"""get_data_rows_after_start should filter out empty trailing rows returned by the API"""
56+
page_size = 2
57+
data_rows = [
58+
["1", "data1"],
59+
["2", "data2"],
60+
]
61+
empty_row = ["", ""]
62+
mock_worksheet = mocker.MagicMock(spec=Worksheet)
63+
mock_worksheet.get_values.side_effect = [
64+
# First page: full page of data rows
65+
data_rows,
66+
# Second page: one empty row (pagination boundary triggers extra fetch)
67+
[empty_row],
68+
]
69+
result = list(
70+
utils.get_data_rows_after_start(
71+
mock_worksheet,
72+
start_row=1,
73+
start_col=1,
74+
end_col=2,
75+
page_size=page_size,
76+
)
77+
)
78+
assert result == data_rows
79+
assert mock_worksheet.get_values.call_count == 2
80+
81+
5482
@pytest.mark.django_db
5583
@pytest.mark.parametrize(
5684
"use_sheet_id, value, force, sheet_modified_offset, existing_modified_offset, expect_error, force_processing",

0 commit comments

Comments
 (0)