aboutsummaryrefslogtreecommitdiff
path: root/tools/cru-py/cru/service/_template.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/cru-py/cru/service/_template.py')
-rw-r--r--tools/cru-py/cru/service/_template.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/tools/cru-py/cru/service/_template.py b/tools/cru-py/cru/service/_template.py
new file mode 100644
index 0000000..170116c
--- /dev/null
+++ b/tools/cru-py/cru/service/_template.py
@@ -0,0 +1,86 @@
+from argparse import Namespace
+import shutil
+
+from cru import CruIterator
+from cru.template import TemplateTree
+
+from ._base import AppCommandFeatureProvider, AppFeaturePath
+from ._config import ConfigManager
+
+
+class TemplateManager(AppCommandFeatureProvider):
+ def __init__(self, prefix: str | None = None):
+ super().__init__("template-manager")
+ self._prefix = prefix or self.app.app_id.upper()
+
+ def setup(self) -> None:
+ self._templates_dir = self.app.add_path("templates", True)
+ self._generated_dir = self.app.add_path("generated", True)
+ self._template_tree: TemplateTree | None = None
+
+ @property
+ def prefix(self) -> str:
+ return self._prefix
+
+ @property
+ def templates_dir(self) -> AppFeaturePath:
+ return self._templates_dir
+
+ @property
+ def generated_dir(self) -> AppFeaturePath:
+ return self._generated_dir
+
+ @property
+ def template_tree(self) -> TemplateTree:
+ if self._template_tree is None:
+ return self.reload()
+ return self._template_tree
+
+ def reload(self) -> TemplateTree:
+ self._template_tree = TemplateTree(
+ self.prefix, self.templates_dir.full_path_str
+ )
+ return self._template_tree
+
+ def _print_file_lists(self) -> None:
+ for file in CruIterator(self.template_tree.templates).transform(lambda t: t[0]):
+ print(file.as_posix())
+
+ def _generate_files(self, dry_run: bool) -> None:
+ config_manager = self.app.get_feature(ConfigManager)
+ if not dry_run and self.generated_dir.full_path.exists():
+ shutil.rmtree(self.generated_dir.full_path)
+ self.template_tree.generate_to(
+ self.generated_dir.full_path_str, config_manager.get_str_dict(), dry_run
+ )
+
+ def get_command_info(self):
+ return ("template", "Manage templates.")
+
+ def setup_arg_parser(self, arg_parser):
+ subparsers = arg_parser.add_subparsers(
+ dest="template_command", required=True, metavar="TEMPLATE_COMMAND"
+ )
+ _list_parser = subparsers.add_parser("list", help="list templates")
+ _variables_parser = subparsers.add_parser(
+ "variables", help="list variables used in all templates"
+ )
+ generate_parser = subparsers.add_parser("generate", help="generate templates")
+ generate_parser.add_argument(
+ "--no-dry-run", action="store_true", help="generate and write target files"
+ )
+
+ def run_command(self, args: Namespace) -> None:
+ if args.template_command == "list":
+ self._print_file_lists()
+ elif args.template_command == "variables":
+ for var in self.template_tree.variables:
+ print(var)
+ elif args.template_command == "generate":
+ dry_run = not args.no_dry_run
+ self._generate_files(dry_run)
+ if dry_run:
+ print("Dry run successfully.")
+ print(
+ f"Will delete dir {self.generated_dir.full_path_str} if it exists."
+ )