From 0680f2f8de507236966ed9ac3ae692f009f2de8f Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 16 Dec 2023 20:05:11 +0800 Subject: :sparkles: 更新事件基类声明 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/event.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/infini/event.py b/src/infini/event.py index a83c4042..659ae73e 100644 --- a/src/infini/event.py +++ b/src/infini/event.py @@ -1,4 +1,3 @@ -from abc import ABCMeta from .typing import Dict from .exceptions import UnknownMessageEvent @@ -7,6 +6,12 @@ import re __all__ = ["MessageEvent", "events"] +class InfiniEvent: + """Inifni 事件基类""" + + name: str + + class Events: """事件集合""" @@ -30,20 +35,31 @@ class Events: return string -class MessageEvent(metaclass=ABCMeta): - """消息事件基类""" +class MessageEvent(InfiniEvent): + """Message 事件""" name: str output: str - def __init_subclass__(cls) -> None: - events.regist(cls.name, cls.output) + def __repr__(self) -> str: + return f"" + + +class WorkflowEvent(InfiniEvent): + """Workflow 事件""" + + name: str + kwargs: dict + + def __repr__(self) -> str: + return f"" -class MatcherEvent: +class MatcherEvent(InfiniEvent): """Matcher 事件""" name: str + prefix: str string: str kwargs: dict -- cgit v1.2.3-70-g09d2 From 8931736c9eb5fc8c5fe2eb8d6eca630b22fba5c9 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 16 Dec 2023 20:29:35 +0800 Subject: :sparkles: 更新事件方法 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/event.py | 57 +++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/infini/event.py b/src/infini/event.py index 659ae73e..7ff276d8 100644 --- a/src/infini/event.py +++ b/src/infini/event.py @@ -1,38 +1,19 @@ -from .typing import Dict -from .exceptions import UnknownMessageEvent +from abc import ABCMeta +from .register import Events -import re +__all__ = ["InfiniEvent", "MessageEvent", "WorkflowEvent", "MatcherEvent", "events"] -__all__ = ["MessageEvent", "events"] - -class InfiniEvent: +class InfiniEvent(metaclass=ABCMeta): """Inifni 事件基类""" name: str + def __repr__(self) -> str: + raise NotImplementedError -class Events: - """事件集合""" - - _events: Dict[str, str] = {} - - def regist(self, name: str, output: str) -> None: - self._events[name.lower()] = output - - def process(self, name: str, **kwargs) -> str: - if string := self._events.get(name.lower()): - return self._format(string, **kwargs) - raise UnknownMessageEvent(f"事件[{name.lower()}]不存在!") - - def _format(self, string: str, **kwargs): - pattern = r"{(.*?)}" - values = re.findall(pattern, string) - for value in values: - kwarg = kwargs.get(value) - value = kwarg if kwarg else "" - string = re.sub(pattern, value, string) - return string + def get_event_name(self) -> str: + return self.name class MessageEvent(InfiniEvent): @@ -54,6 +35,13 @@ class WorkflowEvent(InfiniEvent): def __repr__(self) -> str: return f"" + def __eq__(self, __value: object) -> bool: + if __value is str: + return self.name == __value + if isinstance(__value, WorkflowEvent): + return self.name == __value.name and self.kwargs == __value.kwargs + return False + class MatcherEvent(InfiniEvent): """Matcher 事件""" @@ -63,13 +51,26 @@ class MatcherEvent(InfiniEvent): string: str kwargs: dict - def __init__(self, event_name: str, string: str | None = None, **kwargs): + def __init__( + self, + event_name: str, + prefix: str | None = None, + string: str | None = None, + **kwargs, + ): self.name = event_name + self.prefix = prefix or "" self.string = string or "" self.kwargs = kwargs def __repr__(self) -> str: return f"" + def get_prefix(self): + return self.prefix + + def get_plain_text(self): + return self.string + events = Events() -- cgit v1.2.3-70-g09d2 From 18842db3782ff1bbcdd3281f1efdaf0a8ca98e0c Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 16 Dec 2023 20:30:08 +0800 Subject: :sparkles: 新增注册控制类 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/register.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/infini/register.py diff --git a/src/infini/register.py b/src/infini/register.py new file mode 100644 index 00000000..293b212e --- /dev/null +++ b/src/infini/register.py @@ -0,0 +1,49 @@ +from infini.exceptions import UnknownMessageEvent +from infini.handler import Handler +from infini.typing import Dict + + +import re + + +class Loader: + ... + + +class Register: + ... + + +class Events: + """事件集合""" + + _events: Dict[str, str] = {} + + def regist(self, name: str, output: str) -> None: + self._events[name.lower()] = output + + def process(self, name: str, **kwargs) -> str: + if string := self._events.get(name.lower()): + return self._format(string, **kwargs) + raise UnknownMessageEvent(f"事件[{name.lower()}]不存在!") + + def _format(self, string: str, **kwargs): + pattern = r"{(.*?)}" + values = re.findall(pattern, string) + for value in values: + kwarg = kwargs.get(value) + value = kwarg if kwarg else "" + string = re.sub(pattern, value, string) + return string + + +class Handlers: + """规则包业务集合""" + + _handlers: Dict[str, Handler] = {} + + def regist(self, name: str, handler: Handler) -> None: + self._handlers[name.lower()] = handler + + def match(self, name: str) -> Handler | None: + return self._handlers.get(name.lower()) -- cgit v1.2.3-70-g09d2 From 24286e1922b1686b72ab50ba4abc7c22fd257b7c Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 16 Dec 2023 20:30:33 +0800 Subject: :sparkles: 更新业务基类声明 弃用子类声明方法 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/handler.py | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/src/infini/handler.py b/src/infini/handler.py index 06d5c5fa..650762c6 100644 --- a/src/infini/handler.py +++ b/src/infini/handler.py @@ -1,12 +1,12 @@ from abc import ABCMeta, abstractmethod +from .register import Handlers from .event import MatcherEvent -from .typing import Dict __all__ = ["Result", "Handler"] -class Result(metaclass=ABCMeta): - """规则包运行结果基类""" +class Result: + """规则包运行结果""" event: str status: bool @@ -18,30 +18,18 @@ class Result(metaclass=ABCMeta): self.kwargs = kwargs -class Handler: +class Handler(metaclass=ABCMeta): """规则包业务基类""" name: str priority: int = 0 - def __init_subclass__(cls) -> None: - handlers.regist(cls.name, cls()) + # def __init_subclass__(cls) -> None: + # handlers.regist(cls.name, cls()) @abstractmethod def process(self, event: MatcherEvent) -> Result: raise NotImplementedError -class Handlers: - """规则包业务集合""" - - _handlers: Dict[str, Handler] = {} - - def regist(self, name: str, handler: Handler) -> None: - self._handlers[name.lower()] = handler - - def match(self, name: str) -> Handler | None: - return self._handlers.get(name.lower()) - - handlers = Handlers() -- cgit v1.2.3-70-g09d2 From 607035aaab3c1143cdbc593ac98554d72588a12f Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 16 Dec 2023 20:31:05 +0800 Subject: :recycle: 修订matcher.py导入路径 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/matcher.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/infini/matcher.py b/src/infini/matcher.py index 7fc5b88a..309081ac 100644 --- a/src/infini/matcher.py +++ b/src/infini/matcher.py @@ -1,5 +1,6 @@ -from .event import MatcherEvent, Events, events -from .handler import Handlers, Handler, handlers +from .register import Events, Handlers +from .event import MatcherEvent, events +from .handler import Handler, handlers from .exceptions import UnknownMatcherEvent -- cgit v1.2.3-70-g09d2 From 0ec5261b93df89feefbaed3482e5da577418241f Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 16 Dec 2023 20:37:07 +0800 Subject: :recycle: 允许业务函数返回事件实例 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/event.py | 16 ++++++++++++++-- src/infini/typing.py | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/infini/event.py b/src/infini/event.py index 7ff276d8..d33a9c3c 100644 --- a/src/infini/event.py +++ b/src/infini/event.py @@ -1,5 +1,6 @@ from abc import ABCMeta from .register import Events +from .typing import Dict, Any __all__ = ["InfiniEvent", "MessageEvent", "WorkflowEvent", "MatcherEvent", "events"] @@ -8,6 +9,7 @@ class InfiniEvent(metaclass=ABCMeta): """Inifni 事件基类""" name: str + kwargs: Dict[str, Any] def __repr__(self) -> str: raise NotImplementedError @@ -21,6 +23,12 @@ class MessageEvent(InfiniEvent): name: str output: str + kwargs: Dict[str, Any] + + def __init__(self, name: str, output: str, **kwargs) -> None: + self.name = name + self.output = output + self.kwargs = kwargs def __repr__(self) -> str: return f"" @@ -30,7 +38,11 @@ class WorkflowEvent(InfiniEvent): """Workflow 事件""" name: str - kwargs: dict + kwargs: Dict[str, Any] + + def __init__(self, name: str, **kwargs) -> None: + self.name = name + self.kwargs = kwargs def __repr__(self) -> str: return f"" @@ -49,7 +61,7 @@ class MatcherEvent(InfiniEvent): name: str prefix: str string: str - kwargs: dict + kwargs: Dict[str, Any] def __init__( self, diff --git a/src/infini/typing.py b/src/infini/typing.py index df495707..0055d816 100644 --- a/src/infini/typing.py +++ b/src/infini/typing.py @@ -1,5 +1,6 @@ from typing import ( Dict as Dict, + Any as Any, TYPE_CHECKING as TYPE_CHECKING, TypeVar as TypeVar, Callable as Callable, -- cgit v1.2.3-70-g09d2 From 5763d8e4706efca2d238b63d124d4d0064f990ad Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 16 Dec 2023 20:43:56 +0800 Subject: :recycle: 使用直接事件作为返回方案 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/event.py | 11 ++++++----- src/infini/handler.py | 28 ++++++++++++---------------- src/infini/matcher.py | 11 ++++++----- src/infini/register.py | 5 ++++- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/infini/event.py b/src/infini/event.py index d33a9c3c..1f04afeb 100644 --- a/src/infini/event.py +++ b/src/infini/event.py @@ -1,8 +1,12 @@ from abc import ABCMeta -from .register import Events from .typing import Dict, Any -__all__ = ["InfiniEvent", "MessageEvent", "WorkflowEvent", "MatcherEvent", "events"] +__all__ = [ + "InfiniEvent", + "MessageEvent", + "WorkflowEvent", + "MatcherEvent", +] class InfiniEvent(metaclass=ABCMeta): @@ -83,6 +87,3 @@ class MatcherEvent(InfiniEvent): def get_plain_text(self): return self.string - - -events = Events() diff --git a/src/infini/handler.py b/src/infini/handler.py index 650762c6..8444d3b6 100644 --- a/src/infini/handler.py +++ b/src/infini/handler.py @@ -1,21 +1,20 @@ from abc import ABCMeta, abstractmethod -from .register import Handlers -from .event import MatcherEvent +from .event import MatcherEvent, InfiniEvent -__all__ = ["Result", "Handler"] +__all__ = ["Handler"] -class Result: - """规则包运行结果""" +# class Result: +# """规则包运行结果""" - event: str - status: bool - kwargs: dict = {} +# event: str +# status: bool +# kwargs: dict = {} - def __init__(self, event: str, status: bool, **kwargs) -> None: - self.event = event - self.status = status - self.kwargs = kwargs +# def __init__(self, event: str, status: bool, **kwargs) -> None: +# self.event = event +# self.status = status +# self.kwargs = kwargs class Handler(metaclass=ABCMeta): @@ -28,8 +27,5 @@ class Handler(metaclass=ABCMeta): # handlers.regist(cls.name, cls()) @abstractmethod - def process(self, event: MatcherEvent) -> Result: + def process(self, event: MatcherEvent) -> InfiniEvent: raise NotImplementedError - - -handlers = Handlers() diff --git a/src/infini/matcher.py b/src/infini/matcher.py index 309081ac..94bb6645 100644 --- a/src/infini/matcher.py +++ b/src/infini/matcher.py @@ -1,6 +1,6 @@ -from .register import Events, Handlers -from .event import MatcherEvent, events -from .handler import Handler, handlers +from .register import Events, Handlers, events, handlers +from .event import MatcherEvent +from .handler import Handler from .exceptions import UnknownMatcherEvent @@ -23,9 +23,10 @@ class Matcher: raise UnknownMatcherEvent(f"未知的规则包: {name}") def run(self, event: MatcherEvent) -> str: - result = self.match(event.name).process(event) + callback_event = self.match(event.name).process(event) return self.events.process( - result.event, **result.kwargs if result.kwargs else event.kwargs + callback_event.name, + **callback_event.kwargs if callback_event.kwargs else callback_event.kwargs, ) diff --git a/src/infini/register.py b/src/infini/register.py index 293b212e..40d929f3 100644 --- a/src/infini/register.py +++ b/src/infini/register.py @@ -2,7 +2,6 @@ from infini.exceptions import UnknownMessageEvent from infini.handler import Handler from infini.typing import Dict - import re @@ -47,3 +46,7 @@ class Handlers: def match(self, name: str) -> Handler | None: return self._handlers.get(name.lower()) + + +handlers = Handlers() +events = Events() -- cgit v1.2.3-70-g09d2 From dd27866fc9763af6f5b03024296dd74148d91eb3 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sun, 17 Dec 2023 21:07:23 +0800 Subject: :bug: 修订消息事件生成模式 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/event.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/infini/event.py b/src/infini/event.py index 1f04afeb..555dec57 100644 --- a/src/infini/event.py +++ b/src/infini/event.py @@ -29,9 +29,8 @@ class MessageEvent(InfiniEvent): output: str kwargs: Dict[str, Any] - def __init__(self, name: str, output: str, **kwargs) -> None: + def __init__(self, name: str, **kwargs) -> None: self.name = name - self.output = output self.kwargs = kwargs def __repr__(self) -> str: -- cgit v1.2.3-70-g09d2 From 5d4c76a003a0f93ca52abe7f3997757ba66a97de Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sun, 17 Dec 2023 21:17:29 +0800 Subject: :bug: 修复path不存在的问题 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/__init__.py | 4 ++-- src/infini/__main__.py | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/infini/__init__.py b/src/infini/__init__.py index d572bda8..6a9ed3ed 100644 --- a/src/infini/__init__.py +++ b/src/infini/__init__.py @@ -1,5 +1,5 @@ -from infini.handler import Handler, Result +from infini.handler import Handler from infini.event import MessageEvent from infini.matcher import matcher -__all__ = ["Handler", "Result", "MessageEvent", "matcher"] +__all__ = ["Handler", "MessageEvent", "matcher"] diff --git a/src/infini/__main__.py b/src/infini/__main__.py index 5c4dc2eb..67d18e1f 100644 --- a/src/infini/__main__.py +++ b/src/infini/__main__.py @@ -15,7 +15,11 @@ def main(): logger.critical("选项[--gui]尚未被支持!") sys.exit(1) - path = Path(args.path).resolve() if args.path else Path(os.getcwd()).resolve() + path = ( + Path(args.path).resolve() + if hasattr(args, "path") + else Path(os.getcwd()).resolve() + ) if args.operate == "new": if path.exists() and not args.force: -- cgit v1.2.3-70-g09d2 From b05bcb4a6b1154f4a8f3a638dca9cfee6b7bbdd8 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sun, 17 Dec 2023 23:35:30 +0800 Subject: :sparkles: 新增异常声明 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/exceptions.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/infini/exceptions.py b/src/infini/exceptions.py index 2c181b48..fd10b802 100644 --- a/src/infini/exceptions.py +++ b/src/infini/exceptions.py @@ -2,8 +2,20 @@ class HydroError(Exception): """HydroRoll 异常基类""" -class RuleLoadError(HydroError): - """规则导入错误""" +class LoadError(HydroError): + """规则包导入错误""" + + +class PackageNotFound(LoadError): + """规则包不存在""" + + +class EventLoadError(LoadError, RuntimeError): + """事件声明导入失败""" + + +class HandlerLoadError(LoadError, RuntimeError): + """业务函数导入失败""" class EventError(HydroError): -- cgit v1.2.3-70-g09d2 From 8df31b57b851887cb77d29e9d89cd016f9fff8a5 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sun, 17 Dec 2023 23:36:12 +0800 Subject: :sparkles: 新增抽象声明 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/event.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/infini/event.py b/src/infini/event.py index 555dec57..649103c9 100644 --- a/src/infini/event.py +++ b/src/infini/event.py @@ -1,4 +1,4 @@ -from abc import ABCMeta +from abc import ABCMeta, abstractmethod from .typing import Dict, Any __all__ = [ @@ -15,6 +15,7 @@ class InfiniEvent(metaclass=ABCMeta): name: str kwargs: Dict[str, Any] + @abstractmethod def __repr__(self) -> str: raise NotImplementedError -- cgit v1.2.3-70-g09d2 From b6a3b5366bd6376c2b13a3627773c383df6a3de4 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sun, 17 Dec 2023 23:36:40 +0800 Subject: :sparkles: 新增加载器 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/register.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/src/infini/register.py b/src/infini/register.py index 40d929f3..23ab9aee 100644 --- a/src/infini/register.py +++ b/src/infini/register.py @@ -1,16 +1,73 @@ -from infini.exceptions import UnknownMessageEvent -from infini.handler import Handler -from infini.typing import Dict +from pathlib import Path +from .exceptions import UnknownMessageEvent +from .handler import Handler +from .event import InfiniEvent +from .typing import Dict +from .exceptions import LoadError, EventLoadError, HandlerLoadError import re +import sys +import importlib +import inspect class Loader: - ... + """加载器""" + + name: str + meta_path: Path + events: dict + handlers: dict + + def __init__(self, meta_path: Path | str) -> None: + if isinstance(meta_path, str): + self.meta_path = Path(meta_path).resolve() + else: + self.meta_path = meta_path.resolve() + self.name = self.meta_path.name + self.events = {} + self.handlers = {} + + def load(self) -> None: + sys.path.append(str(self.meta_path)) + try: + importlib.import_module(f"{self.name}") + except Exception as error: + raise LoadError(f"规则包[{self.name}]导入失败: {error}") from error + + try: + event_module = importlib.import_module(f"{self.name}.event") + events = [ + cls[1] + for cls in inspect.getmembers(event_module, inspect.isclass) + if issubclass(cls[1], InfiniEvent) + and not cls[1].__module__.startswith("infini") + ] + for event in events: + self.events[event.__dict__["name"]] = event + except Exception as error: + raise EventLoadError(f"规则包[{self.name}]事件导入失败: {error}") from error + + try: + handler_module = importlib.import_module(f"{self.name}.handler") + events = [ + cls[1] + for cls in inspect.getmembers(handler_module, inspect.isclass) + if issubclass(cls[1], InfiniEvent) + and not cls[1].__module__.startswith("infini") + ] + for event in events: + self.handlers[event.__dict__["name"]] = event + except Exception as error: + raise HandlerLoadError(f"规则包[{self.name}]业务函数导入失败: {error}") from error + + sys.path.remove(str(self.meta_path)) class Register: - ... + """注册器""" + + events: Dict[str, str] class Events: -- cgit v1.2.3-70-g09d2 From 8992b5e9dacb9f5964b1a8d5e501490447291344 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sun, 17 Dec 2023 23:37:05 +0800 Subject: :sparkles: 采用加载器 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/__main__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/infini/__main__.py b/src/infini/__main__.py index 67d18e1f..c02824d5 100644 --- a/src/infini/__main__.py +++ b/src/infini/__main__.py @@ -2,6 +2,7 @@ from pathlib import Path from .utils.cli import parse_args from .consts import templates from .logging import logger +from .register import Loader import os import importlib @@ -35,11 +36,10 @@ def main(): if args.operate == "test": logger.info(f"开始测试规则包: {path.name}...") - sys.path.append(str(path)) + loader = Loader(meta_path=path) logger.info("初始化规则包中...") try: - importlib.import_module("event") - importlib.import_module("handler") + loader.load() except Exception as error: if args.verbose: logger.exception(error) -- cgit v1.2.3-70-g09d2 From 037a5b0e2c1ec9ffa8f0837d019ec8d6ebd20a36 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sun, 17 Dec 2023 23:37:35 +0800 Subject: :fire: 清理废弃代码 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/handler.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/infini/handler.py b/src/infini/handler.py index 8444d3b6..32ab7465 100644 --- a/src/infini/handler.py +++ b/src/infini/handler.py @@ -4,28 +4,12 @@ from .event import MatcherEvent, InfiniEvent __all__ = ["Handler"] -# class Result: -# """规则包运行结果""" - -# event: str -# status: bool -# kwargs: dict = {} - -# def __init__(self, event: str, status: bool, **kwargs) -> None: -# self.event = event -# self.status = status -# self.kwargs = kwargs - - class Handler(metaclass=ABCMeta): """规则包业务基类""" name: str priority: int = 0 - # def __init_subclass__(cls) -> None: - # handlers.regist(cls.name, cls()) - @abstractmethod def process(self, event: MatcherEvent) -> InfiniEvent: raise NotImplementedError -- cgit v1.2.3-70-g09d2 From bf95e7c63aceb7b64d718dc16f007fc78c37d2a7 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sun, 17 Dec 2023 23:42:09 +0800 Subject: :recycle: 优化测试模式 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/__main__.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/infini/__main__.py b/src/infini/__main__.py index c02824d5..97e70b45 100644 --- a/src/infini/__main__.py +++ b/src/infini/__main__.py @@ -35,25 +35,30 @@ def main(): logger.success("HydroRoll 规则包模板已创建!") if args.operate == "test": + exceptions = [] + logger.info(f"开始测试规则包: {path.name}...") loader = Loader(meta_path=path) logger.info("初始化规则包中...") + try: loader.load() except Exception as error: if args.verbose: logger.exception(error) - logger.critical(f"初始化规则包时出现异常: {error}") - return + logger.critical(f"初始化规则包时出现异常: {error}") + exceptions.append(error) + try: - errors = importlib.import_module("tests").test() + errors = importlib.import_module(f"{path.name}.tests").test() + exceptions.extend(errors) except Exception as error: if args.verbose: logger.exception(error) - logger.critical(f"测试规则包时出现异常: {error}") - return - sys.path.remove(str(path)) - logger.info(f"测试规则包 {path.name} 出现 {len(errors)} 个异常, 测试完成.") + logger.critical(f"测试规则包时出现异常: {error}") + exceptions.append(error) + + logger.info(f"测试规则包 {path.name} 出现 {len(exceptions)} 个异常, 测试完成.") if __name__ == "__main__": -- cgit v1.2.3-70-g09d2 From 31b0e745ab9688c3c760130ded3e0ea645902b15 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Mon, 18 Dec 2023 01:13:19 +0800 Subject: :bug: 允许Handler实例化 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/handler.py | 5 ++++- src/infini/matcher.py | 21 ++++++++++----------- src/infini/typing.py | 1 + 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/infini/handler.py b/src/infini/handler.py index 32ab7465..7c0ee73d 100644 --- a/src/infini/handler.py +++ b/src/infini/handler.py @@ -4,12 +4,15 @@ from .event import MatcherEvent, InfiniEvent __all__ = ["Handler"] -class Handler(metaclass=ABCMeta): +class Handler: """规则包业务基类""" name: str priority: int = 0 + def __init__(self) -> None: + pass + @abstractmethod def process(self, event: MatcherEvent) -> InfiniEvent: raise NotImplementedError diff --git a/src/infini/matcher.py b/src/infini/matcher.py index 94bb6645..364bc5ea 100644 --- a/src/infini/matcher.py +++ b/src/infini/matcher.py @@ -1,4 +1,4 @@ -from .register import Events, Handlers, events, handlers +from .register import Register, register from .event import MatcherEvent from .handler import Handler from .exceptions import UnknownMatcherEvent @@ -7,24 +7,23 @@ from .exceptions import UnknownMatcherEvent class Matcher: """事件处理单元""" - events: Events - handlers: Handlers + register: Register - 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 __init__(self, _register: Register | None = None) -> None: + self.register = _register if _register else register def match(self, name: str) -> Handler: - if handler := self.handlers.match(name): - return handler + if handler := self.register.handlers.match(name): + if isinstance(handler, Handler): + return handler + else: + return handler() else: raise UnknownMatcherEvent(f"未知的规则包: {name}") def run(self, event: MatcherEvent) -> str: callback_event = self.match(event.name).process(event) - return self.events.process( + return self.register.events.process( callback_event.name, **callback_event.kwargs if callback_event.kwargs else callback_event.kwargs, ) diff --git a/src/infini/typing.py b/src/infini/typing.py index 0055d816..9af61569 100644 --- a/src/infini/typing.py +++ b/src/infini/typing.py @@ -1,6 +1,7 @@ from typing import ( Dict as Dict, Any as Any, + Type as Type, TYPE_CHECKING as TYPE_CHECKING, TypeVar as TypeVar, Callable as Callable, -- cgit v1.2.3-70-g09d2 From c91ea692ee01f617388141315315a26bddf0e75d Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Mon, 18 Dec 2023 01:13:46 +0800 Subject: :sparkles: 新增异常类型 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/exceptions.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/infini/exceptions.py b/src/infini/exceptions.py index fd10b802..e086fc5d 100644 --- a/src/infini/exceptions.py +++ b/src/infini/exceptions.py @@ -22,9 +22,17 @@ class EventError(HydroError): """事件处理时异常""" -class UnknownMatcherEvent(EventError): +class UnknownEvent(EventError): + """未知事件""" + + +class UnknownMatcherEvent(UnknownEvent): """未知的给入实现""" -class UnknownMessageEvent(EventError): +class UnknownMessageEvent(UnknownEvent): """未知的给出实现""" + + +class UnsupportedError(EventError, RuntimeError): + """方法未被支持""" -- cgit v1.2.3-70-g09d2 From 8850fb24d8e8a9c601f468dda256dec22b7d014b Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Mon, 18 Dec 2023 01:14:38 +0800 Subject: :recycle: 修订入口文件 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/__init__.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/infini/__init__.py b/src/infini/__init__.py index 6a9ed3ed..5a6142c1 100644 --- a/src/infini/__init__.py +++ b/src/infini/__init__.py @@ -1,5 +1,13 @@ from infini.handler import Handler -from infini.event import MessageEvent -from infini.matcher import matcher +from infini.event import MessageEvent, MatcherEvent, WorkflowEvent +from infini.matcher import Matcher +from infini.register import Register -__all__ = ["Handler", "MessageEvent", "matcher"] +__all__ = [ + "Handler", + "MessageEvent", + "Matcher", + "Register", + "MatcherEvent", + "WorkflowEvent", +] -- cgit v1.2.3-70-g09d2 From 2ed7f9cf07ad23227a658a310ffe957f6e36b856 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Mon, 18 Dec 2023 01:15:06 +0800 Subject: :sparkles: 新增并使用注册器 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/__main__.py | 7 ++--- src/infini/register.py | 73 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 54 insertions(+), 26 deletions(-) diff --git a/src/infini/__main__.py b/src/infini/__main__.py index 97e70b45..cd20eb62 100644 --- a/src/infini/__main__.py +++ b/src/infini/__main__.py @@ -2,7 +2,7 @@ from pathlib import Path from .utils.cli import parse_args from .consts import templates from .logging import logger -from .register import Loader +from .register import register import os import importlib @@ -38,11 +38,12 @@ def main(): exceptions = [] logger.info(f"开始测试规则包: {path.name}...") - loader = Loader(meta_path=path) logger.info("初始化规则包中...") try: - loader.load() + register.regist(path) + print(register.events._events) + print(register.handlers._handlers) except Exception as error: if args.verbose: logger.exception(error) diff --git a/src/infini/register.py b/src/infini/register.py index 23ab9aee..64d63cfb 100644 --- a/src/infini/register.py +++ b/src/infini/register.py @@ -1,9 +1,9 @@ from pathlib import Path -from .exceptions import UnknownMessageEvent +from .exceptions import UnsupportedError from .handler import Handler -from .event import InfiniEvent -from .typing import Dict -from .exceptions import LoadError, EventLoadError, HandlerLoadError +from .event import InfiniEvent, MessageEvent, WorkflowEvent +from .typing import Dict, Type +from .exceptions import LoadError, EventLoadError, HandlerLoadError, UnknownEvent import re import sys @@ -12,7 +12,7 @@ import inspect class Loader: - """加载器""" + """Infini 事件加载器""" name: str meta_path: Path @@ -44,44 +44,52 @@ class Loader: and not cls[1].__module__.startswith("infini") ] for event in events: - self.events[event.__dict__["name"]] = event + self.events[f"{self.name}.{event.__dict__['name']}"] = event except Exception as error: raise EventLoadError(f"规则包[{self.name}]事件导入失败: {error}") from error try: handler_module = importlib.import_module(f"{self.name}.handler") - events = [ + handlers = [ cls[1] for cls in inspect.getmembers(handler_module, inspect.isclass) - if issubclass(cls[1], InfiniEvent) + if issubclass(cls[1], Handler) and not cls[1].__module__.startswith("infini") ] - for event in events: - self.handlers[event.__dict__["name"]] = event + for handler in handlers: + self.handlers[f"{self.name}.{handler.__dict__['name']}"] = handler except Exception as error: raise HandlerLoadError(f"规则包[{self.name}]业务函数导入失败: {error}") from error sys.path.remove(str(self.meta_path)) -class Register: - """注册器""" +class Events: + """事件集合""" - events: Dict[str, str] + _events: Dict[str, Type[InfiniEvent]] + def __init__(self) -> None: + self._events = {} -class Events: - """事件集合""" + def regist(self, name: str, event: Type[InfiniEvent]) -> None: + self._events[name.lower()] = event - _events: Dict[str, str] = {} + def update(self, _events: dict) -> None: + self._events.update(_events) - def regist(self, name: str, output: str) -> None: - self._events[name.lower()] = output + def _process(self, event: Type[InfiniEvent], **kwargs) -> str: + if issubclass(event, MessageEvent): + return self._format(event.__dict__["output"], **kwargs) + elif issubclass(event, WorkflowEvent): + raise UnsupportedError + else: + raise UnsupportedError def process(self, name: str, **kwargs) -> str: - if string := self._events.get(name.lower()): - return self._format(string, **kwargs) - raise UnknownMessageEvent(f"事件[{name.lower()}]不存在!") + if event := self._events.get(name.lower()): + return self._process(event, **kwargs) + raise UnknownEvent(f"事件[{name.lower()}]不存在!") def _format(self, string: str, **kwargs): pattern = r"{(.*?)}" @@ -101,9 +109,28 @@ class Handlers: def regist(self, name: str, handler: Handler) -> None: self._handlers[name.lower()] = handler + def update(self, _events: dict) -> None: + self._handlers.update(_events) + def match(self, name: str) -> Handler | None: return self._handlers.get(name.lower()) -handlers = Handlers() -events = Events() +class Register: + """注册器""" + + events: Events + handlers: Handlers + + def __init__(self) -> None: + self.events = Events() + self.handlers = Handlers() + + def regist(self, meta_path: Path | str | None = None): + _loader = Loader(meta_path if meta_path else ".") + _loader.load() + self.events.update(_loader.events) + self.handlers.update(_loader.handlers) + + +register = Register() -- cgit v1.2.3-70-g09d2 From 9b1749bc75a680f3cb65f7286c7154e92989c642 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Mon, 18 Dec 2023 01:18:27 +0800 Subject: :arrow_up: 更新规则包模板 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/__main__.py | 2 +- src/infini/consts/templates.py | 39 +++++++++++++++++++++------------------ 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/infini/__main__.py b/src/infini/__main__.py index cd20eb62..d2d93b72 100644 --- a/src/infini/__main__.py +++ b/src/infini/__main__.py @@ -28,7 +28,7 @@ def main(): sys.exit(1) path.mkdir(parents=True, exist_ok=True) - (path / "handler.py").write_text(templates.RULE, encoding="utf-8") + (path / "handler.py").write_text(templates.HANDLER, encoding="utf-8") (path / "event.py").write_text(templates.EVENT, encoding="utf-8") (path / "tests.py").write_text(templates.TEST, encoding="utf-8") diff --git a/src/infini/consts/templates.py b/src/infini/consts/templates.py index d25894ae..d780c248 100644 --- a/src/infini/consts/templates.py +++ b/src/infini/consts/templates.py @@ -1,37 +1,40 @@ -RULE = """from infini import Handler, Result +HANDLER = """from infini import Handler, MessageEvent +from infini.matcher import MatcherEvent +from .event import MyEvent -__handlers__ = ["HandlerRule"] - -class HandlerRule(Handler): +class MyHandler(Handler): \"\"\"自设业务函数\"\"\" - name = "MyRule" # 规则包名 - priority: int = 0 # 规则包权重 + name = "example_handler" # 业务函数事件名 + priority: int = 0 # 业务函数权重 - def process(self, **kwargs) -> Result: + def process(self, event: MatcherEvent) -> MessageEvent: \"\"\"声明规则包检定方式\"\"\" - return Result("event1", True) + plain_text = event.get_plain_text() + return MyEvent("rule.example_event", plain_text=plain_text) + """ EVENT = """from infini import MessageEvent -__events__ = ["MyEvent"] - class MyEvent(MessageEvent): - name = "event1" - output = "检定成功!" + \"\"\"自定义消息事件\"\"\" + name = "example_event" + output = "捕获到输入: {plain_text}" """ TEST = """from infini.matcher import matcher, MatcherEvent + def test(): - event = MatcherEvent("MyRule") + event = MatcherEvent("rule.example_handler", string="测试") try: - matcher.run(event) + result = matcher.run(event) + assert result == "捕获到输入: 测试" except Exception as error: - return [error] - finally: - return [] -""" \ No newline at end of file + return error + return [] + +""" -- cgit v1.2.3-70-g09d2 From 487a6eadc650d3f6ea0a28f428f982d6478da6f5 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Mon, 18 Dec 2023 01:19:36 +0800 Subject: :fire: 清理DEBUG输出 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infini/__main__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/infini/__main__.py b/src/infini/__main__.py index d2d93b72..65391989 100644 --- a/src/infini/__main__.py +++ b/src/infini/__main__.py @@ -42,8 +42,6 @@ def main(): try: register.regist(path) - print(register.events._events) - print(register.handlers._handlers) except Exception as error: if args.verbose: logger.exception(error) -- cgit v1.2.3-70-g09d2 From 29512b9cb2984aa633c49ac7db8fd9556c0d98b9 Mon Sep 17 00:00:00 2001 From: 简律纯 Date: Mon, 18 Dec 2023 01:35:59 +0800 Subject: chore(event): add `_str__` method --- src/infini/event.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/infini/event.py b/src/infini/event.py index 649103c9..9c6bd41b 100644 --- a/src/infini/event.py +++ b/src/infini/event.py @@ -34,9 +34,12 @@ class MessageEvent(InfiniEvent): self.name = name self.kwargs = kwargs - def __repr__(self) -> str: + def __str__(self) -> str: return f"" + def __repr__(self) -> str: + return self.__str__() + class WorkflowEvent(InfiniEvent): """Workflow 事件""" -- cgit v1.2.3-70-g09d2