diff --git a/src/pyipp/models.py b/src/pyipp/models.py index 0ba0a9590..672e2ee5e 100644 --- a/src/pyipp/models.py +++ b/src/pyipp/models.py @@ -88,7 +88,7 @@ def from_dict(data: dict[str, Any]) -> Info: serial=serial, uptime=data.get("printer-up-time", 0), uuid=uuid[9:] if uuid else None, # strip urn:uuid: from uuid - version=data.get("printer-firmware-string-version"), + version=_join_if_list(data.get("printer-firmware-string-version")), more_info=data.get("printer-more-info"), ) @@ -317,6 +317,17 @@ def _utcnow() -> datetime: """Return the current date and time in UTC.""" return datetime.now(tz=timezone.utc) +def _join_if_list(value: Any) -> str | None: + """Return value joined into a single string if it is a list.""" + if value is None: + return None + + if isinstance(value, list): + return ", ".join(str(item) for item in value) + + return str(value) + + def _str_or_none(value: str) -> str | None: """Return string while handling string representations of None.""" if value == "none": diff --git a/tests/test_models.py b/tests/test_models.py index 52a8d1a02..0fe915fee 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -83,6 +83,18 @@ async def test_info() -> None: # noqa: PLR0915 assert info.model == "Unknown" +@pytest.mark.asyncio +async def test_info_version_list() -> None: + """Test Info model with firmware version reported as multiple values.""" + parsed = parser.parse(load_fixture_binary("get-printer-attributes-epsonxp6000.bin")) + data = parsed["printers"][0] + data["printer-firmware-string-version"] = ["2.0", "1.02", "CXNZJ.250.038"] + info = models.Info.from_dict(data) + + assert info + assert info.version == "2.0, 1.02, CXNZJ.250.038" + + @pytest.mark.asyncio async def test_state() -> None: """Test State model."""