summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author苏向夜 <fu050409@163.com>2023-12-14 17:31:51 +0800
committer苏向夜 <fu050409@163.com>2023-12-14 17:31:51 +0800
commit67002563cd9e4074ffcfd2de79e59a03ff700a4b (patch)
tree414bafd880011942ef02c41b2f307cacc3e35233
parent1efeba89c3c1463f57dfe33d80aa98c206605e1f (diff)
downloadinfini-67002563cd9e4074ffcfd2de79e59a03ff700a4b.tar.gz
infini-67002563cd9e4074ffcfd2de79e59a03ff700a4b.zip
:sparkles: 使用Handler作为对象传参
-rw-r--r--src/infini/__main__.py20
-rw-r--r--src/infini/consts/templates.py11
-rw-r--r--src/infini/handler.py13
-rw-r--r--src/infini/matcher.py12
-rw-r--r--src/infini/utils/cli.py5
5 files changed, 42 insertions, 19 deletions
diff --git a/src/infini/__main__.py b/src/infini/__main__.py
index f8f74457..bd6a2b64 100644
--- a/src/infini/__main__.py
+++ b/src/infini/__main__.py
@@ -16,8 +16,8 @@ def main():
sys.exit(1)
path = Path(args.path).resolve() if args.path else Path(os.getcwd()).resolve()
- if args.new and args.run:
- logger.error("无法确定的指令要求: 你同时指定了new与run指令。")
+ if args.new and args.test:
+ logger.error("无法确定的指令要求: 你同时指定了new与test指令。")
sys.exit(1)
if args.new:
@@ -26,14 +26,26 @@ def main():
sys.exit(1)
path.mkdir(parents=True, exist_ok=True)
- (path / "rule.py").write_text(templates.RULE, encoding="utf-8")
+ (path / "handler.py").write_text(templates.RULE, encoding="utf-8")
(path / "event.py").write_text(templates.EVENT, encoding="utf-8")
+ (path / "tests.py").write_text(templates.TEST, encoding="utf-8")
logger.success("HydroRoll 规则包模板已创建!")
- if args.run:
+ if args.load:
sys.path.append(str(path))
importlib.import_module("event")
+ importlib.import_module("handler")
+ sys.path.remove(str(path))
+
+ if args.test:
+ logger.info(f"开始测试规则包: {str(path)}...")
+ sys.path.append(str(path))
+ importlib.import_module("event")
+ importlib.import_module("handler")
+ tests = importlib.import_module("tests")
+ tests.test()
+ sys.path.remove(str(path))
if __name__ == "__main__":
diff --git a/src/infini/consts/templates.py b/src/infini/consts/templates.py
index d3176468..10ec12b4 100644
--- a/src/infini/consts/templates.py
+++ b/src/infini/consts/templates.py
@@ -10,9 +10,9 @@ class HandlerRule(Handler):
def __init__(self) -> None:
\"\"\"初始化你的规则包\"\"\"
- def check(self) -> Result:
+ def process(self) -> Result:
\"\"\"声明规则包检定方式\"\"\"
- return Result("myevent.event1", True)
+ return Result("event1", True)
"""
EVENT = """from infini import MessageEvent
@@ -24,3 +24,10 @@ class MyEvent(MessageEvent):
name = "event1"
output = "检定成功!"
"""
+
+TEST = """from infini.matcher import matcher, MatcherEvent
+
+def test():
+ event = MatcherEvent("event1")
+ print(matcher.run(event))
+"""
diff --git a/src/infini/handler.py b/src/infini/handler.py
index 30eac0ab..922023e7 100644
--- a/src/infini/handler.py
+++ b/src/infini/handler.py
@@ -1,7 +1,6 @@
from abc import ABCMeta, abstractmethod
from .exceptions import HydroError
-from .typing import Dict, Callable
-
+from .typing import Dict
__all__ = ["Result", "Handler"]
@@ -25,14 +24,14 @@ class Result(metaclass=ABCMeta):
return isinstance(self.exception, HydroError)
-class Handler(metaclass=ABCMeta):
+class Handler:
"""规则包业务基类"""
name: str
priority: int = 0
def __init_subclass__(cls) -> None:
- handlers.regist(cls.name, cls.process)
+ handlers.regist(cls.name, cls())
@abstractmethod
def process(self) -> Result:
@@ -42,12 +41,12 @@ class Handler(metaclass=ABCMeta):
class Handlers:
"""规则包业务集合"""
- _handlers: Dict[str, Callable] = {}
+ _handlers: Dict[str, Handler] = {}
- def regist(self, name: str, handler: Callable) -> None:
+ def regist(self, name: str, handler: Handler) -> None:
self._handlers[name.lower()] = handler
- def match(self, name: str) -> Callable | None:
+ def match(self, name: str) -> Handler | None:
return self._handlers.get(name.lower())
diff --git a/src/infini/matcher.py b/src/infini/matcher.py
index 5fde8445..078a39e8 100644
--- a/src/infini/matcher.py
+++ b/src/infini/matcher.py
@@ -1,7 +1,8 @@
from .event import Events, events
-from .handler import Handlers, Result, handlers
+from .handler import Handlers, Handler, Result, handlers
from .exceptions import UnknownMatcherEvent
from .typing import Callable
+from .logging import logger
class MatcherEvent:
@@ -24,18 +25,21 @@ class Matcher:
events: Events
handlers: Handlers
- def __init__(self, _events: Events | None = None, _handlers: Handlers | None = None) -> None:
+ def __init__(
+ self, _events: Events | None = None, _handlers: Handlers | None = None
+ ) -> None:
self.events = _events if _events else events
self.handlers = _handlers if _handlers else handlers
- def match(self, name: str) -> Callable:
+ def match(self, name: str) -> Handler:
if handler := self.handlers.match(name):
return handler
else:
raise UnknownMatcherEvent(f"未知的规则包: {name}")
def run(self, event: MatcherEvent) -> str:
- result: Result = self.match(event.name)()
+ logger.debug(f"开始处理事件: {event.name}...")
+ result = self.match(event.name).process()
return self.events.process(result.event, **event.kwargs)
diff --git a/src/infini/utils/cli.py b/src/infini/utils/cli.py
index 8e510a35..b594cdd8 100644
--- a/src/infini/utils/cli.py
+++ b/src/infini/utils/cli.py
@@ -5,8 +5,9 @@ import sys
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
parser = argparse.ArgumentParser(prog="Infini CLI", description="Infini 命令行工具")
- parser.add_argument("--new", action="store_true", help="创建一个 HydroRoll 规则包模板")
- parser.add_argument("--run", action="store_true", help="运行 HydroRoll 规则包")
+ parser.add_argument("--new", action="store_true", help="创建一个 Infini 规则包模板")
+ parser.add_argument("--load", action="store_true", help="导入 Infini 规则包")
+ parser.add_argument("--test", action="store_true", help="运行 Infini 规则包测试")
parser.add_argument("--gui", action="store_true", help="显示弹窗")
parser.add_argument("--path", help="指定路径")