From b3ae57b883c670c926e32ee4de091279f2cc925c Mon Sep 17 00:00:00 2001 From: Jonas Vautherin Date: Thu, 23 Jun 2022 22:58:50 +0200 Subject: [PATCH 1/4] Make template files optional: to allow using only file.j2 --- pb_plugins/protoc_gen_mavsdk/enum.py | 5 ++++- pb_plugins/protoc_gen_mavsdk/methods.py | 15 ++++++++++++--- pb_plugins/protoc_gen_mavsdk/struct.py | 5 ++++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/pb_plugins/protoc_gen_mavsdk/enum.py b/pb_plugins/protoc_gen_mavsdk/enum.py index 80e27a936..6a99a9d44 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) diff --git a/pb_plugins/protoc_gen_mavsdk/methods.py b/pb_plugins/protoc_gen_mavsdk/methods.py index dad4a2c1e..a639c45bf 100644 --- a/pb_plugins/protoc_gen_mavsdk/methods.py +++ b/pb_plugins/protoc_gen_mavsdk/methods.py @@ -214,7 +214,10 @@ 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 def __repr__(self): @@ -250,7 +253,10 @@ 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 @@ -294,7 +300,10 @@ def __init__( 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): diff --git a/pb_plugins/protoc_gen_mavsdk/struct.py b/pb_plugins/protoc_gen_mavsdk/struct.py index 608fcbaef..b2043f71c 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) From 1b97c68878738650144397e81bba2fb178dffd42 Mon Sep 17 00:00:00 2001 From: Jonas Vautherin Date: Thu, 23 Jun 2022 22:59:14 +0200 Subject: [PATCH 2/4] Expose everything to file.j2 --- pb_plugins/protoc_gen_mavsdk/enum.py | 12 ++++++ pb_plugins/protoc_gen_mavsdk/methods.py | 50 ++++++++++++++++++++++--- pb_plugins/protoc_gen_mavsdk/struct.py | 16 ++++++++ 3 files changed, 72 insertions(+), 6 deletions(-) diff --git a/pb_plugins/protoc_gen_mavsdk/enum.py b/pb_plugins/protoc_gen_mavsdk/enum.py index 6a99a9d44..b8c6683b7 100644 --- a/pb_plugins/protoc_gen_mavsdk/enum.py +++ b/pb_plugins/protoc_gen_mavsdk/enum.py @@ -41,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 a639c45bf..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, @@ -220,6 +223,10 @@ def __init__( 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, @@ -260,6 +267,22 @@ def __init__( 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, @@ -297,7 +320,6 @@ def __init__( pb_method, requests, responses) - self._is_stream = True self._name = name_parser_factory.create( remove_subscribe(pb_method.name)) try: @@ -309,6 +331,22 @@ def __init__( 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/struct.py b/pb_plugins/protoc_gen_mavsdk/struct.py index b2043f71c..59d3f2f6d 100644 --- a/pb_plugins/protoc_gen_mavsdk/struct.py +++ b/pb_plugins/protoc_gen_mavsdk/struct.py @@ -72,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 = {} From 4a9886b8aed79162824121e77d697de8d4068d4f Mon Sep 17 00:00:00 2001 From: Jonas Vautherin Date: Fri, 24 Jun 2022 00:00:10 +0200 Subject: [PATCH 3/4] Add more command line arguments for more control --- pb_plugins/protoc_gen_mavsdk/autogen.py | 42 +++++++++++++++++--- pb_plugins/protoc_gen_mavsdk/autogen_file.py | 7 +++- pb_plugins/protoc_gen_mavsdk/name_parser.py | 11 +++-- pb_plugins/protoc_gen_mavsdk/type_info.py | 11 +++-- pb_plugins/protoc_gen_mavsdk/utils.py | 4 +- 5 files changed, 54 insertions(+), 21 deletions(-) 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/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/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) From bd288c4ffcab55e0f3e46ed2381c20d628fc71be Mon Sep 17 00:00:00 2001 From: Jonas Vautherin Date: Mon, 27 Jun 2022 23:47:51 +0200 Subject: [PATCH 4/4] Bump protoc-gen-mavsdk to 1.1.0 --- pb_plugins/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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",