aboutsummaryrefslogtreecommitdiff
path: root/tools/cru-py/cru/service
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2024-11-11 01:12:29 +0800
committerYuqian Yang <crupest@crupest.life>2024-12-27 16:16:29 +0800
commit7e9fdc36310d1bc63af4f4a0fc2f4963ae0154aa (patch)
tree32e9cdd3c2072ad16e9e1b68c8e4c252fa2749ed /tools/cru-py/cru/service
parentb834953fa61d816b9a955640ad12d244316ce904 (diff)
downloadcrupest-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.py58
-rw-r--r--tools/cru-py/cru/service/_template.py29
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: ...