Merge branch 'get-handler-from-handler' into 'master'
Get handler from handler See merge request micro-ROS/ros_tracing/tracetools_analysis!42
This commit is contained in:
commit
213a57a027
2 changed files with 45 additions and 5 deletions
|
@ -113,6 +113,11 @@ class TestProcessor(unittest.TestCase):
|
||||||
*args,
|
*args,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_event_handler_process(self) -> None:
|
||||||
|
# Should not be called directly
|
||||||
|
with self.assertRaises(AssertionError):
|
||||||
|
EventHandler.process([])
|
||||||
|
|
||||||
def test_handler_wrong_signature(self) -> None:
|
def test_handler_wrong_signature(self) -> None:
|
||||||
handler = WrongHandler()
|
handler = WrongHandler()
|
||||||
mock_event = {
|
mock_event = {
|
||||||
|
@ -159,6 +164,13 @@ class TestProcessor(unittest.TestCase):
|
||||||
# Passes check
|
# Passes check
|
||||||
Processor(EventHandlerWithRequiredEvent()).process([required_mock_event, mock_event])
|
Processor(EventHandlerWithRequiredEvent()).process([required_mock_event, mock_event])
|
||||||
|
|
||||||
|
def test_get_handler_by_type(self) -> None:
|
||||||
|
handler1 = StubHandler1()
|
||||||
|
handler2 = StubHandler2()
|
||||||
|
processor = Processor(handler1, handler2)
|
||||||
|
result = processor.get_handler_by_type(StubHandler1)
|
||||||
|
self.assertTrue(result is handler1)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -21,6 +21,7 @@ from typing import Dict
|
||||||
from typing import List
|
from typing import List
|
||||||
from typing import Set
|
from typing import Set
|
||||||
from typing import Type
|
from typing import Type
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
from tracetools_read import DictEvent
|
from tracetools_read import DictEvent
|
||||||
from tracetools_read import get_event_name
|
from tracetools_read import get_event_name
|
||||||
|
@ -125,7 +126,7 @@ class EventHandler(Dependant):
|
||||||
f'empty map: {self.__class__.__name__}'
|
f'empty map: {self.__class__.__name__}'
|
||||||
assert all(required_name in handler_map.keys() for required_name in self.required_events())
|
assert all(required_name in handler_map.keys() for required_name in self.required_events())
|
||||||
self._handler_map = handler_map
|
self._handler_map = handler_map
|
||||||
self.processor = None
|
self._processor = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def handler_map(self) -> HandlerMap:
|
def handler_map(self) -> HandlerMap:
|
||||||
|
@ -137,6 +138,10 @@ class EventHandler(Dependant):
|
||||||
"""Get the data model."""
|
"""Get the data model."""
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def processor(self) -> 'Processor':
|
||||||
|
return self._processor
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def required_events() -> Set[str]:
|
def required_events() -> Set[str]:
|
||||||
"""
|
"""
|
||||||
|
@ -147,9 +152,12 @@ class EventHandler(Dependant):
|
||||||
"""
|
"""
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def register_processor(self, processor: 'Processor') -> None:
|
def register_processor(
|
||||||
|
self,
|
||||||
|
processor: 'Processor',
|
||||||
|
) -> None:
|
||||||
"""Register processor with this `EventHandler` so that it can query other handlers."""
|
"""Register processor with this `EventHandler` so that it can query other handlers."""
|
||||||
self.processor = processor
|
self._processor = processor
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def int_to_hex_str(addr: int) -> str:
|
def int_to_hex_str(addr: int) -> str:
|
||||||
|
@ -157,14 +165,19 @@ class EventHandler(Dependant):
|
||||||
return f'0x{addr:X}'
|
return f'0x{addr:X}'
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def process(cls, events: List[DictEvent], **kwargs) -> 'EventHandler':
|
def process(
|
||||||
|
cls,
|
||||||
|
events: List[DictEvent],
|
||||||
|
**kwargs,
|
||||||
|
) -> 'EventHandler':
|
||||||
"""
|
"""
|
||||||
Create a `Processor` and process an instance of the class.
|
Create a `Processor` and process an instance of the class.
|
||||||
|
|
||||||
:param events: the list of events
|
:param events: the list of events
|
||||||
:return: the processor object after processing
|
:return: the processor object after processing
|
||||||
"""
|
"""
|
||||||
assert cls != EventHandler, 'only call process() from inheriting classes'
|
if cls == EventHandler:
|
||||||
|
raise AssertionError('only call EventHandler.process() from inheriting classes')
|
||||||
handler_object = cls(**kwargs) # pylint: disable=all
|
handler_object = cls(**kwargs) # pylint: disable=all
|
||||||
processor = Processor(handler_object, **kwargs)
|
processor = Processor(handler_object, **kwargs)
|
||||||
processor.process(events)
|
processor.process(events)
|
||||||
|
@ -324,6 +337,21 @@ class Processor():
|
||||||
for handler in handlers:
|
for handler in handlers:
|
||||||
handler.register_processor(self)
|
handler.register_processor(self)
|
||||||
|
|
||||||
|
def get_handler_by_type(
|
||||||
|
self,
|
||||||
|
handler_type: Type,
|
||||||
|
) -> Union[EventHandler, None]:
|
||||||
|
"""
|
||||||
|
Get an existing EventHandler instance from its type.
|
||||||
|
|
||||||
|
:param handler_type: the type of EventHandler subclass to find
|
||||||
|
:return: the EventHandler instance if found, otherwise `None`
|
||||||
|
"""
|
||||||
|
return next(
|
||||||
|
(handler for handler in self._expanded_handlers if type(handler) is handler_type),
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_event_names(
|
def get_event_names(
|
||||||
events: List[DictEvent],
|
events: List[DictEvent],
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue