Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/labapi/util/extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,9 @@ def extract_etree(_etree: Element, schema: EtreeExtractorDict) -> dict[str, Any]
try:
items[leaf] = mapper(value)
except ValueError as err:
mapper_name = getattr(mapper, "__name__", repr(mapper))
raise ExtractionError(
f"Could not map value {value!r} with {mapper.__name__} for "
f"Could not map value {value!r} with {mapper_name} for "
f"{message_path!r} while parsing element at {etree_path}"
) from err

Expand Down
25 changes: 25 additions & 0 deletions tests/util/test_extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,31 @@ def test_extract_etree_mapper_fails_raises():
extract_etree(element, format_dict)


def test_extract_etree_mapper_without_name_raises():
"""Test extract_etree raises ExtractionError properly when mapper has no __name__."""
from functools import partial

xml = """<?xml version="1.0" encoding="UTF-8"?>
<root>
<value>not_an_int</value>
</root>
"""
element = etree.fromstring(bytes(xml, encoding="utf-8"))
mapper = partial(int, base=16)
format_dict: EtreeExtractorDict = {
"value": mapper,
}

with pytest.raises(
ExtractionError,
match=(
r"Could not map value 'not_an_int' with .*partial.* for '.+/value' while "
r"parsing element at /root"
),
):
extract_etree(element, format_dict)


def test_extract_etree_warns_on_duplicate_leaf_names():
"""Test duplicate leaf extraction warns and last assignment wins."""
xml = """<?xml version="1.0" encoding="UTF-8"?>
Expand Down