mirror of
				https://github.com/avatao-content/baseimage-tutorial-framework
				synced 2025-10-31 15:02:55 +00:00 
			
		
		
		
	Enable handlers to specify EventHandler type
This commit is contained in:
		| @@ -1,5 +1,9 @@ | ||||
| class EventHandler: | ||||
| from .type_id_registry import TypeIdRegistryMixin | ||||
|  | ||||
|  | ||||
| class EventHandler(TypeIdRegistryMixin): | ||||
|     _instances = set() | ||||
|     _type_id_registry = {} | ||||
|  | ||||
|     def __init__(self, connector): | ||||
|         type(self)._instances.add(self) | ||||
|   | ||||
| @@ -4,7 +4,7 @@ from .event_handler import EventHandler | ||||
|  | ||||
|  | ||||
| class EventHandlerFactoryBase: | ||||
|     def build(self, handler_stub, *, keys=None, event_handler_type=EventHandler): | ||||
|     def build(self, handler_stub, *, keys=None, event_handler_type=None): | ||||
|         builder = EventHandlerBuilder(handler_stub, keys, event_handler_type) | ||||
|         connector = self._build_connector() | ||||
|         event_handler = builder.build(connector) | ||||
| @@ -21,7 +21,13 @@ class EventHandlerFactoryBase: | ||||
| class EventHandlerBuilder: | ||||
|     def __init__(self, event_handler, supplied_keys, event_handler_type): | ||||
|         self._analyzer = HandlerStubAnalyzer(event_handler, supplied_keys) | ||||
|         self._event_handler_type = event_handler_type | ||||
|         self._event_handler_type = self._determine_type(event_handler_type) | ||||
|  | ||||
|     def _determine_type(self, provided_type): | ||||
|         type_ = provided_type or self._analyzer.event_handler_type or EventHandler | ||||
|         if not issubclass(type_, EventHandler): | ||||
|             raise ValueError("No type supplied!") | ||||
|         return type_ | ||||
|  | ||||
|     def build(self, connector): | ||||
|         event_handler = self._event_handler_type(connector) | ||||
| @@ -66,3 +72,8 @@ class HandlerStubAnalyzer: | ||||
|     @property | ||||
|     def cleanup(self): | ||||
|         return self._event_handler.cleanup | ||||
|  | ||||
|     @property | ||||
|     def event_handler_type(self): | ||||
|         with suppress(AttributeError): | ||||
|             return EventHandler.get_type(self._event_handler.type_id) | ||||
|   | ||||
| @@ -6,6 +6,8 @@ import pytest | ||||
|  | ||||
| from .event_handler_factory_base import EventHandlerFactoryBase | ||||
| from .event_handler import EventHandler | ||||
| from .control_event_handler import ControlEventHandler | ||||
| from .fsm_aware_event_handler import FSMAwareEventHandler | ||||
|  | ||||
|  | ||||
| class MockEventHandlerFactory(EventHandlerFactoryBase): | ||||
| @@ -130,6 +132,28 @@ def test_build_from_simple_object(test_keys, test_msg): | ||||
|     assert msg == test_msg | ||||
|  | ||||
|  | ||||
| def test_build_type(): | ||||
|     class SomeControlHandler: | ||||
|         keys = ['cica'] | ||||
|         type_id = 'ControlEventHandler' | ||||
|         # pylint: disable=no-self-use | ||||
|         def handle_event(self, *_): | ||||
|             pass | ||||
|  | ||||
|     eh = MockEventHandlerFactory().build(SomeControlHandler()) | ||||
|     assert isinstance(eh, ControlEventHandler) | ||||
|  | ||||
|     eh = MockEventHandlerFactory().build(SomeControlHandler(), event_handler_type=EventHandler) | ||||
|     assert type(eh) == EventHandler  # pylint: disable=unidiomatic-typecheck | ||||
|  | ||||
|     SomeControlHandler.type_id = 'FSMAwareEventHandler' | ||||
|     eh = MockEventHandlerFactory().build(SomeControlHandler()) | ||||
|     assert isinstance(eh, FSMAwareEventHandler) | ||||
|  | ||||
|     eh = MockEventHandlerFactory().build(lambda *_: None, keys=['cica']) | ||||
|     assert isinstance(eh, EventHandler) | ||||
|  | ||||
|  | ||||
| def test_build_from_callable(test_keys, test_msg): | ||||
|     mock_eh = MockCallable() | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user