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
31 changes: 16 additions & 15 deletions rosidl_generator_py/resource/_action.py.em
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ TEMPLATE(
}@


from action_msgs.msg._goal_status_array import Metaclass_GoalStatusArray # noqa: E402, I100
from action_msgs.srv._cancel_goal import Metaclass_CancelGoal # noqa: E402, I100


class Metaclass_@(action.namespaced_type.name)(rosidl_pycommon.interface_base_classes.ActionTypeSupportMeta):
"""Metaclass of action '@(action.namespaced_type.name)'."""

Expand All @@ -50,7 +54,7 @@ class Metaclass_@(action.namespaced_type.name)(rosidl_pycommon.interface_base_cl
@@classmethod
def __import_type_support__(cls) -> None:
try:
from rosidl_generator_py import import_type_support
from rosidl_generator_py import import_type_support # type: ignore[attr-defined]
module = import_type_support('@(package_name)')
except ImportError:
import logging
Expand All @@ -63,20 +67,17 @@ class Metaclass_@(action.namespaced_type.name)(rosidl_pycommon.interface_base_cl
else:
cls._TYPE_SUPPORT = module.type_support_action__@('__'.join(action.namespaced_type.namespaces[1:]))_@(action_name)

from action_msgs.msg import _goal_status_array
if _goal_status_array.Metaclass_GoalStatusArray._TYPE_SUPPORT is None:
_goal_status_array.Metaclass_GoalStatusArray.__import_type_support__()
from action_msgs.srv import _cancel_goal
if _cancel_goal.Metaclass_CancelGoal._TYPE_SUPPORT is None:
_cancel_goal.Metaclass_CancelGoal.__import_type_support__()

from @('.'.join(action.namespaced_type.namespaces)) import @(module_name)
if @(module_name).Metaclass_@(action.send_goal_service.namespaced_type.name)._TYPE_SUPPORT is None:
@(module_name).Metaclass_@(action.send_goal_service.namespaced_type.name).__import_type_support__()
if @(module_name).Metaclass_@(action.get_result_service.namespaced_type.name)._TYPE_SUPPORT is None:
@(module_name).Metaclass_@(action.get_result_service.namespaced_type.name).__import_type_support__()
if @(module_name).Metaclass_@(action.feedback_message.structure.namespaced_type.name)._TYPE_SUPPORT is None:
@(module_name).Metaclass_@(action.feedback_message.structure.namespaced_type.name).__import_type_support__()
if Metaclass_GoalStatusArray._TYPE_SUPPORT is None:
Metaclass_GoalStatusArray.__import_type_support__()
if Metaclass_CancelGoal._TYPE_SUPPORT is None:
Metaclass_CancelGoal.__import_type_support__()

if Metaclass_@(action.send_goal_service.namespaced_type.name)._TYPE_SUPPORT is None:
Metaclass_@(action.send_goal_service.namespaced_type.name).__import_type_support__()
if Metaclass_@(action.get_result_service.namespaced_type.name)._TYPE_SUPPORT is None:
Metaclass_@(action.get_result_service.namespaced_type.name).__import_type_support__()
if Metaclass_@(action.feedback_message.structure.namespaced_type.name)._TYPE_SUPPORT is None:
Metaclass_@(action.feedback_message.structure.namespaced_type.name).__import_type_support__()


class @(action.namespaced_type.name)(rosidl_pycommon.interface_base_classes.BaseAction[
Expand Down
43 changes: 16 additions & 27 deletions rosidl_generator_py/resource/_msg.py.em
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,18 @@ for member in message.structure.members:
if isinstance(type_, BasicType) and type_.typename in FLOATING_POINT_TYPES:
imports.setdefault(
'import math', []) # used for math.isinf
if isinstance(type_, NamespacedType):
if not (
type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX) or
type_.name.endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) or
type_.name.endswith(ACTION_GOAL_SUFFIX) or
type_.name.endswith(ACTION_RESULT_SUFFIX) or
type_.name.endswith(ACTION_FEEDBACK_SUFFIX)
):
joined_type_namespaces = '.'.join(type_.namespaces)
imports.setdefault(
f'from {joined_type_namespaces}._{convert_camel_case_to_lower_case_underscore(type_.name)} import {type_.name}',
[])
if (
isinstance(member.type, AbstractNestedType) and
isinstance(member.type.value_type, BasicType) and
Expand Down Expand Up @@ -199,16 +211,15 @@ for member in message.structure.members:
type_.name.endswith(ACTION_FEEDBACK_SUFFIX)
):
action_name, suffix = type_.name.rsplit('_', 1)
typename = (*type_.namespaces, action_name, action_name + '.' + suffix)
typename = action_name + '.' + suffix
else:
typename = (*type_.namespaces, type_.name, type_.name)
typename = type_.name
importable_typesupports.add(typename)
}@
@[for typename in sorted(importable_typesupports)]@

from @('.'.join(typename[:-2])) import @(typename[-2])
if @(typename[-1])._TYPE_SUPPORT is None:
@(typename[-1]).__import_type_support__()
if @(typename)._TYPE_SUPPORT is None:
@(typename).__import_type_support__()
@[end for]@

@@classmethod
Expand Down Expand Up @@ -380,17 +391,6 @@ if isinstance(type_, AbstractNestedType):
@[ if member.has_annotation('default')]@
self.@(member.name) = @(member.name) if @(member.name) is not None else @(message.structure.namespaced_type.name).@(member.name.upper())__DEFAULT
@[ else]@
@[ if isinstance(type_, NamespacedType) and not isinstance(member.type, AbstractSequence)]@
@[ if (
type_.name.endswith(ACTION_GOAL_SUFFIX) or
type_.name.endswith(ACTION_RESULT_SUFFIX) or
type_.name.endswith(ACTION_FEEDBACK_SUFFIX)
)]@
from @('.'.join(type_.namespaces))._@(convert_camel_case_to_lower_case_underscore(type_.name.rsplit('_', 1)[0])) import @(type_.name)
@[ else]@
from @('.'.join(type_.namespaces)) import @(type_.name)
@[ end if]@
@[ end if]@
@[ if isinstance(member.type, Array)]@
@[ if isinstance(type_, BasicType) and type_.typename == 'octet']@
self.@(member.name) = @(member.name) if @(member.name) is not None else [bytes([0]) for x in range(@(member.type.size))]
Expand Down Expand Up @@ -516,17 +516,6 @@ if isinstance(member.type, (Array, AbstractSequence)):
return
@[ end if]@
@[ end if]@
@[ if isinstance(type_, NamespacedType)]@
@[ if (
type_.name.endswith(ACTION_GOAL_SUFFIX) or
type_.name.endswith(ACTION_RESULT_SUFFIX) or
type_.name.endswith(ACTION_FEEDBACK_SUFFIX)
)]@
from @('.'.join(type_.namespaces))._@(convert_camel_case_to_lower_case_underscore(type_.name.rsplit('_', 1)[0])) import @(type_.name)
@[ else]@
from @('.'.join(type_.namespaces)) import @(type_.name)
@[ end if]@
@[ end if]@
@[ if isinstance(member.type, AbstractNestedType)]@
from collections.abc import Sequence
from collections.abc import Set
Expand Down
15 changes: 7 additions & 8 deletions rosidl_generator_py/resource/_srv.py.em
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class Metaclass_@(service.namespaced_type.name)(rosidl_pycommon.interface_base_c
@@classmethod
def __import_type_support__(cls) -> None:
try:
from rosidl_generator_py import import_type_support
from rosidl_generator_py import import_type_support # type: ignore[attr-defined]
module = import_type_support('@(package_name)')
except ImportError:
import logging
Expand All @@ -47,13 +47,12 @@ class Metaclass_@(service.namespaced_type.name)(rosidl_pycommon.interface_base_c
else:
cls._TYPE_SUPPORT = module.type_support_srv__@('__'.join(service.namespaced_type.namespaces[1:]))_@(service_name)

from @('.'.join(service.namespaced_type.namespaces)) import @(module_name)
if @(module_name).Metaclass_@(service.request_message.structure.namespaced_type.name)._TYPE_SUPPORT is None:
@(module_name).Metaclass_@(service.request_message.structure.namespaced_type.name).__import_type_support__()
if @(module_name).Metaclass_@(service.response_message.structure.namespaced_type.name)._TYPE_SUPPORT is None:
@(module_name).Metaclass_@(service.response_message.structure.namespaced_type.name).__import_type_support__()
if @(module_name).Metaclass_@(service.event_message.structure.namespaced_type.name)._TYPE_SUPPORT is None:
@(module_name).Metaclass_@(service.event_message.structure.namespaced_type.name).__import_type_support__()
if Metaclass_@(service.request_message.structure.namespaced_type.name)._TYPE_SUPPORT is None:
Metaclass_@(service.request_message.structure.namespaced_type.name).__import_type_support__()
if Metaclass_@(service.response_message.structure.namespaced_type.name)._TYPE_SUPPORT is None:
Metaclass_@(service.response_message.structure.namespaced_type.name).__import_type_support__()
if Metaclass_@(service.event_message.structure.namespaced_type.name)._TYPE_SUPPORT is None:
Metaclass_@(service.event_message.structure.namespaced_type.name).__import_type_support__()


class @(service.namespaced_type.name)(rosidl_pycommon.interface_base_classes.BaseService[
Expand Down
15 changes: 0 additions & 15 deletions rosidl_generator_py/rosidl_generator_py/generate_py_impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,6 @@
from rosidl_parser.definition import AbstractSequence
from rosidl_parser.definition import AbstractType
from rosidl_parser.definition import Action
from rosidl_parser.definition import ACTION_FEEDBACK_SUFFIX
from rosidl_parser.definition import ACTION_GOAL_SUFFIX
from rosidl_parser.definition import ACTION_RESULT_SUFFIX
from rosidl_parser.definition import Array
from rosidl_parser.definition import BasicType
from rosidl_parser.definition import CHARACTER_TYPES
Expand Down Expand Up @@ -435,18 +432,6 @@ def get_setter_and_getter_type(member: Member, type_imports: set[str]) -> tuple[
else:
type_annotation = python_type

if isinstance(type_, NamespacedType):
joined_type_namespaces = '.'.join(type_.namespaces)
if type_.name.endswith(ACTION_GOAL_SUFFIX) or type_.name.endswith(ACTION_RESULT_SUFFIX) \
or type_.name.endswith(ACTION_FEEDBACK_SUFFIX):

type_name_rsplit = type_.name.rsplit('_', 1)
lower_case_name = convert_camel_case_to_lower_case_underscore(type_name_rsplit[0])
type_imports.add(f'from {joined_type_namespaces}._{lower_case_name} '
f'import {type_.name}')
else:
type_imports.add(f'from {joined_type_namespaces} import {type_.name}')

type_annotations_setter = type_annotation

if type_annotations_getter == '':
Expand Down