From 673b6639f81f9c6d7c86c54089361fb0988a23d9 Mon Sep 17 00:00:00 2001 From: Tyler Weaver Date: Tue, 25 Apr 2023 14:45:24 -0600 Subject: [PATCH 1/4] Name cpp generator --- .../cmake/generate_parameter_library.cmake | 10 ++++---- .../{main.py => generate_cpp_header.py} | 2 +- .../{ => cpp}/declare_parameter | 0 .../{ => cpp}/declare_runtime_parameter | 0 .../jinja_templates/{ => cpp}/declare_struct | 0 .../{ => cpp}/parameter_library_header | 0 .../{ => cpp}/parameter_validation | 0 .../{ => cpp}/remove_runtime_parameter | 0 .../jinja_templates/{ => cpp}/set_parameter | 0 .../{ => cpp}/set_runtime_parameter | 0 .../{ => cpp}/set_stack_params | 0 .../{ => cpp}/update_parameter | 0 .../{ => cpp}/update_runtime_parameter | 0 generate_parameter_library_py/setup.py | 24 +++++++++---------- 14 files changed, 18 insertions(+), 18 deletions(-) rename generate_parameter_library_py/generate_parameter_library_py/{main.py => generate_cpp_header.py} (99%) rename generate_parameter_library_py/generate_parameter_library_py/jinja_templates/{ => cpp}/declare_parameter (100%) rename generate_parameter_library_py/generate_parameter_library_py/jinja_templates/{ => cpp}/declare_runtime_parameter (100%) rename generate_parameter_library_py/generate_parameter_library_py/jinja_templates/{ => cpp}/declare_struct (100%) rename generate_parameter_library_py/generate_parameter_library_py/jinja_templates/{ => cpp}/parameter_library_header (100%) rename generate_parameter_library_py/generate_parameter_library_py/jinja_templates/{ => cpp}/parameter_validation (100%) rename generate_parameter_library_py/generate_parameter_library_py/jinja_templates/{ => cpp}/remove_runtime_parameter (100%) rename generate_parameter_library_py/generate_parameter_library_py/jinja_templates/{ => cpp}/set_parameter (100%) rename generate_parameter_library_py/generate_parameter_library_py/jinja_templates/{ => cpp}/set_runtime_parameter (100%) rename generate_parameter_library_py/generate_parameter_library_py/jinja_templates/{ => cpp}/set_stack_params (100%) rename generate_parameter_library_py/generate_parameter_library_py/jinja_templates/{ => cpp}/update_parameter (100%) rename generate_parameter_library_py/generate_parameter_library_py/jinja_templates/{ => cpp}/update_runtime_parameter (100%) diff --git a/generate_parameter_library/cmake/generate_parameter_library.cmake b/generate_parameter_library/cmake/generate_parameter_library.cmake index c4b13f6..adc70f1 100644 --- a/generate_parameter_library/cmake/generate_parameter_library.cmake +++ b/generate_parameter_library/cmake/generate_parameter_library.cmake @@ -28,9 +28,9 @@ function(generate_parameter_library LIB_NAME YAML_FILE) - find_program(generate_parameter_library_py_BIN NAMES "generate_parameter_library_py") - if(NOT generate_parameter_library_py_BIN) - message(FATAL_ERROR "generate_parameter_library_py() variable 'generate_parameter_library_py_BIN' must not be empty") + find_program(generate_parameter_library_cpp_BIN NAMES "generate_parameter_library_cpp") + if(NOT generate_parameter_library_cpp_BIN) + message(FATAL_ERROR "generate_parameter_library_cpp() variable 'generate_parameter_library_cpp_BIN' must not be empty") endif() # Make the include directory @@ -66,10 +66,10 @@ function(generate_parameter_library LIB_NAME YAML_FILE) # Generate the header for the library add_custom_command( OUTPUT ${PARAM_HEADER_FILE} - COMMAND ${generate_parameter_library_py_BIN} ${PARAM_HEADER_FILE} ${YAML_FILE} ${VALIDATE_HEADER_FILENAME} + COMMAND ${generate_parameter_library_cpp_BIN} ${PARAM_HEADER_FILE} ${YAML_FILE} ${VALIDATE_HEADER_FILENAME} DEPENDS ${YAML_FILE} ${VALIDATE_HEADER} COMMENT - "Running `${generate_parameter_library_py_BIN} ${PARAM_HEADER_FILE} ${YAML_FILE} ${VALIDATE_HEADER_FILENAME}`" + "Running `${generate_parameter_library_cpp_BIN} ${PARAM_HEADER_FILE} ${YAML_FILE} ${VALIDATE_HEADER_FILENAME}`" VERBATIM ) diff --git a/generate_parameter_library_py/generate_parameter_library_py/main.py b/generate_parameter_library_py/generate_parameter_library_py/generate_cpp_header.py similarity index 99% rename from generate_parameter_library_py/generate_parameter_library_py/main.py rename to generate_parameter_library_py/generate_parameter_library_py/generate_cpp_header.py index 19c81fe..a192fe4 100755 --- a/generate_parameter_library_py/generate_parameter_library_py/main.py +++ b/generate_parameter_library_py/generate_parameter_library_py/generate_cpp_header.py @@ -769,7 +769,7 @@ def __str__(self): def get_all_templates(): - template_path = os.path.join(os.path.dirname(__file__), "jinja_templates") + template_path = os.path.join(os.path.dirname(__file__), "jinja_templates", "cpp") template_map = {} for file_name in [ f diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/declare_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_parameter similarity index 100% rename from generate_parameter_library_py/generate_parameter_library_py/jinja_templates/declare_parameter rename to generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_parameter diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/declare_runtime_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_runtime_parameter similarity index 100% rename from generate_parameter_library_py/generate_parameter_library_py/jinja_templates/declare_runtime_parameter rename to generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_runtime_parameter diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/declare_struct b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_struct similarity index 100% rename from generate_parameter_library_py/generate_parameter_library_py/jinja_templates/declare_struct rename to generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/declare_struct diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/parameter_library_header b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header similarity index 100% rename from generate_parameter_library_py/generate_parameter_library_py/jinja_templates/parameter_library_header rename to generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_library_header diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/parameter_validation b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_validation similarity index 100% rename from generate_parameter_library_py/generate_parameter_library_py/jinja_templates/parameter_validation rename to generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/parameter_validation diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/remove_runtime_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/remove_runtime_parameter similarity index 100% rename from generate_parameter_library_py/generate_parameter_library_py/jinja_templates/remove_runtime_parameter rename to generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/remove_runtime_parameter diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/set_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_parameter similarity index 100% rename from generate_parameter_library_py/generate_parameter_library_py/jinja_templates/set_parameter rename to generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_parameter diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/set_runtime_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter similarity index 100% rename from generate_parameter_library_py/generate_parameter_library_py/jinja_templates/set_runtime_parameter rename to generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_runtime_parameter diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/set_stack_params b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_stack_params similarity index 100% rename from generate_parameter_library_py/generate_parameter_library_py/jinja_templates/set_stack_params rename to generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/set_stack_params diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/update_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_parameter similarity index 100% rename from generate_parameter_library_py/generate_parameter_library_py/jinja_templates/update_parameter rename to generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_parameter diff --git a/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/update_runtime_parameter b/generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_runtime_parameter similarity index 100% rename from generate_parameter_library_py/generate_parameter_library_py/jinja_templates/update_runtime_parameter rename to generate_parameter_library_py/generate_parameter_library_py/jinja_templates/cpp/update_runtime_parameter diff --git a/generate_parameter_library_py/setup.py b/generate_parameter_library_py/setup.py index bad9466..f78e90a 100644 --- a/generate_parameter_library_py/setup.py +++ b/generate_parameter_library_py/setup.py @@ -39,17 +39,17 @@ install_requires=["setuptools", "typeguard", "jinja2"], package_data={ "": [ - "jinja_templates/declare_parameter", - "jinja_templates/set_parameter", - "jinja_templates/declare_struct", - "jinja_templates/parameter_library_header", - "jinja_templates/parameter_validation", - "jinja_templates/update_parameter", - "jinja_templates/update_runtime_parameter", - "jinja_templates/declare_runtime_parameter", - "jinja_templates/remove_runtime_parameter", - "jinja_templates/set_runtime_parameter", - "jinja_templates/set_stack_params", + "jinja_templates/cpp/declare_parameter", + "jinja_templates/cpp/set_parameter", + "jinja_templates/cpp/declare_struct", + "jinja_templates/cpp/parameter_library_header", + "jinja_templates/cpp/parameter_validation", + "jinja_templates/cpp/update_parameter", + "jinja_templates/cpp/update_runtime_parameter", + "jinja_templates/cpp/declare_runtime_parameter", + "jinja_templates/cpp/remove_runtime_parameter", + "jinja_templates/cpp/set_runtime_parameter", + "jinja_templates/cpp/set_stack_params", ] }, zip_safe=False, @@ -69,7 +69,7 @@ tests_require=["pytest"], entry_points={ "console_scripts": [ - "generate_parameter_library_py = generate_parameter_library_py.main:main", + "generate_parameter_library_cpp = generate_parameter_library_py.generate_cpp_header:main", ], }, ) From 206281b5286123eba5740ef0213e200dc0de8c2d Mon Sep 17 00:00:00 2001 From: Tyler Weaver Date: Tue, 25 Apr 2023 16:26:44 -0600 Subject: [PATCH 2/4] Parse cli args with argparse Signed-off-by: Tyler Weaver --- .../generate_cpp_header.py | 32 +++++++++---------- .../test/YAML_parse_error_test.py | 9 ++++-- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/generate_parameter_library_py/generate_parameter_library_py/generate_cpp_header.py b/generate_parameter_library_py/generate_parameter_library_py/generate_cpp_header.py index a192fe4..c976a22 100755 --- a/generate_parameter_library_py/generate_parameter_library_py/generate_cpp_header.py +++ b/generate_parameter_library_py/generate_parameter_library_py/generate_cpp_header.py @@ -29,6 +29,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +import argparse import yaml from yaml.parser import ParserError from yaml.scanner import ScannerError @@ -987,24 +988,13 @@ def __str__(self): code = j2_template.render(data, trim_blocks=True) return code - def run(self): - if 3 > len(sys.argv) > 4: - raise compile_error( - "generate_parameter_library_py expects three input argument: output_file, " - "yaml file path, [validate include header]" - ) - - param_gen_directory = sys.argv[0].split("/") - param_gen_directory = "".join(x + "/" for x in param_gen_directory[:-1]) - if param_gen_directory[-1] != "/": - param_gen_directory += "/" - - output_file = sys.argv[1] + def run(self, args): + output_file = args.output_cpp_header_file output_dir = os.path.dirname(output_file) if not os.path.isdir(output_dir): os.makedirs(output_dir) - yaml_file = sys.argv[2] + yaml_file = args.input_yaml_file with open(yaml_file) as f: try: docs = yaml.load_all(f, Loader=yaml.Loader) @@ -1021,17 +1011,25 @@ def run(self): self.namespace = list(doc.keys())[0] self.parse_dict(self.namespace, doc[self.namespace], []) - if len(sys.argv) > 3: - self.user_validation_file = sys.argv[3] + self.user_validation_file = args.validate_header code = str(self) with open(output_file, "w") as f: f.write(code) +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument("output_cpp_header_file") + parser.add_argument("input_yaml_file") + parser.add_argument("validate_header", nargs="?", default="") + return parser.parse_args() + + def main(): + args = parse_args() gen_param_struct = GenerateCode() - gen_param_struct.run() + gen_param_struct.run(args) if __name__ == "__main__": diff --git a/generate_parameter_library_py/generate_parameter_library_py/test/YAML_parse_error_test.py b/generate_parameter_library_py/generate_parameter_library_py/test/YAML_parse_error_test.py index 4104dc1..091e7a4 100644 --- a/generate_parameter_library_py/generate_parameter_library_py/test/YAML_parse_error_test.py +++ b/generate_parameter_library_py/generate_parameter_library_py/test/YAML_parse_error_test.py @@ -19,7 +19,11 @@ from unittest.mock import patch import sys import os -from generate_parameter_library_py.main import GenerateCode, YAMLSyntaxError +from generate_parameter_library_py.generate_cpp_header import ( + GenerateCode, + YAMLSyntaxError, + parse_args, +) from ament_index_python.packages import get_package_share_path @@ -30,8 +34,9 @@ def set_up(yaml_test_file): testargs = [sys.argv[0], "/tmp/admittance_controller.h", full_file_path] with patch.object(sys, "argv", testargs): + args = parse_args() gen_param_struct = GenerateCode() - gen_param_struct.run() + gen_param_struct.run(args) # class TestViewValidCodeGen(unittest.TestCase): From db6db7c44a5d72f1cfe19cc9dde0cc53b14cdf12 Mon Sep 17 00:00:00 2001 From: Tyler Weaver Date: Tue, 25 Apr 2023 17:21:38 -0600 Subject: [PATCH 3/4] Stub for rst generator --- .../generate_rst.py | 44 +++++++++++++++++++ generate_parameter_library_py/setup.py | 1 + 2 files changed, 45 insertions(+) create mode 100644 generate_parameter_library_py/generate_parameter_library_py/generate_rst.py diff --git a/generate_parameter_library_py/generate_parameter_library_py/generate_rst.py b/generate_parameter_library_py/generate_parameter_library_py/generate_rst.py new file mode 100644 index 0000000..a64813d --- /dev/null +++ b/generate_parameter_library_py/generate_parameter_library_py/generate_rst.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Copyright 2023 PickNik Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the name of the PickNik Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import argparse + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("output_rst_file") + parser.add_argument("input_yaml_file") + args = parser.parse_args() + print(args) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/generate_parameter_library_py/setup.py b/generate_parameter_library_py/setup.py index f78e90a..cd348ce 100644 --- a/generate_parameter_library_py/setup.py +++ b/generate_parameter_library_py/setup.py @@ -70,6 +70,7 @@ entry_points={ "console_scripts": [ "generate_parameter_library_cpp = generate_parameter_library_py.generate_cpp_header:main", + "generate_parameter_library_rst = generate_parameter_library_py.generate_rst:main", ], }, ) From 11d67ebffbb0968e501b0e818c4e6ad52aac2ae7 Mon Sep 17 00:00:00 2001 From: Tyler Weaver Date: Wed, 26 Apr 2023 13:03:08 -0600 Subject: [PATCH 4/4] Factor out yaml parsing --- .../generate_cpp_header.py | 15 +------ .../parse_yaml.py | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+), 14 deletions(-) create mode 100644 generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py diff --git a/generate_parameter_library_py/generate_parameter_library_py/generate_cpp_header.py b/generate_parameter_library_py/generate_parameter_library_py/generate_cpp_header.py index c976a22..5f7885d 100755 --- a/generate_parameter_library_py/generate_parameter_library_py/generate_cpp_header.py +++ b/generate_parameter_library_py/generate_parameter_library_py/generate_cpp_header.py @@ -39,20 +39,7 @@ from typeguard import typechecked from jinja2 import Template - -# YAMLSyntaxError standardizes compiler error messages -class YAMLSyntaxError(Exception): - def __init__(self, msg): - self.msg = msg - - def __str__(self): - return self.msg - - -# helper functions -@typechecked -def compile_error(msg: str): - return YAMLSyntaxError("\nERROR: " + msg) +from generate_parameter_library_py.parse_yaml import YAMLSyntaxError, compile_error @typechecked diff --git a/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py b/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py new file mode 100644 index 0000000..855193c --- /dev/null +++ b/generate_parameter_library_py/generate_parameter_library_py/parse_yaml.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# Copyright 2023 PickNik Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the name of the PickNik Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +from typeguard import typechecked + + +# YAMLSyntaxError standardizes compiler error messages +class YAMLSyntaxError(Exception): + def __init__(self, msg): + self.msg = msg + + def __str__(self): + return self.msg + + +# helper functions +@typechecked +def compile_error(msg: str): + return YAMLSyntaxError("\nERROR: " + msg)