Skip to content

Commit c3876d8

Browse files
committed
fix component template path and add test case
1 parent b4cab03 commit c3876d8

File tree

3 files changed

+141
-7
lines changed

3 files changed

+141
-7
lines changed

ros2model/api/model_generator/component_generator.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,35 @@
1818

1919
from ros2model.core.generator.generator_core import GeneratorCore
2020
import typing as t
21-
from ament_index_python import get_package_share_directory
2221

2322
Template_Folder = Path(__file__).parent.parent.parent.parent.resolve() / "templates"
2423
Template = Path(Template_Folder / "component.ros2.j2")
2524

26-
Template_Folder_ROS = Path(get_package_share_directory("ros2model") + "/templates")
27-
Template_ROS = Path(Template_Folder_ROS / "component.ros2.j2")
25+
26+
try:
27+
from ament_index_python import get_package_share_directory
28+
29+
Template_Folder_ROS = Path(get_package_share_directory("ros2model") + "/templates")
30+
Template_ROS = Path(Template_Folder_ROS / "component.ros2.j2")
31+
except ImportError:
32+
Template_ROS = None
2833

2934

3035
class ComponentGenerator(GeneratorCore):
3136
def __init__(self, template_path=None) -> None:
3237
if template_path != None:
3338
self.template_path = Path(template_path).resolve()
34-
elif Template_ROS.is_file():
39+
elif Template_ROS != None and Template_ROS.is_file():
3540
self.template_path = Template
3641
elif Template.is_file():
3742
self.template_path = Template
3843
else:
39-
raise FileNotFoundError(
40-
f"Can't find template either from {Template.absolute().as_posix()} or {Template_ROS.absolute().as_posix()}"
41-
)
44+
if Template_ROS != None:
45+
raise FileNotFoundError(
46+
f"Can't find template either from {Template.absolute().as_posix()} or {Template_ROS.absolute().as_posix()}"
47+
)
48+
else:
49+
raise FileNotFoundError(
50+
f"Can't find template either from {Template.absolute().as_posix()}"
51+
)
4252
super().__init__(self.template_path, ".ros2")

test/outputs/test_model.ros2

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
test_model:
2+
artifacts:
3+
map_server:
4+
node: /map_server
5+
publishers:
6+
'map_metadata':
7+
type: 'nav_msgs/msg/MapMetaData'
8+
'map':
9+
type: 'nav_msgs/msg/OccupancyGrid'
10+
actionservers:
11+
'static_map':
12+
type: 'nav_msgs/srv/GetMap'
13+
actionclients:
14+
'static_map':
15+
type: 'nav_msgs/srv/GetMap'
16+
serviceservers:
17+
'static_map':
18+
type: 'nav_msgs/srv/GetMap'
19+
serviceclients:
20+
'static_map':
21+
type: 'nav_msgs/srv/GetMap'
22+
parameters:
23+
'shadows/min_angle':
24+
type: Double
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import unittest
2+
from pathlib import Path
3+
4+
from ros2model.api.model_generator.component_generator import ComponentGenerator
5+
from ros2model.core.metamodels.metamodel_ros import *
6+
7+
test_model = Package(
8+
name="test_model",
9+
artifact=[
10+
Artifact(
11+
name="map_server",
12+
node=[
13+
Node(
14+
name=GraphName(
15+
name="map_server",
16+
namespace="/",
17+
full_name="/map_server",
18+
),
19+
publisher=[
20+
Publisher(name="map_metadata", type="nav_msgs/msg/MapMetaData"),
21+
Publisher(name="map", type="nav_msgs/msg/OccupancyGrid"),
22+
],
23+
serviceserver=[
24+
ServiceServer(name="static_map", type="nav_msgs/srv/GetMap")
25+
],
26+
serviceclient=[
27+
ServiceClient(name="static_map", type="nav_msgs/srv/GetMap")
28+
],
29+
actionclient=[
30+
ActionClient(name="static_map", type="nav_msgs/srv/GetMap")
31+
],
32+
actionserver=[
33+
ActionServer(name="static_map", type="nav_msgs/srv/GetMap")
34+
],
35+
parameter=[
36+
Parameter(
37+
name="shadows/min_angle", type="Double", value="-1.52"
38+
)
39+
],
40+
),
41+
],
42+
),
43+
],
44+
)
45+
46+
from devtools import pprint
47+
48+
pprint(test_model)
49+
50+
test_dir = "test"
51+
output_folder = "outputs"
52+
53+
expect_result = """
54+
test_model:
55+
artifacts:
56+
map_server:
57+
node: /map_server
58+
publishers:
59+
'map_metadata':
60+
type: 'nav_msgs/msg/MapMetaData'
61+
'map':
62+
type: 'nav_msgs/msg/OccupancyGrid'
63+
actionservers:
64+
'static_map':
65+
type: 'nav_msgs/srv/GetMap'
66+
actionclients:
67+
'static_map':
68+
type: 'nav_msgs/srv/GetMap'
69+
serviceservers:
70+
'static_map':
71+
type: 'nav_msgs/srv/GetMap'
72+
serviceclients:
73+
'static_map':
74+
type: 'nav_msgs/srv/GetMap'
75+
parameters:
76+
'shadows/min_angle':
77+
type: Double
78+
79+
"""
80+
81+
82+
class test_message_generator(unittest.TestCase):
83+
def setUp(self) -> None:
84+
self.generator = ComponentGenerator()
85+
self.test_dir = Path(test_dir)
86+
self.output_dir = Path(self.test_dir / output_folder)
87+
88+
def test_generate_pkg(self):
89+
self.generator.generate_a_file(
90+
model=test_model,
91+
output_dir=self.output_dir,
92+
filename=f"{test_model.name}",
93+
)
94+
with open(Path(self.output_dir / f"{test_model.name}.ros2"), "r") as file:
95+
data = file.read()
96+
self.assertEqual(expect_result.strip(), data.strip())
97+
98+
99+
if __name__ == "__main__":
100+
unittest.main()

0 commit comments

Comments
 (0)