File indexing completed on 2024-06-23 05:16:56

0001 # SPDX-FileCopyrightText: 2021 Daniel Vrátil <dvratil@kde.org>
0002 #
0003 # SPDX-License-Identifier: LGPL-2.1-only
0004 # SPDX-License-Identifier: LGPL-3.0-only
0005 # SPDX-License-Identifier: LicenseRef-KDE-Accepted-LGPL
0006 
0007 import os
0008 import pathlib
0009 from datetime import datetime
0010 from jinja2 import Environment, FileSystemLoader, select_autoescape
0011 
0012 from schema_types import Object
0013 
0014 
0015 class Generator:
0016     """
0017     Generates C++ code for given schema.
0018     """
0019 
0020     def __init__(self, api, outdir):
0021         self._env = Environment(
0022             loader=FileSystemLoader(
0023                 f"{pathlib.Path(__file__).parent.resolve()}/templates/"
0024             ),
0025             autoescape=select_autoescape(),
0026         )
0027         self._api = api
0028         self._outdir = outdir
0029         os.makedirs(outdir, exist_ok=True)
0030 
0031         self._api["date"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S %z")
0032 
0033     def generate_schema(self, schema: Object):
0034         template_base = "object"
0035         if schema.name in self._api["kgapiobjects"]:
0036             template_base = "kgapiobject"
0037 
0038         filename = schema.name.lower()
0039         for ext in ["h", "cpp"]:
0040             with open(
0041                 os.path.join(self._outdir, f"{filename}.{ext}"), "w"
0042             ) as output_file:
0043                 template = self._env.get_template(f"{template_base}.{ext}")
0044                 output_file.write(template.render(api=self._api, schema=schema))