Skip to content

Commit

Permalink
Add logic for showing named/unnamed/mixed composite devices in repr
Browse files Browse the repository at this point in the history
  • Loading branch information
bennuttall committed Sep 26, 2019
1 parent 35afb3f commit bb3941d
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 3 deletions.
14 changes: 11 additions & 3 deletions gpiozero/devices.py
Original file line number Diff line number Diff line change
Expand Up @@ -434,16 +434,24 @@ def __setattr__(self, name, value):
def __repr__(self):
try:
self._check_open()
if len(self) - len(self._named) > 0:
named = len(self._named)
unnamed = len(self) - len(self._named)
if named > 0 and unnamed > 0:
return "<gpiozero.%s object containing %d devices: %s and %d unnamed>" % (
self.__class__.__name__,
len(self), ', '.join(self._order),
len(self) - len(self._named)
)
else:
elif named > 0:
return "<gpiozero.%s object containing %d devices: %s>" % (
self.__class__.__name__,
len(self), ', '.join(self._order)
len(self),
', '.join(self._order)
)
else:
return "<gpiozero.%s object containing %d unnamed devices>" % (
self.__class__.__name__,
len(self)
)
except DeviceClosed:
return "<gpiozero.%s object closed>" % (self.__class__.__name__)
Expand Down
12 changes: 12 additions & 0 deletions tests/test_devices.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ def test_composite_device_sequence(mock_factory):

def test_composite_device_values(mock_factory):
with CompositeDevice(InputDevice(4), InputDevice(5)) as device:
assert repr(device) == '<gpiozero.CompositeDevice object containing 2 unnamed devices>'
assert device.value == (0, 0)
assert not device.is_active
device[0].pin.drive_high()
Expand All @@ -200,10 +201,21 @@ def test_composite_device_named(mock_factory):
bar=InputDevice(5),
_order=('foo', 'bar')
) as device:
assert repr(device) == '<gpiozero.CompositeDevice object containing 2 devices: foo, bar>'
assert device.namedtuple._fields == ('foo', 'bar')
assert device.value == (0, 0)
assert not device.is_active

def test_composite_device_some_named(mock_factory):
with CompositeDevice(
InputDevice(4),
foobar=InputDevice(5),
) as device:
assert repr(device) == '<gpiozero.CompositeDevice object containing 2 devices: foobar and 1 unnamed>'
assert device.namedtuple._fields == ('device_0', 'foobar')
assert device.value == (0, 0)
assert not device.is_active

def test_composite_device_bad_init(mock_factory):
with pytest.raises(ValueError):
CompositeDevice(foo=1, bar=2, _order=('foo',))
Expand Down

0 comments on commit bb3941d

Please sign in to comment.