fix(normalizer): don't coerce boolean cells to 1/0
Add bool guard before the int branch in _cell_to_str so True/False cells are preserved as "True"/"False" instead of "1"/"0". Add two regression tests covering the fix and missing-sheet error. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,8 @@ import openpyxl
|
|||||||
def _cell_to_str(value) -> str:
|
def _cell_to_str(value) -> str:
|
||||||
if value is None:
|
if value is None:
|
||||||
return ""
|
return ""
|
||||||
|
if isinstance(value, bool): # bool is a subclass of int — handle before the int branch
|
||||||
|
return str(value)
|
||||||
if isinstance(value, datetime.datetime):
|
if isinstance(value, datetime.datetime):
|
||||||
return value.date().isoformat()
|
return value.date().isoformat()
|
||||||
if isinstance(value, datetime.date):
|
if isinstance(value, datetime.date):
|
||||||
|
|||||||
@@ -34,3 +34,13 @@ def test_build_header_map_collapses_whitespace_and_case():
|
|||||||
def test_build_header_map_missing_required_raises():
|
def test_build_header_map_missing_required_raises():
|
||||||
with pytest.raises(ValueError, match="index"):
|
with pytest.raises(ValueError, match="index"):
|
||||||
ingest.build_header_map(["Box", "Ort"], {"box": "box", "ort": "location"}, required={"index"})
|
ingest.build_header_map(["Box", "Ort"], {"box": "box", "ort": "location"}, required={"index"})
|
||||||
|
|
||||||
|
def test_read_sheet_bool_not_coerced_to_int(tmp_path):
|
||||||
|
path = _make_workbook(tmp_path, "S", [["Flag"], [True], [False]])
|
||||||
|
rows = ingest.read_sheet(path, "S")
|
||||||
|
assert rows[1] == ["True"] and rows[2] == ["False"] # not "1"/"0"
|
||||||
|
|
||||||
|
def test_read_sheet_missing_sheet_raises(tmp_path):
|
||||||
|
path = _make_workbook(tmp_path, "S", [["A"]])
|
||||||
|
with pytest.raises(ValueError, match="not found"):
|
||||||
|
ingest.read_sheet(path, "Nope")
|
||||||
|
|||||||
Reference in New Issue
Block a user