Skip to content

Commit

Permalink
Add a common interface for describing an EventHandler
Browse files Browse the repository at this point in the history
A common pattern for describing event handlers has been moved to the parent class.
Subclasses should implement the 'handler_description' and 'matcher_description' properties rather than implementing a describe method.
  • Loading branch information
jacobperron committed Sep 24, 2018
1 parent dbf1ad7 commit fec5e1d
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 62 deletions.
35 changes: 34 additions & 1 deletion launch/launch/event_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@
"""Module for EventHandler class."""

from typing import Callable
from typing import List
from typing import Optional
from typing import Text
from typing import Tuple

from .event import Event
from .some_actions_type import SomeActionsType
Expand Down Expand Up @@ -59,6 +62,8 @@ def __init__(
@property
def entities(self):
"""Getter for entities."""
# if self.__entities is None:
# return []
return self.__entities

@property
Expand All @@ -75,7 +80,35 @@ def handle_once(self, value):
)
self.__handle_once = value

# TODO(wjwwood): setup standard interface for describing event handlers
@property
def handler_description(self):
"""
Return the string description of the handler.
This should be overridden.
"""
return None

@property
def matcher_description(self):
"""
Return the string description of the matcher.
This should be overridden.
"""
return None

def describe(self) -> Tuple[Text, List[SomeActionsType]]:
"""Return the description list with 0 as a string, and then LaunchDescriptionEntity's."""
return (
"{}(matcher='{}', handler='{}', handle_once={})".format(
type(self).__name__,
self.matcher_description,
self.handler_description,
self.handle_once
),
self.entities if self.entities is not None else []
)

def matches(self, event: Event) -> bool:
"""Return True if the given event should be handled by this event handler."""
Expand Down
21 changes: 9 additions & 12 deletions launch/launch/event_handlers/on_include_launch_description.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,10 @@

"""Module for OnIncludeLaunchDescription class."""

from typing import List
from typing import Text
from typing import Tuple

from ..event_handler import EventHandler
from ..events import IncludeLaunchDescription
from ..launch_description_entity import LaunchDescriptionEntity
from ..utilities import is_a_subclass


Expand All @@ -38,12 +35,12 @@ def __init__(self, **kwargs):
**kwargs,
)

def describe(self) -> Tuple[Text, List[LaunchDescriptionEntity]]:
"""Return the description list with 0 as a string, and then LaunchDescriptionEntity's."""
return (
"OnIncludeLaunchDescription(matcher='{}', handler='{}')".format(
'event issubclass of launch.events.IncludeLaunchDescription',
'returns the launch_description in the event'
),
[],
)
@property
def handler_description(self) -> Text:
"""Return the string description of the handler."""
return 'returns the launch_description in the event'

@property
def matcher_description(self) -> Text:
"""Return the string description of the matcher."""
return 'event issubclass of launch.events.IncludeLaunchDescription'
26 changes: 9 additions & 17 deletions launch/launch/event_handlers/on_process_exit.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,9 @@
import collections
from typing import Callable
from typing import cast
from typing import List
from typing import Optional
from typing import overload
from typing import Text
from typing import Tuple

