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:
|
||||
if value is None:
|
||||
return ""
|
||||
if isinstance(value, bool): # bool is a subclass of int — handle before the int branch
|
||||
return str(value)
|
||||
if isinstance(value, datetime.datetime):
|
||||
return value.date().isoformat()
|
||||
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():
|
||||
with pytest.raises(ValueError, match="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