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 | 69f15f6319626c72707a7d7b461febcaf460570c (patch) | |
| tree | 32e9cdd3c2072ad16e9e1b68c8e4c252fa2749ed /tools/cru-py/cru/service | |
| parent | ce79647caae24e77fb2e978541a30dca29026b8a (diff) | |
| download | crupest-69f15f6319626c72707a7d7b461febcaf460570c.tar.gz crupest-69f15f6319626c72707a7d7b461febcaf460570c.tar.bz2 crupest-69f15f6319626c72707a7d7b461febcaf460570c.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: ...  | 
