diff --git a/pyipp/models.py b/pyipp/models.py index 557735739..897f1d884 100644 --- a/pyipp/models.py +++ b/pyipp/models.py @@ -114,6 +114,7 @@ class Printer: def from_dict(data): """Return Printer object from IPP response.""" markers = [] + mlen = 0 marker_colors = [] marker_levels = [] marker_types = [] @@ -123,23 +124,41 @@ def from_dict(data): marker_names = None if isinstance(data.get("marker-names"), List): marker_names = data["marker-names"] + mlen = len(marker_names) + + for k in range(mlen): + marker_colors.append("") + marker_levels.append(-2) + marker_types.append("unknown") + marker_highs.append(100) + marker_lows.append(0) if isinstance(data.get("marker-colors"), List): - marker_colors = data["marker-colors"] + for k, v in enumerate(data["marker-colors"]): + if k < mlen: + marker_colors[k] = v if isinstance(data.get("marker-levels"), List): - marker_levels = data["marker-levels"] + for k, v in enumerate(data["marker-levels"]): + if k < mlen: + marker_levels[k] = v if isinstance(data.get("marker-high-levels"), List): - marker_highs = data["marker-high-levels"] + for k, v in enumerate(data["marker-high-levels"]): + if k < mlen: + marker_highs[k] = v if isinstance(data.get("marker-low-levels"), List): - marker_lows = data["marker-low-levels"] + for k, v in enumerate(data["marker-low-levels"]): + if k < mlen: + marker_lows[k] = v if isinstance(data.get("marker-types"), List): - marker_types = data["marker-types"] + for k, v in enumerate(data["marker-types"]): + if k < mlen: + marker_types[k] = v - if isinstance(marker_names, List) and len(marker_names) > 0: + if isinstance(marker_names, List) and mlen > 0: markers = [ Marker( marker_id=marker_id, @@ -150,7 +169,7 @@ def from_dict(data): high_level=marker_highs[marker_id], low_level=marker_lows[marker_id], ) - for marker_id in range(len(marker_names)) + for marker_id in range(mlen) ] markers.sort(key=lambda x: x.name) diff --git a/tests/test_models.py b/tests/test_models.py index 2792240d8..31aa3e8ee 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -93,15 +93,50 @@ async def test_printer_with_marker_data(): data["marker-high-levels"] = [] data["marker-low-levels"] = [] + # empty but valid types printer = models.Printer.from_dict(data) assert printer assert len(printer.markers) == 0 + # no names data["marker-names"] = -1 + printer = models.Printer.from_dict(data) assert printer assert len(printer.markers) == 0 + # partial valid data + data["marker-names"] = ["Black"] + data["marker-colors"] = -2 + + printer = models.Printer.from_dict(data) + assert printer + assert len(printer.markers) == 1 + assert printer.markers[0] + assert printer.markers[0].name == "Black" + assert printer.markers[0].color == "" + assert printer.markers[0].level == -2 + assert printer.markers[0].high_level == 100 + assert printer.markers[0].low_level == 0 + assert printer.markers[0].marker_type == "unknown" + + # partial valid data, extra data + data["marker-names"] = ["Black"] + data["marker-colors"] = -2 + data["marker-levels"] = [99, 98] + + printer = models.Printer.from_dict(data) + assert printer + assert len(printer.markers) == 1 + assert printer.markers[0] + assert printer.markers[0].name == "Black" + assert printer.markers[0].color == "" + assert printer.markers[0].level == 99 + assert printer.markers[0].high_level == 100 + assert printer.markers[0].low_level == 0 + assert printer.markers[0].marker_type == "unknown" + + # full valid data["marker-names"] = ["Black"] data["marker-types"] = ["ink-cartridge"] data["marker-colors"] = ["#FF0000"]