Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
1 change: 1 addition & 0 deletions rosidl_generator_py/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@

<exec_depend>ament_index_python</exec_depend>
<exec_depend>python3-numpy</exec_depend>
<exec_depend>python3-typing-extensions</exec_depend>
<exec_depend>rosidl_cli</exec_depend>
<exec_depend>rosidl_generator_c</exec_depend>
<exec_depend>rosidl_parser</exec_depend>
Expand Down
44 changes: 27 additions & 17 deletions rosidl_generator_py/resource/_action.py.em
Original file line number Diff line number Diff line change
Expand Up @@ -79,32 +79,42 @@ class Metaclass_@(action.namespaced_type.name)(rosidl_pycommon.interface_base_cl
@(module_name).Metaclass_@(action.feedback_message.structure.namespaced_type.name).__import_type_support__()


class _@(action.namespaced_type.name)_Impl(rosidl_pycommon.interface_base_classes.BaseImpl[
@(action.send_goal_service.namespaced_type.name),
@(action.get_result_service.namespaced_type.name),
@(action.feedback_message.structure.namespaced_type.name)
]):

# The send_goal service using a wrapped version of the goal message as a request.
SendGoalService: TypeAlias = @(action.send_goal_service.namespaced_type.name)
# The get_result service using a wrapped version of the result message as a response.
GetResultService: TypeAlias = @(action.get_result_service.namespaced_type.name)
# The feedback message with generic fields which wraps the feedback message.
FeedbackMessage: TypeAlias = @(action.feedback_message.structure.namespaced_type.name)

# The generic service to cancel a goal.
from action_msgs.srv._cancel_goal import CancelGoal
CancelGoalService: TypeAlias = CancelGoal
# The generic message for get the status of a goal.
from action_msgs.msg._goal_status_array import GoalStatusArray
GoalStatusMessage: TypeAlias = GoalStatusArray


class @(action.namespaced_type.name)(rosidl_pycommon.interface_base_classes.BaseAction[
@(action.goal.structure.namespaced_type.name),
@(action.result.structure.namespaced_type.name),
@(action.feedback.structure.namespaced_type.name)
@(action.feedback.structure.namespaced_type.name),
_@(action.namespaced_type.name)_Impl
], metaclass=Metaclass_@(action.namespaced_type.name)):

# The goal message defined in the action definition.
Goal: type[@(action.goal.structure.namespaced_type.name)] = @(action.goal.structure.namespaced_type.name)
Goal: TypeAlias = @(action.goal.structure.namespaced_type.name)
# The result message defined in the action definition.
Result: type[@(action.result.structure.namespaced_type.name)] = @(action.result.structure.namespaced_type.name)
Result: TypeAlias = @(action.result.structure.namespaced_type.name)
# The feedback message defined in the action definition.
Feedback: type[@(action.feedback.structure.namespaced_type.name)] = @(action.feedback.structure.namespaced_type.name)

class Impl:

# The send_goal service using a wrapped version of the goal message as a request.
from @('.'.join(action.namespaced_type.namespaces)).@(module_name) import @(action.send_goal_service.namespaced_type.name) as SendGoalService
# The get_result service using a wrapped version of the result message as a response.
from @('.'.join(action.namespaced_type.namespaces)).@(module_name) import @(action.get_result_service.namespaced_type.name) as GetResultService
# The feedback message with generic fields which wraps the feedback message.
from @('.'.join(action.namespaced_type.namespaces)).@(module_name) import @(action.feedback_message.structure.namespaced_type.name) as FeedbackMessage
Feedback: TypeAlias = @(action.feedback.structure.namespaced_type.name)

# The generic service to cancel a goal.
from action_msgs.srv._cancel_goal import CancelGoal as CancelGoalService
# The generic message for get the status of a goal.
from action_msgs.msg._goal_status_array import GoalStatusArray as GoalStatusMessage
Impl: TypeAlias = _@(action.namespaced_type.name)_Impl

# Should eventually be typing.NoReturn. See mypy#14044
def __init__(self) -> None:
Expand Down
18 changes: 15 additions & 3 deletions rosidl_generator_py/resource/_srv.py.em
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,18 @@ TEMPLATE(
package_name=package_name, interface_path=interface_path,
message=service.event_message, import_statements=import_statements,
type_annotations_import_statements=type_annotations_import_statements)

# Can be removed in rhel10 since TypeAlias will exist in typing
TYPE_ALIAS_IMPORT = 'from typing_extensions import TypeAlias'
}@
@[if TYPE_ALIAS_IMPORT not in type_annotations_import_statements]@


if typing.TYPE_CHECKING:
@(TYPE_ALIAS_IMPORT)
@[end if]@
@{
type_annotations_import_statements.add(TYPE_ALIAS_IMPORT)
}@


Expand Down Expand Up @@ -60,9 +72,9 @@ class @(service.namespaced_type.name)(rosidl_pycommon.interface_base_classes.Bas
@(service.request_message.structure.namespaced_type.name),
@(service.response_message.structure.namespaced_type.name)
], metaclass=Metaclass_@(service.namespaced_type.name)):
Request: type[@(service.request_message.structure.namespaced_type.name)] = @(service.request_message.structure.namespaced_type.name)
Response: type[@(service.response_message.structure.namespaced_type.name)] = @(service.response_message.structure.namespaced_type.name)
from @('.'.join(service.namespaced_type.namespaces)).@(module_name) import @(service.event_message.structure.namespaced_type.name) as Event
Request: TypeAlias = @(service.request_message.structure.namespaced_type.name)
Response: TypeAlias = @(service.response_message.structure.namespaced_type.name)
Event: TypeAlias = @(service.event_message.structure.namespaced_type.name)

# Should eventually be typing.NoReturn. See mypy#14044
def __init__(self) -> None:
Expand Down