From 8e09a077fd6e95d4c318bfb3fe8c023da273de31 Mon Sep 17 00:00:00 2001 From: Andrew Scheller Date: Sun, 10 Apr 2016 14:54:30 +0100 Subject: [PATCH] Check that the sub-devices of CompositeDevice are actually Device instances --- gpiozero/__init__.py | 1 + gpiozero/devices.py | 4 ++++ gpiozero/exc.py | 3 +++ tests/test_devices.py | 4 ++++ 4 files changed, 12 insertions(+) diff --git a/gpiozero/__init__.py b/gpiozero/__init__.py index 0ef0810..f615082 100644 --- a/gpiozero/__init__.py +++ b/gpiozero/__init__.py @@ -22,6 +22,7 @@ from .exc import ( CompositeDeviceError, CompositeDeviceBadName, CompositeDeviceBadOrder, + CompositeDeviceBadDevice, SPIError, SPIBadArgs, EnergenieSocketMissing, diff --git a/gpiozero/devices.py b/gpiozero/devices.py index 3f256df..8e9070a 100644 --- a/gpiozero/devices.py +++ b/gpiozero/devices.py @@ -23,6 +23,7 @@ from .exc import ( DeviceClosed, CompositeDeviceBadName, CompositeDeviceBadOrder, + CompositeDeviceBadDevice, GPIOPinMissing, GPIOPinInUse, GPIODeviceClosed, @@ -274,6 +275,9 @@ class CompositeDevice(Device): for name in set(self._order) & set(dir(self)): raise CompositeDeviceBadName('%s is a reserved name' % name) self._all = args + tuple(kwargs[v] for v in self._order) + for dev in self._all: + if not isinstance(dev, Device): + raise CompositeDeviceBadDevice("%s doesn't inherit from Device" % dev) self._named = kwargs self._tuple = namedtuple('%sValue' % self.__class__.__name__, chain( (str(i) for i in range(len(args))), self._order), diff --git a/gpiozero/exc.py b/gpiozero/exc.py index b36034f..60e83f7 100644 --- a/gpiozero/exc.py +++ b/gpiozero/exc.py @@ -31,6 +31,9 @@ class CompositeDeviceBadName(CompositeDeviceError, ValueError): class CompositeDeviceBadOrder(CompositeDeviceError, ValueError): "Error raised when a composite device is constructed with an incomplete order" +class CompositeDeviceBadDevice(CompositeDeviceError, ValueError): + "Error raised when a composite device is constructed with an object that doesn't inherit from :class:`Device`" + class EnergenieSocketMissing(CompositeDeviceError, ValueError): "Error raised when socket number is not specified" diff --git a/tests/test_devices.py b/tests/test_devices.py index 79ae98a..eb19a44 100644 --- a/tests/test_devices.py +++ b/tests/test_devices.py @@ -118,6 +118,10 @@ def test_composite_device_bad_init(): CompositeDevice(foo=1, bar=2, _order=('foo',)) with pytest.raises(ValueError): CompositeDevice(close=1) + with pytest.raises(ValueError): + CompositeDevice(2) + with pytest.raises(ValueError): + CompositeDevice(MockPin(2)) def test_composite_device_read_only(): device = CompositeDevice(