diff options
author | crupest <crupest@outlook.com> | 2024-11-11 01:12:29 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2024-12-27 16:16:29 +0800 |
commit | 7e9fdc36310d1bc63af4f4a0fc2f4963ae0154aa (patch) | |
tree | 32e9cdd3c2072ad16e9e1b68c8e4c252fa2749ed /tools/cru-py/cru/service | |
parent | b834953fa61d816b9a955640ad12d244316ce904 (diff) | |
download | crupest-7e9fdc36310d1bc63af4f4a0fc2f4963ae0154aa.tar.gz crupest-7e9fdc36310d1bc63af4f4a0fc2f4963ae0154aa.tar.bz2 crupest-7e9fdc36310d1bc63af4f4a0fc2f4963ae0154aa.zip |
HALF WORK: 2024.12.27
Diffstat (limited to 'tools/cru-py/cru/service')
-rw-r--r-- | tools/cru-py/cru/service/_base.py | 58 | ||||
-rw-r--r-- | tools/cru-py/cru/service/_template.py | 29 |
2 files changed, 74 insertions, 13 deletions
diff --git a/tools/cru-py/cru/service/_base.py b/tools/cru-py/cru/service/_base.py index 707fb66..7bb09ad 100644 --- a/tools/cru-py/cru/service/_base.py +++ b/tools/cru-py/cru/service/_base.py @@ -1,23 +1,73 @@ +from __future__ import annotations + from argparse import ArgumentParser, Namespace -from typing import Protocol +from abc import ABC, abstractmethod +from collections.abc import Iterable + +from cru import CruIterator, CruInternalError from cru.app import ApplicationPath, CruApplication -class AppFunction(Protocol): +class AppFeatureProvider(ABC): + def __init__(self, name: str, /, app: AppBase | None = None): + super().__init__() + self._name = name + self._app = app if app else AppBase.get_instance() + self._app_paths: list[ApplicationPath] = [] + self.app.add_app_feature(self) + + @property + def app(self) -> AppBase: + return self._app + + @property + def name(self) -> str: + return self._name + @property - def name(self) -> str: ... + def app_paths(self) -> list[ApplicationPath]: + return self._app_paths + + def add_app_path(self, subpath: str, is_dir: bool) -> ApplicationPath: + p = ApplicationPath(self.app.app_dir, subpath, is_dir) + self._app_paths.append(p) + return p + @abstractmethod def add_arg_parser(self, arg_parser: ArgumentParser) -> None: ... + @abstractmethod def run_command(self, args: Namespace) -> None: ... class AppBase(CruApplication): + _instance: AppBase | None = None + + @staticmethod + def get_instance() -> AppBase: + if AppBase._instance is None: + raise CruInternalError("App instance not initialized") + return AppBase._instance + def __init__(self, name: str, app_dir: str): super().__init__(name) + AppBase._instance = self self._app_dir = app_dir - self._template_dir = ApplicationPath(app_dir, "templates", True) + self._app_features: list[AppFeatureProvider] = [] @property def app_dir(self) -> str: return self._app_dir + + @property + def app_features(self) -> list[AppFeatureProvider]: + return self._app_features + + @property + def app_paths(self) -> Iterable[ApplicationPath]: + return ( + CruIterator(self._app_features).transform(lambda x: x.app_paths).flatten(1) + ) + + def add_app_feature(self, feature: AppFeatureProvider) -> None: + self._app_features.append(feature) diff --git a/tools/cru-py/cru/service/_template.py b/tools/cru-py/cru/service/_template.py index 0ca4b63..5da00ba 100644 --- a/tools/cru-py/cru/service/_template.py +++ b/tools/cru-py/cru/service/_template.py @@ -1,20 +1,31 @@ from argparse import ArgumentParser, Namespace -from ._base import AppBase, AppFunction +from ._base import AppFeatureProvider +from cru.app import ApplicationPath +from cru.template import TemplateTree -class TemplateManager(AppFunction): - def __init__(self, app: AppBase): - self._app = app - pass + +class TemplateManager(AppFeatureProvider): + def __init__(self, prefix: str = "CRUPEST"): + super().__init__("template-manager") + self._templates_dir = self.add_app_path("templates", True) + self._generated_dir = self.add_app_path("generated", True) + self._template_tree = TemplateTree( + prefix, self._templates_dir.full_path_str, self._generated_dir.full_path_str + ) + + @property + def templates_dir(self) -> ApplicationPath: + return self._templates_dir @property - def name(self): - return "template-manager" + def generated_dir(self) -> ApplicationPath: + return self._generated_dir def add_arg_parser(self, arg_parser: ArgumentParser) -> None: subparsers = arg_parser.add_subparsers(dest="template_command") - list_parser = subparsers.add_parser("list", help="List templates") - generate_parser = subparsers.add_parser("generate", help="Generate template") + list_parser = subparsers.add_parser("list", help="List templates.") + generate_parser = subparsers.add_parser("generate", help="Generate template.") def run_command(self, args: Namespace) -> None: ... |