From 38b0f36088db93d077c41bda2faf560de056f6e6 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 24 Feb 2024 21:53:31 +0800 Subject: fix(infini): support python>=3.8 --- src/infini/core.py | 8 ++++---- src/infini/generator.py | 4 ++-- src/infini/handler.py | 4 ++-- src/infini/interceptor.py | 12 ++++++------ src/infini/internal.py | 4 ++-- src/infini/loader.py | 29 ++++++++++++++++++++--------- src/infini/register.py | 28 +++++++++++----------------- src/infini/typing.py | 3 ++- 8 files changed, 49 insertions(+), 43 deletions(-) diff --git a/src/infini/core.py b/src/infini/core.py index 12a49c03..8fb46752 100644 --- a/src/infini/core.py +++ b/src/infini/core.py @@ -3,7 +3,7 @@ from infini.interceptor import Interceptor from infini.generator import TextGenerator from infini.handler import Handler from infini.output import Output -from infini.typing import Any, Generator +from infini.typing import Any, Generator, Union from infini.exceptions import ValueError @@ -15,7 +15,7 @@ class Core: def input( self, input: Input - ) -> Generator[str | Output, Any, None]: # TODO 支持Workflow + ) -> Generator[Union[str, Output], Any, None]: # TODO 支持Workflow for pre_intercepted_stream in self.pre_intercept(input): if isinstance(pre_intercepted_stream, Output): if not isinstance(pre_intercepted_stream, Output): @@ -51,7 +51,7 @@ class Core: if handled_stream.block: return - def pre_intercept(self, input: Input) -> Generator[Output | Input, Any, None]: + def pre_intercept(self, input: Input) -> Generator[Union[Input, Output], Any, None]: return self.pre_interceptor.input(input) def handle(self, input: Input) -> Generator[Output, Any, None]: @@ -62,5 +62,5 @@ class Core: def generate(self, output: Output) -> str: return self.generator.output(output) - def intercept(self, output_text: str) -> Generator[Output | str, Any, None]: + def intercept(self, output_text: str) -> Generator[Union[str, Output], Any, None]: return self.interceptor.output(output_text) diff --git a/src/infini/generator.py b/src/infini/generator.py index cc752d70..53ca1a69 100644 --- a/src/infini/generator.py +++ b/src/infini/generator.py @@ -1,12 +1,12 @@ from infini.output import Output -from infini.typing import Dict, Callable +from infini.typing import Dict, Callable, Union from infini.exceptions import UnknownEvent from jinja2 import Template class TextGenerator: # TODO 兼容多类型事件 events: Dict[str, str] - global_variables: Dict[str, str | Callable] + global_variables: Dict[str, Union[str, Callable]] def __init__(self) -> None: self.events = {} diff --git a/src/infini/handler.py b/src/infini/handler.py index 79686485..0d8d1fe0 100644 --- a/src/infini/handler.py +++ b/src/infini/handler.py @@ -1,6 +1,6 @@ from infini.input import Input from infini.output import Output -from infini.typing import List, Any, RouterType, Callable, Generator +from infini.typing import List, Any, RouterType, Callable, Generator, Union from infini.queue import EventQueue @@ -24,7 +24,7 @@ class Handler: def match( self, text: str - ) -> EventQueue[Callable[[Input], Output | Generator[Output, Any, None]]]: + ) -> EventQueue[Callable[[Input], Union[Output, Generator[Output, Any, None]]]]: queue = EventQueue() for handler in self.handlers: diff --git a/src/infini/interceptor.py b/src/infini/interceptor.py index c8866ec0..bffd3f8e 100644 --- a/src/infini/interceptor.py +++ b/src/infini/interceptor.py @@ -1,13 +1,13 @@ from infini.input import Input from infini.output import Output -from infini.typing import List, Any, RouterType, Callable, Generator +from infini.typing import List, Any, RouterType, Callable, Generator, Union from infini.queue import EventQueue class Interceptor: interceptors: List[RouterType] - def input(self, input: Input) -> Generator[Output | Input, Any, None]: + def input(self, input: Input) -> Generator[Union[Output, Input], Any, None]: queue = self.match(input.get_plain_text()) while not queue.is_empty(): if isinstance(stream := queue.pop()(input), Generator): @@ -30,9 +30,7 @@ class Interceptor: input = stream yield input - def output( - self, output_text: str - ) -> Generator[Output | str, Any, None]: + def output(self, output_text: str) -> Generator[Union[Output, str], Any, None]: input = Input(output_text) queue = self.match(input.get_plain_text()) while not queue.is_empty(): @@ -59,7 +57,9 @@ class Interceptor: def match( self, text: str ) -> EventQueue[ - Callable[[Input], Input | Output | Generator[Input | Output, Any, None]] + Callable[ + [Input], Union[Input, Output, Generator[Union[Input, Output], Any, None]] + ] ]: queue = EventQueue() diff --git a/src/infini/internal.py b/src/infini/internal.py index 5924ad01..e30bda63 100644 --- a/src/infini/internal.py +++ b/src/infini/internal.py @@ -1,13 +1,13 @@ from infini.loader import Loader from infini.register import Register -from infini.typing import List +from infini.typing import List, Optional from pathlib import Path import sys import inspect -def require(name: str, paths: List | None = None) -> Register: +def require(name: str, paths: Optional[List] = None) -> Register: caller_frame = inspect.stack()[1][0] caller_file = caller_frame.f_globals["__file__"] diff --git a/src/infini/loader.py b/src/infini/loader.py index 36af2f0a..4dbc392e 100644 --- a/src/infini/loader.py +++ b/src/infini/loader.py @@ -4,7 +4,16 @@ from infini.generator import TextGenerator from infini.handler import Handler from infini.interceptor import Interceptor from infini.register import Register -from infini.typing import List, Dict, Sequence, ModuleType, RouterType, Callable +from infini.typing import ( + List, + Dict, + Sequence, + ModuleType, + RouterType, + Callable, + Union, + Optional, +) from infini.logging import logger from pathlib import Path @@ -15,7 +24,7 @@ import importlib.abc class InfiniMetaFinder(importlib.abc.MetaPathFinder): - def find_spec(self, fullname: str, path: Sequence[str] | None, target=None): + def find_spec(self, fullname: str, path: Optional[Sequence[str]], target=None): default_entries = [ Path.cwd() / "src", Path.home() / ".ipm" / "src", @@ -47,12 +56,14 @@ class InfiniMetaFinder(importlib.abc.MetaPathFinder): fullname, filename, loader=InfiniLoader(str(filename)), - submodule_search_locations=[ - str(submodule_location) - for submodule_location in submodule_locations - ] - if submodule_locations - else None, + submodule_search_locations=( + [ + str(submodule_location) + for submodule_location in submodule_locations + ] + if submodule_locations + else None + ), ) return None @@ -84,7 +95,7 @@ class Loader: pre_interceptors: List[RouterType] handlers: List[RouterType] events: Dict[str, str] - global_variables: Dict[str, str | Callable] + global_variables: Dict[str, Union[str, Callable]] interceptors: List[RouterType] def __init__(self) -> None: diff --git a/src/infini/register.py b/src/infini/register.py index 391fcf63..a2addc2b 100644 --- a/src/infini/register.py +++ b/src/infini/register.py @@ -1,7 +1,7 @@ from infini.input import Input from infini.output import Output from infini.router import Contains, Router -from infini.typing import List, Dict, Any, Callable, RouterType +from infini.typing import List, Dict, Any, Callable, RouterType, Optional, Union from functools import wraps @@ -9,7 +9,7 @@ class Register: pre_interceptors: List[RouterType] handlers: List[RouterType] events: Dict[str, str] - global_variables: Dict[str, str | Callable] + global_variables: Dict[str, Union[str, Callable]] interceptors: List[RouterType] def __init__(self) -> None: @@ -19,18 +19,16 @@ class Register: self.global_variables = {} self.interceptors = [] - def pre_interceptor(self, router: Router | str, priority: int = 0): + def pre_interceptor(self, router: Union[Router, str], priority: int = 0): def decorator(func): @wraps(func) - def wrapper(input: Input) -> Input | Output: + def wrapper(input: Input) -> Union[Input, Output]: return func(input) self.pre_interceptors.append( { "priority": priority, - "router": Contains(router) - if isinstance(router, str) - else router, + "router": Contains(router) if isinstance(router, str) else router, "handler": wrapper, } ) @@ -38,7 +36,7 @@ class Register: return decorator - def handler(self, router: Router | str, priority: int = 0): + def handler(self, router: Union[Router, str], priority: int = 0): def decorator(func): @wraps(func) def wrapper(input: Input) -> Output: @@ -47,9 +45,7 @@ class Register: self.handlers.append( { "priority": priority, - "router": Contains(router) - if isinstance(router, str) - else router, + "router": Contains(router) if isinstance(router, str) else router, "handler": wrapper, } ) @@ -63,7 +59,7 @@ class Register: def regist_variable(self, name: str, data: Any): self.global_variables[name] = data - def dynamic_variable(self, name: str | None = None): + def dynamic_variable(self, name: Optional[str] = None): def decorator(func): @wraps(func) def wrapper(*args, **kwargs) -> str: @@ -74,18 +70,16 @@ class Register: return decorator - def interceptor(self, router: Router | str, priority: int = 0): + def interceptor(self, router: Union[Router, str], priority: int = 0): def decorator(func): @wraps(func) - def wrapper(input: Input) -> Input | Output: + def wrapper(input: Input) -> Union[Input, Output]: return func(input) self.interceptors.append( { "priority": priority, - "router": Contains(router) - if isinstance(router, str) - else router, + "router": Contains(router) if isinstance(router, str) else router, "handler": wrapper, } ) diff --git a/src/infini/typing.py b/src/infini/typing.py index 05eea05e..6bac0099 100644 --- a/src/infini/typing.py +++ b/src/infini/typing.py @@ -2,6 +2,7 @@ from typing import ( Dict as Dict, List as List, Any as Any, + Optional as Optional, Generic as Generic, Callable as Callable, Literal as Literal, @@ -16,7 +17,7 @@ from types import ModuleType as ModuleType, GeneratorType as GeneratorType from . import router, input, output T = TypeVar("T") -Stream = Union["input.Input", "output.Output"] +Stream = Union["input.Input[Any]", "output.Output"] OutputGenerator = Generator["output.Output", Any, None] -- cgit v1.2.3-70-g09d2