diff --git a/pb_plugins/protoc_gen_mavsdk/autogen.py b/pb_plugins/protoc_gen_mavsdk/autogen.py index dfd82fcc7..d4fbc8d04 100644 --- a/pb_plugins/protoc_gen_mavsdk/autogen.py +++ b/pb_plugins/protoc_gen_mavsdk/autogen.py @@ -21,10 +21,27 @@ class AutoGen(object): def generate_reactive(request): params = AutoGen.parse_parameter(request.parameter) - is_java = params["file_ext"] == "java" - name_parser_factory.set_template_path(params["template_path"]) - type_info_factory.set_template_path(params["template_path"]) - template_env = get_template_env(params["template_path"]) + + if "output_file" in params: + is_java = params["output_file"].endswith("java") + else: + is_java = params["file_ext"] == "java" + + # Load initialisms + if "initialisms_file" in params: + initialisms_path = params["initialisms_file"] + else: + initialisms_path = f"{params['template_path']}/initialisms" + name_parser_factory.set_initialisms_path(initialisms_path) + + # Load type conversions + if "conversions_file" in params: + conversion_path = params["conversions_file"] + else: + conversion_path = f"{params['template_path']}/type_conversions" + type_info_factory.set_conversion_path(conversion_path) + + template_env = get_template_env(params["template_path"], params["lstrip_blocks"], params["trim_blocks"]) _codegen_response = plugin_pb2.CodeGeneratorResponse() @@ -71,6 +88,7 @@ def generate_reactive(request): out_file = File(plugin_name, package, template_env, + params['template_file'], docs, enums, structs, @@ -80,7 +98,10 @@ def generate_reactive(request): # Fill response f = _codegen_response.file.add() - f.name = f"{plugin_dir}/{plugin_name}.{params['file_ext']}" + if "output_file" in params: + f.name = params["output_file"] + else: + f.name = f"{plugin_dir}/{plugin_name}.{params['file_ext']}" f.content = str(out_file) return _codegen_response @@ -95,7 +116,16 @@ def parse_parameter(parameter): if len(split_param) == 2: params_dict[split_param[0]] = split_param[1] - if 'file_ext' not in params_dict: + if 'template_file' not in params_dict: + params_dict["template_file"] = None + + if 'lstrip_blocks' not in params_dict: + params_dict["lstrip_blocks"] = False + + if 'trim_blocks' not in params_dict: + params_dict["trim_blocks"] = False + + if 'file_ext' not in params_dict and 'output_file' not in params_dict: raise Exception("'file_ext' option was not specified! See " + "--[name]_out=file_ext=,:/path/to/output " + "or --[name]_opt=file_ext=, in the protoc" + diff --git a/pb_plugins/protoc_gen_mavsdk/autogen_file.py b/pb_plugins/protoc_gen_mavsdk/autogen_file.py index 41e07e78e..a612c90d0 100644 --- a/pb_plugins/protoc_gen_mavsdk/autogen_file.py +++ b/pb_plugins/protoc_gen_mavsdk/autogen_file.py @@ -10,6 +10,7 @@ def __init__( plugin_name, package, template_env, + template_file, docs, enums, structs, @@ -18,7 +19,6 @@ def __init__( is_server): self._package = name_parser_factory.create(package) self._plugin_name = name_parser_factory.create(plugin_name) - self._template = template_env.get_template("file.j2") self._class_description = docs['class'].strip() self._enums = enums self._structs = structs @@ -26,6 +26,11 @@ def __init__( self._has_result = has_result self._is_server = is_server + if template_file is None: + self._template = template_env.get_template("file.j2") + else: + self._template = template_env.get_template(template_file) + def __repr__(self): return self._template.render(package=self._package, plugin_name=self._plugin_name, diff --git a/pb_plugins/protoc_gen_mavsdk/enum.py b/pb_plugins/protoc_gen_mavsdk/enum.py index 80e27a936..b8c6683b7 100644 --- a/pb_plugins/protoc_gen_mavsdk/enum.py +++ b/pb_plugins/protoc_gen_mavsdk/enum.py @@ -15,7 +15,10 @@ def __init__( parent_struct=None): self._plugin_name = name_parser_factory.create(plugin_name) self._package = name_parser_factory.create(package) - self._template = template_env.get_template("enum.j2") + try: + self._template = template_env.get_template("enum.j2") + except: + self._template = None self._enum_description = enum_docs['description'].strip( ) if enum_docs else None self._name = name_parser_factory.create(pb_enum.name) @@ -38,6 +41,18 @@ def __init__( self._values.append({'name': value_name, 'description': enum_docs['params'][value_id], 'has_prefix': has_prefix}) value_id += 1 + @property + def name(self): + return self._name + + @property + def values(self): + return self._values + + @property + def parent_struct(self): + return self._parent_struct + def __repr__(self): return self._template.render(plugin_name=self._plugin_name, package=self._package, diff --git a/pb_plugins/protoc_gen_mavsdk/methods.py b/pb_plugins/protoc_gen_mavsdk/methods.py index dad4a2c1e..85a14a548 100644 --- a/pb_plugins/protoc_gen_mavsdk/methods.py +++ b/pb_plugins/protoc_gen_mavsdk/methods.py @@ -20,7 +20,6 @@ def __init__( pb_method, requests, responses): - self._is_stream = False self._no_return = False self._has_result = False self._returns = False @@ -101,10 +100,6 @@ def extract_is_finite(self, pb_method): if method_descriptor.name == "is_finite": self._is_finite = pb_method.options.Extensions[method_descriptor] - @property - def is_stream(self): - return self._is_stream - @property def no_return(self): return self._no_return @@ -129,10 +124,18 @@ def is_server(self): def name(self): return self._name + @property + def params(self): + return self._params + @property def return_type_required(self): return False + @property + def method_description(self): + return self._method_description + @staticmethod def collect_methods( plugin_name, @@ -214,9 +217,16 @@ def __init__( pb_method, requests, responses) - self._template = template_env.get_template("call.j2") + try: + self._template = template_env.get_template("call.j2") + except: + self._template = None self._no_return = True + @property + def is_call(self): + return True + def __repr__(self): return self._template.render(name=self._name, params=self._params, @@ -250,10 +260,29 @@ def __init__( pb_method, requests, responses) - self._template = template_env.get_template("request.j2") + try: + self._template = template_env.get_template("request.j2") + except: + self._template = None self._method_description = method_description self._returns = True + @property + def is_request(self): + return True + + @property + def return_name(self): + return self._return_name + + @property + def return_type(self): + return self._return_type + + @property + def return_description(self): + return self._return_description + def __repr__(self): return self._template.render( name=self._name, @@ -291,15 +320,33 @@ def __init__( pb_method, requests, responses) - self._is_stream = True self._name = name_parser_factory.create( remove_subscribe(pb_method.name)) - self._template = template_env.get_template("stream.j2") + try: + self._template = template_env.get_template("stream.j2") + except: + self._template = None @property def return_type_required(self): return True + @property + def is_stream(self): + return True + + @property + def return_name(self): + return self._return_name + + @property + def return_type(self): + return self._return_type + + @property + def return_description(self): + return self._return_description + def __repr__(self): return self._template.render( name=self._name, diff --git a/pb_plugins/protoc_gen_mavsdk/name_parser.py b/pb_plugins/protoc_gen_mavsdk/name_parser.py index 0d0f1884f..befb3b149 100644 --- a/pb_plugins/protoc_gen_mavsdk/name_parser.py +++ b/pb_plugins/protoc_gen_mavsdk/name_parser.py @@ -9,15 +9,14 @@ class NameParserFactory: def create(self, name): return NameParser(name, self._initialisms) - def set_template_path(self, template_path): - self._initialisms = self._load_initialisms(template_path) + def set_initialisms_path(self, initialisms_path): + self._initialisms = self._load_initialisms(initialisms_path) - def _load_initialisms(self, template_path): + def _load_initialisms(self, initialisms_path): try: - _initialisms_path = f"{template_path}/initialisms" - with open(_initialisms_path, "r") as handle: + with open(initialisms_path, "r") as handle: return json.loads(handle.read()) - except FileNotFoundError: + except: return [] diff --git a/pb_plugins/protoc_gen_mavsdk/struct.py b/pb_plugins/protoc_gen_mavsdk/struct.py index 608fcbaef..59d3f2f6d 100644 --- a/pb_plugins/protoc_gen_mavsdk/struct.py +++ b/pb_plugins/protoc_gen_mavsdk/struct.py @@ -18,7 +18,10 @@ def __init__(self, plugin_name, package, template_env, pb_struct, struct_docs): self._plugin_name = name_parser_factory.create(plugin_name) self._package = name_parser_factory.create(package) - self._template = template_env.get_template("struct.j2") + try: + self._template = template_env.get_template("struct.j2") + except: + self._template = None self._struct_description = struct_docs['description'].strip( ) if struct_docs else None self._name = name_parser_factory.create(pb_struct.name) @@ -69,6 +72,22 @@ def __repr__(self): def name(self): return self._name + @property + def fields(self): + return self._fields + + @property + def nested_enums(self): + return self._nested_enums + + @property + def nested_structs(self): + return self._nested_structs + + @property + def struct_description(self): + return self._struct_description + @staticmethod def collect_structs(plugin_name, package, structs, template_env, docs): _structs = {} diff --git a/pb_plugins/protoc_gen_mavsdk/type_info.py b/pb_plugins/protoc_gen_mavsdk/type_info.py index f00d55fbb..65cc5c218 100644 --- a/pb_plugins/protoc_gen_mavsdk/type_info.py +++ b/pb_plugins/protoc_gen_mavsdk/type_info.py @@ -7,15 +7,14 @@ class TypeInfoFactory: def create(self, field): return TypeInfo(field, self._conversion_dict) - def set_template_path(self, template_path): - self._conversion_dict = self._load_conversions_dict(template_path) + def set_conversion_path(self, conversions_path): + self._conversion_dict = self._load_conversions_dict(conversions_path) - def _load_conversions_dict(self, template_path): + def _load_conversions_dict(self, conversions_path): try: - _conversion_dict_path = f"{template_path}/type_conversions" - with open(_conversion_dict_path, "r") as handle: + with open(conversions_path, "r") as handle: return json.loads(handle.read()) - except FileNotFoundError: + except: return {} diff --git a/pb_plugins/protoc_gen_mavsdk/utils.py b/pb_plugins/protoc_gen_mavsdk/utils.py index d64ea649a..6492d8260 100644 --- a/pb_plugins/protoc_gen_mavsdk/utils.py +++ b/pb_plugins/protoc_gen_mavsdk/utils.py @@ -96,10 +96,10 @@ def jinja_indent(_in_str, level): ) -def get_template_env(_searchpath): +def get_template_env(_searchpath, _lstrip_blocks, _trim_blocks): """ Generates the template environment """ _template_env = Environment(loader=FileSystemLoader( - searchpath=_searchpath)) + searchpath=_searchpath), lstrip_blocks=_lstrip_blocks, trim_blocks=_trim_blocks) # Register some functions we need to access in the template _template_env.globals.update(indent=jinja_indent) diff --git a/pb_plugins/setup.py b/pb_plugins/setup.py index 03c8ce66f..b77b344f9 100644 --- a/pb_plugins/setup.py +++ b/pb_plugins/setup.py @@ -28,7 +28,7 @@ def parse_requirements(filename): setup( name="protoc-gen-mavsdk", - version="1.0.3", + version="1.1.0", description="Protoc plugin used to generate MAVSDK bindings", url="https://github.com/mavlink/MAVSDK-Proto", maintainer="Jonas Vautherin, Julian Oes",