aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author简律纯 <i@jyunko.cn>2024-06-17 03:52:59 +0800
committer简律纯 <i@jyunko.cn>2024-06-17 03:52:59 +0800
commit525de52d687b44fb14be7da2c46c548eb8a32fbd (patch)
treef696587114334a87bcc672f08b9c161d797abf13
parent5597a8af382e256951d3813aad1cedf41fcde9ac (diff)
downloadHydroRoll-525de52d687b44fb14be7da2c46c548eb8a32fbd.tar.gz
HydroRoll-525de52d687b44fb14be7da2c46c548eb8a32fbd.zip
refactor(examples): update file tree
-rw-r--r--.gitignore6
-rw-r--r--.gitmodules6
-rw-r--r--.vscode/settings.json6
-rw-r--r--README.rst41
-rw-r--r--docs/Makefile2
-rw-r--r--docs/source/community/code-of-conduct.rst109
-rw-r--r--docs/source/community/index.rst3
-rw-r--r--examples/config.toml12
-rw-r--r--examples/plugins/.gitkeep (renamed from examples/plugins/HydroRoll/command/ROUTES)0
-rw-r--r--examples/plugins/HydroRoll/__init__.py151
-rw-r--r--examples/plugins/HydroRoll/command/__init__.py74
-rw-r--r--examples/plugins/HydroRoll/command/alias_command.py4
-rw-r--r--examples/plugins/HydroRoll/command/get_command.py4
-rw-r--r--examples/plugins/HydroRoll/command/set_command.py4
-rw-r--r--examples/plugins/HydroRoll/command/typing.py4
-rw-r--r--examples/plugins/HydroRoll/config.py110
-rw-r--r--examples/plugins/HydroRoll/exceptions.py0
-rw-r--r--examples/plugins/HydroRoll/models/Transformer.py9
-rw-r--r--examples/plugins/HydroRoll/models/__init__.py0
-rw-r--r--examples/plugins/HydroRoll/models/cos_sim.py100
-rw-r--r--examples/plugins/HydroRoll/models/hola.py62
-rw-r--r--examples/plugins/HydroRoll/utils.py170
-rw-r--r--examples/plugins/cachetool.py2
-rw-r--r--examples/plugins/draftbottles/__init__.py48
-rw-r--r--examples/plugins/draftbottles/config.py52
-rw-r--r--examples/plugins/draftbottles/database.py11
-rw-r--r--examples/plugins/draftbottles/inspector.py128
-rw-r--r--examples/plugins/draftbottles/permission.py10
-rw-r--r--examples/plugins/draftbottles/workroutes.py9
-rw-r--r--examples/plugins/lua.py64
-rw-r--r--examples/plugins/nivis.❄295
-rw-r--r--examples/plugins/snow.nivis44
m---------hydro_roll_core0
m---------nivis_python0
-rw-r--r--pdm.lock494
-rw-r--r--pyproject.toml9
-rw-r--r--src/lib.rs3
-rw-r--r--tests/lua_in_python.py23
38 files changed, 614 insertions, 1455 deletions
diff --git a/.gitignore b/.gitignore
index 19c3f01..e7c4dfa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -182,3 +182,9 @@ docs/_build/
# Pyenv
.python-version
+
+# examples
+examples/config.toml
+examples/HydroRoll/**
+examples/plugins/**/*.py
+examples/logs/**/*.log \ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
index 9c4d6d0..7fd6566 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -2,7 +2,7 @@
path = hydro_roll_core
url = https://github.com/HydroRoll-Team/HydroRollCore
branch = main
-[submodule "nivis_python"]
- path = nivis_python
- url = https://github.com/HydroRoll-Team/nivis-python
+[submodule "TRPGNivis"]
+ path = TRPGNivis
+ url = https://github.com/HydroRoll-Team/TRPGNivis
branch = main \ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 13e56dc..8667400 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -30,5 +30,9 @@
"python.formatting.provider": "none",
"restructuredtext.preview.docutils.disabled": true,
"iis.configDir": "",
- "restructuredtext.preview.name": "docutils"
+ "restructuredtext.preview.name": "docutils",
+ "Lua.diagnostics.globals": [
+ "setGroupConf",
+ "getGroupConf"
+ ]
} \ No newline at end of file
diff --git a/README.rst b/README.rst
index b45cd80..fb1e904 100644
--- a/README.rst
+++ b/README.rst
@@ -9,7 +9,7 @@
.. start-index
跨平台、多模态、高度自定义的骰系开发框架
-==================================
+========================================
欢迎来到 *HydroRoll* [水系],一个依据科学架构并由多模态模型赋能,使用 *Rust* 与 *Python* 编写的高性能、跨平台骰系开发框架。
@@ -31,7 +31,7 @@
.. end-index
安装与使用
------
+----------
在安装 **3.9+** 版本的 *Python* 之后,请先全局安装 *pdm* 依赖,接着全局安装 *hydro_roll* 包。
@@ -53,7 +53,7 @@
更多详细的使用方法请参考 `官方文档`_。
开发示例
-----
+--------
你可以选择从框架端开始开发水系骰子。
@@ -84,27 +84,28 @@
python main.py
知识问答
-----
+--------
“谁适合水系?”
-
- - 世界主——规则书作者。水系基于通用规则包(规则书的 *Python* 实现)标准架构,可以为你一键生成规则书
- 的 *pdf* 版本与一个在线规则书浏览站点,同时允许你在规则包内自定义高优先级的骰系内建指令。一个规则
- 包,便是一个骰系。
- - 插件爱好者——下游插件开发者。水系插件可用 *lua*、 *python*、 *javascript* 编写,同时,支持在线将其他骰
- 系的插件文件(如 *shiki* 的 *lua* 脚本,青果的 *python* 插件,海豹的 *js* 插件等)转换为水系对应语言的插
- 件脚本实现,另有使用 *Blockly* 搭建的可视化编程站点,轻松编写插件脚本。
- - 机器学习爱好者。水系继承自多模态机器学习框架 *iamai*,能够同时训练与推理多个模型,试想你的骰子拥有
- 自己的独特人格...
-
- - 渴望游玩冷门规则的 *kp* 与 *pl*。
+~~~~~~~~~~~~~~~~~
+
+- 世界主——规则书作者。水系基于通用规则包(规则书的 *Python* 实现)标准架构,可以为你一键生成规则书
+ 的 *pdf* 版本与一个在线规则书浏览站点,同时允许你在规则包内自定义高优先级的骰系内建指令。一个规则
+ 包,便是一个骰系。
+- 插件爱好者——下游插件开发者。水系插件可用 *lua*、 *python*、 *javascript* 编写,同时,支持在线将其他骰
+ 系的插件文件(如 *shiki* 的 *lua* 脚本,青果的 *python* 插件,海豹的 *js* 插件等)转换为水系对应语言的插
+ 件脚本实现,另有使用 *Blockly* 搭建的可视化编程站点,轻松编写插件脚本。
+- 机器学习爱好者。水系继承自多模态机器学习框架 *iamai*,能够同时训练与推理多个模型,试想你的骰子拥有
+ 自己的独特人格...
+- 渴望游玩冷门规则的 *kp* 与 *pl*。
“水系是什么?水系不是什么?”
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 水系是一个骰系开发框架,允许你方便快捷的开发自己的骰系。抛开人工智能模块的水系的第一用户是世界主。
+水系是一个骰系开发框架,允许你方便快捷的开发自己的骰系。抛开人工智能模块的水系的第一用户是世界主。
- 水系不是一个具体的骰系,但是水系有一个官方的规则书实现。在水系社区,骰系概念是被弱化的,一个加载了
- 独特的规则包的骰子,便是一个骰系(针对此规则包所对应的规则书而言)。
+水系不是一个具体的骰系,但是水系有一个官方的规则书实现。在水系社区,骰系概念是被弱化的,一个加载了
+独特的规则包的骰子,便是一个骰系(针对此规则包所对应的规则书而言)。
----
@@ -136,7 +137,7 @@
:alt: Ruff
.. |logo_icon| image:: https://cdn.jsdelivr.net/gh/HydroRoll-Team/HydroRoll@main/site/src/assets/image/logo.png
:target: https://hydroroll.team/
- :align: right
+ :align: bottom
:alt: HydroRoll Logo
:height: 128
.. |docs| image:: https://img.shields.io/badge/DOCS%20AND%20BLOGS-000000.svg?logo=Vercel&labelColor=000&style=flat-square
@@ -150,7 +151,7 @@
.. |official site| image:: https://img.shields.io/badge/官网-2255aa.svg?logo=data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/CgoK/woKCv8GBgb/BgYG/woKCv8KCgr/AgIC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BgYG/0ZGRv9MTEz/JiYm/ygoKP9MTEz/RkZG/wYGBv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9ycnL/Li4u/1xcXP9eXl7/Li4u/3Jycv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP88PDz/cnJy/05OTv9OTk7/UFBQ/05OTv9wcHD/Pj4+/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Kioq/3Jycv9cXFz/TExM/05OTv9aWlr/cHBw/yoqKv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Pj4+/zg4OP+AgID/Pj4+/2ZmZv9oaGj/PDw8/4CAgP86Ojr/Pj4+/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ywsLP9iYmL/enp6/zIyMv90dHT/dHR0/zAwMP98fHz/YmJi/ywsLP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9SUlL/PDw8/3Jycv9CQkL/UlJS/1RUVP9CQkL/cnJy/zw8PP9SUlL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/VFRU/yIiIv9aWlr/PDw8/zw8PP8+Pj7/PDw8/1hYWP8iIiL/VFRU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zQ0NP9CQkL/ZmZm/yIiIv9WVlb/WFhY/yIiIv9mZmb/QkJC/zY2Nv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9QUFD/BgYG/0RERP9KSkr/JCQk/yYmJv9KSkr/RERE/wgICP9QUFD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CgoK/wICAv8KCgr/CgoK/wYGBv8GBgb/CgoK/woKCv8CAgL/CgoK/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==&labelColor=gray&logoWidth=20&logoColor=white&style=flat-square
:target: https://hydroroll.team/
.. |crates_v| image:: https://img.shields.io/crates/v/hydro_roll?logo=rust&color=red
- :target: https://crates.io/crates/hydro_roll)
+ :target: https://crates.io/crates/hydro_roll
.. |release_img| image:: https://github.com/HydroRoll-Team/HydroRoll/actions/workflows/release.yml/badge.svg
:target: https://github.com/HydroRoll-Team/HydroRoll/actions/workflows/release.yml
.. |license icon| image:: https://app.fossa.com/api/projects/git%2Bgithub.com%2FHydroRoll-Team%2FHydroRoll.svg?type=shield&issueType=license
diff --git a/docs/Makefile b/docs/Makefile
index fc24907..6fdb78c 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -5,7 +5,7 @@
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
-SOURCEDIR = .
+SOURCEDIR = source
BUILDDIR = _build
SPHINXINTL ?= sphinx-intl
lang ?= zh_CN
diff --git a/docs/source/community/code-of-conduct.rst b/docs/source/community/code-of-conduct.rst
new file mode 100644
index 0000000..977e032
--- /dev/null
+++ b/docs/source/community/code-of-conduct.rst
@@ -0,0 +1,109 @@
+贡献者公约
+==========
+
+我们的承诺
+---------
+
+身为社区成员、贡献者和领袖,我们承诺使社区参与者不受骚扰,无论其年龄、体型、可见或不可见的缺陷、族裔、性征、性别认同和表达、经验水平、教育程度、社会与经济地位、国籍、相貌、种族、种姓、肤色、宗教信仰、性倾向或性取向如何。
+
+我们承诺以有助于建立开放、友善、多样化、包容、健康社区的方式行事和互动。
+
+
+我们的准则
+---------
+
+有助于为我们的社区创造积极环境的行为例子包括但不限于:
+
+* 表现出对他人的同情和善意
+* 尊重不同的主张、观点和感受
+* 提出和大方接受建设性意见
+* 承担责任并向受我们错误影响的人道歉
+* 注重社区共同诉求,而非个人得失
+
+不当行为例子包括:
+
+* 使用情色化的语言或图像,及性引诱或挑逗
+* 嘲弄、侮辱或诋毁性评论,以及人身或政治攻击
+* 公开或私下的骚扰行为
+* 未经他人明确许可,公布他人的私人信息,如物理或电子邮件地址
+* 其他有理由认定为违反职业操守的不当行为
+
+
+责任和权力
+---------
+
+社区领袖有责任解释和落实我们所认可的行为准则,并妥善公正地对他们认为不当、威胁、冒犯或有害的任何行为采取纠正措施。
+
+社区领导有权力和责任删除、编辑或拒绝或拒绝与本行为准则不相符的评论(comment)、提交(commits)、代码、维基(wiki)编辑、议题(issues)或其他贡献,并在适当时机知采取措施的理由。
+
+
+适用范围
+--------
+
+本行为准则适用于所有社区场合,也适用于在公共场所代表社区时的个人。
+
+代表社区的情形包括使用官方电子邮件地址、通过官方社交媒体帐户发帖或在线上或线下活动中担任指定代表。
+
+
+监督
+----
+
+辱骂、骚扰或其他不可接受的行为可通过 [插入联系方式] 向负责监督的社区领袖报告。
+所有投诉都将得到及时和公平的审查和调查。
+
+所有社区领袖都有义务尊重任何事件报告者的隐私和安全。
+
+
+处理方针
+--------
+
+社区领袖将遵循下列社区处理方针来明确他们所认定违反本行为准则的行为的处理方式:
+
+
+1. 纠正
+^^^^^^^
+
+**社区影响**:使用不恰当的语言或其他在社区中被认定为不符合职业道德或不受欢迎的行为。
+
+**处理意见**:由社区领袖发出非公开的书面警告,明确说明违规行为的性质,并解释举止如何不妥。或将要求公开道歉。
+
+
+2. 警告
+^^^^^^^
+
+**社区影响**:单个或一系列违规行为。
+
+**处理意见**:警告并对连续性行为进行处理。在指定时间内,不得与相关人员互动,包括主动与行为准则执行者互动。这包括避免在社区场所和外部渠道中的互动。违反这些条款可能会导致临时或永久封禁。
+
+
+3. 临时封禁
+^^^^^^^^^^^
+
+**社区影响**: 严重违反社区准则,包括持续的不当行为。
+
+**处理意见**: 在指定时间内,暂时禁止与社区进行任何形式的互动或公开交流。在此期间,不得与相关人员进行公开或私下互动,包括主动与行为准则执行者互动。违反这些条款可能会导致永久封禁。
+
+
+4. 永久封禁
+^^^^^^^^^^^
+
+**社区影响**:行为模式表现出违反社区准则,包括持续的不当行为、骚扰个人或攻击或贬低某个类别的个体。
+
+**处理意见**:永久禁止在社区内进行任何形式的公开互动。
+
+
+参见
+----
+
+本行为准则改编自 [Contributor Covenant][homepage] 2.1 版, 参见 [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]。
+
+社区处理方针灵感来源于 [Mozilla's code of conduct enforcement ladder][Mozilla CoC]。
+
+有关本行为准则的常见问题的答案,参见 [https://www.contributor-covenant.org/faq][FAQ]。
+其他语言翻译参见 [https://www.contributor-covenant.org/translations][translations]。
+
+[homepage]: https://www.contributor-covenant.org
+[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
+[Mozilla CoC]: https://github.com/mozilla/diversity
+[FAQ]: https://www.contributor-covenant.org/faq
+[translations]: https://www.contributor-covenant.org/translations
diff --git a/docs/source/community/index.rst b/docs/source/community/index.rst
index 5d3b92c..f4ecb13 100644
--- a/docs/source/community/index.rst
+++ b/docs/source/community/index.rst
@@ -5,4 +5,5 @@
asset_library/index
channels
- tutorials \ No newline at end of file
+ tutorials
+ code-of-conduct \ No newline at end of file
diff --git a/examples/config.toml b/examples/config.toml
index debfa20..e1f9f37 100644
--- a/examples/config.toml
+++ b/examples/config.toml
@@ -6,20 +6,20 @@ rule_dirs = ["rules"]
adapters = [
"iamai.adapter.onebot11",
# "iamai.adapter.gensokyo",
- # "iamai.adapter.apscheduler",
+ "iamai.adapter.apscheduler",
# "iamai.adapter.dingtalk"
-]
+]
[bot.log]
level = "INFO"
verbose_exception = true
[adapter.onebot11]
-adapter_type = "reverse-ws"
+adapter_type = "ws"
host = "127.0.0.1"
-port = 8080
-url = "/cqhttp/ws"
-show_raw = true
+port = 3002
+# url = "/onebot"
+# show_raw = true
[adapter.gensokyo]
adapter_type = "reverse-ws"
diff --git a/examples/plugins/HydroRoll/command/ROUTES b/examples/plugins/.gitkeep
index e69de29..e69de29 100644
--- a/examples/plugins/HydroRoll/command/ROUTES
+++ b/examples/plugins/.gitkeep
diff --git a/examples/plugins/HydroRoll/__init__.py b/examples/plugins/HydroRoll/__init__.py
deleted file mode 100644
index 8a5cd74..0000000
--- a/examples/plugins/HydroRoll/__init__.py
+++ /dev/null
@@ -1,151 +0,0 @@
-"""中间件"""
-import re
-import json
-import joblib
-import os
-import shutil
-
-import oneroll
-from iamai import ConfigModel, Plugin
-from iamai.log import logger
-from iamai.exceptions import GetEventTimeout
-from iamai.event import MessageEvent, Event
-from iamai.typing import StateT
-
-from .config import Directory, GlobalConfig, Models
-from .utils import *
-from .models.Transformer import query
-
-from .config import (
- BasePluginConfig,
- CommandPluginConfig,
- RegexPluginConfig,
- GlobalConfig,
-)
-
-from ast import literal_eval
-from os.path import dirname, join, abspath
-from abc import ABC, abstractmethod
-from typing import Any, Generic, TypeVar
-from typing_extensions import Annotated
-
-ConfigT = TypeVar("ConfigT", bound=BasePluginConfig)
-RegexPluginConfigT = TypeVar("RegexPluginConfigT", bound=RegexPluginConfig)
-CommandPluginConfigT = TypeVar("CommandPluginConfigT", bound=CommandPluginConfig)
-
-
-BASE_DIR = dirname(abspath("__file__"))
-HYDRO_DIR = dirname(abspath(__file__))
-APP_DIR = join(BASE_DIR, "HydroRoll")
-
-# logger.info(GlobalConfig._copyright)
-
-
-class Dice(Plugin[MessageEvent, Annotated[dict, {}], RegexPluginConfig]):
- """中间件"""
-
- priority = 0
-
- # TODO: infini should be able to handle all signals and tokens from Psi.
- logger.info("Loading infini...")
-
- def __post_init__(self):
- self.state = {}
- self.model_path_list = []
- self.bot.global_state["HydroRoll"] = {}
- self.model_dict = Models().get_models_dict()
-
- self.model_path_list.append(join(BASE_DIR, "models"))
- self.model_path_list.append(join(HYDRO_DIR, "models"))
- self.model_path_list.append(join(BASE_DIR, "HydroRoll", "models"))
-
- self.load_models()
-
- async def handle(self) -> None:
- """
- @TODO: infini should be able to handle all signals and tokens from Psi.
- @BODY: infini actives the rule-packages.
- """
- global flag
-
- args = self.event.get_plain_text().split(" ")
- command_list = ["/r", ".root", ".roots", ".core", ".set", ".get", ".test"]
- current_cmd = args[0]
- text = (
- self.event.get_plain_text()[2:]
- if len(self.event.get_plain_text()) >= 2
- else None
- )
- flag = True in [cmd.startswith(current_cmd) for cmd in command_list]
- # logger.info(f"Command {current_cmd} not found with flag {flag}")
- logger.info(f"text: {text}")
- if text and self.event.get_plain_text().startswith("/r"):
- logger.info(text)
- try:
- await self.event.reply(f"{oneroll.roll(text)}")
- except Exception as e:
- await self.event.reply(f"{e!r}")
- if args[0] in [".root", ".roots"]:
- try:
- import aiohttp
-
- async with aiohttp.ClientSession() as session:
- async with session.get(
- "https://api.hydroroll.team/api/roots"
- ) as response:
- data = await response.json()
- await self.event.reply(data["line"])
- except Exception as e:
- await self.event.reply(f"{e!r}")
- elif args[0] == ".core":
- await self.event.reply(f"{self.state}")
- # if args[0].startswith(".set"):
- # resolve = Set(args[1:]) # TODO: handle multiple sets
- # elif args[0].startswith(".get"):
- # resolve = Get(args[1:]) # TODO: handle multiple gets
- elif args[0].startswith(".test"):
- try:
- result = eval(self.event.message.get_plain_text()[5:])
- await self.event.reply(str(result))
- except Exception as error:
- await self.event.reply(f"{error!r}")
-
- async def rule(self) -> bool:
- """
- @TODO: Psi should be able to handle all message first.
- @BODY: lexer module will return a list of tokens, parser module will parse the tokens into a tree, and executor module will execute the tokens with a stack with a bool return value.
- """
- logger.info("loading psi...")
- return isinstance(self.event, MessageEvent)
-
- def _init_directory(self, _prefix: str = ""):
- """初始化水系目录"""
- for _ in Directory(BASE_DIR).get_dice_dir_list(_prefix):
- if not os.path.exists(_):
- os.makedirs(_)
-
- def _init_file(self, _prefix: str = ""):
- """初始化文件"""
-
- def init_directory(self, _prefix: str = "HydroRoll"):
- """在指定目录生成水系文件结构"""
- self._init_directory(_prefix=_prefix)
-
- def _load_model(self, path: str, model_file: str):
- if model_file is None:
- model_file = ""
- return joblib.load(join(path, f"{model_file}"))
-
- def _load_models(self, model_path_list: list, model_dict: dict) -> dict:
- """加载指定模型, 当然也可能是数据集"""
- models = {}
- for path in model_path_list:
- for model_name, model_file in model_dict.items():
- if os.path.exists(join(path, model_file)):
- models[model_name] = self._load_model(path, model_file)
- logger.success(f'Succeeded to load model "{model_name}"')
- return models
-
- def load_models(self):
- """我想睡觉, 但我失眠了。"""
- self.models = self._load_models(self.model_path_list, self.model_dict)
diff --git a/examples/plugins/HydroRoll/command/__init__.py b/examples/plugins/HydroRoll/command/__init__.py
deleted file mode 100644
index ec4be24..0000000
--- a/examples/plugins/HydroRoll/command/__init__.py
+++ /dev/null
@@ -1,74 +0,0 @@
-SET, GET, ALIAS = ("SET", "GET", "ALIAS")
-INTEGER = "INTEGER"
-EOF = "EOF"
-
-class Token(object):
- def __init__(self, type, value):
- self.type = type
- self.value = value
-
- def __str__(self):
- return f"Token({self.type}, {self.value}"
-
- def __repr__(self) -> str:
- return self.__str__()
-
-
-class Lexer(object):
- def __init__(self, text):
- self.text = text
- self.pos = 0
- self.current_char = self.text[self.pos]
-
- def error(self):
- raise Exception("Invalid Character")
-
- def advance(self):
- """Advance the `pos` pointer and set the `current_char` variable."""
- self.pos += 1
- if self.pos > len(self.text) - 1:
- self.current_char = None # Indicates end of input
- else:
- self.current_char = self.text[self.pos]
-
- def skip_whitespace(self):
- while self.current_char is not None and self.current_char.isspace():
- self.advance()
-
- def integer(self):
- """Return a (multidigit) integer consumed from the input."""
- result = ""
- while self.current_char is not None and self.current_char.isdigit():
- result += self.current_char
- self.advance()
- return int(result)
-
- def get_next_token(self):
- """Lexical analyzer (also known as scanner or tokenizer)
-
- This method is responsible for breaking a sentence
- apart into tokens. One token at a time.
- """
- while self.current_char is not None:
- if self.current_char.isspace():
- self.skip_whitespace()
- continue
-
- if self.current_char.isdigit():
- return Token(INTEGER, self.integer())
-
- if self.current_char == "get":
- self.advance()
- return Token(GET, "get")
-
- if self.current_char == "set":
- self.advance()
- return Token(SET, "set")
-
- if self.current_char == "Alias":
- self.advance()
- return Token(ALIAS, "Alias")
-
- self.error()
-
- return Token(EOF, None)
diff --git a/examples/plugins/HydroRoll/command/alias_command.py b/examples/plugins/HydroRoll/command/alias_command.py
deleted file mode 100644
index 462c062..0000000
--- a/examples/plugins/HydroRoll/command/alias_command.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from .typing import CommandBase
-
-class AliasCommand(CommandBase):
- ... \ No newline at end of file
diff --git a/examples/plugins/HydroRoll/command/get_command.py b/examples/plugins/HydroRoll/command/get_command.py
deleted file mode 100644
index b8a8a96..0000000
--- a/examples/plugins/HydroRoll/command/get_command.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from .typing import CommandBase
-
-class GetCommand(CommandBase):
- ... \ No newline at end of file
diff --git a/examples/plugins/HydroRoll/command/set_command.py b/examples/plugins/HydroRoll/command/set_command.py
deleted file mode 100644
index 1f1d4dd..0000000
--- a/examples/plugins/HydroRoll/command/set_command.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from .typing import CommandBase
-
-class SetCommand(CommandBase):
- ... \ No newline at end of file
diff --git a/examples/plugins/HydroRoll/command/typing.py b/examples/plugins/HydroRoll/command/typing.py
deleted file mode 100644
index b52d4a6..0000000
--- a/examples/plugins/HydroRoll/command/typing.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from pydantic import BaseModel
-
-class CommandBase(BaseModel):
- ... \ No newline at end of file
diff --git a/examples/plugins/HydroRoll/config.py b/examples/plugins/HydroRoll/config.py
deleted file mode 100644
index c380a01..0000000
--- a/examples/plugins/HydroRoll/config.py
+++ /dev/null
@@ -1,110 +0,0 @@
-from randomgen import AESCounter
-from numpy.random import Generator
-import argparse
-import sys
-from os.path import dirname, dirname, join, abspath
-import platform
-from importlib.metadata import version
-import os
-from typing import Set, Optional
-from iamai import ConfigModel
-import datetime
-
-from typing import Set
-
-from pydantic import Field
-
-
-class BasePluginConfig(ConfigModel):
- message_str: str = "{message}"
- """最终发送消息的格式。"""
-
-
-class RegexPluginConfig(BasePluginConfig):
- pass
-
-
-class CommandPluginConfig(RegexPluginConfig):
- __config_name__ = "HydroRoll"
- command_prefix: Set[str] = Field(default_factory=lambda: {".", "。"})
- """命令前缀。"""
- command: Set[str] = Field(default_factory=set)
- """命令文本。"""
- ignore_case: bool = True
- """忽略大小写。"""
-
-
-class Color:
- # 定义ANSI转义序列
- RESET = "\033[0m"
- BLUE_BASE = "\033[36m"
- BLUE_DARK = "\033[34m"
- BLUE_DARKER = "\033[32m"
- BLUE_DARKEST = "\033[30m"
-
-
-# 定义全局配置类
-class GlobalConfig:
- _name = "HydroRoll[水系]"
- _version = "0.1.0"
- _svn = "2"
- _author = "简律纯"
- _iamai_version = version("iamai")
- _python_ver = sys.version
- _python_ver_raw = ".".join(map(str, platform.python_version_tuple()[:3]))
- _base_dir = dirname(abspath("__file__"))
- _hydro_dir = dirname(abspath(__file__))
- _copyright = f"""\033[36m
- _ __ _ _
- /\ /\_ _ __| |_ __ ___ /__\ ___ | | |
- / /_/ / | | |/ _` | '__/ _ \ / \/// _ \| | |
-/ __ /| |_| | (_| | | | (_) / _ \ (_) | | |
-\/ /_/ \__, |\__,_|_| \___/\/ \_/\___/|_|_|
- |___/
-
-\033[4m{_name} [版本 {_version}]\033[0m\033[36m
-(c) HydroRoll-Team contributors, {_author}。
-Github: https://github.com/HydroRoll-Team
-Under the MIT License, see LICENSE for more details.
-"""
-
-
-class Directory(object):
- def __init__(self, _path: str) -> None:
- self.current_path = _path
-
- def get_dice_dir_list(self, _prefix: str) -> list:
- return [
- os.path.join(self.current_path, f"{_prefix}", *dirs)
- for dirs in [
- ["config"],
- ["data"],
- ["rules"],
- ["scripts", "lua"],
- ["scripts", "js"],
- ["scripts", "psi"],
- ["web", "frontend"],
- ["web", "backend"],
- ]
- ]
-
-
-class FileManager(object):
- def __init__(self, _path: str) -> None:
- self.current_path = _path
-
- def get_file_list(self, _dir: str):
- return {
- "web;frontend": "index.html",
- "data": "censor.json",
- }
-
-
-class Models:
- """模型管理类"""
-
- def __init__(self) -> None:
- self.builtin_models = {"hola": "hola.pkl"}
-
- def get_models_dict(self) -> dict:
- return self.builtin_models
diff --git a/examples/plugins/HydroRoll/exceptions.py b/examples/plugins/HydroRoll/exceptions.py
deleted file mode 100644
index e69de29..0000000
--- a/examples/plugins/HydroRoll/exceptions.py
+++ /dev/null
diff --git a/examples/plugins/HydroRoll/models/Transformer.py b/examples/plugins/HydroRoll/models/Transformer.py
deleted file mode 100644
index b52422e..0000000
--- a/examples/plugins/HydroRoll/models/Transformer.py
+++ /dev/null
@@ -1,9 +0,0 @@
-import requests
-
-API_URL = "https://api-inference.huggingface.co/models/sentence-transformers/all-MiniLM-L6-v2"
-headers = {"Authorization": "Bearer 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"}
-
-def query(payload):
- response = requests.post(API_URL, headers=headers, json=payload)
- return response.json()
-
diff --git a/examples/plugins/HydroRoll/models/__init__.py b/examples/plugins/HydroRoll/models/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/examples/plugins/HydroRoll/models/__init__.py
+++ /dev/null
diff --git a/examples/plugins/HydroRoll/models/cos_sim.py b/examples/plugins/HydroRoll/models/cos_sim.py
deleted file mode 100644
index 24b743d..0000000
--- a/examples/plugins/HydroRoll/models/cos_sim.py
+++ /dev/null
@@ -1,100 +0,0 @@
-"""余弦相似度比较"""
-
-
-import joblib
-import jieba
-import numpy as np
-
-from sklearn.feature_extraction.text import TfidfTransformer
-from sklearn.feature_extraction.text import CountVectorizer
-from sklearn.metrics.pairwise import cosine_similarity
-
-
-class cosSim:
- def __init__(self, simple: list = [], test_data: list = []):
- self.simple = simple
- self.inputs = test_data
- self.texts = self.simple
- self.texts.extend(self.inputs)
-
- @property
- def corpuss(self):
- return [" ".join(jieba.cut(text)) for text in self.simple]
-
- @property
- def vocabulary(self):
- return self.getVocabulary(self.corpuss)
-
- @property
- def vectors(self):
- return self.getVectors(self.corpuss, self.vocabulary)
-
- @property
- def input_corpuss(self):
- return [" ".join(jieba.cut(text)) for text in self.inputs]
-
- @property
- def input_vocabulary(self):
- return self.getVocabulary(self.input_corpuss)
-
- @property
- def input_vector(self):
- return self.getVectors(self.input_corpuss, self.input_vocabulary)
-
- def append(self, add_test_data: list = []):
- self.inputs.extend(add_test_data)
-
- @property
- def similarities(self):
- similarities = []
- corpuss = [" ".join(jieba.cut(text)) for text in self.texts]
- vocabulary = self.getVocabulary(corpuss)
- vector = self.getVectors(corpuss, vocabulary)
- for v in vector[len(self.texts)-1:]:
- sim = []
- for v1 in vector[:len(self.simple)+1]:
- sim.append(self.cos_sim(v1, v))
- print('sim', sim)
- similarities.append(max(sim))
-
- return similarities
-
- @staticmethod
- def cos_sim(vector_a, vector_b):
- """
- 计算两个向量之间的余弦相似度
- :param vector_a: 向量 a
- :param vector_b: 向量 b
- :return: sim
- """
- vector_a = np.array(vector_a).reshape(1, -1)
- vector_b = np.array(vector_b).reshape(1, -1)
- return cosine_similarity(vector_a, vector_b)[0][0]
-
- @staticmethod
- def getVocabulary(corpuss):
- vectorizer = CountVectorizer(max_features=500)
- transformer = TfidfTransformer()
- tfidf = transformer.fit_transform(vectorizer.fit_transform(corpuss))
- words = vectorizer.get_feature_names_out()
- return words
-
- @staticmethod
- def getVectors(corpus, vocabulary):
- vectorizer = CountVectorizer(vocabulary=vocabulary)
- transformer = TfidfTransformer()
- tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
- vectors = tfidf.toarray()
- return vectors
-
- def save(self, filename):
- joblib.dump(self, filename)
-
- @staticmethod
- def load(filename):
- return joblib.load(filename)
-
- def reload(self):
- self.texts = self.simple
- self.texts.extend(self.inputs)
- self.similarities \ No newline at end of file
diff --git a/examples/plugins/HydroRoll/models/hola.py b/examples/plugins/HydroRoll/models/hola.py
deleted file mode 100644
index 255f5dd..0000000
--- a/examples/plugins/HydroRoll/models/hola.py
+++ /dev/null
@@ -1,62 +0,0 @@
-from cos_sim import cosSim
-import numpy as np
-
-texts = [
- "你好 HydroRoll",
- "你好 水系",
- "水系你好",
- "HydroRoll hi~",
- "水系, hola"
- "你好呀 水系",
- "hi 水系",
- "hi HydroRoll",
- "hello 水系",
- "hello HydroRoll",
- "hola 水系",
- "hola HydroRoll",
-]
-
-# print(model.corpuss)
-
-# print(model.vocabulary)
-
-
-
-model = cosSim(
- simple=texts,
- test_data=[
- # 'Hi! HydroRoll is a roll system.',
- # 'Hello, this is a system which named HydroRoll',
- # '短文本匹配技术应用是很广泛的,包括搜索、问答、推荐、计算广告等领域,相关技术也沉淀多年,从无监督方法到有监督方法层出不穷,工业界也是都有应用,短文本匹配算是自然语言处理领域的重要技术了,虽然任务简单,但是想要做好并不是那么容易的事情。',
- # '短文本匹配技术在搜索、问答、推荐和计算广告等领域有广泛的应用。这项技术已经发展多年,从无监督方法到有监督方法层出不穷。在工业界,短文本匹配技术已经得到了广泛的应用。虽然短文本匹配任务看起来简单,但要做好并不容易。',
- # '你好~水系。',
- # 'hola~~~~~~~hola水系!'
- ]
-)
-
-# print(model.vectors)
-
-# print(model.input_vector)
-
-# print(model.input_vocabulary)
-
-# print(cosSim.cos_sim(vector_a=model.input_vector[4], vector_b=model.input_vector[5]))
-
-
-print(model.similarities)
-
-print(model.inputs)
-
-# model.append(['你好水'])
-
-# model.append(['你好'])
-
-print(model.inputs)
-
-print(model.similarities)
-
-model.reload()
-
-print(model.input_corpuss)
-
-print(model.similarities) \ No newline at end of file
diff --git a/examples/plugins/HydroRoll/utils.py b/examples/plugins/HydroRoll/utils.py
deleted file mode 100644
index 4c9405c..0000000
--- a/examples/plugins/HydroRoll/utils.py
+++ /dev/null
@@ -1,170 +0,0 @@
-import difflib
-import re
-import time
-import random
-from abc import ABC, abstractmethod
-from typing import Type, Union, Generic, TypeVar
-from iamai import Plugin
-
-import re
-from abc import ABC, abstractmethod
-from typing import Any, Generic, TypeVar
-
-from iamai import MessageEvent, Plugin
-from iamai.typing import StateT
-
-from .config import BasePluginConfig, CommandPluginConfig, RegexPluginConfig
-
-ConfigT = TypeVar("ConfigT", bound=BasePluginConfig)
-RegexPluginConfigT = TypeVar("RegexPluginConfigT", bound=RegexPluginConfig)
-CommandPluginConfigT = TypeVar("CommandPluginConfigT", bound=CommandPluginConfig)
-
-
-class BasePlugin(
- Plugin[MessageEvent[Any], StateT, ConfigT],
- ABC,
- Generic[StateT, ConfigT],
-):
- def format_str(self, format_str: str, message_str: str = "") -> str:
- return format_str.format(
- message=message_str,
- user_name=self.get_event_sender_name(),
- user_id=self.get_event_sender_id(),
- )
-
- def get_event_sender_name(self) -> str:
- from iamai.adapter.gensokyo.event import MessageEvent as OneBotMessageEvent
-
- if isinstance(self.event, OneBotMessageEvent):
- return self.event.sender.nickname or ""
- return ""
-
- def get_event_sender_id(self) -> str:
- from iamai.adapter.gensokyo.event import MessageEvent as OneBotMessageEvent
-
- if isinstance(self.event, OneBotMessageEvent):
- if self.event.sender.user_id is not None:
- return str(self.event.sender.user_id)
- return ""
- return ""
-
- async def rule(self) -> bool:
- return isinstance(self.event, MessageEvent) and self.str_match(
- self.event.get_plain_text()
- )
-
- @abstractmethod
- def str_match(self, msg_str: str) -> bool:
- raise NotImplementedError
-
-
-class RegexPluginBase(BasePlugin[StateT, RegexPluginConfigT], ABC):
- msg_match: re.Match[str]
- re_pattern: re.Pattern[str]
-
- def str_match(self, msg_str: str) -> bool:
- msg_str = msg_str.strip()
- msg_match = self.re_pattern.fullmatch(msg_str)
- if msg_match is None:
- return False
- self.msg_match = msg_match
- return bool(self.msg_match)
-
-
-class CommandPluginBase(RegexPluginBase[StateT, CommandPluginConfigT], ABC):
- command_match: re.Match[str]
- command_re_pattern: re.Pattern[str]
-
- def str_match(self, msg_str: str) -> bool:
- if not hasattr(self, "re_pattern"):
- self.re_pattern = re.compile(
- f'[{"".join(self.config.command_prefix)}]'
- f'({"|".join(self.config.command)})'
- r"\s*(?P<command_args>.*)",
- flags=re.I if self.config.ignore_case else 0,
- )
- msg_str = msg_str.strip()
- msg_match = self.re_pattern.fullmatch(msg_str)
- if not msg_match:
- return False
- self.msg_match = msg_match
- command_match = self.re_pattern.fullmatch(self.msg_match.group("command_args"))
- if not command_match:
- return False
- self.command_match = command_match
- return True
-
-
-class PseudoRandomGenerator:
- """线性同余法随机数生成器"""
-
- def __init__(self, seed):
- self.seed = seed
-
- def generate(self):
- while True:
- self.seed = (self.seed * 1103515245 + 12345) % (2**31)
- yield self.seed
-
-
-class HydroDice:
- """水系掷骰组件
-
- 一些 API 相关的工具函数
-
- """
-
- def __init__(self, seed):
- self.generator = PseudoRandomGenerator(seed)
-
- def roll_dice(
- self,
- _counts: int | str,
- _sides: int | str,
- is_reversed: bool = False,
- streamline: bool = False,
- threshold: int | str = 5,
- ) -> str:
- """普通掷骰
- Args:
- _counts (int | str): 掷骰个数.
- _sides (int | str): 每个骰子的面数.
- is_reversed (bool, optional): 倒序输出. Defaults to False.
- streamline (bool, optional): 忽略过程. Defaults to False.
- threshold (int | str, optional): streamline 的阈值. Defaults to 5.
-
- Returns:
- str: 表达式结果.
- """
- rolls = []
- for _ in range(int(_counts)):
- roll = next(self.generator.generate()) % _sides + 1
- rolls.append(roll)
- total = sum(rolls)
-
- if streamline:
- return str(total)
- if len(rolls) > int(threshold):
- return str(total)
- rolls_str = " + ".join(str(r) for r in rolls)
- return f"{total} = {rolls_str}" if is_reversed else f"{rolls_str} = {total}"
-
-
-def find_max_similarity(input_string, string_list):
- """寻找最大的相似度"""
- max_similarity = 0
- max_string = ""
-
- for string in string_list:
- similarity = difflib.SequenceMatcher(None, input_string, string).quick_ratio()
- if similarity > max_similarity:
- max_similarity = similarity
- max_string = string
-
- return max_string, max_similarity
-
-
-def check_file(filename: str) -> bool:
- """根据给定参数校验文件夹内文件完整性"""
-
- return False
diff --git a/examples/plugins/cachetool.py b/examples/plugins/cachetool.py
index 77885d2..3955891 100644
--- a/examples/plugins/cachetool.py
+++ b/examples/plugins/cachetool.py
@@ -29,5 +29,5 @@ class CachedPlugin(Plugin):
async def rule(self) -> bool:
return (
isinstance(self.event, MessageEvent)
- and self.event.get_plain_text() == ".cachetools"
+ and self.event.get_plain_text() == "/cachetools"
)
diff --git a/examples/plugins/draftbottles/__init__.py b/examples/plugins/draftbottles/__init__.py
deleted file mode 100644
index 1a71f1d..0000000
--- a/examples/plugins/draftbottles/__init__.py
+++ /dev/null
@@ -1,48 +0,0 @@
-from typing import Union
-from iamai import Plugin, Event, Depends
-from iamai.log import logger
-from .config import Config
-from iamai.event import MessageEvent
-from .database import Database
-from .permission import Permission
-from .workroutes import WorkRoutes
-from .inspector import Inspector
-
-
-class Bottles(Plugin, config=Config):
- database: Database = Depends()
- permission: Permission = Depends()
- workroutes: WorkRoutes = Depends()
- inspector: Inspector = Depends()
-
- def __init__(self):
- self.text = None
- self.prefix = None
- self.suffix = None
-
- async def handle(self) -> None:
- self.namespace = next(
- (
- key
- for key, value in self.config.command_list.items()
- if value == self.prefix
- ),
- "",
- )
- if method := getattr(self.inspector, self.namespace, None):
- result = await method(self.suffix, self.config)
- if result:
- await self.event.reply(result)
-
- async def rule(self) -> bool:
- if not isinstance(self.event, MessageEvent):
- return False
- if not self.permission.is_admin():
- return False
- self.text = self.event.get_plain_text()
- for prefix in list(self.config.command_list.values()):
- if self.text.startswith(prefix):
- self.prefix = prefix
- self.suffix = self.text[len(self.prefix) + 1 :]
- return True
- return False
diff --git a/examples/plugins/draftbottles/config.py b/examples/plugins/draftbottles/config.py
deleted file mode 100644
index f5aaa72..0000000
--- a/examples/plugins/draftbottles/config.py
+++ /dev/null
@@ -1,52 +0,0 @@
-from iamai import ConfigModel
-
-
-class Config(ConfigModel):
- __config_name__ = "draft_bottles"
-
- usage: str = """\
- 指令:
- 扔漂流瓶 [文本/图片]
- 捡漂流瓶
- 查看漂流瓶 [漂流瓶编号]
- 点赞漂流瓶 [漂流瓶编号]
- 评论漂流瓶 [漂流瓶编号] [文本]
- 举报漂流瓶 [漂流瓶编号]
- 删除漂流瓶 [漂流瓶编号]
- 我的漂流瓶
- SUPERUSER指令:
- 清空漂流瓶
- 恢复漂流瓶 [漂流瓶编号]
- 删除漂流瓶评论 [漂流瓶编号] [QQ号]
- 漂流瓶白名单 [QQ / 群聊 / 举报] [QQ号 / 群号]
- 漂流瓶黑名单 [QQ / 群聊] [QQ号 / 群号]
- 漂流瓶详情 [漂流瓶编号]
- """.strip()
-
- command_list: dict = {
- "test": "/dfb",
- "throw": "扔漂流瓶",
- "get": "捡漂流瓶",
- "report": "举报漂流瓶",
- "comment": "评论漂流瓶",
- "check": "查看漂流瓶",
- "remove": "删除漂流瓶",
- "listb": "我的漂流瓶",
- "like": "点赞漂流瓶",
- "resume": "恢复漂流瓶",
- "clear": "清空漂流瓶",
- "delete": "删除漂流瓶评论",
- "details": "漂流瓶详情",
- }
-
- ban_list: dict = {
- "groups": [],
- "users": [],
- }
-
- white_list: dict = {
- "groups": [],
- "users": [],
- }
-
- max_content_length: int = 1024
diff --git a/examples/plugins/draftbottles/database.py b/examples/plugins/draftbottles/database.py
deleted file mode 100644
index dededac..0000000
--- a/examples/plugins/draftbottles/database.py
+++ /dev/null
@@ -1,11 +0,0 @@
-class Database:
- admin_list: list = [2753364619]
-
- def __init__(self) -> None:
- ...
-
- def connect(self):
- ...
-
- def close(self):
- ...
diff --git a/examples/plugins/draftbottles/inspector.py b/examples/plugins/draftbottles/inspector.py
deleted file mode 100644
index de757b2..0000000
--- a/examples/plugins/draftbottles/inspector.py
+++ /dev/null
@@ -1,128 +0,0 @@
-from iamai import Event, Depends, Bot
-from .database import Database
-from .permission import Permission
-from .workroutes import WorkRoutes
-from .config import Config
-from iamai.exceptions import GetEventTimeout
-from iamai.adapter.onebot11.message import CQHTTPMessageSegment as ms
-import oneroll
-
-class Inspector:
- event: Event = Depends()
- bot: Bot = Depends()
- database: Database = Depends()
- permission: Permission = Depends()
- workroutes: WorkRoutes = Depends()
-
- async def test(self, *args):
- suffix = list(args)[0]
- a = "1"
- try:
- return f"{eval(suffix)}"
- except Exception as e:
- return f"{e!r}"
-
- async def throw(self, *args):
- suffix = list(args)[0]
- config = list(args)[1]
- if len(suffix) == 0:
- """没有内容,则进入输入流"""
- try:
- content_event = await self.event.ask(
- "在漂流瓶中要写下什么呢?(输入“取消”来取消扔漂流瓶操作。)", timeout=10
- ) # type: ignore
- except GetEventTimeout:
- return "超时。"
- except Exception as e:
- return f"{e!r}"
- else:
- if content_event.message.get_plain_text().lower() in ["取消", "cancel"]:
- return ms.reply(content_event.message_id) + ms.text("已取消扔漂流瓶操作。")
- """有内容,进行审核"""
- content = content_event.message.get_plain_text()
- self._throw(content=content, event=content_event)
- else:
- """有内容,进行审核"""
- self._throw(content=suffix, event=self.event)
-
- async def get(self, *args):
- suffix = list(args)[0]
- try:
- return f"{eval(suffix)}"
- except Exception as e:
- return f"{e!r}"
-
- async def report(self, *args):
- suffix = list(args)[0]
- try:
- return f"{eval(suffix)}"
- except Exception as e:
- return f"{e!r}"
-
- async def comment(self, *args):
- suffix = list(args)[0]
- try:
- return f"{eval(suffix)}"
- except Exception as e:
- return f"{e!r}"
-
- async def check(self, *args):
- suffix = list(args)[0]
- try:
- return f"{eval(suffix)}"
- except Exception as e:
- return f"{e!r}"
-
- async def remove(self, *args):
- suffix = list(args)[0]
- try:
- return f"{eval(suffix)}"
- except Exception as e:
- return f"{e!r}"
-
- async def listb(self, *args):
- suffix = list(args)[0]
- try:
- return f"{eval(suffix)}"
- except Exception as e:
- return f"{e!r}"
-
- async def like(self, *args):
- suffix = list(args)[0]
- try:
- return f"{eval(suffix)}"
- except Exception as e:
- return f"{e!r}"
-
- async def resume(self, *args):
- suffix = list(args)[0]
- try:
- return f"{eval(suffix)}"
- except Exception as e:
- return f"{e!r}"
-
- async def clear(self, *args):
- suffix = list(args)[0]
- try:
- return f"{eval(suffix)}"
- except Exception as e:
- return f"{e!r}"
-
- async def delete(self, *args):
- suffix = list(args)[0]
- try:
- return f"{eval(suffix)}"
- except Exception as e:
- return f"{e!r}"
-
- async def details(self, *args):
- suffix = list(args)[0]
- try:
- return f"{eval(suffix)}"
- except Exception as e:
- return f"{e!r}"
-
- @staticmethod
- def _throw(content: str, **kwargs):
- """扔出漂流瓶"""
- event = kwargs.pop('event', None)
diff --git a/examples/plugins/draftbottles/permission.py b/examples/plugins/draftbottles/permission.py
deleted file mode 100644
index 456dc8b..0000000
--- a/examples/plugins/draftbottles/permission.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from iamai import Event, Depends
-from .database import Database
-
-
-class Permission:
- event: Event = Depends()
- database: Database = Depends()
-
- def is_admin(self):
- return self.event.user_id in self.database.admin_list
diff --git a/examples/plugins/draftbottles/workroutes.py b/examples/plugins/draftbottles/workroutes.py
deleted file mode 100644
index f539780..0000000
--- a/examples/plugins/draftbottles/workroutes.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from iamai import Event, Depends
-from .permission import Permission
-from .database import Database
-
-
-class WorkRoutes:
- event: Event = Depends()
- database: Database = Depends()
- permission: Permission = Depends()
diff --git a/examples/plugins/lua.py b/examples/plugins/lua.py
deleted file mode 100644
index 6a36827..0000000
--- a/examples/plugins/lua.py
+++ /dev/null
@@ -1,64 +0,0 @@
-from iamai import Plugin
-from iamai.exceptions import GetEventTimeout
-from numpy.random import Generator
-from iamai.adapter.onebot11.message import CQHTTPMessage, CQHTTPMessageSegment
-from iamai.log import logger
-from lupa import LuaRuntime
-from iamai.utils import sync_func_wrapper
-import asyncio
-
-lua = LuaRuntime(unpack_returned_tuples=True)
-ms = CQHTTPMessageSegment
-
-
-class Lua(Plugin):
- priority = 1
- prefix = "/lua"
-
- async def handle(self) -> None:
- try:
- self.suffix = self.event.message.get_plain_text()[len(self.prefix) + 1 :]
-
- class msg:
- priority = self.priority
- prefix = self.prefix
- fromMsg = self.event.message
- suffix = self.suffix
- event = self.event
-
- def echo(self, message=None):
- if not message:
- return self.__str__
-
- loop = asyncio.get_event_loop()
- coro = self.event.reply(message)
- asyncio.run_coroutine_threadsafe(coro, loop)
-
- def ask(self, message=None, timeout=10, **kwargs):
- if not message:
- return self.__str__
-
- loop = asyncio.get_event_loop()
- try:
- coro = self.event.ask(message, timeout=timeout)
- asyncio.run_coroutine_threadsafe(coro, loop)
- except GetEventTimeout:
- return self.__str__
- else:
- coro = self.event.reply(**kwargs)
- asyncio.run_coroutine_threadsafe(coro, loop)
-
- lua.globals().msg = msg
- lua.globals().event = self.event
- # logger.info(lua.eval(self.suffix))
- if result := lua.eval(self.suffix):
- await self.event.reply(result)
- except Exception as e:
- await self.event.reply(f"ERROR!{e!r}")
- logger.info(f"ERROR with message: {e}")
-
- async def rule(self) -> bool:
- return (
- self.event.type == "message"
- and self.event.message.get_plain_text().startswith(self.prefix)
- )
diff --git a/examples/plugins/nivis.❄ b/examples/plugins/nivis.❄
deleted file mode 100644
index 783fdb1..0000000
--- a/examples/plugins/nivis.❄
+++ /dev/null
@@ -1,295 +0,0 @@
-""" SPI - Simple Pascal Interpreter """
-
-###############################################################################
-# #
-# LEXER #
-# #
-###############################################################################
-
-# Token types
-#
-# EOF (end-of-file) token is used to indicate that
-# there is no more input left for lexical analysis
-from iamai import Plugin
-from HydroRoll.utils import HydroDice
-
-INTEGER, PLUS, MINUS, MUL, DIV, LPAREN, RPAREN, EOF = (
- "INTEGER",
- "PLUS",
- "MINUS",
- "MUL",
- "DIV",
- "(",
- ")",
- "EOF",
-)
-
-DICE = "DICE"
-
-
-class Token(object):
- """A single token from the lexer."""
-
- def __init__(self, _type, _value):
- self.type = _type
- self.value = _value
-
- def __str__(self):
- """String representation of the class instance.
-
- Examples:
- Token(INTEGER, 3)
- Token(PLUS, '+')
- Token(MUL, '*')
- """
- return f"Token({self.type}, {repr(self.value)})"
-
- def __repr__(self):
- return self.__str__()
-
-
-class Lexer(object):
- """A lexer for the Psi language."""
-
- def __init__(self, text):
- # client string input, e.g. "4 + 2 * 3 - 6 / 2"
- self.text = text
- # self.pos is an index into self.text
- self.pos = 0
- self.current_char = self.text[self.pos]
-
- def error(self):
- """Raise an exception at the current position."""
- raise ValueError("Invalid character")
-
- def advance(self):
- """Advance the `pos` pointer and set the `current_char` variable."""
- self.pos += 1
- if self.pos > len(self.text) - 1:
- self.current_char = None # Indicates end of input
- else:
- self.current_char = self.text[self.pos]
-
- def skip_whitespace(self):
- while self.current_char is not None and self.current_char.isspace():
- self.advance()
-
- def integer(self):
- """Return a (multidigit) integer consumed from the input."""
- result = ""
- while self.current_char is not None and self.current_char.isdigit():
- result += self.current_char
- self.advance()
- return int(result)
-
- def get_next_token(self):
- """Lexical analyzer (also known as scanner or tokenizer)"""
- while self.current_char is not None:
- if self.current_char.isspace():
- self.skip_whitespace()
- continue
-
- token_type = {
- "+": PLUS,
- "-": MINUS,
- "d": DICE,
- "*": MUL,
- "/": DIV,
- "(": LPAREN,
- ")": RPAREN,
- }.get(self.current_char)
-
- if token_type:
- self.advance()
- return Token(token_type, self.current_char)
-
- if self.current_char.isdigit():
- return Token(INTEGER, self.integer())
-
- self.error()
-
- return Token(EOF, None)
-
-
-###############################################################################
-# #
-# PARSER #
-# #
-###############################################################################
-
-
-class AST(object):
- pass
-
-
-class BinOp(AST):
- def __init__(self, left, op, right):
- self.left = left
- self.token = self.op = op
- self.right = right
-
-
-class Num(AST):
- def __init__(self, token):
- self.token = token
- self.value = token.value
-
-
-class UnaryOp(AST):
- def __init__(self, op, expr):
- self.token = self.op = op
- self.expr = expr
-
-
-class Parser(object):
- def __init__(self, lexer):
- self.lexer = lexer
- # set current token to the first token taken from the input
- self.current_token = self.lexer.get_next_token()
-
- def error(self):
- raise Exception("Invalid syntax")
-
- def eat(self, token_type):
- # compare the current token type with the passed token
- # type and if they match then "eat" the current token
- # and assign the next token to the self.current_token,
- # otherwise raise an exception.
- if self.current_token.type == token_type:
- self.current_token = self.lexer.get_next_token()
- else:
- self.error()
-
- def factor(self):
- """factor : (PLUS | MINUS | DICE) factor | INTEGER | LPAREN expr RPAREN"""
- token = self.current_token
- if token.type == PLUS:
- self.eat(PLUS)
- node = UnaryOp(token, self.factor())
- return node
- elif token.type == MINUS:
- self.eat(MINUS)
- node = UnaryOp(token, self.factor())
- return node
- elif token.type == DICE:
- self.eat(DICE)
- left = Num(Token(INTEGER, 1)) # 默认骰子个数为1
- right = self.factor()
- node = BinOp(left, token, right)
- return node
- elif token.type == INTEGER:
- self.eat(INTEGER)
- return Num(token)
- elif token.type == LPAREN:
- self.eat(LPAREN)
- node = self.expr()
- self.eat(RPAREN)
- return node
-
- def term(self):
- """term : factor ((MUL | DIV) factor)*"""
- node = self.factor()
-
- while self.current_token.type in (MUL, DIV):
- token = self.current_token
- if token.type == MUL:
- self.eat(MUL)
- elif token.type == DIV:
- self.eat(DIV)
-
- node = BinOp(left=node, op=token, right=self.factor())
-
- return node
-
- def expr(self):
- """
- expr : term ((PLUS | MINUS) term)*
- term : factor ((MUL | DIV) factor)*
- factor : (PLUS | MINUS) factor | INTEGER | LPAREN expr RPAREN
- """
- node = self.term()
-
- while self.current_token.type in (PLUS, MINUS):
- token = self.current_token
- if token.type == PLUS:
- self.eat(PLUS)
- elif token.type == MINUS:
- self.eat(MINUS)
-
- node = BinOp(left=node, op=token, right=self.term())
-
- return node
-
- def parse(self):
- node = self.expr()
- if self.current_token.type != EOF:
- self.error()
- return node
-
-
-###############################################################################
-# #
-# INTERPRETER #
-# #
-###############################################################################
-
-
-class NodeVisitor(object):
- def visit(self, node):
- method_name = "visit_" + type(node).__name__
- visitor = getattr(self, method_name, self.generic_visit)
- return visitor(node)
-
- def generic_visit(self, node):
- raise Exception("No visit_{} method".format(type(node).__name__))
-
-
-class Interpreter(NodeVisitor):
- def __init__(self, parser):
- self.parser = parser
-
- def visit_BinOp(self, node):
- if node.op.type == PLUS:
- return self.visit(node.left) + self.visit(node.right)
- elif node.op.type == MINUS:
- return self.visit(node.left) - self.visit(node.right)
- elif node.op.type == DICE:
- return int(
- HydroDice(1).roll_dice(
- _counts=self.visit(node.left),
- _sides=self.visit(node.right),
- streamline=True,
- )
- )
- elif node.op.type == MUL:
- return self.visit(node.left) * self.visit(node.right)
- elif node.op.type == DIV:
- return self.visit(node.left) // self.visit(node.right)
-
- def visit_Num(self, node):
- return node.value
-
- def visit_UnaryOp(self, node):
- op = node.op.type
- if op == PLUS:
- return +self.visit(node.expr)
- elif op == MINUS:
- return -self.visit(node.expr)
-
- def interpret(self):
- tree = self.parser.parse()
- if tree is None:
- return ""
- return self.visit(tree)
-
-
-class Psi(Plugin):
- async def handle(self) -> None:
- lexer = Lexer(self.event.message.get_plain_text()[4:])
- parser = Parser(lexer)
- interpreter = Interpreter(parser)
- result = interpreter.interpret()
- await self.event.reply(str(result))
-
- async def rule(self) -> bool:
- return self.event.type == "message" and self.event.message.startswith(".psi")
diff --git a/examples/plugins/snow.nivis b/examples/plugins/snow.nivis
deleted file mode 100644
index 4b31630..0000000
--- a/examples/plugins/snow.nivis
+++ /dev/null
@@ -1,44 +0,0 @@
-from iamai import Plugin
-from numpy.random import Generator
-from iamai.adapter.onebot11.message import CQHTTPMessage, CQHTTPMessageSegment
-
-ms = CQHTTPMessageSegment
-
-
-class Exec(Plugin):
- priority = 1
-
- async def handle(self) -> None:
- try:
- content = [
- {
- "type": "node",
- "data": {
- "name": f"{self.event.sender.nickname}",
- "uin": f"{self.event.sender.user_id}",
- "content": [
- {
- "type": "text",
- "data": {
- "text": f"{eval(self.event.message.get_plain_text()[6:])}"
- },
- },
- # eval(self.event.message.get_plain_text()[6:])
- ],
- },
- }
- ]
- res = await self.event.adapter.send_group_forward_msg(
- group_id=int(self.event.group_id), messages=content
- )
- except Exception as e:
- # await self.event.reply(f"ERROR!{e!r}")
- await self.bot.get_adapter("onebot11").send_guild_channel_msg(
- f"{eval(self.event.message.get_plain_text()[6:])}"
- )
-
- async def rule(self) -> bool:
- return (
- self.event.type == "message"
- and self.event.message.get_plain_text().startswith(".show")
- )
diff --git a/hydro_roll_core b/hydro_roll_core
deleted file mode 160000
-Subproject 967ce6dc6fb3329b93293862c4e9178b8ce8709
diff --git a/nivis_python b/nivis_python
deleted file mode 160000
-Subproject 830c1fbe10ebf4bbdf2cf3f881222d933db2896
diff --git a/pdm.lock b/pdm.lock
index fb860fb..3d3107c 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -2,11 +2,11 @@
# It is not intended for manual editing.
[metadata]
-groups = ["default", "dev"]
+groups = ["default", "dev", "docs", "pygments"]
cross_platform = true
static_urls = false
lock_version = "4.3"
-content_hash = "sha256:97cd238a002b9f83c158c162cd72ce9f008be00c900ed899f4472b005b03935b"
+content_hash = "sha256:a9331a6e9bd96ddd55ebed47f0d0814ca25a7ee117e138697363885ca866fec3"
[[package]]
name = "aiohttp"
@@ -303,6 +303,81 @@ files = [
]
[[package]]
+name = "contourpy"
+version = "1.2.1"
+requires_python = ">=3.9"
+summary = "Python library for calculating contours of 2D quadrilateral grids"
+dependencies = [
+ "numpy>=1.20",
+]
+files = [
+ {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"},
+ {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"},
+ {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"},
+ {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"},
+ {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"},
+ {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"},
+ {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"},
+ {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"},
+ {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"},
+ {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"},
+ {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"},
+ {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"},
+ {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"},
+ {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"},
+ {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"},
+ {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"},
+ {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"},
+ {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"},
+ {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"},
+ {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"},
+ {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"},
+ {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"},
+ {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"},
+ {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"},
+ {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"},
+ {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"},
+ {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"},
+ {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"},
+ {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"},
+ {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"},
+ {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"},
+ {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"},
+ {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"},
+ {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"},
+ {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"},
+ {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"},
+ {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"},
+ {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"},
+ {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"},
+ {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"},
+ {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"},
+ {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"},
+ {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"},
+ {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"},
+]
+
+[[package]]
+name = "cycler"
+version = "0.12.1"
+requires_python = ">=3.8"
+summary = "Composable style cycles"
+files = [
+ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"},
+ {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"},
+]
+
+[[package]]
+name = "docutils"
+version = "0.20.1"
+requires_python = ">=3.7"
+summary = "Docutils -- Python Documentation Utilities"
+files = [
+ {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"},
+ {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"},
+]
+
+[[package]]
name = "exceptiongroup"
version = "1.2.0"
requires_python = ">=3.7"
@@ -313,6 +388,48 @@ files = [
]
[[package]]
+name = "fonttools"
+version = "4.51.0"
+requires_python = ">=3.8"
+summary = "Tools to manipulate font files"
+files = [
+ {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74"},
+ {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308"},
+ {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037"},
+ {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716"},
+ {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438"},
+ {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039"},
+ {file = "fonttools-4.51.0-cp310-cp310-win32.whl", hash = "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77"},
+ {file = "fonttools-4.51.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b"},
+ {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74"},
+ {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2"},
+ {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f"},
+ {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097"},
+ {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0"},
+ {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1"},
+ {file = "fonttools-4.51.0-cp311-cp311-win32.whl", hash = "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034"},
+ {file = "fonttools-4.51.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1"},
+ {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba"},
+ {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc"},
+ {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a"},
+ {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2"},
+ {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671"},
+ {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5"},
+ {file = "fonttools-4.51.0-cp312-cp312-win32.whl", hash = "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15"},
+ {file = "fonttools-4.51.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e"},
+ {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b"},
+ {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936"},
+ {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55"},
+ {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce"},
+ {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051"},
+ {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7"},
+ {file = "fonttools-4.51.0-cp39-cp39-win32.whl", hash = "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636"},
+ {file = "fonttools-4.51.0-cp39-cp39-win_amd64.whl", hash = "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a"},
+ {file = "fonttools-4.51.0-py3-none-any.whl", hash = "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f"},
+ {file = "fonttools-4.51.0.tar.gz", hash = "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68"},
+]
+
+[[package]]
name = "frozenlist"
version = "1.4.1"
requires_python = ">=3.8"
@@ -456,6 +573,19 @@ files = [
]
[[package]]
+name = "importlib-resources"
+version = "6.4.0"
+requires_python = ">=3.8"
+summary = "Read resources from Python packages"
+dependencies = [
+ "zipp>=3.1.0; python_version < \"3.10\"",
+]
+files = [
+ {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"},
+ {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"},
+]
+
+[[package]]
name = "jieba"
version = "0.42.1"
summary = "Chinese Words Segmentation Utilities"
@@ -474,6 +604,90 @@ files = [
]
[[package]]
+name = "kiwisolver"
+version = "1.4.5"
+requires_python = ">=3.7"
+summary = "A fast implementation of the Cassowary constraint solver"
+files = [
+ {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"},
+ {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"},
+]
+
+[[package]]
name = "lark"
version = "1.1.9"
requires_python = ">=3.6"
@@ -499,68 +713,114 @@ files = [
[[package]]
name = "lupa"
-version = "2.0"
+version = "2.1"
summary = "Python wrapper around Lua and LuaJIT"
files = [
- {file = "lupa-2.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:32d1e7cdced4e29771dacfed68abc92da9ba2300a2929ec5782467316ea4a715"},
- {file = "lupa-2.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d412925a73b6b848fd1076fbc392d445ff4a1ab5b5bb278e358f78768677c963"},
- {file = "lupa-2.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:7c10d4f0fa592b798a71c0b2e273e4b899a14b3634a48cbc444917b254ddce37"},
- {file = "lupa-2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f50a395dc3c950974ac73b2476136785c6995f611a81e14d2a7c6aa59b342abf"},
- {file = "lupa-2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c19482a595deed90e5b8542df1ed861e2a4a9d99bd8a9ff108e3a7c66bc7c6c0"},
- {file = "lupa-2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d85c20691dbd2db5b7c60f40e4a5ced6a35be60264a81dc08804483917b41ea9"},
- {file = "lupa-2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43353ae1e204b1f7fb18150f7dc5357592be37431e84f799c6cf21a4b7a52dcc"},
- {file = "lupa-2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9add3d9ba86fa2fb5604e429ca811b9fa6b4c55fe5330bd9f0fcf51f2c5bebf8"},
- {file = "lupa-2.0-cp310-cp310-win32.whl", hash = "sha256:17fd814523b9fa268df8f0995874218a9be008dbcd1c1c7bd28207814a209491"},
- {file = "lupa-2.0-cp310-cp310-win_amd64.whl", hash = "sha256:5c249d83655942ebe7db99c4e981de547867a7d30ace34e61f3ccc5b7a14402c"},
- {file = "lupa-2.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e051969dc712d7050d0f3d6c6c8ed063941a004381e84f072815350476118f81"},
- {file = "lupa-2.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a0e45ada08e5694ab3f3c06523ec16322dfb875668ce9ff3e04a01d3e18e81"},
- {file = "lupa-2.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f7c1cfa9dac4f1363d9620384f9881a1ec968ff825be1e9b2ecdb4cb5375fbf2"},
- {file = "lupa-2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4649a5501f0d8e5c96c297896377e9f73d0167df139109536187c57c60be1e90"},
- {file = "lupa-2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e980571081c93152bb04de07bbde6852462e1674349eb3eafe703f5fa81a836"},
- {file = "lupa-2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50c529e5ecf3ec5b3e57efbb9a5def5125ceb7b95f12e2c89c34535856abb1ac"},
- {file = "lupa-2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6847c2541f9cbdd596df821a575222f471175cd710fb967ffc51801dae58d68"},
- {file = "lupa-2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f3f962a499f95b3a5e90de36ac396cdb59c0c46b8003fbfcc1e2d78d7edc14f8"},
- {file = "lupa-2.0-cp311-cp311-win32.whl", hash = "sha256:fcedc43012527edb4ca2b97a6c8176dd2384a006e47549d4e73143f7982deaff"},
- {file = "lupa-2.0-cp311-cp311-win_amd64.whl", hash = "sha256:0e66da3bc40cde8edeb4d7d8141afad67ec6a5da0ee07ce5265df7e899e0883c"},
- {file = "lupa-2.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:1be2e1015d8481511852ae0f9f05f3722715d7aadb48207480eb50edc45a7510"},
- {file = "lupa-2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7caa1ce59fe1cefd845093d1354244c59d286fcc1196a15297fb189a5bb749c6"},
- {file = "lupa-2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f04c7a8d4e5b50a570681b990ff3be09bce5efbd91a521442c0ebfc36e0ce422"},
- {file = "lupa-2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f8368f0d5131f47da60f7cea4a5932418ca0bcd12c22fcf700f36af93fdf2a6a"},
- {file = "lupa-2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d225e06748aca078a02529054c6678ba3e5b7cc2080b5be30e33ede9eac5efb2"},
- {file = "lupa-2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:974de113c63e35668fbbbff656fef718e586abed3fc875eae4fece279a1e8a11"},
- {file = "lupa-2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c953b9430751e792b721dd2265af1759251cdac0ade5642f25e16a6174bcc58"},
- {file = "lupa-2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65d5971eb8c060eb3c9218c25181001e25982dfdf88e0b284447f837a4318a5f"},
- {file = "lupa-2.0-cp38-cp38-win32.whl", hash = "sha256:eece0bc316c2b050e8c3596320e124c8ccea2a7872e593193d30eecab7f0acf6"},
- {file = "lupa-2.0-cp38-cp38-win_amd64.whl", hash = "sha256:06792b86f9410bd26936728e7f903e2eee76642cbf51e435622637a3d752a2ea"},
- {file = "lupa-2.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:8f3e6ea86053ec0c9945ae313fba8ba06dc4ccc397369709bba956dd48db95a7"},
- {file = "lupa-2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:201fc894d257132e90e42ce9396c5b45aa5f5bdc4cd4dfc8076c8476f04dd44b"},
- {file = "lupa-2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b3f6837c1e2fd7c66100828953063dfe8a1d283bc48e1144d621b35bf19ce79f"},
- {file = "lupa-2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:becb01602dc6d5439101e1ac5877b25e35817b1bd131b9af709a5a181e6b8026"},
- {file = "lupa-2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3d34870912bf7501d2a9e7dc75319e55f836fd8412b783afa44c5bfb72be0867"},
- {file = "lupa-2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d02d4af2682169b8aa744e7eae59d1e05f9b0071a59fb140852dae9b5c8d86c"},
- {file = "lupa-2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:282126096ba71c1926f28da59cd1cf6913b7e9e7020d577b42dc52ca3c359e93"},
- {file = "lupa-2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c7ec361e05d932c5355825982613077ac8cb5b63d95022d571290d8ca667188"},
- {file = "lupa-2.0-cp39-cp39-win32.whl", hash = "sha256:e361efe6c8a667fa221d42b7fa2beb7fada86e901a0f0e1e17c7c7927d66b2ff"},
- {file = "lupa-2.0-cp39-cp39-win_amd64.whl", hash = "sha256:c0be42065ad39219eaf890c224cc7cc140ed72691b97b0905dd7a89abebdf474"},
- {file = "lupa-2.0-pp37-pypy37_pp73-macosx_11_0_x86_64.whl", hash = "sha256:dea916b28ee38c904ece3a26986b6943a073666c038ae6b6d6d131668da20f59"},
- {file = "lupa-2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:345032ef77bd474d288ea2c4ddd14b552b93d60a40a9b0daf0a82bc078625982"},
- {file = "lupa-2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:9fa9d5013a06aa09392f1d02d9724a9856f4f4111794ca9be17a016c83c6546a"},
- {file = "lupa-2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:71e517327bff75cc5e60fe105da7da6621a75ba05a5050869e33b4bdbe838288"},
- {file = "lupa-2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e00664780836b353113804f8e0f860322abf5ef723d615ba6f49d9e78874944"},
- {file = "lupa-2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9a5843fbfb22b70ea13ec624d43c818b396ff1f62d9bd84f9ed10e3fef06ccf0"},
- {file = "lupa-2.0-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5396ebb51753a8243a18080e2efa9f085bac5d43185d5a1dd9a3679ff7fb09c5"},
- {file = "lupa-2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:404bda126a34eef839e29fc94fd65c1092b53301b2d0abc9388f02cc5ba87ac9"},
- {file = "lupa-2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:fb5efacbb5dd568d44f4f31a4764a52eefb78288f0445da016652fe7143cdde3"},
- {file = "lupa-2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7762c6780fe7ab64d64f8658ab54d79cb5d3d0fbdcc76290f5fc19b41fc01ad5"},
- {file = "lupa-2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0068d75f0df5f2fb85230b1df7a05305645ee28ef89551997eb09009c70d7f8a"},
- {file = "lupa-2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:690c0654b92c6de0893c004d0a46d5d5b5fd76e9017dda328a2435afdf3c55a0"},
- {file = "lupa-2.0-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:9b7c9799a45e6fff8c38395d370b318b8ce6841710c2082f180ea7d189f7d229"},
- {file = "lupa-2.0-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:200544d259a054c5d0c6696499d0c66ccd924d42efb41b09b19c2af9771f5c31"},
- {file = "lupa-2.0-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:682860cd6ed84e0ffdaf84c82c21b192858261964b3ed126bc54d52cc8a480b4"},
- {file = "lupa-2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb4426cddefb48683068e94ed4748710507bbd3f0a4d71574535443c75a16e36"},
- {file = "lupa-2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88495333e79937cdf7edac35ec36aca41d50134dbb23f2f1684a1685a4295433"},
- {file = "lupa-2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c776290a06b03e8dd5ca061d9fefde13be37fb25700c56bb513343262ea1729"},
- {file = "lupa-2.0.tar.gz", hash = "sha256:ad3fef486be7adddd349fe9a9c393789061312cf98ebc533b489be34f484cb79"},
+ {file = "lupa-2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b5a50b598064d4cf0f0b417fbe0136f0eb059c3a9c0b671ced299d6c4214267"},
+ {file = "lupa-2.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:b91157e7d431c146acf694bf6cb8657bd76aa66805dd79fa03aef13e14d9a2ff"},
+ {file = "lupa-2.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5d91f1ad69e4012c4afc0aa7287339d036b6b7c554ebfc583b06ec47751963a3"},
+ {file = "lupa-2.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35350b8f70f0e9422c7c96be478cdb0afb09aac1724e2eccc4f3bf60881073b9"},
+ {file = "lupa-2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09ade981e97c8267029c89fb374f92f327b55198eded6b386065963d93157a62"},
+ {file = "lupa-2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35630eef63d8f363d768beec5c14e7ccaf4cfc2a979e0662fce998b26678dc2e"},
+ {file = "lupa-2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fb683e0affa423614ea4cd518c6a4d8ac68f0d09928e4188f26be1668d3c0bc7"},
+ {file = "lupa-2.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4b136250e3abf6cd366db3516c0df8fc3bdf485dbb681e09cda6f58ea63a6db0"},
+ {file = "lupa-2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:553b94b068a3fe22dc7c5724d1a312d3bc6daed40ad36138b0ad4b3667e34c09"},
+ {file = "lupa-2.1-cp310-cp310-win32.whl", hash = "sha256:db39dbb443ad89fe6c2059dd4a2bcb80bfbe6b9d2ed137c4c83b476e826b76ad"},
+ {file = "lupa-2.1-cp310-cp310-win_amd64.whl", hash = "sha256:354ab722b30711de8e30a11f9383bb68fd4acf68b87915f26960477906690455"},
+ {file = "lupa-2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98d260af271353d3eaea3a44ab610db25c7eb3a489d39cfdd20a6ccb482dba92"},
+ {file = "lupa-2.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e7876d07cdd1709c7890e0b51ef595600fb72dee40351d0327056300becce601"},
+ {file = "lupa-2.1-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:43a15a366dea073072cccf800fdbd9c63fb83b77c783674e1e0900013fddd833"},
+ {file = "lupa-2.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b53faece345c5b711713337777cf2e8c148359df44ec819949022072372d1ac"},
+ {file = "lupa-2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5988d7a7d0c469eebbe30a59442980dd950369ea824bffef499eeb7920e63db5"},
+ {file = "lupa-2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68ffa2545329144ec419587175620f67882c0d062d0dd749f6524d608a92d63c"},
+ {file = "lupa-2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:27a23b70bd995688925e8c64fbc2119cc2577e266aa40b8c8ff5c3eee51b0a62"},
+ {file = "lupa-2.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d29bafd459d925339771ef0cb5c83bd7f5f4b5743fc717d55428b77d41032145"},
+ {file = "lupa-2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0b046d05a60ce4026c3732e35e99e0c876e143b4dc22bf875ecd6fc87a90e48"},
+ {file = "lupa-2.1-cp311-cp311-win32.whl", hash = "sha256:35f44781de55a4ebf8270e1ae1d50975c43f6e04ef91efb5f60b4fdbc3141c98"},
+ {file = "lupa-2.1-cp311-cp311-win_amd64.whl", hash = "sha256:151077023b2be939c09a6393142be6d70b92cac2fea38e21cfb976ea28c022dc"},
+ {file = "lupa-2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f2dcac388cf6995e5c6b4b3cb3acfa8af70e2542c3ae50c294a02a8a06e1534f"},
+ {file = "lupa-2.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:738295b071749da7e25f81f25245fdafbf310cbf68e1a9a91e61658f6542fd0b"},
+ {file = "lupa-2.1-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:5a8ff2bb744d17c7ba4fd1158feada8a49c77b28105c077858b1d8ac90e0e8ff"},
+ {file = "lupa-2.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:809ce9a77eef51089c98360312ef59ece7839af331f9aea7afbf40842d7116f5"},
+ {file = "lupa-2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2a96fa5fcc10eef350bf3cf685fd5c9c90cd5548e57369881b736bb5848dcf9"},
+ {file = "lupa-2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a69abf48ba14df28901d00156023799dd6d9d25489018f8dca0f784d5b48003"},
+ {file = "lupa-2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8b0636b1fc9f97d416005ddd3c59d5ce0ae98580534d830625c692d31053f486"},
+ {file = "lupa-2.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:caf3bed9165ff503b9a381ce13655e0487499094b2065e8d90f55d98b28623ba"},
+ {file = "lupa-2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:63d4991769497044531ac25390d6dcb960402425eb670022274a830c505bda07"},
+ {file = "lupa-2.1-cp312-cp312-win32.whl", hash = "sha256:5cddbf849e6292da3cd9e0e2352392817db041cf368517ac0618c273188e4aaf"},
+ {file = "lupa-2.1-cp312-cp312-win_amd64.whl", hash = "sha256:d3faf580c2b0c70f778b1a22a0afc4bc225076d50ae3f9e354237259d83af97b"},
+ {file = "lupa-2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0cbd41c23bf18d3ae6bc65c0ec88f711a1e012bca56a19e6cd04265da1bdf5a"},
+ {file = "lupa-2.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:29f50f1d2a53071c6eb3b89289753ba6306417cb4bf55c00897251e2e813fe7e"},
+ {file = "lupa-2.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:ca36d2337064a980e2f565ea28618744d85e75ea1b5b47be18d543810c413102"},
+ {file = "lupa-2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8ec99552cd5f2b1caba63d082ea3cbdf0872d8634d04233b9000ac0c1aebfcf"},
+ {file = "lupa-2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a58963c9cd335d092d11c7242a6433806e70410fa66aafefe0cefd9bba30f42"},
+ {file = "lupa-2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d4f876d42236d47ef247076501a2c74849b52070637d8cca905d06a710794ce"},
+ {file = "lupa-2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bd24a43ebef9deb5bea8f9f63ce0e0e1831fa0ffd663404bc06460ed53cbf0e4"},
+ {file = "lupa-2.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05616bc5c467d7ec0b26de99d1586bdd4e034cd3b9068be9306e128d0d005d34"},
+ {file = "lupa-2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:aab836f17b9625b8511f5f9c76fd4598c16e9d7a27d314cd12fc1de987f3bf58"},
+ {file = "lupa-2.1-cp39-cp39-win32.whl", hash = "sha256:c1c0a0270e41a2dd982824cd2fd4960f4c09c97514c6ed58056834054637de39"},
+ {file = "lupa-2.1-cp39-cp39-win_amd64.whl", hash = "sha256:23852fb56d14853cc0a62c0f93decdb4d2b476ce7e512c4488fe8a186e6d060e"},
+ {file = "lupa-2.1-pp310-pypy310_pp73-macosx_11_0_x86_64.whl", hash = "sha256:c82c96f0982eadfa5552a95df93ae563cc46a7948ba15542e03999ed82d3b6f8"},
+ {file = "lupa-2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9899df13e8518a807392febc9922372f904f72fc7b07c3b849e651bb2c51cdcc"},
+ {file = "lupa-2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c8956ea9a3cf930cdda50e985232dea813662ff7afd4e9595cacd8509d55aff"},
+ {file = "lupa-2.1-pp37-pypy37_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5579bcf9e99ff85c7bba3eb98642059a9580e2d4aa038a19fef814512c4392c2"},
+ {file = "lupa-2.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dfd149622d688d2aefd50f74dea6ced1663e5ddedda0fb040bfc0fa0ddb15c7"},
+ {file = "lupa-2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e93adbabe49d2a548cdeb5c9862aacfc21d55899de795cf5de88a56f3e045115"},
+ {file = "lupa-2.1-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:bdf4e0d935fd1c7c7f1e4e97ae63b646eddf23dac2e06178f5238b10c3c1d2d8"},
+ {file = "lupa-2.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:604609f8c636c16795426233691e35ab1877fd2b7833331aec62d5dac57ffb63"},
+ {file = "lupa-2.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:db60e884ba66182eddf62081f262f4080d2f34dd9fcac4ed941ccf0199f7ad28"},
+ {file = "lupa-2.1-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:7713b5fd295e0934cf6c7778944bf750c7a78d69b7efb3fd68ba7ca1e12ddbd2"},
+ {file = "lupa-2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdfd08101ddbbd178977f05bff94b9dbed677b5f218028412a98361c65a830d5"},
+ {file = "lupa-2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:05fa474ae5617a77bdb9e09c42d45f3b4b869cd3c412914eaf7913a0a38cf03d"},
+ {file = "lupa-2.1.tar.gz", hash = "sha256:760030712d5273396f5e963dd8731aefb5ac65d92eff8bf8fd4124c1630fe950"},
+]
+
+[[package]]
+name = "matplotlib"
+version = "3.8.4"
+requires_python = ">=3.9"
+summary = "Python plotting package"
+dependencies = [
+ "contourpy>=1.0.1",
+ "cycler>=0.10",
+ "fonttools>=4.22.0",
+ "importlib-resources>=3.2.0; python_version < \"3.10\"",
+ "kiwisolver>=1.3.1",
+ "numpy>=1.21",
+ "packaging>=20.0",
+ "pillow>=8",
+ "pyparsing>=2.3.1",
+ "python-dateutil>=2.7",
+]
+files = [
+ {file = "matplotlib-3.8.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014"},
+ {file = "matplotlib-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106"},
+ {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10"},
+ {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0"},
+ {file = "matplotlib-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef"},
+ {file = "matplotlib-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338"},
+ {file = "matplotlib-3.8.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661"},
+ {file = "matplotlib-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c"},
+ {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa"},
+ {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71"},
+ {file = "matplotlib-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b"},
+ {file = "matplotlib-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae"},
+ {file = "matplotlib-3.8.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616"},
+ {file = "matplotlib-3.8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732"},
+ {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb"},
+ {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30"},
+ {file = "matplotlib-3.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25"},
+ {file = "matplotlib-3.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a"},
+ {file = "matplotlib-3.8.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6"},
+ {file = "matplotlib-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67"},
+ {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb44f53af0a62dc80bba4443d9b27f2fde6acfdac281d95bc872dc148a6509cc"},
+ {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9"},
+ {file = "matplotlib-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9bb0189011785ea794ee827b68777db3ca3f93f3e339ea4d920315a0e5a78d54"},
+ {file = "matplotlib-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0"},
+ {file = "matplotlib-3.8.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c7064120a59ce6f64103c9cefba8ffe6fba87f2c61d67c401186423c9a20fd35"},
+ {file = "matplotlib-3.8.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e47eda4eb2614300fc7bb4657fced3e83d6334d03da2173b09e447418d499f"},
+ {file = "matplotlib-3.8.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:493e9f6aa5819156b58fce42b296ea31969f2aab71c5b680b4ea7a3cb5c07d94"},
+ {file = "matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea"},
]
[[package]]
@@ -685,6 +945,83 @@ files = [
]
[[package]]
+name = "packaging"
+version = "24.0"
+requires_python = ">=3.7"
+summary = "Core utilities for Python packages"
+files = [
+ {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"},
+ {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"},
+]
+
+[[package]]
+name = "pillow"
+version = "10.3.0"
+requires_python = ">=3.8"
+summary = "Python Imaging Library (Fork)"
+files = [
+ {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"},
+ {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"},
+ {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"},
+ {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"},
+ {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"},
+ {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"},
+ {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"},
+ {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"},
+ {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"},
+ {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"},
+ {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"},
+ {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"},
+ {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"},
+ {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"},
+ {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"},
+ {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"},
+ {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"},
+ {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"},
+ {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"},
+ {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"},
+ {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"},
+ {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"},
+ {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"},
+ {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"},
+ {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"},
+ {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"},
+ {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"},
+ {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"},
+ {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"},
+ {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"},
+ {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"},
+ {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"},
+ {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"},
+ {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"},
+ {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"},
+ {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"},
+ {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"},
+ {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"},
+ {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"},
+ {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"},
+ {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"},
+ {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"},
+ {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"},
+ {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"},
+ {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"},
+]
+
+[[package]]
name = "pip"
version = "24.0"
requires_python = ">=3.7"
@@ -800,6 +1137,29 @@ files = [
]
[[package]]
+name = "pyparsing"
+version = "3.1.2"
+requires_python = ">=3.6.8"
+summary = "pyparsing module - Classes and methods to define and execute parsing grammars"
+files = [
+ {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"},
+ {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"},
+]
+
+[[package]]
+name = "python-dateutil"
+version = "2.9.0.post0"
+requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+summary = "Extensions to the standard Python datetime module"
+dependencies = [
+ "six>=1.5",
+]
+files = [
+ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
+ {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
+]
+
+[[package]]
name = "pytz"
version = "2024.1"
summary = "World timezone definitions, modern and historical"
@@ -1220,3 +1580,13 @@ files = [
{file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"},
{file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"},
]
+
+[[package]]
+name = "zipp"
+version = "3.18.1"
+requires_python = ">=3.8"
+summary = "Backport of pathlib-compatible object wrapper for zip files"
+files = [
+ {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"},
+ {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"},
+]
diff --git a/pyproject.toml b/pyproject.toml
index fa76a64..ec8061b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -17,11 +17,12 @@ dependencies = [
"scikit-learn>=1.3.1",
"requests>=2.31.0",
"apscheduler>=3.10.4",
- "lupa>=2.0",
+ "lupa>=2.1",
"windows-curses>=2.3.2",
"lark>=1.1.8",
"cachetools>=5.3.2",
"iamai[onebot11]>=0.0.2",
+ "matplotlib>=3.8.4",
]
requires-python = ">=3.9"
readme.content-type = "text/x-rst"
@@ -54,6 +55,12 @@ features = ["pyo3/extension-module"]
dev = [
"pip>=24.0",
]
+docs = [
+ "docutils>=0.20.1",
+]
+pygments = [
+ "docutils>=0.20.1",
+]
[tool.ruff]
# Exclude a variety of commonly ignored directories.
diff --git a/src/lib.rs b/src/lib.rs
index 6b44509..ac54f62 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,14 +1,13 @@
use pyo3::prelude::*;
-/// Formats the sum of two numbers as string.
#[pyfunction]
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
Ok((a + b).to_string())
}
-/// A Python module implemented in Rust.
#[pymodule]
fn hydro_roll(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
Ok(())
}
+
diff --git a/tests/lua_in_python.py b/tests/lua_in_python.py
index 0cb2700..0f929df 100644
--- a/tests/lua_in_python.py
+++ b/tests/lua_in_python.py
@@ -18,20 +18,35 @@ from lupa import LuaRuntime
lua = LuaRuntime(unpack_returned_tuples=True)
import os
+
def get_Dice_Dir():
- return os.path.dirname(os.path.abspath(__file__))
+ return os.path.dirname(os.path.abspath("__file__"))
lua.globals().getDiceDir = get_Dice_Dir
-lua.globals().package.path = lua.globals().package.path + ';' + os.path.join(get_Dice_Dir(), '?.lua')
+lua.globals().package.path = (
+ lua.globals().package.path
+ + ";"
+ + os.path.join(get_Dice_Dir(), "?.lua")
+ + ";"
+ + os.path.join(get_Dice_Dir(), "?.dll")
+ + ";"
+ + os.path.join(os.path.dirname(os.path.abspath(__file__)), "?.lua")
+ + ";"
+ + os.path.join(os.path.dirname(os.path.abspath(__file__)), "?.dll")
+)
+
try:
lua.execute(
"""\
+ print()
print(getDiceDir())
+ print()
print(package.path)
js = require('json')
+ print()
print(js)
- """
+ """
)
except Exception as e:
- print(f'{e!r}') \ No newline at end of file
+ print(f"{e!r}")