Skip to content

Commit fdb9fed

Browse files
Derive Messages from Base Classes (#230)
Signed-off-by: Michael Carlstrom <rmc@carlstrom.com> Co-authored-by: Christophe Bedard <bedard.christophe@gmail.com>
1 parent e4c419f commit fdb9fed

File tree

4 files changed

+20
-11
lines changed

4 files changed

+20
-11
lines changed

rosidl_generator_py/resource/_action.py.em

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ TEMPLATE(
4242
}@
4343

4444

45-
class Metaclass_@(action.namespaced_type.name)(type):
45+
class Metaclass_@(action.namespaced_type.name)(rosidl_pycommon.interface_base_classes.ActionTypeSupportMeta):
4646
"""Metaclass of action '@(action.namespaced_type.name)'."""
4747

4848
_TYPE_SUPPORT: typing.ClassVar[typing.Optional[PyCapsule]] = None
@@ -79,14 +79,18 @@ class Metaclass_@(action.namespaced_type.name)(type):
7979
@(module_name).Metaclass_@(action.feedback_message.structure.namespaced_type.name).__import_type_support__()
8080

8181

82-
class @(action.namespaced_type.name)(metaclass=Metaclass_@(action.namespaced_type.name)):
82+
class @(action.namespaced_type.name)(rosidl_pycommon.interface_base_classes.BaseAction[
83+
@(action.goal.structure.namespaced_type.name),
84+
@(action.result.structure.namespaced_type.name),
85+
@(action.feedback.structure.namespaced_type.name)
86+
], metaclass=Metaclass_@(action.namespaced_type.name)):
8387

8488
# The goal message defined in the action definition.
85-
from @('.'.join(action.namespaced_type.namespaces)).@(module_name) import @(action.goal.structure.namespaced_type.name) as Goal
89+
Goal: type[@(action.goal.structure.namespaced_type.name)] = @(action.goal.structure.namespaced_type.name)
8690
# The result message defined in the action definition.
87-
from @('.'.join(action.namespaced_type.namespaces)).@(module_name) import @(action.result.structure.namespaced_type.name) as Result
91+
Result: type[@(action.result.structure.namespaced_type.name)] = @(action.result.structure.namespaced_type.name)
8892
# The feedback message defined in the action definition.
89-
from @('.'.join(action.namespaced_type.namespaces)).@(module_name) import @(action.feedback.structure.namespaced_type.name) as Feedback
93+
Feedback: type[@(action.feedback.structure.namespaced_type.name)] = @(action.feedback.structure.namespaced_type.name)
9094

9195
class Impl:
9296

rosidl_generator_py/resource/_idl.py.em

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import collections.abc
88
from os import getenv
99
import typing
1010

11+
import rosidl_pycommon.interface_base_classes
12+
1113
# This is being done at the module level and not on the instance level to avoid looking
1214
# for the same variable multiple times on each instance. This variable is not supposed to
1315
# change during runtime so it makes sense to only look for it once.

rosidl_generator_py/resource/_msg.py.em

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ for member in message.structure.members:
138138
@#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
139139

140140

141-
class Metaclass_@(message.structure.namespaced_type.name)(type):
141+
class Metaclass_@(message.structure.namespaced_type.name)(rosidl_pycommon.interface_base_classes.MessageTypeSupportMeta):
142142
"""Metaclass of message '@(message.structure.namespaced_type.name)'."""
143143

144144
_CREATE_ROS_MESSAGE: typing.ClassVar[typing.Optional[PyCapsule]] = None
@@ -244,7 +244,7 @@ for member in message.structure.members:
244244
@[end for]@
245245

246246

247-
class @(message.structure.namespaced_type.name)(metaclass=Metaclass_@(message.structure.namespaced_type.name)):
247+
class @(message.structure.namespaced_type.name)(rosidl_pycommon.interface_base_classes.BaseMessage, metaclass=Metaclass_@(message.structure.namespaced_type.name)):
248248
@[if not message.constants]@
249249
"""Message class '@(message.structure.namespaced_type.name)'."""
250250
@[else]@

rosidl_generator_py/resource/_srv.py.em

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ TEMPLATE(
2626
}@
2727

2828

29-
class Metaclass_@(service.namespaced_type.name)(type):
29+
class Metaclass_@(service.namespaced_type.name)(rosidl_pycommon.interface_base_classes.ServiceTypeSupportMeta):
3030
"""Metaclass of service '@(service.namespaced_type.name)'."""
3131

3232
_TYPE_SUPPORT: typing.ClassVar[typing.Optional[PyCapsule]] = None
@@ -56,9 +56,12 @@ class Metaclass_@(service.namespaced_type.name)(type):
5656
@(module_name).Metaclass_@(service.event_message.structure.namespaced_type.name).__import_type_support__()
5757

5858

59-
class @(service.namespaced_type.name)(metaclass=Metaclass_@(service.namespaced_type.name)):
60-
from @('.'.join(service.namespaced_type.namespaces)).@(module_name) import @(service.request_message.structure.namespaced_type.name) as Request
61-
from @('.'.join(service.namespaced_type.namespaces)).@(module_name) import @(service.response_message.structure.namespaced_type.name) as Response
59+
class @(service.namespaced_type.name)(rosidl_pycommon.interface_base_classes.BaseService[
60+
@(service.request_message.structure.namespaced_type.name),
61+
@(service.response_message.structure.namespaced_type.name)
62+
], metaclass=Metaclass_@(service.namespaced_type.name)):
63+
Request: type[@(service.request_message.structure.namespaced_type.name)] = @(service.request_message.structure.namespaced_type.name)
64+
Response: type[@(service.response_message.structure.namespaced_type.name)] = @(service.response_message.structure.namespaced_type.name)
6265
from @('.'.join(service.namespaced_type.namespaces)).@(module_name) import @(service.event_message.structure.namespaced_type.name) as Event
6366

6467
# Should eventually be typing.NoReturn. See mypy#14044

0 commit comments

Comments
 (0)