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
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ The format follows the spirit of Keep a Changelog, and this project intends to u
## Unreleased

- Added repository workflow defaults for future GitHub workflow sessions.
- Added public-path coverage for model-instance computer, printer, and print
job lookups.
- Updated post-release documentation now that `0.3.0` is published.
- Removed stale private helper code that was unreachable from account and
computer APIs.
- Hardened model factory handling for missing or null optional nested PrintNode
response fields.

Expand Down
90 changes: 0 additions & 90 deletions printnode_community/accounts.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
from .model import Model, Client, Account
import json


class Accounts:

def __init__(self, auth, factory):
Expand Down Expand Up @@ -140,89 +136,3 @@ def get_clientkey(
url = "/client/key/"+uuid+"?edition="+edition+"&version="+version
response = self._auth.get(url, {'Content-Type': 'application/json'})
return response

def _get_computer_ids(self, computer):
if isinstance(computer, int):
return [computer]
elif isinstance(computer, Computer):
return [computer.id]
elif computer is None or isinstance(computer, str):
computers = [
self._factory.create_computer(comp)
for comp in self._auth.get('/computers')]
if isinstance(computer, str):
computers = [
comp
for comp in computers
if comp.name == computer]
return [c.id for c in computers]
else:
raise TypeError('computer: "{}"'.format(type(computer)))

def _get_computer_id(self, computer):
return self._get_model_id(computer, Computer)

def _get_printer_id(self, printer):
return self._get_model_id(printer, Printer)

def _get_printjob_id(self, printjob):
return self._get_model_id(printjob, PrintJob)

def _get_model_id(self, model, model_type):
if isinstance(model, int):
return model
elif isinstance(model, model_type):
return model.id
else:
raise TypeError(str(type(model)))

def _get_printer_ids(self, printer):
if isinstance(printer, int):
return [printer]
elif isinstance(printer, Printer):
return [Printer.id]
elif printer is None or isinstance(printer, str):
printers = {
self._factory.create_printer(printer_dict)
for printer_dict in self._auth.get('/printer')}
if isinstance(printer, str):
printers = {
p for p in printers if p.name == printer}
return printers
else:
raise TypeError('printer: "{}"'.format(type(printer)))

def _is_multi_query(self, obj):
if obj is None:
return True
elif isinstance(obj, int):
return False
elif isinstance(obj, str):
return True
elif isinstance(obj, Model):
return False
else:
raise TypeError('type "{}" unsupported'.format(type(obj)))

def _get_printer_by_name(self, printer_name, computer_id=None):
assert isinstance(printer_name, str)
assert not computer_id or isinstance(computer_id, int)
printers = self.get_printers(computer=computer_id)
return [
printer
for printer in printers
if printer.name == printer_name]


class LookupFailedError(RuntimeError):

def __init__(self, obj_name, field, value):
msg = 'Failed to find a matching {} with {} of {}'.format(
obj_name,
field,
value)
super(RuntimeError, self).__init__(msg)

self.obj_name = obj_name
self.field = field
self.value = value
47 changes: 1 addition & 46 deletions printnode_community/computers.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from .model import Computer, Model, Printer, PrintJob, Scale, State
from .model import Computer, Model, Printer, PrintJob
from future.types import newbytes
import json
import base64 as base_64
import sys

Expand Down Expand Up @@ -205,12 +204,6 @@ def submit_printjob(

return printjob_id

def _native(self, obj):
if hasattr(obj, '__native__'):
return obj.__native__()
else:
return obj

def _get_computer_ids(self, computer):
if isinstance(computer, int):
return [computer]
Expand Down Expand Up @@ -246,22 +239,6 @@ def _get_model_id(self, model, model_type):
else:
raise TypeError(str(type(model)))

def _get_printer_ids(self, printer):
if isinstance(printer, int):
return [printer]
elif isinstance(printer, Printer):
return [Printer.id]
elif printer is None or isinstance(printer, str):
printers = {
self._factory.create_printer(printer_dict)
for printer_dict in self._auth.get('/printer')}
if isinstance(printer, str):
printers = {
p for p in printers if p.name == printer}
return printers
else:
raise TypeError('printer: "{}"'.format(type(printer)))

def _is_multi_query(self, obj):
if obj is None:
return True
Expand All @@ -274,15 +251,6 @@ def _is_multi_query(self, obj):
else:
raise TypeError('type "{}" unsupported'.format(type(obj)))

def _get_printer_by_name(self, printer_name, computer_id=None):
assert isinstance(printer_name, str)
assert not computer_id or isinstance(computer_id, int)
printers = self.get_printers(computer=computer_id)
return [
printer
for printer in printers
if printer.name == printer_name]

def _create_pagination_params(self, limit, after, dir):
params = []
if limit is not None:
Expand All @@ -302,16 +270,3 @@ def _create_pagination_params(self, limit, after, dir):
raise TypeError("dir must equal 'asc' or 'desc'")
if len(params) > 0:
return '&'.join(params)

class LookupFailedError(RuntimeError):

def __init__(self, obj_name, field, value):
msg = 'Failed to find a matching {} with {} of {}'.format(
obj_name,
field,
value)
super(RuntimeError, self).__init__(msg)

self.obj_name = obj_name
self.field = field
self.value = value
52 changes: 43 additions & 9 deletions tests/test_computers.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import pytest

from printnode_community.computers import Computers
from printnode_community.model import ModelFactory, Printer
from printnode_community.model import Computer, ModelFactory, Printer, PrintJob

from tests.test_model import computer_payload, printer_payload, printjob_payload

Expand Down Expand Up @@ -80,6 +80,20 @@ def test_get_printers_for_computer_builds_expected_url():
assert [printer.name for printer in result] == ['Shipping Printer']


def test_get_printers_accepts_computer_model_instance():
factory = ModelFactory()
computer = factory.create_computer(computer_payload(id=100))
computers, auth = make_computers({
'/computers/100/printers': [printer_payload()],
})

result = computers.get_printers(computer=computer)

assert isinstance(computer, Computer)
assert auth.get_calls == ['/computers/100/printers']
assert [printer.id for printer in result] == [200]


def test_get_printer_by_id_returns_single_printer():
computers, auth = make_computers({
'/printers/200': [printer_payload(id=200)],
Expand All @@ -91,6 +105,20 @@ def test_get_printer_by_id_returns_single_printer():
assert result.id == 200


def test_get_printer_by_model_instance_returns_single_printer():
factory = ModelFactory()
printer = factory.create_printer(printer_payload(id=200))
computers, auth = make_computers({
'/printers/200': [printer_payload(id=200)],
})

result = computers.get_printers(printer=printer)

assert isinstance(printer, Printer)
assert auth.get_calls == ['/printers/200']
assert result.id == 200


def test_get_printjobs_lists_all_with_title_filter():
computers, auth = make_computers({
'/printjobs': [
Expand Down Expand Up @@ -134,6 +162,20 @@ def test_get_printjob_by_id_returns_single_printjob():
assert result.id == 300


def test_get_printjob_by_model_instance_returns_single_printjob():
factory = ModelFactory()
printjob = factory.create_printjob(printjob_payload(id=300))
computers, auth = make_computers({
'/printjobs/300': [printjob_payload(id=300)],
})

result = computers.get_printjobs(printjob=printjob)

assert isinstance(printjob, PrintJob)
assert auth.get_calls == ['/printjobs/300']
assert result.id == 300


def test_get_states_builds_global_and_printjob_specific_paths():
computers, auth = make_computers({
'/printjobs/states?limit=5': [[{
Expand Down Expand Up @@ -217,11 +259,3 @@ def test_pagination_params_validate_inputs(kwargs, error):

with pytest.raises(error):
computers.get_computers(**kwargs)


def test_get_printer_id_accepts_printer_model_instance():
computers, _auth = make_computers()
printer = ModelFactory().create_printer(printer_payload(id=200))

assert isinstance(printer, Printer)
assert computers._get_printer_id(printer) == 200