6 from genmsg
import MsgContext, MsgSpec, SrvSpec, gentools
7 from genpy.generator
import compute_outfile_name, make_python_safe
9 from ._typing
import TYPE_CHECKING
10 from .converter
import convert_genpy_init, convert_message_class, convert_service_class
11 from .stub_element
import ClassElement, EmptyLinesElement, ImportsElement, ModuleElement
14 from typing
import Callable, Dict, Iterator, List, TypeVar
16 SpecType = TypeVar(
"SpecType", MsgSpec, SrvSpec)
17 LoaderType = Callable[[MsgContext, str, str], SpecType]
18 GeneratorType = Callable[[str, SpecType], Iterator[str]]
19 ModuleFinderType = Callable[[str], Iterator[str]]
22 GENMSG_EXT_LENGTH = len(genmsg.EXT_MSG)
27 pyspec = make_python_safe(spec)
32 module.add_element(imports)
34 module.add_element(genclass)
36 for line
in module.generate():
45 for message_spec
in (spec.request, spec.response):
46 pyspec = make_python_safe(message_spec)
50 module.add_element(imports)
52 module.add_element(message_classes[0])
54 module.add_element(message_classes[1])
60 for line
in module.generate():
72 if e.errno != errno.EEXIST:
78 outpath = compute_outfile_name(
79 outdir, os.path.basename(target_path), genmsg.EXT_MSG
83 assert outpath.endswith(
".py")
84 outpath = outpath +
"i"
96 filename = os.path.basename(target_path)
97 full_type = gentools.compute_full_type_name(package, filename)
98 spec = loader(msg_context, target_path, full_type)
103 genmsg.msg_loader.load_depends(msg_context, spec, search_paths)
104 except genmsg.InvalidMsgSpec
as e:
105 raise RuntimeError(
"Failed to load message: {}".format(e))
112 for path
in os.listdir(package_dir):
113 if not os.path.isfile(os.path.join(package_dir, path)):
116 if path.endswith(genmsg.EXT_MSG)
or path.endswith(genmsg.EXT_SRV):
117 yield path[:-GENMSG_EXT_LENGTH]
122 for path
in os.listdir(package_dir):
123 if path ==
"__init__.py" or not os.path.isfile(os.path.join(package_dir, path)):
126 if path.startswith(
"_")
and path.endswith(
".py"):
140 spec =
_load_spec(msg_context, loader, package, target_path, search_paths)
144 with open(outpath,
"w")
as f:
145 for line
in generator(package, spec):
146 f.write(
"{}\n".format(line))
151 GenPyModuleFinders = {
152 "py": _find_all_genpy_modules_py,
153 "genmsg": _find_all_genpy_modules_genmsg,
159 module_finder_impl = GenPyModuleFinders.get(module_finder)
160 if module_finder_impl
is None:
161 raise ValueError(
"Unknown module finder: {}".format(module_finder))
162 genmsg_modules = sorted(module_finder_impl(package_dir))
166 outpath = os.path.join(outdir,
"__init__.pyi")
167 with open(outpath,
"w")
as f:
168 for line
in imports.generate(0):
169 f.write(
"{}\n".format(line))