diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e0a7427..c8b13af 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,6 +71,7 @@ jobs: run: | pip install -r requirements-dev.txt pip install -r requirements.txt + pip install -r tests/requirements.txt pip install -e . - name: unit test diff --git a/.gitignore b/.gitignore index f8cd14b..aed7f7f 100644 --- a/.gitignore +++ b/.gitignore @@ -133,6 +133,7 @@ dmypy.json output/ velocitas_model/ out/ +gen_model/ # test data repos tests/data/vspec diff --git a/NOTICE-3RD-PARTY-CONTENT.md b/NOTICE-3RD-PARTY-CONTENT.md index 1f63486..7c59fbb 100644 --- a/NOTICE-3RD-PARTY-CONTENT.md +++ b/NOTICE-3RD-PARTY-CONTENT.md @@ -4,21 +4,14 @@ | Dependency | Version | License | |:-----------|:-------:|--------:| |cfgv|3.4.0|MIT| -|coverage|7.4.0|Apache 2.0| |distlib|0.3.8|Python Software Foundation License| -|exceptiongroup|1.2.0|MIT| |filelock|3.13.1|The Unlicense (Unlicense)| -|identify|2.5.33|MIT| -|iniconfig|2.0.0|MIT| +|identify|2.5.34|MIT| |mypy|1.8.0|MIT| |mypy-extensions|1.0.0|MIT| |nodeenv|1.8.0|BSD| -|packaging|23.2|Apache 2.0
BSD| -|platformdirs|4.1.0|MIT| -|pluggy|1.4.0|MIT| -|pre-commit|3.6.0|MIT| -|pytest|7.4.4|MIT| -|pytest-cov|4.1.0|MIT| +|platformdirs|4.2.0|MIT| +|pre-commit|3.6.1|MIT| |PyYAML|6.0.1|MIT| |setuptools|58.1.0|MIT| |tomli|2.0.1|MIT| diff --git a/requirements-dev.txt b/requirements-dev.txt index 033f86b..db952dc 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,2 @@ -pytest -pytest-cov pre-commit>=3.5.0 mypy diff --git a/src/velocitas/model_generator/__init__.py b/src/velocitas/model_generator/__init__.py index 104f64c..096a5e8 100644 --- a/src/velocitas/model_generator/__init__.py +++ b/src/velocitas/model_generator/__init__.py @@ -30,8 +30,11 @@ """Convert all vspec input files to Velocitas Python Vehicle Model.""" +import os +import shutil import sys from typing import List + import vspec # type: ignore from velocitas.model_generator.cpp.cpp_generator import VehicleModelCppGenerator @@ -66,6 +69,9 @@ def generate_model( print(f"Known extended attributes: {', '.join(ext_attributes_list)}") try: + if os.path.exists(target_folder): + shutil.rmtree(target_folder) + tree = FileImport(input_file_path, include_dirs, strict, overlays).load_tree() if language == "python": diff --git a/src/velocitas/model_generator/cpp/cpp_generator.py b/src/velocitas/model_generator/cpp/cpp_generator.py index 5f03bc0..90bdd4d 100644 --- a/src/velocitas/model_generator/cpp/cpp_generator.py +++ b/src/velocitas/model_generator/cpp/cpp_generator.py @@ -16,7 +16,6 @@ import os import re -import shutil from typing import List, Set # Until vsspec issue will be fixed: https://github.com/COVESA/vss-tools/issues/208 @@ -34,7 +33,9 @@ def __init__(self, root_node: VSSNode, target_folder: str, root_namespace: str): """Initialize the c++ generator. Args: - root (_type_): the vspec tree root node. + root_node (VSSNode): The root node of the VSS tree + target_folder (str): The path to the output folder + root_namespace (str): The root namespace to use to which VSS based namespaces will be appended """ self.root_node = root_node self.target_folder = target_folder @@ -59,12 +60,36 @@ def generate(self): path = os.path.join( self.root_path, *self.__to_folder_names(self.root_namespace_list) ) - if os.path.exists(path): - shutil.rmtree(path) + os.makedirs(path) self.__gen_model(self.root_node, self.root_namespace_list, is_root=True) self.__visit_nodes(self.root_node, self.root_namespace_list) + # self.__gen_cmake_project() + self.__gen_conan_package() + + def __gen_conan_package(self): + path = os.path.join(self.target_folder, "conanfile.py") + with open(path, "w", encoding="utf-8") as file: + file.write( + """from conans import ConanFile + +class VehicleModelConan(ConanFile): + name = "vehicle-model" + version = "generated" + license = "Apache 2.0" + url = "https://github.com/eclipse-velocitas/vehicle-model-generator" + description = "Vehicle Model API auto-generated from Vehicle Signal Specification" + # No settings/options are necessary, this is header only + exports_sources = "include/*" + no_copy_source = True + # all SDK versions are supported at the moment + requires = "vehicle-app-sdk/[>=0.1]" + + def package(self): + self.copy("*.hpp") +""" + ) def __visit_nodes(self, node: VSSNode, parent_namespace_list: List[str]): """Recursively render nodes.""" @@ -371,12 +396,12 @@ def __gen_model(self, node: VSSNode, namespace_list: List[str], is_root=False): self.__gen_footer(namespace_list, node) + relative_header_path = os.path.join( + *self.__to_folder_names(namespace_list), f"{node.name}.hpp" + ) + with open( - os.path.join( - self.root_path, - *self.__to_folder_names(namespace_list), - f"{node.name}.hpp", - ), + os.path.join(self.root_path, relative_header_path), "w", encoding="utf-8", ) as file: diff --git a/src/velocitas/model_generator/python/python_generator.py b/src/velocitas/model_generator/python/python_generator.py index e6a74f0..bab0d34 100644 --- a/src/velocitas/model_generator/python/python_generator.py +++ b/src/velocitas/model_generator/python/python_generator.py @@ -15,7 +15,6 @@ """VehicleModelPythonGenerator.""" import os -import shutil from typing import List, Set # Until vsspec issue will be fixed: https://github.com/COVESA/vss-tools/issues/208 @@ -52,8 +51,6 @@ def generate(self): """Generate python code for vehicle model.""" self.root_path = self.target_folder - if os.path.exists(self.root_path): - shutil.rmtree(self.root_path) path = os.path.join(self.root_path, *self.root_package_list) os.makedirs(path) diff --git a/tests/requirements.txt b/tests/requirements.txt new file mode 100644 index 0000000..cd3a222 --- /dev/null +++ b/tests/requirements.txt @@ -0,0 +1,3 @@ +pytest +pytest-cov +conan==1.62.0 diff --git a/tests/test_model_generator.py b/tests/test_model_generator.py index a3ada3d..c1d2ba4 100644 --- a/tests/test_model_generator.py +++ b/tests/test_model_generator.py @@ -33,11 +33,12 @@ ) def test_generate(language: str, input_file_path: str, include_dir: str): input_file_path = Path(__file__).parent.joinpath("data", input_file_path).__str__() - generate_model(input_file_path, language, "output", "vehicle") + generate_model( + input_file_path, language, "output", "vehicle", include_dir=include_dir + ) if language == "python": subprocess.check_call([sys.executable, "-m", "pip", "install", "./output"]) assert compileall.compile_dir("./output", force=True) elif language == "cpp": - # TODO: add a check if the package can be installed after generated model is a conan package - pass + subprocess.check_call(["conan", "export", "./output"])