from ..event import Event
from ..event_handler import EventHandler
Expand Down Expand Up @@ -110,24 +108,18 @@ def handle(self, event: Event, context: LaunchContext) -> Optional[SomeActionsTy
"""Handle the given event."""
return self.__on_exit(cast(ProcessExited, event), context)

def describe(self) -> Tuple[Text, List[LaunchDescriptionEntity]]:
"""Return the description list with 0 as a string, and then LaunchDescriptionEntity's."""
@property
def handler_description(self) -> Text:
"""Return the string description of the handler."""
# TODO(jacobperron): revisit how to describe known actions that are passed in.
# It would be nice if the parent class could output their desciption
# via the 'entities' property.
if self.__actions_on_exit:
# A list of resulting actions is already known.
return (
"OnProcessExit(matcher='{}', handler=<actions>)".format(self.matcher_description),
self.__actions_on_exit,
)
# A callable handler has been provided.
return (
"OnProcessExit(matcher='{}', handler={})".format(
self.matcher_description,
self.__on_exit),
[],
)
return '<actions>'
return '{}'.format(self.__on_exit)

@property
def matcher_description(self):
def matcher_description(self) -> Text:
"""Return the string description of the matcher."""
if self.__target_action is None:
return 'event == ProcessExited'
Expand Down
17 changes: 5 additions & 12 deletions launch/launch/event_handlers/on_process_io.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,13 @@

from typing import Callable
from typing import cast
from typing import List
from typing import Optional
from typing import Text
from typing import Tuple

from ..event import Event
from ..event_handler import EventHandler
from ..events.process import ProcessIO
from ..launch_context import LaunchContext
from ..launch_description_entity import LaunchDescriptionEntity
from ..some_actions_type import SomeActionsType

if False:
Expand Down Expand Up @@ -78,8 +75,9 @@ def handle(self, event: Event, context: LaunchContext) -> Optional[SomeActionsTy
return self.__on_stdin(event)
return None

def describe(self) -> Tuple[Text, List[LaunchDescriptionEntity]]:
"""Return the description list with 0 as a string, and then LaunchDescriptionEntity's."""
@property
def handler_description(self) -> Text:
"""Return the string description of the handler."""
handlers = []
if self.__on_stdin is not None:
handlers.append("on_stdin: '{}'".format(self.__on_stdin))
Expand All @@ -88,15 +86,10 @@ def describe(self) -> Tuple[Text, List[LaunchDescriptionEntity]]:
if self.__on_stderr is not None:
handlers.append("on_stderr: '{}'".format(self.__on_stderr))
handlers_str = '{' + ', '.join(handlers) + '}'
return (
"OnProcessIO(matcher='{}', handlers={})".format(
self.matcher_description, handlers_str
),
[],
)
return handlers_str

@property
def matcher_description(self):
def matcher_description(self) -> Text:
"""Return the string description of the matcher."""
if self.__target_action is None:
return 'event issubclass of ProcessIO'
Expand Down
15 changes: 4 additions & 11 deletions launch/launch/event_handlers/on_shutdown.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,13 @@

from typing import Callable
from typing import cast
from typing import List
from typing import Optional
from typing import overload
from typing import Text
from typing import Tuple

from ..event import Event
from ..event_handler import EventHandler
from ..events import Shutdown
from ..launch_description_entity import LaunchDescriptionEntity
from ..some_actions_type import SomeActionsType
from ..utilities import is_a_subclass

Expand Down Expand Up @@ -70,15 +67,11 @@ def handle(self, event: Event, context: 'LaunchContext') -> Optional[SomeActions
context.extend_locals({'event': event})
return self.__on_shutdown(cast(Shutdown, event), context)

def describe(self) -> Tuple[Text, List[LaunchDescriptionEntity]]:
"""Return the description list with 0 as a string, and then LaunchDescriptionEntity's."""
@property
def handler_description(self) -> Text:
"""Return the string description of the handler."""
# TODO(dhood): print known actions if they were passed in, like in OnProcessExit
return (
"OnShutdown(matcher='{}', handler={})".format(
self.matcher_description,
self.__on_shutdown),
[],
)
return '{}'.format(self.__on_shutdown)

@property
def matcher_description(self):
Expand Down
13 changes: 4 additions & 9 deletions launch_ros/launch_ros/event_handlers/on_state_transition.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,11 @@
"""Module for OnStateTransition class."""

from typing import Callable
from typing import List
from typing import Optional
from typing import Text
from typing import Tuple

from launch.event import Event
from launch.event_handler import EventHandler
from launch.launch_description_entity import LaunchDescriptionEntity
from launch.some_actions_type import SomeActionsType
from launch.some_substitutions_type import SomeSubstitutionsType

Expand Down Expand Up @@ -84,12 +81,10 @@ def __init__(
)
self.__target_lifecycle_node = target_lifecycle_node

def describe(self) -> Tuple[Text, List[LaunchDescriptionEntity]]:
"""Return the description list with 0 as a string, and then LaunchDescriptionEntity's."""
return (
"OnStateTransition(matcher='{}', handler=<actions>)".format(self.matcher_description),
self.entities,
)
@property
def handler_description(self) -> Text:
"""Return the string description of the handler."""
return '<actions>'

@property
def matcher_description(self):
Expand Down

0 comments on commit fec5e1d

Please sign in to comment.