diff --git a/bot.py b/bot.py index ecb7ab2..30f71ab 100644 --- a/bot.py +++ b/bot.py @@ -7,16 +7,11 @@ from datetime import datetime from time import sleep -import core.scripts.config_generate # noqa -from core.config import Config, CFGManager -from core.constants.default import base_superuser_default -from core.constants.path import cache_path -from core.database import BotDBUtil, session, DBVersion -from core.logger import Logger -from core.utils.info import Info +from loguru import logger as loggerFallback + ascii_art = r''' - ._. _ .____ ._. + _ _ ____ _ /\ | | (_) | _ \ | | / \ | | ____ _ _ __ _ | |_) | ___ | |_ / /\ \ | |/ / _` | '__| | | _ < / _ \| __| @@ -48,9 +43,29 @@ class RestartBot(Exception): failed_to_start_attempts = {} +disabled_bots = [] +processes = [] def init_bot(): + import core.scripts.config_generate # noqa + from core.config import Config, CFGManager # noqa + from core.constants.default import base_superuser_default # noqa + from core.database import BotDBUtil, session, DBVersion # noqa + from core.logger import Logger # noqa + + query_dbver = session.query(DBVersion).first() + if not query_dbver: + session.add_all([DBVersion(value=str(BotDBUtil.database_version))]) + session.commit() + query_dbver = session.query(DBVersion).first() + if (current_ver := int(query_dbver.value)) < (target_ver := BotDBUtil.database_version): + Logger.info(f'Updating database from {current_ver} to {target_ver}...') + from core.database.update import update_database + + update_database() + Logger.info('Database updated successfully!') + print(ascii_art) base_superuser = Config('base_superuser', base_superuser_default, cfg_type=(str, list)) if base_superuser: if isinstance(base_superuser, str): @@ -58,10 +73,35 @@ def init_bot(): for bu in base_superuser: BotDBUtil.SenderInfo(bu).init() BotDBUtil.SenderInfo(bu).edit('isSuperUser', True) - print(ascii_art) + else: + Logger.warning("The base superuser was not found, please setup it in the config file.") + + disabled_bots.clear() + for t in CFGManager.values: + if t.startswith('bot_') and not t.endswith('_secret'): + if 'enable' in CFGManager.values[t][t]: + if not CFGManager.values[t][t]['enable']: + disabled_bots.append(t[4:]) + + +def multiprocess_run_until_complete(func): + p = multiprocessing.Process( + target=func,) + p.start() + + while True: + if not p.is_alive(): + break + sleep(1) + p.terminate() + p.join() + p.close() def go(bot_name: str = None, subprocess: bool = False, binary_mode: bool = False): + from core.logger import Logger # noqa + from core.utils.info import Info # noqa + Logger.info(f"[{bot_name}] Here we go!") Info.subprocess = subprocess Info.binary_mode = binary_mode @@ -75,41 +115,34 @@ def go(bot_name: str = None, subprocess: bool = False, binary_mode: bool = False sys.exit(1) -disabled_bots = [] -processes = [] - -for t in CFGManager.values: - if t.startswith('bot_') and not t.endswith('_secret'): - if 'enable' in CFGManager.values[t][t]: - if not CFGManager.values[t][t]['enable']: - disabled_bots.append(t[4:]) - - -def restart_process(bot_name: str): - if bot_name not in failed_to_start_attempts or datetime.now( - ).timestamp() - failed_to_start_attempts[bot_name]['timestamp'] > 60: - failed_to_start_attempts[bot_name] = {} - failed_to_start_attempts[bot_name]['count'] = 0 +def run_bot(): + from core.constants.path import cache_path # noqa + from core.config import Config # noqa + from core.logger import Logger # noqa + + def restart_process(bot_name: str): + if bot_name not in failed_to_start_attempts or datetime.now( + ).timestamp() - failed_to_start_attempts[bot_name]['timestamp'] > 60: + failed_to_start_attempts[bot_name] = {} + failed_to_start_attempts[bot_name]['count'] = 0 + failed_to_start_attempts[bot_name]['timestamp'] = datetime.now().timestamp() + failed_to_start_attempts[bot_name]['count'] += 1 failed_to_start_attempts[bot_name]['timestamp'] = datetime.now().timestamp() - failed_to_start_attempts[bot_name]['count'] += 1 - failed_to_start_attempts[bot_name]['timestamp'] = datetime.now().timestamp() - if failed_to_start_attempts[bot_name]['count'] >= 3: - Logger.error(f'Bot {bot_name} failed to start 3 times, abort to restart, please check the log.') - return - - Logger.warning(f'Restarting bot {bot_name}...') - p = multiprocessing.Process( - target=go, - args=( - bot_name, - True, - bool(not sys.argv[0].endswith('.py'))), - name=bot_name) - p.start() - processes.append(p) + if failed_to_start_attempts[bot_name]['count'] >= 3: + Logger.error(f'Bot {bot_name} failed to start 3 times, abort to restart, please check the log.') + return + Logger.warning(f'Restarting bot {bot_name}...') + p = multiprocessing.Process( + target=go, + args=( + bot_name, + True, + bool(not sys.argv[0].endswith('.py'))), + name=bot_name) + p.start() + processes.append(p) -def run_bot(): if os.path.exists(cache_path): shutil.rmtree(cache_path) os.makedirs(cache_path, exist_ok=True) @@ -152,45 +185,37 @@ def run_bot(): processes.remove(p) p.terminate() p.join() + p.close() restart_process(p.name) break if not processes: break sleep(1) + Logger.critical('All bots exited unexpectedly, please check the output.') if __name__ == '__main__': - query_dbver = session.query(DBVersion).first() - if not query_dbver: - session.add_all([DBVersion(value=str(BotDBUtil.database_version))]) - session.commit() - query_dbver = session.query(DBVersion).first() - if (current_ver := int(query_dbver.value)) < (target_ver := BotDBUtil.database_version): - Logger.info(f'Updating database from {current_ver} to {target_ver}...') - from core.database.update import update_database - - update_database() - Logger.info('Database updated successfully!') - init_bot() try: while True: try: + multiprocess_run_until_complete(init_bot) run_bot() # Process will block here so - Logger.critical('All bots exited unexpectedly, please check the output.') break except RestartBot: for ps in processes: ps.terminate() ps.join() + ps.close() processes.clear() continue except Exception: - Logger.critical('An error occurred, please check the output.') + loggerFallback.critical('An error occurred, please check the output.') traceback.print_exc() break except (KeyboardInterrupt, SystemExit): for ps in processes: ps.terminate() ps.join() + ps.close() processes.clear() diff --git a/core/builtins/__init__.py b/core/builtins/__init__.py index 1391cac..f4f0f1d 100644 --- a/core/builtins/__init__.py +++ b/core/builtins/__init__.py @@ -23,6 +23,7 @@ class Bot: ModuleHookContext = ModuleHookContext ExecutionLockList = ExecutionLockList Info = Info + Temp = Temp @staticmethod async def send_message(target: Union[FetchedSession, MessageSession, str], @@ -37,7 +38,10 @@ async def send_message(target: Union[FetchedSession, MessageSession, str], if isinstance(msg, list): msg = MessageChain(msg) Logger.info(target.__dict__) - await target.send_direct_message(msg, disable_secret_check, enable_split_image) + await target.send_direct_message(message_chain=msg, + disable_secret_check=disable_secret_check, + enable_parse_message=enable_parse_message, + enable_split_image=enable_split_image) @staticmethod async def fetch_target(target: str): diff --git a/core/builtins/message/__init__.py b/core/builtins/message/__init__.py index 902ba60..2901288 100644 --- a/core/builtins/message/__init__.py +++ b/core/builtins/message/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import asyncio from datetime import datetime, UTC as datetimeUTC from typing import Any, Coroutine, Dict, List, Optional, Union @@ -16,21 +18,24 @@ class ExecutionLockList: + """ + 执行锁。 + """ _list = set() @staticmethod - def add(msg: 'MessageSession'): + def add(msg: MessageSession): target_id = msg.target.sender_id ExecutionLockList._list.add(target_id) @staticmethod - def remove(msg: 'MessageSession'): + def remove(msg: MessageSession): target_id = msg.target.sender_id if target_id in ExecutionLockList._list: ExecutionLockList._list.remove(target_id) @staticmethod - def check(msg: 'MessageSession'): + def check(msg: MessageSession): target_id = msg.target.sender_id return target_id in ExecutionLockList._list @@ -40,66 +45,75 @@ def get(): class MessageTaskManager: - _list = {} + """ + 消息计划管理器。 + """ + _task_list = {} _callback_list = {} @classmethod - def add_task(cls, session: 'MessageSession', flag, all_=False, reply=None, timeout=120): + def add_task( + cls, + session: MessageSession, + flag: asyncio.Event, + all_: bool = False, + reply: Optional[Union[List[int], List[str], int, str]] = None, + timeout: Optional[float] = 120): sender = session.target.sender_id task_type = 'reply' if reply else 'wait' if all_: sender = 'all' - if session.target.target_id not in cls._list: - cls._list[session.target.target_id] = {} - if sender not in cls._list[session.target.target_id]: - cls._list[session.target.target_id][sender] = {} - cls._list[session.target.target_id][sender][session] = { + if session.target.target_id not in cls._task_list: + cls._task_list[session.target.target_id] = {} + if sender not in cls._task_list[session.target.target_id]: + cls._task_list[session.target.target_id][sender] = {} + cls._task_list[session.target.target_id][sender][session] = { 'flag': flag, 'active': True, 'type': task_type, 'reply': reply, 'ts': datetime.now().timestamp(), 'timeout': timeout} - Logger.debug(cls._list) + Logger.debug(cls._task_list) @classmethod - def add_callback(cls, message_id, callback): + def add_callback(cls, message_id: Union[List[int], List[str], int, str], callback: Optional[Coroutine]): cls._callback_list[message_id] = {'callback': callback, 'ts': datetime.now().timestamp()} @classmethod - def get_result(cls, session: 'MessageSession'): - if 'result' in cls._list[session.target.target_id][session.target.sender_id][session]: - return cls._list[session.target.target_id][session.target.sender_id][session]['result'] + def get_result(cls, session: MessageSession): + if 'result' in cls._task_list[session.target.target_id][session.target.sender_id][session]: + return cls._task_list[session.target.target_id][session.target.sender_id][session]['result'] else: return None @classmethod def get(cls): - return cls._list + return cls._task_list @classmethod async def bg_check(cls): - for target in cls._list: - for sender in cls._list[target]: - for session in cls._list[target][sender]: - if cls._list[target][sender][session]['active']: - if (datetime.now().timestamp() - cls._list[target][sender][session]['ts'] > - cls._list[target][sender][session].get('timeout', 3600)): - cls._list[target][sender][session]['active'] = False - cls._list[target][sender][session]['flag'].set() # no result = cancel + for target in cls._task_list: + for sender in cls._task_list[target]: + for session in cls._task_list[target][sender]: + if cls._task_list[target][sender][session]['active']: + if (datetime.now().timestamp() - cls._task_list[target][sender][session]['ts'] > + cls._task_list[target][sender][session].get('timeout', 3600)): + cls._task_list[target][sender][session]['active'] = False + cls._task_list[target][sender][session]['flag'].set() # no result = cancel for message_id in cls._callback_list.copy(): if datetime.now().timestamp() - cls._callback_list[message_id]['ts'] > 3600: del cls._callback_list[message_id] @classmethod - async def check(cls, session: 'MessageSession'): - if session.target.target_id in cls._list: + async def check(cls, session: MessageSession): + if session.target.target_id in cls._task_list: senders = [] - if session.target.sender_id in cls._list[session.target.target_id]: + if session.target.sender_id in cls._task_list[session.target.target_id]: senders.append(session.target.sender_id) - if 'all' in cls._list[session.target.target_id]: + if 'all' in cls._task_list[session.target.target_id]: senders.append('all') if senders: for sender in senders: - for s in cls._list[session.target.target_id][sender]: - get_ = cls._list[session.target.target_id][sender][s] + for s in cls._task_list[session.target.target_id][sender]: + get_ = cls._task_list[session.target.target_id][sender][s] if get_['type'] == 'wait': get_['result'] = session get_['active'] = False @@ -122,6 +136,9 @@ async def check(cls, session: 'MessageSession'): class FinishedSession: + """ + 结束会话。 + """ def __init__(self, session, message_id: Union[List[int], List[str], int, str], result): self.session = session if isinstance(message_id, (int, str)): @@ -140,14 +157,18 @@ def __str__(self): class MessageSession: + """ + 消息会话。 + """ + def __init__(self, target: MsgInfo, session: Session): self.target = target self.session = session self.sent: List[MessageChain] = [] - self.parsed_msg: Optional[dict] = None self.trigger_msg: Optional[str] = None + self.parsed_msg: Optional[dict] = None self.prefixes: List[str] = [] self.data = exports.get("BotDBUtil").TargetInfo(self.target.target_id) self.info = exports.get("BotDBUtil").SenderInfo(self.target.sender_id) @@ -184,7 +205,7 @@ async def send_message(self, raise NotImplementedError async def finish(self, - message_chain: Union[MessageChain, str, list, MessageElement] = None, + message_chain: Optional[Union[MessageChain, str, list, MessageElement]] = None, quote: bool = True, disable_secret_check: bool = False, enable_parse_message: bool = True, @@ -193,7 +214,7 @@ async def finish(self, """ 用于向消息发送者返回消息并终结会话(模块后续代码不再执行)。 - :param message_chain: 消息链,若传入str则自动创建一条带有Plain元素的消息链。 + :param message_chain: 消息链,若传入str则自动创建一条带有Plain元素的消息链,可不填。 :param quote: 是否引用传入dict中的消息。(默认为True) :param disable_secret_check: 是否禁用消息检查。(默认为False) :param enable_parse_message: 是否允许解析消息。(此参数作接口兼容用,仅QQ平台使用,默认为True) @@ -259,6 +280,8 @@ async def check_native_permission(self) -> bool: async def fake_forward_msg(self, nodelist: List[Dict[str, Union[str, Any]]]): """ 用于发送假转发消息(QQ)。 + + :param nodelist: 消息段列表,即`type`键名为`node`的字典列表,详情参考OneBot文档。 """ raise NotImplementedError @@ -269,7 +292,7 @@ async def get_text_channel_list(self) -> List[str]: raise NotImplementedError class Typing: - def __init__(self, msg: 'MessageSession'): + def __init__(self, msg: MessageSession): """ :param msg: 本条消息,由于此class需要被一同传入下游方便调用,所以作为子class存在,将来可能会有其他的解决办法。 """ @@ -287,7 +310,7 @@ async def wait_confirm(self, message_chain: Optional[Union[MessageChain, str, list, MessageElement]] = None, quote: bool = True, delete: bool = True, - timeout: int = 120, + timeout: Optional[float] = 120, append_instruction: bool = True) -> bool: """ 一次性模板,用于等待触发对象确认。 @@ -330,8 +353,8 @@ async def wait_next_message(self, message_chain: Optional[Union[MessageChain, str, list, MessageElement]] = None, quote: bool = True, delete: bool = False, - timeout: int = 120, - append_instruction: bool = True) -> 'MessageSession': + timeout: Optional[float] = 120, + append_instruction: bool = True) -> MessageSession: """ 一次性模板,用于等待对象的下一条消息。 @@ -369,9 +392,9 @@ async def wait_reply(self, message_chain: Union[MessageChain, str, list, MessageElement], quote: bool = True, delete: bool = False, - timeout: int = 120, + timeout: Optional[float] = 120, all_: bool = False, - append_instruction: bool = True) -> 'MessageSession': + append_instruction: bool = True) -> MessageSession: """ 一次性模板,用于等待触发对象回复消息。 @@ -410,7 +433,7 @@ async def wait_anyone(self, message_chain: Optional[Union[MessageChain, str, list, MessageElement]] = None, quote: bool = False, delete: bool = False, - timeout: int = 120) -> 'MessageSession': + timeout: Optional[float] = 120) -> MessageSession: """ 一次性模板,用于等待触发对象所属对话内任意成员确认。 @@ -529,6 +552,10 @@ class Feature: class FetchedSession: + """ + 获取消息会话。 + """ + def __init__(self, target_from: str, target_id: Union[str, int], @@ -568,6 +595,9 @@ async def send_direct_message(self, class FetchTarget: + """ + 获取消息会话对象。 + """ name = '' @staticmethod diff --git a/core/builtins/message/chain.py b/core/builtins/message/chain.py index 5a1d00f..00be41f 100644 --- a/core/builtins/message/chain.py +++ b/core/builtins/message/chain.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import base64 import re from typing import List, Optional, Tuple, Union, Any @@ -32,7 +34,7 @@ def __init__( List[MessageElement], Tuple[MessageElement], MessageElement, - 'MessageChain' + MessageChain ]] = None, ): """ @@ -146,7 +148,7 @@ def unsafeprompt(name, secret, text): return False return True - def as_sendable(self, msg: 'MessageSession' = None, embed: bool = True) -> list: + def as_sendable(self, msg: MessageSession = None, embed: bool = True) -> list: """ 将消息链转换为可发送的格式。 """ diff --git a/core/builtins/message/elements.py b/core/builtins/message/elements.py index a2df406..56c70a5 100644 --- a/core/builtins/message/elements.py +++ b/core/builtins/message/elements.py @@ -1,9 +1,11 @@ +from __future__ import annotations + import base64 import os import random import re from datetime import datetime, timezone -from typing import Tuple, Optional, TYPE_CHECKING, Dict, Any, Union, List +from typing import Optional, TYPE_CHECKING, Dict, Any, Union, List from urllib import parse import aiohttp @@ -19,6 +21,8 @@ from core.utils.cache import random_cache_path from core.utils.i18n import Locale +from copy import deepcopy + if TYPE_CHECKING: from core.builtins import MessageSession @@ -41,20 +45,16 @@ class PlainElement(MessageElement): @classmethod def assign(cls, - *texts: Tuple[str], - disable_joke: bool = False, - comment: Optional[str] = None): + *texts: Any, + disable_joke: bool = False): """ :param texts: 文本内容。 :param disable_joke: 是否禁用玩笑功能。(默认为False) - :param comment: 注释文本,不受玩笑功能影响。 """ text = ''.join([str(x) for x in texts]) if not disable_joke: text = joke(text) - if comment: - text += '\n' + comment - return cls(text=text) + return deepcopy(cls(text=text)) @define @@ -80,7 +80,7 @@ def assign(cls, url: str, use_mm: bool = False): "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM") url = mm_url % parse.quote(parse.unquote(url).translate(rot13)) - return cls(url=url) + return deepcopy(cls(url=url)) def __str__(self): if self.md_format: @@ -102,7 +102,7 @@ class FormattedTimeElement(MessageElement): seconds: bool = True timezone: bool = True - def to_str(self, msg: Optional['MessageSession'] = None): + def to_str(self, msg: Optional[MessageSession] = None): ftime_template = [] if msg: if self.date: @@ -149,7 +149,7 @@ def assign(cls, timestamp: float, :param seconds: 是否显示秒。(默认为True) :param timezone: 是否显示时区。(默认为True) """ - return cls(timestamp=timestamp, date=date, iso=iso, time=time, seconds=seconds, timezone=timezone) + return deepcopy(cls(timestamp=timestamp, date=date, iso=iso, time=time, seconds=seconds, timezone=timezone)) @define @@ -168,7 +168,7 @@ def assign(cls, :param key: 多语言的键名。 :param kwargs: 多语言中的变量。 """ - return cls(key=key, kwargs=kwargs) + return deepcopy(cls(key=key, kwargs=kwargs)) @define @@ -207,7 +207,7 @@ def assign(cls, error_message += '\n' + \ locale.t('error.prompt.address', url=str(report_url)) - return cls(error_message) + return deepcopy(cls(error_message)) def __str__(self): return self.error_message @@ -238,7 +238,7 @@ def assign(cls, path: Union[str, PILImage.Image], path = save elif re.match('^https?://.*', path): need_get = True - return cls(path, need_get, headers) + return deepcopy(cls(path, need_get, headers)) async def get(self): """ @@ -298,7 +298,7 @@ def assign(cls, path: str): """ :param path: 语音路径。 """ - return cls(path) + return deepcopy(cls(path)) @define @@ -321,7 +321,7 @@ def assign(cls, name: str, value: str, inline: bool = False): :param value: 字段值。 :param inline: 是否内联。(默认为False) """ - return cls(name=name, value=value, inline=inline) + return deepcopy(cls(name=name, value=value, inline=inline)) @define @@ -359,7 +359,7 @@ def assign(cls, title: Optional[str] = None, author: Optional[str] = None, footer: Optional[str] = None, fields: Optional[List[EmbedFieldElement]] = None): - return cls( + return deepcopy(cls( title=title, description=description, url=url, @@ -369,9 +369,9 @@ def assign(cls, title: Optional[str] = None, thumbnail=thumbnail, author=author, footer=footer, - fields=fields) + fields=fields)) - def to_message_chain(self, msg: Optional['MessageSession'] = None): + def to_message_chain(self, msg: Optional[MessageSession] = None): """ 将Embed转换为消息链。 """ diff --git a/core/component.py b/core/component.py index 9419474..8e4315c 100644 --- a/core/component.py +++ b/core/component.py @@ -184,22 +184,22 @@ def module( :param exclude_from: 此命令排除的平台列表。 :param support_languages: 此命令支持的语言列表。 """ - module = Module(alias=alias, - bind_prefix=bind_prefix, - desc=desc, - recommend_modules=recommend_modules, - developers=developers, - base=base, - doc=doc, - hidden=hidden, - load=load, - rss=rss, - required_admin=required_admin, - required_superuser=required_superuser, - required_base_superuser=required_base_superuser, - available_for=available_for, - exclude_from=exclude_from, - support_languages=support_languages) + module = Module.assign(alias=alias, + bind_prefix=bind_prefix, + desc=desc, + recommend_modules=recommend_modules, + developers=developers, + base=base, + doc=doc, + hidden=hidden, + load=load, + rss=rss, + required_admin=required_admin, + required_superuser=required_superuser, + required_base_superuser=required_base_superuser, + available_for=available_for, + exclude_from=exclude_from, + support_languages=support_languages) frame = inspect.currentframe() ModulesManager.add_module(module, frame.f_back.f_globals["__name__"]) return Bind.Module(bind_prefix) diff --git a/core/config/__init__.py b/core/config/__init__.py index b1d15a5..4da9637 100644 --- a/core/config/__init__.py +++ b/core/config/__init__.py @@ -9,6 +9,7 @@ from tomlkit.exceptions import KeyAlreadyPresent from tomlkit.items import Table +from . import update # noqa from core.constants.default import default_locale from core.constants.exceptions import ConfigValueError, ConfigOperationError from core.constants.path import config_path @@ -110,11 +111,9 @@ def get(cls, :param cfg_type: 配置项类型。 :param secret: 是否为密钥配置项。(默认为False) :param table_name: 配置项表名。 - :param _global: 是否搜索所有表的配置项,仅内部使用。(默认为False) - :param _generate: 是否标记为生成配置文件,仅内部使用。(默认为False) :return: 配置文件中对应配置项的值。 - ''' + ''' cls.watch() q = q.lower() value = None @@ -218,7 +217,6 @@ def write(cls, q: str, value: Union[Any, None], cfg_type: Union[type, tuple, Non :param cfg_type: 配置项类型。 :param secret: 是否为密钥配置项。(默认为False) :param table_name: 配置项表名。 - :param _generate: 是否标记为生成配置文件,仅内部使用。(默认为False) ''' cls.watch() q = q.lower() @@ -351,7 +349,7 @@ def delete(cls, q: str, table_name: Optional[str] = None) -> bool: :param q: 配置项键名。 :param table_name: 配置项表名。 - ''' + ''' cls.watch() q = q.lower() found = False @@ -406,8 +404,6 @@ def Config(q: str, :param secret: 是否为密钥配置项。(默认为False) :param table_name: 配置项表名。 :param get_url: 是否为URL配置项。(默认为False) - :param _global: 是否搜索所有表的配置项,仅内部使用。(默认为False) - :param _generate: 是否标记为生成配置文件,仅内部使用。(默认为False) :return: 配置文件中对应配置项的值。 ''' diff --git a/core/constants/info.py b/core/constants/info.py index 183b8aa..0cdff65 100644 --- a/core/constants/info.py +++ b/core/constants/info.py @@ -9,6 +9,20 @@ def add(cls, secret): class Info: + ''' + 机器人信息。 + + :param version: 机器人版本。 + :param subprocess: 是否为子进程。 + :param binary_mode: 是否为二进制模式。 + :param command_parsed: 已处理命令数量。 + :param client_name: 客户端名称。 + :param dirty_word_check: 是否启用文本过滤。 + :param web_render_status: WebRender 状态。 + :param web_render_local_status: 本地 WebRender 状态。 + :param use_url_manager: 是否启用 URLManager。 + :param use_url_md_format: 是否启用 URL MarkDown 格式。 + ''' version = None subprocess = False binary_mode = False diff --git a/core/joke.py b/core/joke.py index 9acea3d..9e91f5b 100644 --- a/core/joke.py +++ b/core/joke.py @@ -5,13 +5,19 @@ from core.utils.http import url_pattern -def joke(text: str) -> str: +def check_apr_fools() -> bool: current_date = datetime.now().date() enable_joke = Config('enable_joke', True, cfg_type=bool) - if enable_joke and (current_date.month == 4 and current_date.day == 1): + return (enable_joke and (current_date.month == 4 and current_date.day == 1)) + + +def joke(text: str) -> str: + if check_apr_fools(): + # 这里可能会增加使用不同玩笑方法的区分,但现在不太想做XD return shuffle_joke(text) - return text + else: + return text def shuffle_joke(text: str) -> str: @@ -37,6 +43,3 @@ def shuffle_joke(text: str) -> str: text_list[j], text_list[j + 1] = text_list[j + 1], text_list[j] parts[i] = ''.join(text_list) return ''.join(parts) - - -__all__ = ['joke', 'shuffle_joke'] diff --git a/core/parser/message.py b/core/parser/message.py index 66fc287..c4b99dd 100644 --- a/core/parser/message.py +++ b/core/parser/message.py @@ -489,10 +489,10 @@ async def execute_submodule(msg: Bot.MessageSession, command_first_word, command if Config('bug_report_url', bug_report_url_default, cfg_type=str): errmsg += '\n' + msg.locale.t('error.prompt.address', - url=str(Url(Config('bug_report_url', - bug_report_url_default, - cfg_type=str), - use_mm=False))) + url=Url(Config('bug_report_url', + bug_report_url_default, + cfg_type=str), + use_mm=False)) await msg.send_message(errmsg) if not timeout and report_targets: diff --git a/core/types/message/__init__.py b/core/types/message/__init__.py index 23ee5a2..6725272 100644 --- a/core/types/message/__init__.py +++ b/core/types/message/__init__.py @@ -7,8 +7,8 @@ @define class MsgInfo: - target_id: Union[int, str] - sender_id: Union[int, str] + target_id: str + sender_id: str sender_prefix: str target_from: str sender_from: str diff --git a/core/types/module/__init__.py b/core/types/module/__init__.py index cadf4ce..efa916d 100644 --- a/core/types/module/__init__.py +++ b/core/types/module/__init__.py @@ -7,57 +7,47 @@ from .component_matches import * +from .utils import convert2lst -def convert2lst(elements: Union[str, list, tuple]) -> list: - if isinstance(elements, str): - return [elements] - elif isinstance(elements, tuple): - return list(elements) - return elements +from attrs import define, field, Converter +from copy import deepcopy + +def alias_converter(value, _self) -> dict: + if isinstance(value, str): + return {value: _self.bind_prefix} + elif isinstance(value, (tuple, list)): + return {x: _self.bind_prefix for x in value} + return value + + +@define class Module: - def __init__(self, - bind_prefix: str, - alias: Union[str, list, tuple, dict, None] = None, - desc: str = None, - recommend_modules: Union[str, list, tuple, None] = None, - developers: Union[str, list, tuple, None] = None, - required_admin: bool = False, - base: bool = False, - doc: bool = False, - hidden: bool = False, - load: bool = True, - rss: bool = False, - required_superuser: bool = False, - required_base_superuser: bool = False, - available_for: Union[str, list, tuple, None] = '*', - exclude_from: Union[str, list, tuple, None] = '', - support_languages: Union[str, list, tuple, None] = None): - self.bind_prefix: str = bind_prefix - if isinstance(alias, str): - alias = {alias: bind_prefix} - elif isinstance(alias, (tuple, list)): - alias = {x: bind_prefix for x in alias} - self.alias: Dict[str, str] = alias - self.desc: str = desc - self.recommend_modules: List[str] = convert2lst(recommend_modules) - self.developers: List[str] = convert2lst(developers) - self.required_admin: bool = required_admin - self.base: bool = base - self.doc: bool = doc - self.hidden: bool = hidden - self.load: bool = load - self.rss: bool = rss - self.required_superuser: bool = required_superuser - self.required_base_superuser: bool = required_base_superuser - self.available_for: List[str] = convert2lst(available_for) - self.exclude_from: List[str] = convert2lst(exclude_from) - self.support_languages: List[str] = convert2lst(support_languages) - self.command_list = CommandMatches() - self.regex_list = RegexMatches() - self.schedule_list = ScheduleMatches() - self.hooks_list = HookMatches() + bind_prefix: str + alias: dict = field(converter=Converter(alias_converter, takes_self=True)) + recommend_modules: list = field(converter=convert2lst) + developers: list = field(converter=convert2lst) + available_for: list = field(default=['*'], converter=convert2lst) + exclude_from: list = field(default=[], converter=convert2lst) + support_languages: list = field(default=None, converter=convert2lst) + desc: Union[str] = '' + required_admin: bool = False + base: bool = False + doc: bool = False + hidden: bool = False + load: bool = True + rss: bool = False + required_superuser: bool = False + required_base_superuser: bool = False + command_list: CommandMatches = CommandMatches.init() + regex_list: RegexMatches = RegexMatches.init() + schedule_list: ScheduleMatches = ScheduleMatches.init() + hooks_list: HookMatches = HookMatches.init() + + @classmethod + def assign(cls, **kwargs): + return deepcopy(cls(**kwargs)) __all__ = ["Module", "AndTrigger", "OrTrigger", "DateTrigger", diff --git a/core/types/module/component_matches.py b/core/types/module/component_matches.py index d272904..11c1bfc 100644 --- a/core/types/module/component_matches.py +++ b/core/types/module/component_matches.py @@ -2,15 +2,27 @@ from .component_meta import * +from attrs import define, field +from copy import deepcopy -class CommandMatches: - def __init__(self): - self.set: List[CommandMeta] = [] + +@define +class BaseMatches: + set: List[ModuleMeta] = [] def add(self, meta): self.set.append(meta) return self.set + @classmethod + def init(cls): + return deepcopy(cls()) + + +@define +class CommandMatches(BaseMatches): + set: List[CommandMeta] = [] + def get(self, target_from: str, show_required_superuser: bool = False, show_required_base_superuser: bool = False) -> List[CommandMeta]: metas = [] @@ -28,13 +40,9 @@ def get(self, target_from: str, show_required_superuser: bool = False, return metas -class RegexMatches: - def __init__(self): - self.set: List[RegexMeta] = [] - - def add(self, meta): - self.set.append(meta) - return self.set +@define +class RegexMatches(BaseMatches): + set: List[RegexMeta] = [] def get(self, target_from: str, show_required_superuser: bool = False, show_required_base_superuser: bool = False) -> List[RegexMeta]: @@ -53,22 +61,14 @@ def get(self, target_from: str, show_required_superuser: bool = False, return metas -class ScheduleMatches: - def __init__(self): - self.set: List[ScheduleMeta] = [] - - def add(self, meta): - self.set.append(meta) - return self.set +@define +class ScheduleMatches(BaseMatches): + set: List[ScheduleMeta] = [] -class HookMatches: - def __init__(self): - self.set: List[HookMeta] = [] - - def add(self, meta): - self.set.append(meta) - return self.set +@define +class HookMatches(BaseMatches): + set: List[HookMeta] = [] __all__ = ["CommandMatches", "RegexMatches", "ScheduleMatches", "HookMatches"] diff --git a/core/types/module/component_meta.py b/core/types/module/component_meta.py index a35d8cc..36f5678 100644 --- a/core/types/module/component_meta.py +++ b/core/types/module/component_meta.py @@ -8,100 +8,55 @@ from core.parser.args import Template - -class Meta: - def __init__(self, **kwargs): - raise NotImplementedError - - -class CommandMeta: - def __init__(self, - function: Callable = None, - help_doc: List[Template] = None, - options_desc: dict = None, - required_admin: bool = False, - required_superuser: bool = False, - required_base_superuser: bool = False, - available_for: Union[str, list, tuple] = '*', - exclude_from: Union[str, list, tuple] = '', - load: bool = True, - priority: int = 1 - ): - self.function = function - if isinstance(help_doc, str): - help_doc = [help_doc] - elif isinstance(help_doc, tuple): - help_doc = list(help_doc) - self.help_doc: List[Template] = help_doc - self.options_desc = options_desc - self.required_admin = required_admin - self.required_superuser = required_superuser - self.required_base_superuser = required_base_superuser - if isinstance(available_for, str): - available_for = [available_for] - elif isinstance(available_for, tuple): - available_for = list(available_for) - if isinstance(exclude_from, str): - exclude_from = [exclude_from] - elif isinstance(exclude_from, tuple): - exclude_from = list(exclude_from) - self.available_for = available_for - self.exclude_from = exclude_from - self.load = load - self.priority = priority - - -class RegexMeta: - def __init__(self, - function: Callable = None, - pattern: Union[str, re.Pattern] = None, - mode: str = None, - desc: str = None, - required_admin: bool = False, - required_superuser: bool = False, - required_base_superuser: bool = False, - available_for: Union[str, list, tuple] = '*', - exclude_from: Union[str, list, tuple] = '', - flags: re.RegexFlag = 0, - load: bool = True, - show_typing: bool = True, - logging: bool = True - ): - self.function = function - self.pattern = pattern - self.mode = mode - self.flags = flags - self.desc = desc - self.required_admin = required_admin - self.required_superuser = required_superuser - self.required_base_superuser = required_base_superuser - if isinstance(available_for, str): - available_for = [available_for] - elif isinstance(available_for, tuple): - available_for = list(available_for) - if isinstance(exclude_from, str): - exclude_from = [exclude_from] - elif isinstance(exclude_from, tuple): - exclude_from = list(exclude_from) - self.available_for = available_for - self.exclude_from = exclude_from - self.load = load - self.show_typing = show_typing - self.logging = logging - - -class ScheduleMeta: - def __init__(self, trigger: Union[AndTrigger, OrTrigger, DateTrigger, CronTrigger, IntervalTrigger], - function: Callable = None - ): - self.trigger = trigger - self.function = function - - -class HookMeta: - def __init__(self, function: Callable, name: str = None): - self.function = function - self.name = name - - -__all__ = ["Meta", "CommandMeta", "RegexMeta", "ScheduleMeta", "HookMeta"] +from attrs import define, field +from .utils import convert2lst + + +class ModuleMeta: + pass + + +@define +class CommandMeta(ModuleMeta): + function: Callable = None + help_doc: List[Template] = field(default=[], converter=convert2lst) + options_desc: dict = None + required_admin: bool = False + required_superuser: bool = False + required_base_superuser: bool = False + available_for: list = field(default=['*'], converter=convert2lst) + exclude_from: list = field(default=[], converter=convert2lst) + load: bool = True + priority: int = 1 + + +@define +class RegexMeta(ModuleMeta): + function: Callable = None + pattern: Union[str, re.Pattern] = None + mode: str = None + desc: str = None + required_admin: bool = False + required_superuser: bool = False + required_base_superuser: bool = False + available_for: list = field(default=['*'], converter=convert2lst) + exclude_from: list = field(default=[], converter=convert2lst) + flags: re.RegexFlag = 0 + load: bool = True + show_typing: bool = True + logging: bool = True + + +@define +class ScheduleMeta(ModuleMeta): + trigger: Union[AndTrigger, OrTrigger, DateTrigger, CronTrigger, IntervalTrigger] + function: Callable = None + + +@define +class HookMeta(ModuleMeta): + function: Callable = None + name: str = None + + +__all__ = ["ModuleMeta", "CommandMeta", "RegexMeta", "ScheduleMeta", "HookMeta"] diff --git a/core/types/module/utils.py b/core/types/module/utils.py new file mode 100644 index 0000000..e369649 --- /dev/null +++ b/core/types/module/utils.py @@ -0,0 +1,9 @@ +from typing import Union + + +def convert2lst(elements: Union[str, list, tuple]) -> list: + if isinstance(elements, str): + return [elements] + elif isinstance(elements, tuple): + return list(elements) + return elements diff --git a/core/utils/cooldown.py b/core/utils/cooldown.py index 3a2bc6f..0c74b2d 100644 --- a/core/utils/cooldown.py +++ b/core/utils/cooldown.py @@ -1,50 +1,65 @@ -import datetime -from typing import Dict +from collections import defaultdict +from datetime import datetime from core.builtins import MessageSession -_cd_lst: Dict[str, Dict[MessageSession, float]] = {} +_cd_lst = defaultdict(lambda: defaultdict(dict)) class CoolDown: + ''' + 冷却事件构造器。 + + :param key: 冷却事件名称。 + :param msg: 消息会话。 + :param all: 是否应用至全对话。(默认为False) + ''' def __init__(self, key: str, msg: MessageSession, all: bool = False): self.key = key self.msg = msg - self.sender_id = self.msg - if isinstance(self.sender_id, MessageSession): - if all: - self.sender_id = self.msg.target.target_id - else: - self.sender_id = self.sender_id.target.sender_id + self.all = all + self.target_id = self.msg.target.target_id + self.sender_id = self.msg.target.sender_id + + def _get_cd_dict(self): + target_dict = _cd_lst[self.target_id] + if self.all: + return target_dict.setdefault(self.key, {'_timestamp': 0.0}) + else: + sender_dict = target_dict.setdefault(self.sender_id, {}) + return sender_dict.setdefault(self.key, {'_timestamp': 0.0}) def add(self): ''' 添加冷却事件。 ''' - if self.key not in _cd_lst: - _cd_lst[self.key] = {} - _cd_lst[self.key][self.sender_id] = datetime.datetime.now().timestamp() + cooldown_dict = self._get_cd_dict() + cooldown_dict['_timestamp'] = datetime.now().timestamp() - def check(self, delay: int) -> float: + def check(self, delay: float) -> float: ''' 检查冷却事件剩余冷却时间。 + + :param delay: 设定的冷却时间。 + :return: 剩余的冷却时间。 ''' if self.key not in _cd_lst: return 0 - if self.sender_id in _cd_lst[self.key]: - if (d := (datetime.datetime.now().timestamp() - _cd_lst[self.key][self.sender_id])) > delay: - return 0 - else: - return d + target_dict = _cd_lst[self.target_id] + if self.all: + ts = target_dict.get(self.key, {}).get('_timestamp', 0.0) else: + sender_dict = target_dict.get(self.sender_id, {}) + ts = sender_dict.get(self.key, {}).get('_timestamp', 0.0) + + if (d := (datetime.now().timestamp() - ts)) > delay: return 0 + else: + return d def reset(self): ''' 重置冷却事件。 ''' - if self.key in _cd_lst: - if self.sender_id in _cd_lst[self.key]: - _cd_lst[self.key].pop(self.sender_id) self.add() diff --git a/core/utils/game.py b/core/utils/game.py index 68af573..d5eef76 100644 --- a/core/utils/game.py +++ b/core/utils/game.py @@ -1,15 +1,23 @@ from collections import defaultdict from datetime import datetime -from typing import Any, Optional +from typing import Any, Dict, Optional from core.builtins import MessageSession from core.logger import Logger -playstate_lst = defaultdict(lambda: defaultdict(dict)) +_ps_lst = defaultdict(lambda: defaultdict(dict)) GAME_EXPIRED = 3600 class PlayState: + ''' + 游戏事件构造器。 + + :param game: 游戏事件名称。 + :param msg: 消息会话。 + :param all: 是否应用至全对话。(默认为False) + ''' + def __init__(self, game: str, msg: MessageSession, all: bool = False): self.game = game self.msg = msg @@ -17,8 +25,8 @@ def __init__(self, game: str, msg: MessageSession, all: bool = False): self.target_id = self.msg.target.target_id self.sender_id = self.msg.target.sender_id - def _get_game_dict(self): - target_dict = playstate_lst[self.target_id] + def _get_ps_dict(self): + target_dict = _ps_lst[self.target_id] if self.all: return target_dict.setdefault(self.game, {'_status': False, '_timestamp': 0.0}) else: @@ -29,21 +37,21 @@ def enable(self) -> None: ''' 开启游戏事件。 ''' - game_dict = self._get_game_dict() - game_dict['_status'] = True - game_dict['_timestamp'] = datetime.now().timestamp() + playstate_dict = self._get_ps_dict() + playstate_dict['_status'] = True + playstate_dict['_timestamp'] = datetime.now().timestamp() if self.all: Logger.info(f'[{self.target_id}]: Enabled {self.game} by {self.sender_id}.') else: Logger.info(f'[{self.sender_id}]: Enabled {self.game} at {self.target_id}.') - def disable(self, auto=False) -> None: + def disable(self, _auto=False) -> None: ''' 关闭游戏事件。 ''' - if self.target_id not in playstate_lst: + if self.target_id not in _ps_lst: return - target_dict = playstate_lst[self.target_id] + target_dict = _ps_lst[self.target_id] if self.all: game_dict = target_dict.get(self.game) if game_dict: @@ -54,7 +62,7 @@ def disable(self, auto=False) -> None: game_dict = sender_dict.get(self.game) if game_dict: game_dict['_status'] = False - if auto: + if _auto: if self.all: Logger.info(f'[{self.target_id}]: Disabled {self.game} automatically.') else: @@ -65,12 +73,14 @@ def disable(self, auto=False) -> None: else: Logger.info(f'[{self.sender_id}]: Disabled {self.game} at {self.target_id}.') - def update(self, **kwargs) -> None: + def update(self, **kwargs: Dict[str, Any]) -> None: ''' 更新游戏事件中需要的值。 + + :param kwargs: 键值对。 ''' - game_dict = self._get_game_dict() - game_dict.update(kwargs) + playstate_dict = self._get_ps_dict() + playstate_dict.update(kwargs) if self.all: Logger.debug(f'[{self.game}]: Updated {str(kwargs)} at {self.target_id}.') else: @@ -80,9 +90,9 @@ def check(self) -> bool: ''' 检查游戏事件状态,若超过时间则自动关闭。 ''' - if self.target_id not in playstate_lst: + if self.target_id not in _ps_lst: return False - target_dict = playstate_lst[self.target_id] + target_dict = _ps_lst[self.target_id] if self.all: status = target_dict.get(self.game, {}).get('_status', False) ts = target_dict.get(self.game, {}).get('_timestamp', 0.0) @@ -91,16 +101,19 @@ def check(self) -> bool: status = sender_dict.get(self.game, {}).get('_status', False) ts = sender_dict.get(self.game, {}).get('_timestamp', 0.0) if datetime.now().timestamp() - ts >= GAME_EXPIRED: - self.disable(auto=True) + self.disable(_auto=True) return status def get(self, key: str) -> Optional[Any]: ''' 获取游戏事件中需要的值。 + + :param key: 键名。 + :return: 值。 ''' - if self.target_id not in playstate_lst: + if self.target_id not in _ps_lst: return None - target_dict = playstate_lst[self.target_id] + target_dict = _ps_lst[self.target_id] if self.all: return target_dict.get(self.game, {}).get(key, None) else: diff --git a/core/utils/http.py b/core/utils/http.py index f8bf345..63584d2 100644 --- a/core/utils/http.py +++ b/core/utils/http.py @@ -44,11 +44,11 @@ def private_ip_check(url: str): async def get_url(url: str, - status_code: int = False, + status_code: int = 200, headers: Optional[Dict[str, Any]] = None, params: Optional[Dict[str, Any]] = None, fmt: Optional[str] = None, - timeout: int = 20, + timeout: Optional[float] = 20, attempt: int = 3, request_private_ip: bool = False, logging_err_resp: bool = True, @@ -113,10 +113,10 @@ async def get_(): async def post_url(url: str, data: Any = None, - status_code: int = False, + status_code: int = 200, headers: Optional[Dict[str, Any]] = None, fmt: Optional[str] = None, - timeout: int = 20, + timeout: Optional[float] = 20, attempt: int = 3, request_private_ip: bool = False, logging_err_resp: bool = True, @@ -182,11 +182,11 @@ async def _post(): async def download(url: str, filename: Optional[str] = None, path: Optional[str] = None, - status_code: int = False, + status_code: int = 200, method: str = "GET", post_data: Any = None, headers: Optional[Dict[str, Any]] = None, - timeout: int = 20, + timeout: Optional[float] = 20, attempt: int = 3, request_private_ip: bool = False, logging_err_resp: bool = True) -> Union[str, bool]: diff --git a/core/utils/i18n.py b/core/utils/i18n.py index f4a1cfd..5d11718 100644 --- a/core/utils/i18n.py +++ b/core/utils/i18n.py @@ -115,8 +115,11 @@ def get_available_locales() -> List[str]: class Locale: + """ + 创建一个本地化对象。 + """ + def __init__(self, locale: str, fallback_lng: Optional[List[str]] = None): - """创建一个本地化对象。""" if not fallback_lng: fallback_lng = supported_locales.copy() fallback_lng.remove(locale) diff --git a/core/utils/image_table.py b/core/utils/image_table.py index 34e86b8..32ed3e9 100644 --- a/core/utils/image_table.py +++ b/core/utils/image_table.py @@ -2,7 +2,7 @@ import re from html import escape from io import BytesIO -from typing import List, Union +from typing import Any, List, Union import aiohttp import orjson as json @@ -18,12 +18,28 @@ class ImageTable: - def __init__(self, data, headers): + ''' + 图片表格。 + :param data: 表格内容,表格行数需与表格标头的数量相符。 + :param headers: 表格表头。 + ''' + + def __init__(self, data: List[List[Any]], headers: List[str]): self.data = data self.headers = headers -async def image_table_render(table: Union[ImageTable, List[ImageTable]], save_source=True, use_local=True) -> Union[List[PILImage], bool]: +async def image_table_render(table: Union[ImageTable, List[ImageTable]], + save_source: bool = True, + use_local: bool = True) -> Union[List[PILImage.Image], bool]: + ''' + 使用WebRender渲染图片表格。 + + :param table: 要渲染的表格。 + :param save_source: 是否保存源文件。 + :param use_local: 是否使用本地WebRender渲染。 + :return: 图片的PIL对象。 + ''' if not Info.web_render_status: return False elif not Info.web_render_local_status: diff --git a/core/utils/random.py b/core/utils/random.py index 2d8797a..8440d66 100644 --- a/core/utils/random.py +++ b/core/utils/random.py @@ -9,11 +9,18 @@ class Random: + """ + 机器人内置的随机数生成器。在配置文件中将`use_secrets_random`设为`true`时使用`secret`库,否则默认使用`random`库。 + """ use_secrets = Config('use_secrets_random', False) @classmethod def random(cls) -> float: - """返回0到1之间的随机浮点数""" + """ + 返回0到1之间的随机浮点数。 + + :return: 随机浮点数。 + """ if cls.use_secrets: return secrets.randbelow(INF) / INF else: @@ -21,7 +28,13 @@ def random(cls) -> float: @classmethod def randint(cls, a: int, b: int) -> int: - """返回[a, b]范围内的随机整数""" + """ + 返回[a, b]范围内的随机整数。 + + :param a: 下界。 + :param b: 上界。 + :return: 符合条件的随机整数。 + """ if cls.use_secrets: return secrets.randbelow(b - a + 1) + a else: @@ -29,7 +42,13 @@ def randint(cls, a: int, b: int) -> int: @classmethod def uniform(cls, a: float, b: float) -> float: - """返回[a, b]范围内的随机浮点数""" + """ + 返回[a, b]范围内的随机浮点数。 + + :param a: 下界。 + :param b: 上界。 + :return: 符合条件的随机浮点数。 + """ if cls.use_secrets: return a + (b - a) * secrets.randbelow(INF) / INF else: @@ -37,7 +56,14 @@ def uniform(cls, a: float, b: float) -> float: @classmethod def randrange(cls, start: int, stop: Optional[int] = None, step: int = 1) -> int: - """返回范围内的随机整数,类似于range""" + """ + 返回范围内的随机整数,类似于`range`。 + + :param start: 开始值。 + :param stop: 结束值,不包含在范围内。 + :param step: 递增次数。 + :return: 符合条件的随机整数。 + """ if cls.use_secrets: if not stop: stop = start @@ -52,7 +78,12 @@ def randrange(cls, start: int, stop: Optional[int] = None, step: int = 1) -> int @classmethod def randbits(cls, k: int) -> int: - """返回k比特长度的随机整数""" + """ + 返回k字节长度的随机整数。 + + :param k: 字节长度。 + :return: 符合条件的随机整数。 + """ if cls.use_secrets: return secrets.randbits(k) else: @@ -60,7 +91,12 @@ def randbits(cls, k: int) -> int: @classmethod def randbytes(cls, n: int) -> bytes: - """生成n个随机字节""" + """ + 生成n个随机字节。 + + :param n: 字节数量。 + :return: 符合条件的随机字节。 + """ if cls.use_secrets: return secrets.token_bytes(n) else: @@ -68,23 +104,40 @@ def randbytes(cls, n: int) -> bytes: @classmethod def choice(cls, seq: Sequence[T]) -> T: - """从序列中随机选择一个元素""" + """ + 从序列中随机选择一个元素。 + + :param seq: 给定序列。 + :return: 序列内的随机元素。 + """ if cls.use_secrets: return secrets.choice(seq) else: return random.choice(seq) @classmethod - def choices(cls, population: Sequence[T], weights: Optional[Sequence[float]] = None, k: int = 1) -> List[T]: - """从总体中选择k个元素,允许重复""" + def choices(cls, population: Sequence[T], k: int = 1) -> List[T]: + """ + 从总体中选择k个元素,允许重复。 + + :param population: 给定序列。 + :param k: 选择的元素个数。 + :return: 序列内符合条件的随机元素列表。 + """ if cls.use_secrets: return [secrets.choice(population) for _ in range(k)] else: - return random.choices(population, weights=weights, k=k) + return random.choices(population, k=k) @classmethod def sample(cls, population: Sequence[T], k: int) -> List[T]: - """从总体中选择k个不重复元素""" + """ + 从总体中选择k个不重复元素。 + + :param population: 给定序列。 + :param k: 选择的元素个数。 + :return: 序列内符合条件的随机元素列表。 + """ if cls.use_secrets: if k > len(population): raise ValueError("Sample larger than population or is negative") @@ -99,7 +152,12 @@ def sample(cls, population: Sequence[T], k: int) -> List[T]: @classmethod def shuffle(cls, seq: MutableSequence[T]) -> MutableSequence[T]: - """随机打乱序列""" + """ + 随机打乱序列。 + + :param seq: 给定序列。 + :return: 重新打乱后的序列。 + """ if cls.use_secrets: for i in reversed(range(1, len(seq))): j = secrets.randbelow(i + 1) diff --git a/core/utils/text.py b/core/utils/text.py index c3ab0f9..13615a8 100644 --- a/core/utils/text.py +++ b/core/utils/text.py @@ -4,6 +4,9 @@ def isfloat(num_str: Any) -> bool: + ''' + 检查字符串是否符合float。 + ''' try: float(num_str) return True @@ -12,6 +15,9 @@ def isfloat(num_str: Any) -> bool: def isint(num_str: Any) -> bool: + ''' + 检查字符串是否符合int。 + ''' try: int(num_str) return True @@ -40,8 +46,4 @@ def parse_time_string(time_str: str) -> timedelta: return timedelta() -def random_string(length: int) -> str: - return ''.join(random.choices("0123456789ABCDEF", k=length)) - - -__all__ = ["parse_time_string", "random_string", "isint", "isfloat"] +__all__ = ["isint", "isfloat"] diff --git a/core/utils/web_render.py b/core/utils/web_render.py index bd1708a..866f20f 100644 --- a/core/utils/web_render.py +++ b/core/utils/web_render.py @@ -1,5 +1,5 @@ import traceback -from typing import Tuple, Union +from typing import Tuple, Optional, Union from core.config import Config from core.constants.info import Info @@ -10,7 +10,7 @@ web_render_local = Config('web_render_local', get_url=True) -def webrender(method: str = '', url: str = '', use_local: bool = True) -> Union[str, None]: +def webrender(method: str = '', url: Optional[str] = None, use_local: bool = True, _ignore_status=False) -> str: '''根据请求方法生成 WebRender URL。 :param method: API 方法。 @@ -18,18 +18,19 @@ def webrender(method: str = '', url: str = '', use_local: bool = True) -> Union[ :param use_local: 是否使用本地 WebRender。 :returns: 生成的 WebRender URL。 ''' - if use_local and not Info.web_render_local_status: + if use_local and (not Info.web_render_local_status or _ignore_status): use_local = False if method == 'source': - if Info.web_render_status: + url = '' if not url else url + if Info.web_render_status or _ignore_status: return f'{(web_render_local if use_local else web_render)}source?url={url}' else: return url else: - if Info.web_render_status: + if Info.web_render_status or _ignore_status: return (web_render_local if use_local else web_render) + method else: - return None + return '' async def check_web_render() -> Tuple[bool, bool]: @@ -47,7 +48,7 @@ async def check_web_render() -> Tuple[bool, bool]: if web_render_status: try: Logger.info('[WebRender] Checking WebRender status...') - await get_url(webrender('source', ping_url), 200, request_private_ip=True) + await get_url(webrender('source', ping_url, _ignore_status=True), 200, request_private_ip=True) Logger.info('[WebRender] WebRender is working as expected.') except Exception: Logger.error('[WebRender] WebRender is not working as expected.') diff --git a/launcher.py b/launcher.py deleted file mode 100644 index 0a0f996..0000000 --- a/launcher.py +++ /dev/null @@ -1,22 +0,0 @@ -import sys -import importlib - -from core.logger import Logger -from core.utils.info import Info - -arg = sys.argv -if not sys.argv[0].endswith('.py'): - Info.binary_mode = True - -if len(arg) > 1: - Logger.info(f"[{arg[-1]}] Here we go!") - if 'subprocess' in sys.argv: - Info.subprocess = True - try: - importlib.import_module(f"bots.{arg[-1]}.bot") - except ModuleNotFoundError: - Logger.error(f"[{arg[-1]}] ???, entry not found.") - sys.exit(1) -else: - Logger.error("Please specify the entry.") - sys.exit(1) diff --git a/poetry.lock b/poetry.lock index 18c97ce..712cf52 100644 --- a/poetry.lock +++ b/poetry.lock @@ -236,22 +236,23 @@ files = [ [[package]] name = "anyio" -version = "4.6.2.post1" +version = "4.7.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" files = [ - {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, - {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, + {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, + {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, ] [package.dependencies] idna = ">=2.8" sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] trio = ["trio (>=0.26.1)"] [[package]] @@ -283,22 +284,22 @@ zookeeper = ["kazoo"] [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "autopep8" @@ -816,13 +817,13 @@ files = [ [[package]] name = "fastapi" -version = "0.115.5" +version = "0.115.6" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.115.5-py3-none-any.whl", hash = "sha256:596b95adbe1474da47049e802f9a65ab2ffa9c2b07e7efee70eb8a66c9f2f796"}, - {file = "fastapi-0.115.5.tar.gz", hash = "sha256:0e7a4d0dc0d01c68df21887cce0945e72d3c48b9f4f79dfe7a7d53aa08fbb289"}, + {file = "fastapi-0.115.6-py3-none-any.whl", hash = "sha256:e9240b29e36fa8f4bb7290316988e90c381e5092e0cbe84e7818cc3713bcf305"}, + {file = "fastapi-0.115.6.tar.gz", hash = "sha256:9ec46f7addc14ea472958a96aae5b5de65f39721a46aaf5705c480d9a8b76654"}, ] [package.dependencies] @@ -924,61 +925,61 @@ dotenv = ["python-dotenv"] [[package]] name = "fonttools" -version = "4.55.1" +version = "4.55.3" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.55.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c17a6f9814f83772cd6d9c9009928e1afa4ab66210a31ced721556651075a9a0"}, - {file = "fonttools-4.55.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c4d14eecc814826a01db87a40af3407c892ba49996bc6e49961e386cd78b537c"}, - {file = "fonttools-4.55.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8589f9a15dc005592b94ecdc45b4dfae9bbe9e73542e89af5a5e776e745db83b"}, - {file = "fonttools-4.55.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfee95bd9395bcd9e6c78955387554335109b6a613db71ef006020b42f761c58"}, - {file = "fonttools-4.55.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:34fa2ecc0bf1923d1a51bf2216a006de2c3c0db02c6aa1470ea50b62b8619bd5"}, - {file = "fonttools-4.55.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9c1c48483148bfb1b9ad951133ceea957faa004f6cb475b67e7bc75d482b48f8"}, - {file = "fonttools-4.55.1-cp310-cp310-win32.whl", hash = "sha256:3e2fc388ca7d023b3c45badd71016fd4185f93e51a22cfe4bd65378af7fba759"}, - {file = "fonttools-4.55.1-cp310-cp310-win_amd64.whl", hash = "sha256:c4c36c71f69d2b3ee30394b0986e5f8b2c461e7eff48dde49b08a90ded9fcdbd"}, - {file = "fonttools-4.55.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5daab3a55d460577f45bb8f5a8eca01fa6cde43ef2ab943b527991f54b735c41"}, - {file = "fonttools-4.55.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:acf1e80cf96c2fbc79e46f669d8713a9a79faaebcc68e31a9fbe600cf8027992"}, - {file = "fonttools-4.55.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e88a0329f7f88a210f09f79c088fb64f8032fc3ab65e2390a40b7d3a11773026"}, - {file = "fonttools-4.55.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03105b42259a8a94b2f0cbf1bee45f7a8a34e7b26c946a8fb89b4967e44091a8"}, - {file = "fonttools-4.55.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9af3577e821649879ab5774ad0e060af34816af556c77c6d3820345d12bf415e"}, - {file = "fonttools-4.55.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:34bd5de3d0ad085359b79a96575cd6bd1bc2976320ef24a2aa152ead36dbf656"}, - {file = "fonttools-4.55.1-cp311-cp311-win32.whl", hash = "sha256:5da92c4b637f0155a41f345fa81143c8e17425260fcb21521cb2ad4d2cea2a95"}, - {file = "fonttools-4.55.1-cp311-cp311-win_amd64.whl", hash = "sha256:f70234253d15f844e6da1178f019a931f03181463ce0c7b19648b8c370527b07"}, - {file = "fonttools-4.55.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9c372e527d58ba64b695f15f8014e97bc8826cf64d3380fc89b4196edd3c0fa8"}, - {file = "fonttools-4.55.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:845a967d3bef3245ba81fb5582dc731f6c2c8417fa211f1068c56893504bc000"}, - {file = "fonttools-4.55.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03be82bcd4ba4418adf10e6165743f824bb09d6594c2743d7f93ea50968805b"}, - {file = "fonttools-4.55.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c42e935cf146f826f556d977660dac88f2fa3fb2efa27d5636c0b89a60c16edf"}, - {file = "fonttools-4.55.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:96328bf91e05621d8e40d9f854af7a262cb0e8313e9b38e7f3a7f3c4c0caaa8b"}, - {file = "fonttools-4.55.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:291acec4d774e8cd2d8472d88c04643a77a3324a15247951bd6cfc969799b69e"}, - {file = "fonttools-4.55.1-cp312-cp312-win32.whl", hash = "sha256:6d768d6632809aec1c3fa8f195b173386d85602334701a6894a601a4d3c80368"}, - {file = "fonttools-4.55.1-cp312-cp312-win_amd64.whl", hash = "sha256:2a3850afdb0be1f79a1e95340a2059226511675c5b68098d4e49bfbeb48a8aab"}, - {file = "fonttools-4.55.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0c88d427eaf8bd8497b9051f56e0f5f9fb96a311aa7c72cda35e03e18d59cd16"}, - {file = "fonttools-4.55.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f062c95a725a79fd908fe8407b6ad63e230e1c7d6dece2d5d6ecaf843d6927f6"}, - {file = "fonttools-4.55.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f298c5324c45cad073475146bf560f4110ce2dc2488ff12231a343ec489f77bc"}, - {file = "fonttools-4.55.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f06dbb71344ffd85a6cb7e27970a178952f0bdd8d319ed938e64ba4bcc41700"}, - {file = "fonttools-4.55.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4c46b3525166976f5855b1f039b02433dc51eb635fb54d6a111e0c5d6e6cdc4c"}, - {file = "fonttools-4.55.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:af46f52a21e086a2f89b87bd941c9f0f91e5f769e1a5eb3b37c912228814d3e5"}, - {file = "fonttools-4.55.1-cp313-cp313-win32.whl", hash = "sha256:cd7f36335c5725a3fd724cc667c10c3f5254e779bdc5bffefebb33cf5a75ecb1"}, - {file = "fonttools-4.55.1-cp313-cp313-win_amd64.whl", hash = "sha256:5d6394897710ccac7f74df48492d7f02b9586ff0588c66a2c218844e90534b22"}, - {file = "fonttools-4.55.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:52c4f4b383c56e1a4fe8dab1b63c2269ba9eab0695d2d8e033fa037e61e6f1ef"}, - {file = "fonttools-4.55.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d83892dafdbd62b56545c77b6bd4fa49eef6ec1d6b95e042ee2c930503d1831e"}, - {file = "fonttools-4.55.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604d5bf16f811fcaaaec2dde139f7ce958462487565edcd54b6fadacb2942083"}, - {file = "fonttools-4.55.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3324b92feb5fd084923a8e89a8248afd5b9f9d81ab9517d7b07cc84403bd448"}, - {file = "fonttools-4.55.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:30f8b1ca9b919c04850678d026fc330c19acaa9e3b282fcacc09a5eb3c8d20c3"}, - {file = "fonttools-4.55.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:1835c98df2cf28c86a66d234895c87df7b9325fd079a8019c5053a389ff55d23"}, - {file = "fonttools-4.55.1-cp38-cp38-win32.whl", hash = "sha256:9f202703720a7cc0049f2ed1a2047925e264384eb5cc4d34f80200d7b17f1b6a"}, - {file = "fonttools-4.55.1-cp38-cp38-win_amd64.whl", hash = "sha256:2efff20aed0338d37c2ff58766bd67f4b9607ded61cf3d6baf1b3e25ea74e119"}, - {file = "fonttools-4.55.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3032d9bf010c395e6eca2851666cafb1f4ecde85d420188555e928ad0144326e"}, - {file = "fonttools-4.55.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0794055588c30ffe25426048e8a7c0a5271942727cd61fc939391e37f4d580d5"}, - {file = "fonttools-4.55.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13ba980e3ffd3206b8c63a365f90dc10eeec27da946d5ee5373c3a325a46d77c"}, - {file = "fonttools-4.55.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d7063babd7434a17a5e355e87de9b2306c85a5c19c7da0794be15c58aab0c39"}, - {file = "fonttools-4.55.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ed84c15144015a58ef550dd6312884c9fb31a2dbc31a6467bcdafd63be7db476"}, - {file = "fonttools-4.55.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e89419d88b0bbfdb55209e03a17afa2d20db3c2fa0d785543c9d0875668195d5"}, - {file = "fonttools-4.55.1-cp39-cp39-win32.whl", hash = "sha256:6eb781e401b93cda99356bc043ababead2a5096550984d8a4ecf3d5c9f859dc2"}, - {file = "fonttools-4.55.1-cp39-cp39-win_amd64.whl", hash = "sha256:db1031acf04523c5a51c3e1ae19c21a1c32bc5f820a477dd4659a02f9cb82002"}, - {file = "fonttools-4.55.1-py3-none-any.whl", hash = "sha256:4bcfb11f90f48b48c366dd638d773a52fca0d1b9e056dc01df766bf5835baa08"}, - {file = "fonttools-4.55.1.tar.gz", hash = "sha256:85bb2e985718b0df96afc659abfe194c171726054314b019dbbfed31581673c7"}, + {file = "fonttools-4.55.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1dcc07934a2165ccdc3a5a608db56fb3c24b609658a5b340aee4ecf3ba679dc0"}, + {file = "fonttools-4.55.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f7d66c15ba875432a2d2fb419523f5d3d347f91f48f57b8b08a2dfc3c39b8a3f"}, + {file = "fonttools-4.55.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e4ae3592e62eba83cd2c4ccd9462dcfa603ff78e09110680a5444c6925d841"}, + {file = "fonttools-4.55.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d65a3022c35e404d19ca14f291c89cc5890032ff04f6c17af0bd1927299674"}, + {file = "fonttools-4.55.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d342e88764fb201286d185093781bf6628bbe380a913c24adf772d901baa8276"}, + {file = "fonttools-4.55.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dd68c87a2bfe37c5b33bcda0fba39b65a353876d3b9006fde3adae31f97b3ef5"}, + {file = "fonttools-4.55.3-cp310-cp310-win32.whl", hash = "sha256:1bc7ad24ff98846282eef1cbeac05d013c2154f977a79886bb943015d2b1b261"}, + {file = "fonttools-4.55.3-cp310-cp310-win_amd64.whl", hash = "sha256:b54baf65c52952db65df39fcd4820668d0ef4766c0ccdf32879b77f7c804d5c5"}, + {file = "fonttools-4.55.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c4491699bad88efe95772543cd49870cf756b019ad56294f6498982408ab03e"}, + {file = "fonttools-4.55.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5323a22eabddf4b24f66d26894f1229261021dacd9d29e89f7872dd8c63f0b8b"}, + {file = "fonttools-4.55.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5480673f599ad410695ca2ddef2dfefe9df779a9a5cda89503881e503c9c7d90"}, + {file = "fonttools-4.55.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da9da6d65cd7aa6b0f806556f4985bcbf603bf0c5c590e61b43aa3e5a0f822d0"}, + {file = "fonttools-4.55.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e894b5bd60d9f473bed7a8f506515549cc194de08064d829464088d23097331b"}, + {file = "fonttools-4.55.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aee3b57643827e237ff6ec6d28d9ff9766bd8b21e08cd13bff479e13d4b14765"}, + {file = "fonttools-4.55.3-cp311-cp311-win32.whl", hash = "sha256:eb6ca911c4c17eb51853143624d8dc87cdcdf12a711fc38bf5bd21521e79715f"}, + {file = "fonttools-4.55.3-cp311-cp311-win_amd64.whl", hash = "sha256:6314bf82c54c53c71805318fcf6786d986461622dd926d92a465199ff54b1b72"}, + {file = "fonttools-4.55.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9e736f60f4911061235603a6119e72053073a12c6d7904011df2d8fad2c0e35"}, + {file = "fonttools-4.55.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a8aa2c5e5b8b3bcb2e4538d929f6589a5c6bdb84fd16e2ed92649fb5454f11c"}, + {file = "fonttools-4.55.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07f8288aacf0a38d174445fc78377a97fb0b83cfe352a90c9d9c1400571963c7"}, + {file = "fonttools-4.55.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8d5e8916c0970fbc0f6f1bece0063363bb5857a7f170121a4493e31c3db3314"}, + {file = "fonttools-4.55.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae3b6600565b2d80b7c05acb8e24d2b26ac407b27a3f2e078229721ba5698427"}, + {file = "fonttools-4.55.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:54153c49913f45065c8d9e6d0c101396725c5621c8aee744719300f79771d75a"}, + {file = "fonttools-4.55.3-cp312-cp312-win32.whl", hash = "sha256:827e95fdbbd3e51f8b459af5ea10ecb4e30af50221ca103bea68218e9615de07"}, + {file = "fonttools-4.55.3-cp312-cp312-win_amd64.whl", hash = "sha256:e6e8766eeeb2de759e862004aa11a9ea3d6f6d5ec710551a88b476192b64fd54"}, + {file = "fonttools-4.55.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a430178ad3e650e695167cb53242dae3477b35c95bef6525b074d87493c4bf29"}, + {file = "fonttools-4.55.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:529cef2ce91dc44f8e407cc567fae6e49a1786f2fefefa73a294704c415322a4"}, + {file = "fonttools-4.55.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e75f12c82127486fac2d8bfbf5bf058202f54bf4f158d367e41647b972342ca"}, + {file = "fonttools-4.55.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:859c358ebf41db18fb72342d3080bce67c02b39e86b9fbcf1610cca14984841b"}, + {file = "fonttools-4.55.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:546565028e244a701f73df6d8dd6be489d01617863ec0c6a42fa25bf45d43048"}, + {file = "fonttools-4.55.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:aca318b77f23523309eec4475d1fbbb00a6b133eb766a8bdc401faba91261abe"}, + {file = "fonttools-4.55.3-cp313-cp313-win32.whl", hash = "sha256:8c5ec45428edaa7022f1c949a632a6f298edc7b481312fc7dc258921e9399628"}, + {file = "fonttools-4.55.3-cp313-cp313-win_amd64.whl", hash = "sha256:11e5de1ee0d95af4ae23c1a138b184b7f06e0b6abacabf1d0db41c90b03d834b"}, + {file = "fonttools-4.55.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:caf8230f3e10f8f5d7593eb6d252a37caf58c480b19a17e250a63dad63834cf3"}, + {file = "fonttools-4.55.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b586ab5b15b6097f2fb71cafa3c98edfd0dba1ad8027229e7b1e204a58b0e09d"}, + {file = "fonttools-4.55.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8c2794ded89399cc2169c4d0bf7941247b8d5932b2659e09834adfbb01589aa"}, + {file = "fonttools-4.55.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf4fe7c124aa3f4e4c1940880156e13f2f4d98170d35c749e6b4f119a872551e"}, + {file = "fonttools-4.55.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:86721fbc389ef5cc1e2f477019e5069e8e4421e8d9576e9c26f840dbb04678de"}, + {file = "fonttools-4.55.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:89bdc5d88bdeec1b15af790810e267e8332d92561dce4f0748c2b95c9bdf3926"}, + {file = "fonttools-4.55.3-cp38-cp38-win32.whl", hash = "sha256:bc5dbb4685e51235ef487e4bd501ddfc49be5aede5e40f4cefcccabc6e60fb4b"}, + {file = "fonttools-4.55.3-cp38-cp38-win_amd64.whl", hash = "sha256:cd70de1a52a8ee2d1877b6293af8a2484ac82514f10b1c67c1c5762d38073e56"}, + {file = "fonttools-4.55.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bdcc9f04b36c6c20978d3f060e5323a43f6222accc4e7fcbef3f428e216d96af"}, + {file = "fonttools-4.55.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c3ca99e0d460eff46e033cd3992a969658c3169ffcd533e0a39c63a38beb6831"}, + {file = "fonttools-4.55.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22f38464daa6cdb7b6aebd14ab06609328fe1e9705bb0fcc7d1e69de7109ee02"}, + {file = "fonttools-4.55.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed63959d00b61959b035c7d47f9313c2c1ece090ff63afea702fe86de00dbed4"}, + {file = "fonttools-4.55.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5e8d657cd7326eeaba27de2740e847c6b39dde2f8d7cd7cc56f6aad404ddf0bd"}, + {file = "fonttools-4.55.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fb594b5a99943042c702c550d5494bdd7577f6ef19b0bc73877c948a63184a32"}, + {file = "fonttools-4.55.3-cp39-cp39-win32.whl", hash = "sha256:dc5294a3d5c84226e3dbba1b6f61d7ad813a8c0238fceea4e09aa04848c3d851"}, + {file = "fonttools-4.55.3-cp39-cp39-win_amd64.whl", hash = "sha256:aedbeb1db64496d098e6be92b2e63b5fac4e53b1b92032dfc6988e1ea9134a4d"}, + {file = "fonttools-4.55.3-py3-none-any.whl", hash = "sha256:f412604ccbeee81b091b420272841e5ec5ef68967a9790e80bffd0e30b8e2977"}, + {file = "fonttools-4.55.3.tar.gz", hash = "sha256:3983313c2a04d6cc1fe9251f8fc647754cf49a61dac6cb1e7249ae67afaafc45"}, ] [package.extras] @@ -1347,13 +1348,13 @@ test = ["Cython (>=0.29.24)"] [[package]] name = "httpx" -version = "0.28.0" +version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.28.0-py3-none-any.whl", hash = "sha256:dc0b419a0cfeb6e8b34e85167c0da2671206f5095f1baa9663d23bcfd6b535fc"}, - {file = "httpx-0.28.0.tar.gz", hash = "sha256:0858d3bab51ba7e386637f22a61d8ccddaeec5f3fe4209da3a6168dbb91573e0"}, + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, ] [package.dependencies] @@ -1659,25 +1660,29 @@ name = "langconv" version = "0.3.0" description = "A Python library for conversion between Traditional and Simplified Chinese, inspired by MediaWiki's LanguageConverter." optional = false -python-versions = "<4.0,>=3.9" -files = [ - {file = "langconv-0.3.0-py3-none-any.whl", hash = "sha256:dfd3484e0373a07ed8271ab60293648e9d216ef460c58ff7dda80315292d0566"}, - {file = "langconv-0.3.0.tar.gz", hash = "sha256:816bedf81db368a410959293a31aeebe4cd75de516427b50370727003f3bd3ce"}, -] +python-versions = ">=3.9" +files = [] +develop = false [package.dependencies] -attrs = ">=23.2.0,<24.0.0" -iso639-lang = ">=2.2.3,<3.0.0" +attrs = "^24.2.0" +iso639-lang = "^2.2.3" + +[package.source] +type = "git" +url = "https://github.com/OasisAkari/langconv.py.git" +reference = "HEAD" +resolved_reference = "975ee0896096b63148f0930db762607a5a2113df" [[package]] name = "loguru" -version = "0.7.2" +version = "0.7.3" description = "Python logging made (stupidly) simple" optional = false -python-versions = ">=3.5" +python-versions = "<4.0,>=3.5" files = [ - {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, - {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, + {file = "loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c"}, + {file = "loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6"}, ] [package.dependencies] @@ -1685,7 +1690,7 @@ colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] -dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] +dev = ["Sphinx (==8.1.3)", "build (==1.2.2)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.5.0)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.13.0)", "mypy (==v1.4.1)", "myst-parser (==4.0.0)", "pre-commit (==4.0.1)", "pytest (==6.1.2)", "pytest (==8.3.2)", "pytest-cov (==2.12.1)", "pytest-cov (==5.0.0)", "pytest-cov (==6.0.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.1.0)", "sphinx-rtd-theme (==3.0.2)", "tox (==3.27.1)", "tox (==4.23.2)", "twine (==6.0.1)"] [[package]] name = "magic-filter" @@ -3098,112 +3103,114 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rpds-py" -version = "0.22.0" +version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" files = [ - {file = "rpds_py-0.22.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a4366f264fa60d3c109f0b27af0cd9eb8d46746bd70bd3d9d425f035b6c7e286"}, - {file = "rpds_py-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e34a3e665d38d0749072e6565400c8ce9abae976e338919a0dfbfb0e1ba43068"}, - {file = "rpds_py-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38cacf1f378571450576f2c8ce87da6f3fddc59d744de5c12b37acc23285b1e1"}, - {file = "rpds_py-0.22.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8cbb040fec8eddd5a6a75e737fd73c9ce37e51f94bacdd0b178d0174a4758395"}, - {file = "rpds_py-0.22.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d80fd710b3307a3c63809048b72c536689b9b0b31a2518339c3f1a4d29c73d7a"}, - {file = "rpds_py-0.22.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b5d17d8f5b885ce50e0cda85f99c0719e365e98b587338535fa566a48375afb"}, - {file = "rpds_py-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7a048ec1ebc991331d709be4884dc318c9eaafa66dcde8be0933ac0e702149"}, - {file = "rpds_py-0.22.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:306da3dfa174b489a3fc63b0872e2226a5ddf94c59875a770d72aff945d5ed96"}, - {file = "rpds_py-0.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c7b4450093c0c909299770226fb0285be47b0a57545bae25b5c4e51566b0e587"}, - {file = "rpds_py-0.22.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0903ffdb5b9007e503203b6285e4ff0faf96d875c19f1d103b475acf7d9f7311"}, - {file = "rpds_py-0.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d1522025cda9e57329aade769f56e5793b2a5da7759a21914ee10e67e17e601e"}, - {file = "rpds_py-0.22.0-cp310-cp310-win32.whl", hash = "sha256:49e084d47a66027ac72844f9f52f13d347a9a1f05d4f84381b420e47f836a7fd"}, - {file = "rpds_py-0.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:d9ceca96df54cb1675a0b7f52f1c6d5d1df62c5b40741ba211780f1b05a282a2"}, - {file = "rpds_py-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:771c9a3851beaa617d8c8115d65f834a2b52490f42ee2b88b13f1fc5529e9e0c"}, - {file = "rpds_py-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:341a07a4b55126bfae68c9bf24220a73d456111e5eb3dcbdab9fd16de2341224"}, - {file = "rpds_py-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7649c8b8e4bd1ccc5fcbd51a855d57a617deeba19c66e3d04b1abecc61036b2"}, - {file = "rpds_py-0.22.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f513758e7cda8bc262e80299a8e3395d7ef7f4ae705be62632f229bc6c33208"}, - {file = "rpds_py-0.22.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba1fc34d0b2f6fd53377a4c954116251eba6d076bf64f903311f4a7d27d10acd"}, - {file = "rpds_py-0.22.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:632d2fdddd9fbe3ac8896a119fd18a71fc95ca9c4cbe5223096c142d8c4a2b1d"}, - {file = "rpds_py-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:326e42f2b49462e05f8527a1311ce98f9f97c484b3e443ec0ea4638bed3aebcf"}, - {file = "rpds_py-0.22.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e9bbdba9e75b1a9ee1dd1335034dad998ef1acc08492226c6fd50aa773bdfa7d"}, - {file = "rpds_py-0.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:41f65a97bf2c4b161c9f8f89bc37058346bec9b36e373c8ad00a16c957bff625"}, - {file = "rpds_py-0.22.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0686f2c16eafdc2c6b4ce6e86e5b3092e87db09ae64be2787616444eb35b9756"}, - {file = "rpds_py-0.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4e7c9aa2353eb0b0d845323857197daa036c2ff8624df990b0d886d22a8f665e"}, - {file = "rpds_py-0.22.0-cp311-cp311-win32.whl", hash = "sha256:2d2fc3ab021be3e0b5aec6d4164f2689d231b8bfc5185cc454314746aa4aee72"}, - {file = "rpds_py-0.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:87453d491369cd8018016d2714a13e8461975161703c18ee31eecf087a8ae5d4"}, - {file = "rpds_py-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e9d4293b21c69ee4f9e1a99ac4f772951d345611c614a0cfae2ec6b565279bc9"}, - {file = "rpds_py-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:67e013a17a3db4d98cc228fd5aeb36a51b0f5cf7330b9102a552060f1fe4e560"}, - {file = "rpds_py-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b639a19e1791b646d27f15d17530a51722cc728d43b2dff3aeb904f92d91bac"}, - {file = "rpds_py-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1357c3092702078b7782b6ebd5ba9b22c1a291c34fbf9d8f1a48237466ac7758"}, - {file = "rpds_py-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:842855bbb113a19c393c6de5aa6ed9a26c6b13c2fead5e49114d39f0d08b94d8"}, - {file = "rpds_py-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ae7927cd2b869ca4dc645169d8af5494a29c99afd0ea0f24dd00c811ab1d8b8"}, - {file = "rpds_py-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91bfef5daa2a5a4fe62f8d317fc91a626073639f951f851bd2cb252d01bc6c5"}, - {file = "rpds_py-0.22.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fc4824e38c1e91a73bc820e7caacaf19d0acd557465aceef0420ca59489b390"}, - {file = "rpds_py-0.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:92d28a608127b357da47c99e0d0e0655ca2060286540fe9f2a25a2e8ac666e05"}, - {file = "rpds_py-0.22.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c637188b930175c256f13adbfc427b83ec7e64476d1ec9d6608f312bb84e06c3"}, - {file = "rpds_py-0.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93bbd66f46dddc41e8c656130c97c0fb515e0fa44e1eebb2592769dbbd41b2f5"}, - {file = "rpds_py-0.22.0-cp312-cp312-win32.whl", hash = "sha256:54d8f94dec5765a9edc19610fecf0fdf9cab36cbb9def1213188215f735a6f98"}, - {file = "rpds_py-0.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:931bf3d0705b2834fed29354f35170fa022fe22a95542b61b7c66aca5f8a224f"}, - {file = "rpds_py-0.22.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2a57300cc8b034c5707085249efd09f19116bb80278d0ec925d7f3710165c510"}, - {file = "rpds_py-0.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c398a5a8e258dfdc5ea2aa4e5aa2ca3207f654a8eb268693dd1a76939074a588"}, - {file = "rpds_py-0.22.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6cc4eb1e86364331928acafb2bb41d8ab735ca3caf2d6019b9f6dac3f4f65d"}, - {file = "rpds_py-0.22.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:574c5c94213bc9990805bfd7e4ba3826d3c098516cbc19f0d0ef0433ad93fa06"}, - {file = "rpds_py-0.22.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c0321bc03a1c513eca1837e3bba948b975bcf3a172aebc197ab3573207f137a"}, - {file = "rpds_py-0.22.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d276280649305c1da6cdd84585d48ae1f0efa67434d8b10d2df95228e59a05bb"}, - {file = "rpds_py-0.22.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c17b43fe9c6da16885e3fe28922bcd1a029e61631fb771c7d501019b40bcc904"}, - {file = "rpds_py-0.22.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:48c95997af9314f4034fe5ba2d837399e786586e220835a578d28fe8161e6ae5"}, - {file = "rpds_py-0.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e9aa4af6b879bb75a3c7766fbf49d77f4097dd12b548ecbbd8b3f85caa833281"}, - {file = "rpds_py-0.22.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8426f97117b914b9bfb2a7bd46edc148e8defda728a55a5df3a564abe70cd7a4"}, - {file = "rpds_py-0.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:034964ea0ea09645bdde13038b38abb14be0aa747f20fcfab6181207dd9e0483"}, - {file = "rpds_py-0.22.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:3dc7c64b56b82428894f056e9ff6e8ee917ff74fc26b65211a33602c2372e928"}, - {file = "rpds_py-0.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:1212cb231f2002934cd8d71a0d718fdd9d9a2dd671e0feef8501038df3508026"}, - {file = "rpds_py-0.22.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f21e1278c9456cd601832375c778ca44614d3433996488221a56572c223f04a"}, - {file = "rpds_py-0.22.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:875fe8dffb43c20f68379ee098b035a7038d7903c795d46715f66575a7050b19"}, - {file = "rpds_py-0.22.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e23dcdd4b2ff9c6b3317ea7921b210d39592f8ca1cdea58ada25b202c65c0a69"}, - {file = "rpds_py-0.22.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fb8efc9e579acf1e556fd86277fecec320c21ca9b5d39db96433ad8c45bc4a"}, - {file = "rpds_py-0.22.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe23687924b25a2dee52fab15976fd6577ed8518072bcda9ff2e2b88ab1f168b"}, - {file = "rpds_py-0.22.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5469b347445d1c31105f33e7bfc9a8ba213d48e42641a610dda65bf9e3c83f5"}, - {file = "rpds_py-0.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a810a57ce5e8ecf8eac6ec4dab534ff80c34e5a2c31db60e992009cd20f58e0f"}, - {file = "rpds_py-0.22.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d9bb9242b38a664f307b3b897f093896f7ed51ef4fe25a0502e5a368de9151ea"}, - {file = "rpds_py-0.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b4660943030406aaa40ec9f51960dd88049903d9536bc3c8ebb5cc4e1f119bbe"}, - {file = "rpds_py-0.22.0-cp313-cp313t-win32.whl", hash = "sha256:208ce1d8e3af138d1d9b21d7206356b7f29b96675e0113aea652cf024e4ddfdc"}, - {file = "rpds_py-0.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e6da2e0500742e0f157f005924a0589f2e2dcbfdd6cd0cc0abce367433e989be"}, - {file = "rpds_py-0.22.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:f980a0640599a74f27fd9d50c84c293f1cb7afc2046c5c6d3efaf8ec7cdbc326"}, - {file = "rpds_py-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ca505fd3767a09a139737f3278bc8a485cb64043062da89bcba27e2f2ea78d33"}, - {file = "rpds_py-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba235e00e0878ba1080b0f2a761f143b2a2d1c354f3d8e507fbf2f3de401bf18"}, - {file = "rpds_py-0.22.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81e7a27365b02fe70a77f1365376879917235b3fec551d19b4c91b51d0bc1d07"}, - {file = "rpds_py-0.22.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:32a0e24cab2daae0503b06666d516e90a080c1a95aff0406b9f03c6489177c4b"}, - {file = "rpds_py-0.22.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a73ed43d64209e853bba567a543170267a5cd64f359540b0ca2d597e329ba172"}, - {file = "rpds_py-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0abcce5e874474d3eab5ad53be03dae2abe651d248bdeaabe83708e82969e78"}, - {file = "rpds_py-0.22.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4e9946c8c7def17e4fcb5eddb14c4eb6ebc7f6f309075e6c8d23b133c104607"}, - {file = "rpds_py-0.22.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:758098b38c344d9a7f279baf0689261777e601f620078ef5afdc9bd3339965c3"}, - {file = "rpds_py-0.22.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9ad4640a409bc2b7d22b7921e7660f0db96c5c8c69fbb2e8f3261d4f71d33983"}, - {file = "rpds_py-0.22.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8c48fc7458fe3a74dcdf56ba3534ff41bd421f69436df09ff3497fdaac18b431"}, - {file = "rpds_py-0.22.0-cp39-cp39-win32.whl", hash = "sha256:fde778947304e55fc732bc8ea5c6063e74244ac1808471cb498983a210aaf62c"}, - {file = "rpds_py-0.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:5fdf91a7c07f40e47b193f2acae0ed9da35d09325d7c3c3279f722b7cbf3d264"}, - {file = "rpds_py-0.22.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c8fd7a16f7a047e06c747cfcf2acef3ac316132df1c6077445b29ee6f3f3a70b"}, - {file = "rpds_py-0.22.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b6e4bcfc32f831bfe3d6d8a5acedfbfd5e252a03c83fa24813b277a3a8a13ca"}, - {file = "rpds_py-0.22.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eadd2417e83a77ce3ae4a0efd08cb0ebdfd317b6406d11020354a53ad458ec84"}, - {file = "rpds_py-0.22.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9dc2113e0cf0dd637751ca736186fca63664939ceb9f9f67e93ade88c69c0c9"}, - {file = "rpds_py-0.22.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2c00acdf68f1f69a476b770af311a7dc3955b7de228b04a40bcc51ac4d743b"}, - {file = "rpds_py-0.22.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dfdabdf8519c93908b2bf0f87c3f86f9e88bab279fb4acfd0907519ca5a1739f"}, - {file = "rpds_py-0.22.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8338db3c76833d02dc21c3e2c42534091341d26e4f7ba32c6032bb558a02e07b"}, - {file = "rpds_py-0.22.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8ad4dfda52e64af3202ceb2143a62deba97894b71c64a4405ee80f6b3ea77285"}, - {file = "rpds_py-0.22.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3b94b074dcce39976db22ea75c7aea8b22d95e6d3b62f76e20e1179a278521d8"}, - {file = "rpds_py-0.22.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d4f2af3107fe4dc40c0d1a2409863f5249c6796398a1d83c1d99a0b3fa6cfb8d"}, - {file = "rpds_py-0.22.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:bb11809b0de643a292a82f728c494a2bbef0e30a7c42d37464abbd6bef7ca7b1"}, - {file = "rpds_py-0.22.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c1c21030ed494deb10226f90e2dbd84a012d59810c409832714a3dd576527be2"}, - {file = "rpds_py-0.22.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:64a0c965a1e299c9b280006bdb15c276c427c45360aed676305dc36bcaa4d13c"}, - {file = "rpds_py-0.22.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:2498ff422823be087b48bc82710deb87ac34f6b7c8034ee39920647647de1e60"}, - {file = "rpds_py-0.22.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59e63da174ff287db05ef7c21d75974a5bac727ed60452aeb3a14278477842a8"}, - {file = "rpds_py-0.22.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e1c04fb380bc8efaae2fdf17ed6cd5d223da78a8b0b18a610f53d4c5d6e31dfd"}, - {file = "rpds_py-0.22.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04919ffa9a728c446b27b6b625fa1d00ece221bdb9d633e978a7e0353a12c0e"}, - {file = "rpds_py-0.22.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24c28df05bd284879d0fac850ba697077d2a33b7ebcaea6318d6b6cdfdc86ddc"}, - {file = "rpds_py-0.22.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33622dc63c295788eed09dbb1d11bed178909d3267b02d873116ee6be368244"}, - {file = "rpds_py-0.22.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7539dbb8f705e13629ba6f23388976aad809e387f32a6e5c0712e4e8d9bfcce7"}, - {file = "rpds_py-0.22.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b8906f537978da3f7f0bd1ba37b69f6a877bb43312023b086582707d2835bf2f"}, - {file = "rpds_py-0.22.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:62ab12fe03ffc49978d29de9c31bbb216610157f7e5ca8e172fed6642aead3be"}, - {file = "rpds_py-0.22.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:762206ba3bf1d6c8c9e0055871d3c0d5b074b7c3120193e6c067e7866f106ab1"}, - {file = "rpds_py-0.22.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed0102146574e5e9f079b2e1a06e6b5b12a691f9c74a65b93b7f3d4feda566c6"}, - {file = "rpds_py-0.22.0.tar.gz", hash = "sha256:32de71c393f126d8203e9815557c7ff4d72ed1ad3aa3f52f6c7938413176750a"}, + {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, + {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf"}, + {file = "rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652"}, + {file = "rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a"}, + {file = "rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64"}, + {file = "rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7"}, + {file = "rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627"}, + {file = "rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"}, + {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"}, + {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520"}, + {file = "rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9"}, + {file = "rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"}, + {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, ] [[package]] @@ -3229,13 +3236,13 @@ files = [ [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] @@ -3624,82 +3631,82 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "watchfiles" -version = "1.0.0" +version = "1.0.3" description = "Simple, modern and high performance file watching and code reload in python." optional = false python-versions = ">=3.9" files = [ - {file = "watchfiles-1.0.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:1d19df28f99d6a81730658fbeb3ade8565ff687f95acb59665f11502b441be5f"}, - {file = "watchfiles-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:28babb38cf2da8e170b706c4b84aa7e4528a6fa4f3ee55d7a0866456a1662041"}, - {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ab123135b2f42517f04e720526d41448667ae8249e651385afb5cda31fedc0"}, - {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13a4f9ee0cd25682679eea5c14fc629e2eaa79aab74d963bc4e21f43b8ea1877"}, - {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e1d9284cc84de7855fcf83472e51d32daf6f6cecd094160192628bc3fee1b78"}, - {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ee5edc939f53466b329bbf2e58333a5461e6c7b50c980fa6117439e2c18b42d"}, - {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dccfc70480087567720e4e36ec381bba1ed68d7e5f368fe40c93b3b1eba0105"}, - {file = "watchfiles-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83a6d33a9eda0af6a7470240d1af487807adc269704fe76a4972dd982d16236"}, - {file = "watchfiles-1.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:905f69aad276639eff3893759a07d44ea99560e67a1cf46ff389cd62f88872a2"}, - {file = "watchfiles-1.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09551237645d6bff3972592f2aa5424df9290e7a2e15d63c5f47c48cde585935"}, - {file = "watchfiles-1.0.0-cp310-none-win32.whl", hash = "sha256:d2b39aa8edd9e5f56f99a2a2740a251dc58515398e9ed5a4b3e5ff2827060755"}, - {file = "watchfiles-1.0.0-cp310-none-win_amd64.whl", hash = "sha256:2de52b499e1ab037f1a87cb8ebcb04a819bf087b1015a4cf6dcf8af3c2a2613e"}, - {file = "watchfiles-1.0.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fbd0ab7a9943bbddb87cbc2bf2f09317e74c77dc55b1f5657f81d04666c25269"}, - {file = "watchfiles-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:774ef36b16b7198669ce655d4f75b4c3d370e7f1cbdfb997fb10ee98717e2058"}, - {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b4fb98100267e6a5ebaff6aaa5d20aea20240584647470be39fe4823012ac96"}, - {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0fc3bf0effa2d8075b70badfdd7fb839d7aa9cea650d17886982840d71fdeabf"}, - {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:648e2b6db53eca6ef31245805cd528a16f56fa4cc15aeec97795eaf713c11435"}, - {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa13d604fcb9417ae5f2e3de676e66aa97427d888e83662ad205bed35a313176"}, - {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:936f362e7ff28311b16f0b97ec51e8f2cc451763a3264640c6ed40fb252d1ee4"}, - {file = "watchfiles-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245fab124b9faf58430da547512d91734858df13f2ddd48ecfa5e493455ffccb"}, - {file = "watchfiles-1.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4ff9c7e84e8b644a8f985c42bcc81457240316f900fc72769aaedec9d088055a"}, - {file = "watchfiles-1.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9c9a8d8fd97defe935ef8dd53d562e68942ad65067cd1c54d6ed8a088b1d931d"}, - {file = "watchfiles-1.0.0-cp311-none-win32.whl", hash = "sha256:a0abf173975eb9dd17bb14c191ee79999e650997cc644562f91df06060610e62"}, - {file = "watchfiles-1.0.0-cp311-none-win_amd64.whl", hash = "sha256:2a825ba4b32c214e3855b536eb1a1f7b006511d8e64b8215aac06eb680642d84"}, - {file = "watchfiles-1.0.0-cp311-none-win_arm64.whl", hash = "sha256:a5a7a06cfc65e34fd0a765a7623c5ba14707a0870703888e51d3d67107589817"}, - {file = "watchfiles-1.0.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:28fb64b5843d94e2c2483f7b024a1280662a44409bedee8f2f51439767e2d107"}, - {file = "watchfiles-1.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e3750434c83b61abb3163b49c64b04180b85b4dabb29a294513faec57f2ffdb7"}, - {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bedf84835069f51c7b026b3ca04e2e747ea8ed0a77c72006172c72d28c9f69fc"}, - {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:90004553be36427c3d06ec75b804233f8f816374165d5225b93abd94ba6e7234"}, - {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b46e15c34d4e401e976d6949ad3a74d244600d5c4b88c827a3fdf18691a46359"}, - {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:487d15927f1b0bd24e7df921913399bb1ab94424c386bea8b267754d698f8f0e"}, - {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ff236d7a3f4b0a42f699a22fc374ba526bc55048a70cbb299661158e1bb5e1f"}, - {file = "watchfiles-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c01446626574561756067f00b37e6b09c8622b0fc1e9fdbc7cbcea328d4e514"}, - {file = "watchfiles-1.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b551c465a59596f3d08170bd7e1c532c7260dd90ed8135778038e13c5d48aa81"}, - {file = "watchfiles-1.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1ed613ee107269f66c2df631ec0fc8efddacface85314d392a4131abe299f00"}, - {file = "watchfiles-1.0.0-cp312-none-win32.whl", hash = "sha256:5f75cd42e7e2254117cf37ff0e68c5b3f36c14543756b2da621408349bd9ca7c"}, - {file = "watchfiles-1.0.0-cp312-none-win_amd64.whl", hash = "sha256:cf517701a4a872417f4e02a136e929537743461f9ec6cdb8184d9a04f4843545"}, - {file = "watchfiles-1.0.0-cp312-none-win_arm64.whl", hash = "sha256:8a2127cd68950787ee36753e6d401c8ea368f73beaeb8e54df5516a06d1ecd82"}, - {file = "watchfiles-1.0.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:95de85c254f7fe8cbdf104731f7f87f7f73ae229493bebca3722583160e6b152"}, - {file = "watchfiles-1.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:533a7cbfe700e09780bb31c06189e39c65f06c7f447326fee707fd02f9a6e945"}, - {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2218e78e2c6c07b1634a550095ac2a429026b2d5cbcd49a594f893f2bb8c936"}, - {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9122b8fdadc5b341315d255ab51d04893f417df4e6c1743b0aac8bf34e96e025"}, - {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9272fdbc0e9870dac3b505bce1466d386b4d8d6d2bacf405e603108d50446940"}, - {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a3b33c3aefe9067ebd87846806cd5fc0b017ab70d628aaff077ab9abf4d06b3"}, - {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc338ce9f8846543d428260fa0f9a716626963148edc937d71055d01d81e1525"}, - {file = "watchfiles-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ac778a460ea22d63c7e6fb0bc0f5b16780ff0b128f7f06e57aaec63bd339285"}, - {file = "watchfiles-1.0.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:53ae447f06f8f29f5ab40140f19abdab822387a7c426a369eb42184b021e97eb"}, - {file = "watchfiles-1.0.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1f73c2147a453315d672c1ad907abe6d40324e34a185b51e15624bc793f93cc6"}, - {file = "watchfiles-1.0.0-cp313-none-win32.whl", hash = "sha256:eba98901a2eab909dbd79681190b9049acc650f6111fde1845484a4450761e98"}, - {file = "watchfiles-1.0.0-cp313-none-win_amd64.whl", hash = "sha256:d562a6114ddafb09c33246c6ace7effa71ca4b6a2324a47f4b09b6445ea78941"}, - {file = "watchfiles-1.0.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3d94fd83ed54266d789f287472269c0def9120a2022674990bd24ad989ebd7a0"}, - {file = "watchfiles-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48051d1c504448b2fcda71c5e6e3610ae45de6a0b8f5a43b961f250be4bdf5a8"}, - {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29cf884ad4285d23453c702ed03d689f9c0e865e3c85d20846d800d4787de00f"}, - {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d3572d4c34c4e9c33d25b3da47d9570d5122f8433b9ac6519dca49c2740d23cd"}, - {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c2696611182c85eb0e755b62b456f48debff484b7306b56f05478b843ca8ece"}, - {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:550109001920a993a4383b57229c717fa73627d2a4e8fcb7ed33c7f1cddb0c85"}, - {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b555a93c15bd2c71081922be746291d776d47521a00703163e5fbe6d2a402399"}, - {file = "watchfiles-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:947ccba18a38b85c366dafeac8df2f6176342d5992ca240a9d62588b214d731f"}, - {file = "watchfiles-1.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ffd98a299b0a74d1b704ef0ed959efb753e656a4e0425c14e46ae4c3cbdd2919"}, - {file = "watchfiles-1.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f8c4f3a1210ed099a99e6a710df4ff2f8069411059ffe30fa5f9467ebed1256b"}, - {file = "watchfiles-1.0.0-cp39-none-win32.whl", hash = "sha256:1e176b6b4119b3f369b2b4e003d53a226295ee862c0962e3afd5a1c15680b4e3"}, - {file = "watchfiles-1.0.0-cp39-none-win_amd64.whl", hash = "sha256:2d9c0518fabf4a3f373b0a94bb9e4ea7a1df18dec45e26a4d182aa8918dee855"}, - {file = "watchfiles-1.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f159ac795785cde4899e0afa539f4c723fb5dd336ce5605bc909d34edd00b79b"}, - {file = "watchfiles-1.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c3d258d78341d5d54c0c804a5b7faa66cd30ba50b2756a7161db07ce15363b8d"}, - {file = "watchfiles-1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bbd0311588c2de7f9ea5cf3922ccacfd0ec0c1922870a2be503cc7df1ca8be7"}, - {file = "watchfiles-1.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a13ac46b545a7d0d50f7641eefe47d1597e7d1783a5d89e09d080e6dff44b0"}, - {file = "watchfiles-1.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2bca898c1dc073912d3db7fa6926cc08be9575add9e84872de2c99c688bac4e"}, - {file = "watchfiles-1.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:06d828fe2adc4ac8a64b875ca908b892a3603d596d43e18f7948f3fef5fc671c"}, - {file = "watchfiles-1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:074c7618cd6c807dc4eaa0982b4a9d3f8051cd0b72793511848fd64630174b17"}, - {file = "watchfiles-1.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95dc785bc284552d044e561b8f4fe26d01ab5ca40d35852a6572d542adfeb4bc"}, - {file = "watchfiles-1.0.0.tar.gz", hash = "sha256:37566c844c9ce3b5deb964fe1a23378e575e74b114618d211fbda8f59d7b5dab"}, + {file = "watchfiles-1.0.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:1da46bb1eefb5a37a8fb6fd52ad5d14822d67c498d99bda8754222396164ae42"}, + {file = "watchfiles-1.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2b961b86cd3973f5822826017cad7f5a75795168cb645c3a6b30c349094e02e3"}, + {file = "watchfiles-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34e87c7b3464d02af87f1059fedda5484e43b153ef519e4085fe1a03dd94801e"}, + {file = "watchfiles-1.0.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d9dd2b89a16cf7ab9c1170b5863e68de6bf83db51544875b25a5f05a7269e678"}, + {file = "watchfiles-1.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b4691234d31686dca133c920f94e478b548a8e7c750f28dbbc2e4333e0d3da9"}, + {file = "watchfiles-1.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90b0fe1fcea9bd6e3084b44875e179b4adcc4057a3b81402658d0eb58c98edf8"}, + {file = "watchfiles-1.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b90651b4cf9e158d01faa0833b073e2e37719264bcee3eac49fc3c74e7d304b"}, + {file = "watchfiles-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2e9fe695ff151b42ab06501820f40d01310fbd58ba24da8923ace79cf6d702d"}, + {file = "watchfiles-1.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62691f1c0894b001c7cde1195c03b7801aaa794a837bd6eef24da87d1542838d"}, + {file = "watchfiles-1.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:275c1b0e942d335fccb6014d79267d1b9fa45b5ac0639c297f1e856f2f532552"}, + {file = "watchfiles-1.0.3-cp310-cp310-win32.whl", hash = "sha256:06ce08549e49ba69ccc36fc5659a3d0ff4e3a07d542b895b8a9013fcab46c2dc"}, + {file = "watchfiles-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f280b02827adc9d87f764972fbeb701cf5611f80b619c20568e1982a277d6146"}, + {file = "watchfiles-1.0.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ffe709b1d0bc2e9921257569675674cafb3a5f8af689ab9f3f2b3f88775b960f"}, + {file = "watchfiles-1.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:418c5ce332f74939ff60691e5293e27c206c8164ce2b8ce0d9abf013003fb7fe"}, + {file = "watchfiles-1.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f492d2907263d6d0d52f897a68647195bc093dafed14508a8d6817973586b6b"}, + {file = "watchfiles-1.0.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:48c9f3bc90c556a854f4cab6a79c16974099ccfa3e3e150673d82d47a4bc92c9"}, + {file = "watchfiles-1.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75d3bcfa90454dba8df12adc86b13b6d85fda97d90e708efc036c2760cc6ba44"}, + {file = "watchfiles-1.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5691340f259b8f76b45fb31b98e594d46c36d1dc8285efa7975f7f50230c9093"}, + {file = "watchfiles-1.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e263cc718545b7f897baeac1f00299ab6fabe3e18caaacacb0edf6d5f35513c"}, + {file = "watchfiles-1.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c6cf7709ed3e55704cc06f6e835bf43c03bc8e3cb8ff946bf69a2e0a78d9d77"}, + {file = "watchfiles-1.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:703aa5e50e465be901e0e0f9d5739add15e696d8c26c53bc6fc00eb65d7b9469"}, + {file = "watchfiles-1.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bfcae6aecd9e0cb425f5145afee871465b98b75862e038d42fe91fd753ddd780"}, + {file = "watchfiles-1.0.3-cp311-cp311-win32.whl", hash = "sha256:6a76494d2c5311584f22416c5a87c1e2cb954ff9b5f0988027bc4ef2a8a67181"}, + {file = "watchfiles-1.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:cf745cbfad6389c0e331786e5fe9ae3f06e9d9c2ce2432378e1267954793975c"}, + {file = "watchfiles-1.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:2dcc3f60c445f8ce14156854a072ceb36b83807ed803d37fdea2a50e898635d6"}, + {file = "watchfiles-1.0.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:93436ed550e429da007fbafb723e0769f25bae178fbb287a94cb4ccdf42d3af3"}, + {file = "watchfiles-1.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c18f3502ad0737813c7dad70e3e1cc966cc147fbaeef47a09463bbffe70b0a00"}, + {file = "watchfiles-1.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a5bc3ca468bb58a2ef50441f953e1f77b9a61bd1b8c347c8223403dc9b4ac9a"}, + {file = "watchfiles-1.0.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0d1ec043f02ca04bf21b1b32cab155ce90c651aaf5540db8eb8ad7f7e645cba8"}, + {file = "watchfiles-1.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f58d3bfafecf3d81c15d99fc0ecf4319e80ac712c77cf0ce2661c8cf8bf84066"}, + {file = "watchfiles-1.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1df924ba82ae9e77340101c28d56cbaff2c991bd6fe8444a545d24075abb0a87"}, + {file = "watchfiles-1.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:632a52dcaee44792d0965c17bdfe5dc0edad5b86d6a29e53d6ad4bf92dc0ff49"}, + {file = "watchfiles-1.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bf4b459d94a0387617a1b499f314aa04d8a64b7a0747d15d425b8c8b151da0"}, + {file = "watchfiles-1.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca94c85911601b097d53caeeec30201736ad69a93f30d15672b967558df02885"}, + {file = "watchfiles-1.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65ab1fb635476f6170b07e8e21db0424de94877e4b76b7feabfe11f9a5fc12b5"}, + {file = "watchfiles-1.0.3-cp312-cp312-win32.whl", hash = "sha256:49bc1bc26abf4f32e132652f4b3bfeec77d8f8f62f57652703ef127e85a3e38d"}, + {file = "watchfiles-1.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:48681c86f2cb08348631fed788a116c89c787fdf1e6381c5febafd782f6c3b44"}, + {file = "watchfiles-1.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:9e080cf917b35b20c889225a13f290f2716748362f6071b859b60b8847a6aa43"}, + {file = "watchfiles-1.0.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e153a690b7255c5ced17895394b4f109d5dcc2a4f35cb809374da50f0e5c456a"}, + {file = "watchfiles-1.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ac1be85fe43b4bf9a251978ce5c3bb30e1ada9784290441f5423a28633a958a7"}, + {file = "watchfiles-1.0.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec98e31e1844eac860e70d9247db9d75440fc8f5f679c37d01914568d18721"}, + {file = "watchfiles-1.0.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0179252846be03fa97d4d5f8233d1c620ef004855f0717712ae1c558f1974a16"}, + {file = "watchfiles-1.0.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:995c374e86fa82126c03c5b4630c4e312327ecfe27761accb25b5e1d7ab50ec8"}, + {file = "watchfiles-1.0.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29b9cb35b7f290db1c31fb2fdf8fc6d3730cfa4bca4b49761083307f441cac5a"}, + {file = "watchfiles-1.0.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f8dc09ae69af50bead60783180f656ad96bd33ffbf6e7a6fce900f6d53b08f1"}, + {file = "watchfiles-1.0.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:489b80812f52a8d8c7b0d10f0d956db0efed25df2821c7a934f6143f76938bd6"}, + {file = "watchfiles-1.0.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:228e2247de583475d4cebf6b9af5dc9918abb99d1ef5ee737155bb39fb33f3c0"}, + {file = "watchfiles-1.0.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1550be1a5cb3be08a3fb84636eaafa9b7119b70c71b0bed48726fd1d5aa9b868"}, + {file = "watchfiles-1.0.3-cp313-cp313-win32.whl", hash = "sha256:16db2d7e12f94818cbf16d4c8938e4d8aaecee23826344addfaaa671a1527b07"}, + {file = "watchfiles-1.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:160eff7d1267d7b025e983ca8460e8cc67b328284967cbe29c05f3c3163711a3"}, + {file = "watchfiles-1.0.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c05b021f7b5aa333124f2a64d56e4cb9963b6efdf44e8d819152237bbd93ba15"}, + {file = "watchfiles-1.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:310505ad305e30cb6c5f55945858cdbe0eb297fc57378f29bacceb534ac34199"}, + {file = "watchfiles-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddff3f8b9fa24a60527c137c852d0d9a7da2a02cf2151650029fdc97c852c974"}, + {file = "watchfiles-1.0.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46e86ed457c3486080a72bc837300dd200e18d08183f12b6ca63475ab64ed651"}, + {file = "watchfiles-1.0.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f79fe7993e230a12172ce7d7c7db061f046f672f2b946431c81aff8f60b2758b"}, + {file = "watchfiles-1.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea2b51c5f38bad812da2ec0cd7eec09d25f521a8b6b6843cbccedd9a1d8a5c15"}, + {file = "watchfiles-1.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fe4e740ea94978b2b2ab308cbf9270a246bcbb44401f77cc8740348cbaeac3d"}, + {file = "watchfiles-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9af037d3df7188ae21dc1c7624501f2f90d81be6550904e07869d8d0e6766655"}, + {file = "watchfiles-1.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:52bb50a4c4ca2a689fdba84ba8ecc6a4e6210f03b6af93181bb61c4ec3abaf86"}, + {file = "watchfiles-1.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c14a07bdb475eb696f85c715dbd0f037918ccbb5248290448488a0b4ef201aad"}, + {file = "watchfiles-1.0.3-cp39-cp39-win32.whl", hash = "sha256:be37f9b1f8934cd9e7eccfcb5612af9fb728fecbe16248b082b709a9d1b348bf"}, + {file = "watchfiles-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ef9ec8068cf23458dbf36a08e0c16f0a2df04b42a8827619646637be1769300a"}, + {file = "watchfiles-1.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:84fac88278f42d61c519a6c75fb5296fd56710b05bbdcc74bdf85db409a03780"}, + {file = "watchfiles-1.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c68be72b1666d93b266714f2d4092d78dc53bd11cf91ed5a3c16527587a52e29"}, + {file = "watchfiles-1.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:889a37e2acf43c377b5124166bece139b4c731b61492ab22e64d371cce0e6e80"}, + {file = "watchfiles-1.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca05cacf2e5c4a97d02a2878a24020daca21dbb8823b023b978210a75c79098"}, + {file = "watchfiles-1.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:8af4b582d5fc1b8465d1d2483e5e7b880cc1a4e99f6ff65c23d64d070867ac58"}, + {file = "watchfiles-1.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:127de3883bdb29dbd3b21f63126bb8fa6e773b74eaef46521025a9ce390e1073"}, + {file = "watchfiles-1.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713f67132346bdcb4c12df185c30cf04bdf4bf6ea3acbc3ace0912cab6b7cb8c"}, + {file = "watchfiles-1.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abd85de513eb83f5ec153a802348e7a5baa4588b818043848247e3e8986094e8"}, + {file = "watchfiles-1.0.3.tar.gz", hash = "sha256:f3ff7da165c99a5412fe5dd2304dd2dbaaaa5da718aad942dcb3a178eaa70c56"}, ] [package.dependencies] @@ -3824,13 +3831,13 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "win32-setctime" -version = "1.1.0" +version = "1.2.0" description = "A small Python utility to set file creation time on Windows" optional = false python-versions = ">=3.5" files = [ - {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, - {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, + {file = "win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390"}, + {file = "win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0"}, ] [package.extras] @@ -3949,4 +3956,4 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.0" python-versions = "^3.12.0" -content-hash = "a5546e6ca9e2714383c27369aca456b08df5e0bd5c10863681b67499d278e72d" +content-hash = "bdf64277d6ebce93c564ddd27029f195a3af620cf8cf34dc631aabdcc4334635" diff --git a/pyproject.toml b/pyproject.toml index 593ec85..18e5582 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,7 @@ tiktoken = "^0.8.0" pycryptodome = "^3.18.0" khl-py = "^0.3.16" matrix-nio = "^0.25.0" -attrs = "^23.1.0" +attrs = "^24.2.0" uvicorn = {extras = ["standard"], version = "^0.32.0"} pyjwt = {extras = ["crypto"], version = "^2.8.0"} pandas = "^2.2.0" @@ -53,7 +53,7 @@ future = "^1.0.0" fastapi = "^0.115.0" inputimeout = "^1.0.4" prompt-toolkit = "^3.0.47" -langconv = "0.3.0" +langconv = {git = "https://github.com/OasisAkari/langconv.py.git"} ff3 = "^1.0.2" orjson = "^3.10.9" jinja2 = "^3.1.4" diff --git a/requirements.txt b/requirements.txt index 7b3b21e..7dbf26b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,159 +1,127 @@ aiocqhttp==1.4.4 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" aiofile==3.9.0 ; python_full_version >= "3.12.0" and python_version < "4" aiofiles==24.1.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -aiogram==3.14.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -aiohappyeyeballs==2.4.3 ; python_version >= "3.12" and python_version < "4.0" -aiohttp-socks==0.9.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +aiogram==3.15.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +aiohappyeyeballs==2.4.4 ; python_version >= "3.12" and python_version < "4.0" +aiohttp-socks==0.9.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" aiohttp==3.10.11 ; python_version >= "3.12" and python_version < "4.0" aiosignal==1.3.1 ; python_version >= "3.12" and python_version < "4.0" -aliyun-python-sdk-core==2.16.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -aliyun-python-sdk-kms==2.16.5 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -annotated-types==0.7.0 ; python_full_version >= "3.12.0" and python_version < "4.0" -anyio==4.6.2.post1 ; python_full_version >= "3.12.0" and python_version < "4.0" -appdirs==1.4.4 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -apscheduler==3.10.4 ; python_version >= "3.12" and python_version < "4.0" -asyncio-dgram==2.2.0 ; python_full_version >= "3.12.0" and python_version < "4" -attrs==23.2.0 ; python_version >= "3.12" and python_version < "4.0" +annotated-types==0.7.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +anyio==4.7.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +apscheduler==3.11.0 ; python_version >= "3.12" and python_version < "4.0" +attrs==24.2.0 ; python_version >= "3.12" and python_version < "4.0" backoff==2.2.1 ; python_full_version >= "3.12.0" and python_version < "4.0" beautifulsoup4==4.12.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -blinker==1.8.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +blinker==1.9.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" botpy @ git+https://github.com/Teahouse-Studios/botpy.git@56c66983f36918fa433a71e1cb7db18a16825def ; python_version >= "3.12" and python_version < "4.0" caio==0.9.17 ; python_full_version >= "3.12.0" and python_version < "4" -certifi==2024.8.30 ; python_full_version >= "3.12.0" and python_version < "4.0" +cattrs==24.1.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +certifi==2024.8.30 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" cffi==1.17.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" and platform_python_implementation != "PyPy" cfgv==3.4.0 ; python_version >= "3.12" and python_version < "4.0" -charset-normalizer==3.4.0 ; python_full_version >= "3.12.0" and python_version < "4.0" +charset-normalizer==3.4.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" click==8.1.7 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -colorama==0.4.6 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" and (sys_platform == "win32" or platform_system == "Windows") -contourpy==1.3.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -crcmod==1.7 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +colorama==0.4.6 ; python_full_version >= "3.12.0" and python_version < "4.0" and (sys_platform == "win32" or platform_system == "Windows") +contourpy==1.3.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" cryptography==43.0.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" cycler==0.12.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" distlib==0.3.9 ; python_version >= "3.12" and python_version < "4.0" -distro==1.9.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -dnspython==2.7.0 ; python_full_version >= "3.12.0" and python_version < "4" -duckduckgo-search==6.3.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -emoji==2.14.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -fastapi==0.115.4 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +fastapi==0.115.6 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" feedparser==6.0.11 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" ff3==1.0.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" ffmpy==0.4.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" filelock==3.16.1 ; python_version >= "3.12" and python_version < "4.0" filetype==1.2.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -flask==3.0.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -flexcache==0.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -flexparser==0.3.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -fonttools==4.54.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +flask==3.1.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +fonttools==4.55.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" frozenlist==1.5.0 ; python_version >= "3.12" and python_version < "4.0" future==1.0.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -google-play-scraper==1.2.7 ; python_full_version >= "3.12.0" and python_version < "4.0" gql==3.5.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" graphql-core==3.2.5 ; python_full_version >= "3.12.0" and python_version < "4" greenlet==3.1.1 ; python_version < "3.13" and (platform_machine == "aarch64" or platform_machine == "ppc64le" or platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "AMD64" or platform_machine == "win32" or platform_machine == "WIN32") and python_full_version >= "3.12.0" -h11==0.14.0 ; python_full_version >= "3.12.0" and python_version < "4.0" +h11==0.14.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" h2==4.1.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" hpack==4.0.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -httpcore==1.0.6 ; python_full_version >= "3.12.0" and python_version < "4.0" +httpcore==1.0.7 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" httptools==0.6.4 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -httpx==0.27.2 ; python_full_version >= "3.12.0" and python_version < "4.0" +httpx==0.28.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" hypercorn==0.17.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" hyperframe==6.0.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -identify==2.6.1 ; python_version >= "3.12" and python_version < "4.0" +identify==2.6.3 ; python_version >= "3.12" and python_version < "4.0" idna==3.10 ; python_version >= "3.12" and python_version < "4.0" inputimeout==1.0.4 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -iso639-lang==2.5.0 ; python_full_version >= "3.12.0" and python_version < "4.0" +iso639-lang==2.5.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" itsdangerous==2.2.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -jaraco-context==6.0.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" jinja2==3.1.4 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -jiter==0.7.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -jmespath==0.10.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -jsonpatch==1.33 ; python_full_version >= "3.12.0" and python_version < "4.0" -jsonpointer==3.0.0 ; python_full_version >= "3.12.0" and python_version < "4.0" jsonschema-specifications==2024.10.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" jsonschema==4.23.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" khl-py==0.3.17 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" kiwisolver==1.4.7 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -langchain-core==0.3.15 ; python_full_version >= "3.12.0" and python_version < "4.0" -langchain-text-splitters==0.3.2 ; python_full_version >= "3.12.0" and python_version < "4.0" -langchain==0.3.7 ; python_full_version >= "3.12.0" and python_version < "4.0" -langconv==0.3.0 ; python_full_version >= "3.12.0" and python_version < "4.0" -langsmith==0.1.139 ; python_full_version >= "3.12.0" and python_version < "4.0" -loguru==0.7.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +langconv @ git+https://github.com/OasisAkari/langconv.py.git@975ee0896096b63148f0930db762607a5a2113df ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +loguru==0.7.3 ; python_full_version >= "3.12.0" and python_version < "4.0" magic-filter==1.0.12 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" markupsafe==3.0.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -matplotlib==3.9.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +matplotlib==3.9.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" matrix-nio==0.25.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -mcstatus==11.1.1 ; python_full_version >= "3.12.0" and python_version < "4" -more-itertools==10.5.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" multidict==6.1.0 ; python_version >= "3.12" and python_version < "4.0" nodeenv==1.9.1 ; python_version >= "3.12" and python_version < "4.0" -numpy==1.26.4 ; python_version >= "3.12" and python_version < "4.0" -openai==1.54.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -orjson==3.10.11 ; python_full_version >= "3.12.0" and python_version < "4.0" -oss2==2.19.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -packaging==24.1 ; python_full_version >= "3.12.0" and python_version < "4.0" +numpy==1.26.4 ; python_version >= "3.12" and python_full_version < "4.0.0" +orjson==3.10.12 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +packaging==24.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" pandas==2.2.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" pillow==11.0.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -pint==0.24.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" platformdirs==4.3.6 ; python_version >= "3.12" and python_version < "4.0" pre-commit==4.0.1 ; python_version >= "3.12" and python_version < "4.0" -primp==0.7.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" priority==2.0.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" prompt-toolkit==3.0.48 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -propcache==0.2.0 ; python_version >= "3.12" and python_version < "4.0" +propcache==0.2.1 ; python_version >= "3.12" and python_version < "4.0" psutil==6.1.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" py-cord==2.6.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" py-cpuinfo==9.0.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" pycparser==2.22 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" and platform_python_implementation != "PyPy" pycryptodome==3.21.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" pycryptodomex==3.21.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -pydantic-core==2.23.4 ; python_full_version >= "3.12.0" and python_version < "4.0" -pydantic==2.9.2 ; python_full_version >= "3.12.0" and python_version < "4.0" -pyjwt[crypto]==2.9.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +pydantic-core==2.23.4 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +pydantic==2.9.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +pyjwt[crypto]==2.10.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" pymysql==1.1.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" pyparsing==3.2.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" python-dateutil==2.9.0.post0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" python-dotenv==1.0.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" python-socks[asyncio]==2.5.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -python-whois==0.9.4 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -pytz==2024.2 ; python_version >= "3.12" and python_version < "4.0" +pytz==2024.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" pywin32==306 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" and sys_platform == "win32" pyyaml==6.0.2 ; python_version >= "3.12" and python_version < "4.0" qq-botpy==1.2.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -quart==0.19.8 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +quart==0.19.9 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" referencing==0.35.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -regex==2024.9.11 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -requests-toolbelt==1.0.0 ; python_full_version >= "3.12.0" and python_version < "4.0" -requests==2.32.3 ; python_full_version >= "3.12.0" and python_version < "4.0" -rpds-py==0.20.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -setuptools==75.3.0 ; python_full_version >= "3.12.0" and python_version < "4" +regex==2024.11.6 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +requests==2.32.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +rpds-py==0.22.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" sgmllib3k==1.0.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" simpleeval==1.0.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -six==1.16.0 ; python_version >= "3.12" and python_version < "4.0" -sniffio==1.3.1 ; python_full_version >= "3.12.0" and python_version < "4.0" +six==1.17.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +sniffio==1.3.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" soupsieve==2.6 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -sqlalchemy==2.0.36 ; python_full_version >= "3.12.0" and python_version < "4.0" -starlette==0.41.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +sqlalchemy==2.0.36 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +starlette==0.41.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" tabulate==0.9.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -tenacity==9.0.0 ; python_full_version >= "3.12.0" and python_version < "4.0" +tenacity==9.0.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" tiktoken==0.8.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" tomlkit==0.13.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -tqdm==4.66.6 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -typing-extensions==4.12.2 ; python_full_version >= "3.12.0" and python_version < "4.0" +typing-extensions==4.12.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" tzdata==2024.2 ; python_version >= "3.12" and python_version < "4.0" tzlocal==5.2 ; python_version >= "3.12" and python_version < "4.0" unpaddedbase64==2.1.0 ; python_full_version >= "3.12.0" and python_version < "4.0" -urllib3==2.2.3 ; python_full_version >= "3.12.0" and python_version < "4.0" -uvicorn[standard]==0.32.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +urllib3==2.2.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +uvicorn[standard]==0.32.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" uvloop==0.21.0 ; (sys_platform != "win32" and sys_platform != "cygwin") and platform_python_implementation != "PyPy" and python_full_version >= "3.12.0" and python_full_version < "4.0.0" -virtualenv==20.27.1 ; python_version >= "3.12" and python_version < "4.0" -watchfiles==0.24.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +virtualenv==20.28.0 ; python_version >= "3.12" and python_version < "4.0" +watchfiles==1.0.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" wcwidth==0.2.13 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -webcolors==24.8.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -websockets==13.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -werkzeug==3.1.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -win32-setctime==1.1.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" and sys_platform == "win32" -wolframalpha==5.1.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +webcolors==24.11.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +websockets==14.1 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +werkzeug==3.1.3 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" +win32-setctime==1.2.0 ; python_full_version >= "3.12.0" and python_version < "4.0" and sys_platform == "win32" wsproto==1.2.0 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -xmltodict==0.14.2 ; python_full_version >= "3.12.0" and python_full_version < "4.0.0" -yarl==1.17.1 ; python_version >= "3.12" and python_version < "4.0" +yarl==1.18.3 ; python_version >= "3.12" and python_version < "4.0"