| @@ -158,10 +158,10 @@ class AD2Factory(object): | |||
| last_devices = current_devices | |||
| for d in new_devices: | |||
| self._factory.on_attached(d) | |||
| self._factory.on_attached(device=d) | |||
| for d in removed_devices: | |||
| self._factory.on_detached(d) | |||
| self._factory.on_detached(device=d) | |||
| except CommError, err: | |||
| pass | |||
| @@ -416,7 +416,7 @@ class AD2(object): | |||
| """ | |||
| msg = RFMessage(data) | |||
| self.on_rfx_message(msg) | |||
| self.on_rfx_message(message=msg) | |||
| return msg | |||
| @@ -433,14 +433,14 @@ class AD2(object): | |||
| if msg.event_type == 'ALARM_PANIC': | |||
| self._panic_status = True | |||
| self.on_panic(True) | |||
| self.on_panic(status=True) | |||
| elif msg.event_type == 'CANCEL': | |||
| if self._panic_status == True: | |||
| self._panic_status = False | |||
| self.on_panic(False) | |||
| self.on_panic(status=False) | |||
| self.on_lrr_message(msg) | |||
| self.on_lrr_message(message=msg) | |||
| return msg | |||
| @@ -486,19 +486,19 @@ class AD2(object): | |||
| self._power_status, old_status = message.ac_power, self._power_status | |||
| if old_status is not None: | |||
| self.on_power_changed(self._power_status) | |||
| self.on_power_changed(status=self._power_status) | |||
| if message.alarm_sounding != self._alarm_status: | |||
| self._alarm_status, old_status = message.alarm_sounding, self._alarm_status | |||
| if old_status is not None: | |||
| self.on_alarm(self._alarm_status) | |||
| self.on_alarm(status=self._alarm_status) | |||
| if message.zone_bypassed != self._bypass_status: | |||
| self._bypass_status, old_status = message.zone_bypassed, self._bypass_status | |||
| if old_status is not None: | |||
| self.on_bypass(self._bypass_status) | |||
| self.on_bypass(status=self._bypass_status) | |||
| if (message.armed_away | message.armed_home) != self._armed_status: | |||
| self._armed_status, old_status = message.armed_away | message.armed_home, self._armed_status | |||
| @@ -514,20 +514,20 @@ class AD2(object): | |||
| else: | |||
| if message.battery_low == True or time.time() > self._battery_status[1] + AD2.BATTERY_TIMEOUT: | |||
| self._battery_status = (message.battery_low, time.time()) | |||
| self.on_low_battery(self._battery_status) | |||
| self.on_low_battery(status=self._battery_status) | |||
| if message.fire_alarm == self._fire_status[0]: | |||
| self._fire_status = (self._fire_status[0], time.time()) | |||
| else: | |||
| if message.fire_alarm == True or time.time() > self._fire_status[1] + AD2.FIRE_TIMEOUT: | |||
| self._fire_status = (message.fire_alarm, time.time()) | |||
| self.on_fire(self._fire_status) | |||
| self.on_fire(status=self._fire_status) | |||
| elif isinstance(message, ExpanderMessage): | |||
| if message.type == ExpanderMessage.RELAY: | |||
| self._relay_status[(message.address, message.channel)] = message.value | |||
| self.on_relay_changed(message) | |||
| self.on_relay_changed(message=message) | |||
| self._update_zone_tracker(message) | |||
| @@ -548,42 +548,42 @@ class AD2(object): | |||
| self._zonetracker.update(message) | |||
| def _on_open(self, sender, args): | |||
| def _on_open(self, sender, *args, **kwargs): | |||
| """ | |||
| Internal handler for opening the device. | |||
| """ | |||
| self.on_open(args) | |||
| self.on_open(args, kwargs) | |||
| def _on_close(self, sender, args): | |||
| def _on_close(self, sender, *args, **kwargs): | |||
| """ | |||
| Internal handler for closing the device. | |||
| """ | |||
| self.on_close(args) | |||
| self.on_close(args, kwargs) | |||
| def _on_read(self, sender, args): | |||
| def _on_read(self, sender, *args, **kwargs): | |||
| """ | |||
| Internal handler for reading from the device. | |||
| """ | |||
| self.on_read(args) | |||
| self.on_read(args, kwargs) | |||
| msg = self._handle_message(args) | |||
| msg = self._handle_message(kwargs['data']) | |||
| if msg: | |||
| self.on_message(msg) | |||
| self.on_message(message=msg) | |||
| def _on_write(self, sender, args): | |||
| def _on_write(self, sender, *args, **kwargs): | |||
| """ | |||
| Internal handler for writing to the device. | |||
| """ | |||
| self.on_write(args) | |||
| self.on_write(args, kwargs) | |||
| def _on_zone_fault(self, sender, args): | |||
| def _on_zone_fault(self, sender, *args, **kwargs): | |||
| """ | |||
| Internal handler for zone faults. | |||
| """ | |||
| self.on_zone_fault(args) | |||
| self.on_zone_fault(args, kwargs) | |||
| def _on_zone_restore(self, sender, args): | |||
| def _on_zone_restore(self, sender, *args, **kwargs): | |||
| """ | |||
| Internal handler for zone restoration. | |||
| """ | |||
| self.on_zone_restore(args) | |||
| self.on_zone_restore(args, kwargs) | |||
| @@ -304,7 +304,7 @@ class USBDevice(Device): | |||
| try: | |||
| self._device.write_data(data) | |||
| self.on_write(data) | |||
| self.on_write(data=data) | |||
| except FtdiError, err: | |||
| raise CommError('Error writing to device: {0}'.format(str(err)), err) | |||
| @@ -385,7 +385,7 @@ class USBDevice(Device): | |||
| ret = self._buffer | |||
| self._buffer = '' | |||
| self.on_read(ret) | |||
| self.on_read(data=ret) | |||
| if timer: | |||
| if timer.is_alive(): | |||
| @@ -530,7 +530,7 @@ class SerialDevice(Device): | |||
| raise CommError('Error writing to device.', err) | |||
| else: | |||
| self.on_write(data) | |||
| self.on_write(data=data) | |||
| def read(self): | |||
| """ | |||
| @@ -604,7 +604,7 @@ class SerialDevice(Device): | |||
| ret = self._buffer | |||
| self._buffer = '' | |||
| self.on_read(ret) | |||
| self.on_read(data=ret) | |||
| if timer: | |||
| if timer.is_alive(): | |||
| @@ -797,7 +797,7 @@ class SocketDevice(Device): | |||
| if data_sent == 0: | |||
| raise CommError('Error writing to device.') | |||
| self.on_write(data) | |||
| self.on_write(data=data) | |||
| except (SSL.Error, socket.error), err: | |||
| raise CommError('Error writing to device.', err) | |||
| @@ -880,7 +880,7 @@ class SocketDevice(Device): | |||
| ret = self._buffer | |||
| self._buffer = '' | |||
| self.on_read(ret) | |||
| self.on_read(data=ret) | |||
| if timer: | |||
| if timer.is_alive(): | |||
| @@ -2,11 +2,12 @@ | |||
| # | |||
| # Based on pyevent originally found at http://www.emptypage.jp/notes/pyevent.en.html | |||
| # | |||
| # | |||
| # License: https://creativecommons.org/licenses/by/2.1/jp/deed.en | |||
| # | |||
| # Changes: | |||
| # Added type check in fire() | |||
| # * Added type check in fire() | |||
| # * Removed earg from fire() and added support for args/kwargs. | |||
| class Event(object): | |||
| @@ -60,19 +61,19 @@ class EventHandler(object): | |||
| self._getfunctionlist().remove(func) | |||
| return self | |||
| def fire(self, earg=None): | |||
| def fire(self, *args, **kwargs): | |||
| """Fire event and call all handler functions | |||
| You can call EventHandler object itself like e(earg) instead of | |||
| e.fire(earg). | |||
| You can call EventHandler object itself like e(*args, **kwargs) instead of | |||
| e.fire(*args, **kwargs). | |||
| """ | |||
| for func in self._getfunctionlist(): | |||
| if type(func) == EventHandler: | |||
| func.fire(earg) | |||
| func.fire(*args, **kwargs) | |||
| else: | |||
| func(self.obj, earg) | |||
| func(self.obj, *args, **kwargs) | |||
| __iadd__ = add | |||
| __isub__ = remove | |||
| @@ -20,10 +20,10 @@ class TestAD2Factory(TestCase): | |||
| def tearDown(self): | |||
| self._factory.stop() | |||
| def attached_event(self, sender, args): | |||
| def attached_event(self, sender, *args, **kwargs): | |||
| self._attached = True | |||
| def detached_event(self, sender, args): | |||
| def detached_event(self, sender, *args, **kwargs): | |||
| self._detached = True | |||
| def test_find_all(self): | |||
| @@ -114,43 +114,43 @@ class TestAD2(TestCase): | |||
| def tearDown(self): | |||
| pass | |||
| def on_panic(self, sender, args): | |||
| self._panicked = args | |||
| def on_panic(self, sender, *args, **kwargs): | |||
| self._panicked = kwargs['status'] | |||
| def on_relay_changed(self, sender, args): | |||
| def on_relay_changed(self, sender, *args, **kwargs): | |||
| self._relay_changed = True | |||
| def on_power_changed(self, sender, args): | |||
| self._power_changed = args | |||
| def on_power_changed(self, sender, *args, **kwargs): | |||
| self._power_changed = kwargs['status'] | |||
| def on_alarm(self, sender, args): | |||
| self._alarmed = args | |||
| def on_alarm(self, sender, *args, **kwargs): | |||
| self._alarmed = kwargs['status'] | |||
| def on_bypass(self, sender, args): | |||
| self._bypassed = args | |||
| def on_bypass(self, sender, *args, **kwargs): | |||
| self._bypassed = kwargs['status'] | |||
| def on_battery(self, sender, args): | |||
| self._battery = args | |||
| def on_battery(self, sender, *args, **kwargs): | |||
| self._battery = kwargs['status'] | |||
| def on_fire(self, sender, args): | |||
| self._fire = args | |||
| def on_fire(self, sender, *args, **kwargs): | |||
| self._fire = kwargs['status'] | |||
| def on_arm(self, sender, args): | |||
| def on_arm(self, sender, *args, **kwargs): | |||
| self._armed = True | |||
| def on_disarm(self, sender, args): | |||
| def on_disarm(self, sender, *args, **kwargs): | |||
| self._armed = False | |||
| def on_config(self, sender, args): | |||
| def on_config(self, sender, *args, **kwargs): | |||
| self._got_config = True | |||
| def on_message(self, sender, args): | |||
| def on_message(self, sender, *args, **kwargs): | |||
| self._message_received = True | |||
| def on_rfx_message(self, sender, args): | |||
| def on_rfx_message(self, sender, *args, **kwargs): | |||
| self._rfx_message_received = True | |||
| def on_lrr_message(self, sender, args): | |||
| def on_lrr_message(self, sender, *args, **kwargs): | |||
| self._lrr_message_received = True | |||
| def test_open(self): | |||
| @@ -195,14 +195,14 @@ class TestAD2(TestCase): | |||
| msg = self._ad2._handle_message('[0000000000000000----],000,[f707000600e5800c0c020000]," "') | |||
| self.assertIsInstance(msg, Message) | |||
| self._ad2._on_read(self, '[0000000000000000----],000,[f707000600e5800c0c020000]," "') | |||
| self._ad2._on_read(self, data='[0000000000000000----],000,[f707000600e5800c0c020000]," "') | |||
| self.assertTrue(self._message_received) | |||
| def test_message_kpe(self): | |||
| msg = self._ad2._handle_message('!KPE:[0000000000000000----],000,[f707000600e5800c0c020000]," "') | |||
| self.assertIsInstance(msg, Message) | |||
| self._ad2._on_read(self, '[0000000000000000----],000,[f707000600e5800c0c020000]," "') | |||
| self._ad2._on_read(self, data='[0000000000000000----],000,[f707000600e5800c0c020000]," "') | |||
| self.assertTrue(self._message_received) | |||
| def test_expander_message(self): | |||
| @@ -17,10 +17,10 @@ class TestZonetracking(TestCase): | |||
| def tearDown(self): | |||
| pass | |||
| def fault_event(self, sender, args): | |||
| def fault_event(self, sender, *args, **kwargs): | |||
| self._faulted = True | |||
| def restore_event(self, sender, args): | |||
| def restore_event(self, sender, *args, **kwargs): | |||
| self._restored = True | |||
| def _build_expander_message(self, msg): | |||
| @@ -238,7 +238,7 @@ class Zonetracker(object): | |||
| self._zones[zone] = Zone(zone=zone, name=name, status=status) | |||
| if status != Zone.CLEAR: | |||
| self.on_fault(zone) | |||
| self.on_fault(zone=zone) | |||
| def _update_zone(self, zone, status=None): | |||
| """ | |||
| @@ -263,7 +263,7 @@ class Zonetracker(object): | |||
| if zone in self._zones_faulted: | |||
| self._zones_faulted.remove(zone) | |||
| self.on_restore(zone) | |||
| self.on_restore(zone=zone) | |||
| def _zone_expired(self, zone): | |||
| """ | |||