Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
d3a5834
Update models.py
ctalkington Apr 12, 2020
b4279aa
Update test_models.py
ctalkington Apr 12, 2020
71ec3a9
Update models.py
ctalkington Apr 12, 2020
969d42b
Update test_models.py
ctalkington Apr 12, 2020
dbb497c
Update models.py
ctalkington Apr 12, 2020
3ab2763
Update models.py
ctalkington Apr 12, 2020
cbb5e87
Update test_models.py
ctalkington Apr 12, 2020
a7b6c9d
Update test_models.py
ctalkington Apr 12, 2020
94ed259
Update models.py
ctalkington Apr 12, 2020
47a20fd
Update test_models.py
ctalkington Apr 12, 2020
880fecd
Update models.py
ctalkington Apr 12, 2020
4157f81
Update models.py
ctalkington Apr 12, 2020
ff702b5
Update models.py
ctalkington Apr 12, 2020
3f94c17
Update models.py
ctalkington Apr 12, 2020
6390ed0
Update models.py
ctalkington Apr 12, 2020
22bcbc7
Update test_models.py
ctalkington Apr 12, 2020
f46afd1
Update models.py
ctalkington Apr 12, 2020
fa55ec6
Update test_models.py
ctalkington Apr 13, 2020
b31d7b9
Update test_models.py
ctalkington Apr 13, 2020
f251881
Update test_models.py
ctalkington Apr 13, 2020
fd8bdd8
Update models.py
ctalkington Apr 13, 2020
cddd779
Update test_models.py
ctalkington Apr 13, 2020
0666179
Update models.py
ctalkington Apr 13, 2020
d03ebf1
Update test_models.py
ctalkington Apr 13, 2020
1db8092
Update models.py
ctalkington Apr 13, 2020
168e3c3
Update models.py
ctalkington Apr 13, 2020
4517318
Update models.py
ctalkington Apr 13, 2020
97dcf76
Update models.py
ctalkington Apr 13, 2020
7e966c3
Update models.py
ctalkington Apr 13, 2020
921d0a9
Update ipp.py
ctalkington Apr 13, 2020
75c2e76
Update models.py
ctalkington Apr 13, 2020
d3fde3c
Update models.py
ctalkington Apr 13, 2020
7862bcf
Update models.py
ctalkington Apr 13, 2020
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: 0 additions & 3 deletions pyipp/ipp.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,6 @@ async def _request(
self._session = aiohttp.ClientSession()
self._close_session = True

if data is None:
data = {}

if isinstance(data, dict):
data = encode_dict(data)

Expand Down
61 changes: 41 additions & 20 deletions pyipp/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from dataclasses import dataclass
from typing import List, Optional

from yarl import URL

from .parser import parse_ieee1284_device_id, parse_make_and_model

PRINTER_STATES = {3: "idle", 4: "printing", 5: "stopped"}
Expand All @@ -11,56 +13,75 @@
class Info:
"""Object holding information from IPP."""

command_set: str
location: str
name: str
manufacturer: str
model: str
printer_name: str
printer_info: str
printer_uri_supported: list
serial: Optional[str]
uptime: int
uuid: str
version: str
command_set: Optional[str] = None
location: Optional[str] = None
manufacturer: Optional[str] = None
model: Optional[str] = None
printer_info: Optional[str] = None
serial: Optional[str] = None
uuid: Optional[str] = None
version: Optional[str] = None

@staticmethod
def from_dict(data: dict):
"""Return Info object from IPP response."""
make_model = data.get("printer-make-and-model", "IPP Printer")
cmd = None
name = "IPP Printer"
name_parts = []
serial = None
_printer_name = printer_name = data.get("printer-name", "")
make_model = data.get("printer-make-and-model", "")
device_id = data.get("printer-device-id", "")
uri_supported = data.get("printer-uri-supported", [])
uuid = data.get("printer-uuid")

make, model = parse_make_and_model(make_model)
cmd = "Unknown"
serial = None
if isinstance(uri_supported, List):
for uri in uri_supported:
uri_path = URL(uri).path.lstrip("/")
if uri_path == _printer_name.lstrip("/"):
_printer_name = ""
break

make, model = parse_make_and_model(make_model)
parsed_device_id = parse_ieee1284_device_id(device_id)

if parsed_device_id.get("MFG") is not None:
if parsed_device_id.get("MFG") is not None and len(parsed_device_id["MFG"]) > 0:
make = parsed_device_id["MFG"]
name_parts.append(make)

if parsed_device_id.get("MDL") is not None:
if parsed_device_id.get("MDL") is not None and len(parsed_device_id["MDL"]) > 0:
model = parsed_device_id["MDL"]
name_parts.append(model)

if parsed_device_id.get("CMD") is not None:
if parsed_device_id.get("CMD") is not None and len(parsed_device_id["CMD"]) > 0:
cmd = parsed_device_id["CMD"]

if parsed_device_id.get("SN") is not None:
if parsed_device_id.get("SN") is not None and len(parsed_device_id["SN"]) > 0:
serial = parsed_device_id["SN"]

if len(make_model) > 0:
name = make_model
elif len(name_parts) == 2:
name = " ".join(name_parts)
elif len(_printer_name) > 0:
name = _printer_name

return Info(
command_set=cmd,
location=data.get("printer-location", ""),
name=make_model,
name=name,
manufacturer=make,
model=model,
printer_name=data.get("printer-name", None),
printer_name=printer_name,
printer_info=data.get("printer-info", None),
printer_uri_supported=data.get("printer-uri-supported", []),
printer_uri_supported=uri_supported,
serial=serial,
uptime=data.get("printer-up-time", 0),
uuid=uuid[9:] if uuid else None,
uuid=uuid[9:] if uuid else None, # strip urn:uuid: from uuid
version=data.get("printer-firmware-string-version", None),
)

Expand Down
72 changes: 72 additions & 0 deletions tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,77 @@
from . import IPPE10_PRINTER_ATTRS, load_fixture_binary


@pytest.mark.asyncio
async def test_info():
"""Test Info model."""
parsed = parser.parse(load_fixture_binary("get-printer-attributes-epsonxp6000.bin"))
data = parsed["printers"][0]
info = models.Info.from_dict(data)

assert info
assert info.command_set == "ESCPL2,BDC,D4,D4PX,ESCPR7,END4,GENEP,URF"
assert info.location == ""
assert info.name == "EPSON XP-6000 Series"
assert info.manufacturer == "EPSON"
assert info.model == "XP-6000 Series"
assert info.printer_name == "ipp/print"
assert info.printer_info == "EPSON XP-6000 Series"
assert info.printer_uri_supported == [
"ipps://epson761251.local.:631/ipp/print",
"ipp://epson761251.local.:631/ipp/print",
]
assert info.serial == "583434593035343012"
assert info.uuid == "cfe92100-67c4-11d4-a45f-f8d027761251"
assert info.version == "20.44.NU20K2"
assert info.uptime == 4119

# no make/model, device id
data["printer-make-and-model"] = ""
info = models.Info.from_dict(data)

assert info
assert info.name == "EPSON XP-6000 Series"
assert info.printer_name == "ipp/print"
assert info.manufacturer == "EPSON"
assert info.model == "XP-6000 Series"

# no make/model, no device id, URI name
data["printer-device-id"] = ""
data["printer-make-and-model"] = ""
data["printer-name"] = "ipp/print"
info = models.Info.from_dict(data)

assert info
assert info.name == "IPP Printer"
assert info.printer_name == "ipp/print"
assert info.manufacturer == "Unknown"
assert info.model == "Unknown"

# no make/model, no device id, name
data["printer-device-id"] = ""
data["printer-make-and-model"] = ""
data["printer-name"] = "Printy"
info = models.Info.from_dict(data)

assert info
assert info.name == "Printy"
assert info.printer_name == "Printy"
assert info.manufacturer == "Unknown"
assert info.model == "Unknown"

# no make/model, no device id, no name
data["printer-device-id"] = ""
data["printer-make-and-model"] = ""
data["printer-name"] = ""
info = models.Info.from_dict(data)

assert info
assert info.name == "IPP Printer"
assert info.printer_name == ""
assert info.manufacturer == "Unknown"
assert info.model == "Unknown"


@pytest.mark.asyncio
async def test_printer():
"""Test Printer model."""
Expand All @@ -20,6 +91,7 @@ async def test_printer():
assert printer.info.name == "EPSON XP-6000 Series"
assert printer.info.manufacturer == "EPSON"
assert printer.info.model == "XP-6000 Series"
assert printer.info.printer_name == "ipp/print"
assert printer.info.printer_info == "EPSON XP-6000 Series"
assert printer.info.printer_uri_supported == [
"ipps://epson761251.local.:631/ipp/print",
Expand Down