Guest User

Untitled

a guest
Jul 22nd, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. from __future__ import unicode_literals
  2.  
  3. from Queue import Queue, Empty
  4.  
  5. class EventLoop(object):
  6. def __init__(self, setup):
  7. """Sets up a Firefly event loop.
  8.  
  9. setup must be a callable that performs application-specific loop
  10. initializations.
  11. """
  12. self._eventqueue = Queue(0)
  13.  
  14. setup(self)
  15.  
  16. def add(self, event, args):
  17. e = (event, args)
  18. self._eventqueue.put(e, block=False)
  19.  
  20. def process_data(self):
  21. try:
  22. event = self._eventqueue.get()
  23. except Empty:
  24. return
  25.  
  26. while event is not None:
  27. event[1].handle(*event[2])
  28.  
  29. class Event(object):
  30. """A Firefly event.
  31.  
  32. Firefly events are maintained as a partially-dynamic heirarchy. This allows
  33. for a very fine-grained level of control, as events' parents can respond to
  34. the same events their children do.
  35.  
  36. Handlers are called parent-first, in case a parent event handler asks for a
  37. halt.
  38. """
  39. _forbidden = [
  40. '__hash__',
  41. '__init__',
  42. '__new__',
  43. '__setattr__',
  44. '__str__',
  45. '__unicode__',
  46. '_name',
  47. 'attach',
  48. 'detach',
  49. 'handle',
  50. 'emit'
  51. ]
  52.  
  53. def __new__(cls, name, doc=''):
  54. _dict = {
  55. '_name': name,
  56. '_handlers': [],
  57. '_parent': None,
  58. '__doc__': doc if doc else '<undocumented>'
  59. }
  60. obj = type(cls.__name__, (Event,), _dict)
  61.  
  62. return obj
  63.  
  64. def __hash__(self):
  65. return hash(self._name)
  66.  
  67. def __setattr__(self, attr, value):
  68. if attr in self._forbidden:
  69. error.event.emit(self, 'invalid child event')
  70. elif attr == '_parent':
  71. object.__setattr(self, attr, value)
  72. object.__setattr(self, '_name', '.'.join(value._name, self._name))
  73. else:
  74. object.__setattr__(self, attr, value)
  75. value._parent = self
  76.  
  77. def __unicode__(self):
  78. return unicode(self._name)
  79.  
  80. def attach(self, func):
  81. self._handlers.append(func)
  82. event.attached.emit(self)
  83.  
  84. def detach(self, func):
  85. if isinstance(func, int):
  86. try:
  87. self._handlers.pop(func)
  88. except IndexError:
  89. error.event.emit(self, 'no handler at index %s')
  90. return
  91. else:
  92. try:
  93. self._handlers.remove(func)
  94. except ValueError:
  95. error.event.emit(self, 'cannot detach unattached handler')
  96. return
  97.  
  98. event.detached.emit(self)
  99.  
  100. def handle(self, *args):
  101. if self._parent is not None:
  102. halt = self._parent.handle(*args)
  103.  
  104. if halt:
  105. return halt
  106.  
  107. for handle in self._handlers:
  108. halt = handle(self, *args)
  109.  
  110. if halt:
  111. break
  112.  
  113. def emit(self, *args, **kwargs):
  114. process = False if 'process' not in kwargs else kwargs['process']
  115. obj = args.pop(0)
  116. emitter = unicode(obj)
  117.  
  118. if process:
  119. eventloop.add(emitter, obj, args)
  120.  
  121. event = Event('event', 'event system root')
  122. event.attached = Event('event.attached', 'handler attached to event')
  123. event.detached = Event('event.detached', 'handler detached from event')
  124.  
  125. error = Event('error', 'error system root')
  126. error.event = Event('event', 'event system error')
  127. error.handler = Event('handler', 'event handler error')
  128.  
  129. protocols = Event('protocols', 'protocols system root')
Add Comment
Please, Sign In to add comment