Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add 'handle_once' property for unregistering an EventHandler after one event #141

Merged
merged 3 commits into from
Sep 25, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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:
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll remove this.

# 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