Skip to content
33 changes: 26 additions & 7 deletions pyipp/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand All @@ -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,
Expand All @@ -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)

Expand Down
35 changes: 35 additions & 0 deletions tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
Expand Down