A clone of: https://github.com/nutechsoftware/alarmdecoder This is requires as they dropped support for older firmware releases w/o building in backward compatibility code, and they had previously hardcoded pyserial to a python2 only version.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
2.0 KiB

  1. # event.py (improved)
  2. #
  3. # Based on pyevent originally found at http://www.emptypage.jp/notes/pyevent.en.html
  4. #
  5. # License: https://creativecommons.org/licenses/by/2.1/jp/deed.en
  6. #
  7. # Changes:
  8. # * Added type check in fire()
  9. # * Removed earg from fire() and added support for args/kwargs.
  10. class Event(object):
  11. def __init__(self, doc=None):
  12. self.__doc__ = doc
  13. def __get__(self, obj, objtype=None):
  14. if obj is None:
  15. return self
  16. return EventHandler(self, obj)
  17. def __set__(self, obj, value):
  18. pass
  19. class EventHandler(object):
  20. def __init__(self, event, obj):
  21. self.event = event
  22. self.obj = obj
  23. def __iter__(self):
  24. return iter(self._getfunctionlist())
  25. def _getfunctionlist(self):
  26. """(internal use) """
  27. try:
  28. eventhandler = self.obj.__eventhandler__
  29. except AttributeError:
  30. eventhandler = self.obj.__eventhandler__ = {}
  31. return eventhandler.setdefault(self.event, [])
  32. def add(self, func):
  33. """Add new event handler function.
  34. Event handler function must be defined like func(sender, earg).
  35. You can add handler also by using '+=' operator.
  36. """
  37. self._getfunctionlist().append(func)
  38. return self
  39. def remove(self, func):
  40. """Remove existing event handler function.
  41. You can remove handler also by using '-=' operator.
  42. """
  43. self._getfunctionlist().remove(func)
  44. return self
  45. def clear(self):
  46. del self._getfunctionlist()[:]
  47. return self
  48. def fire(self, *args, **kwargs):
  49. """Fire event and call all handler functions
  50. You can call EventHandler object itself like e(*args, **kwargs) instead of
  51. e.fire(*args, **kwargs).
  52. """
  53. for func in self._getfunctionlist():
  54. if type(func) == EventHandler:
  55. func.fire(*args, **kwargs)
  56. else:
  57. func(self.obj, *args, **kwargs)
  58. __iadd__ = add
  59. __isub__ = remove
  60. __call__ = fire