From 29574d28cfa8958c7c1b69ae5662edc4c87dc117 Mon Sep 17 00:00:00 2001 From: felinae98 <731499577@qq.com> Date: Wed, 25 May 2022 20:55:13 +0800 Subject: [PATCH 01/23] seperate post and abstract post --- src/plugins/nonebot_bison/post/__init__.py | 3 + .../nonebot_bison/post/abstract_post.py | 50 ++++++++++++ src/plugins/nonebot_bison/{ => post}/post.py | 79 ++++++++++--------- 3 files changed, 95 insertions(+), 37 deletions(-) create mode 100644 src/plugins/nonebot_bison/post/__init__.py create mode 100644 src/plugins/nonebot_bison/post/abstract_post.py rename src/plugins/nonebot_bison/{ => post}/post.py (73%) diff --git a/src/plugins/nonebot_bison/post/__init__.py b/src/plugins/nonebot_bison/post/__init__.py new file mode 100644 index 0000000..3900f47 --- /dev/null +++ b/src/plugins/nonebot_bison/post/__init__.py @@ -0,0 +1,3 @@ +from .post import Post + +__all__ = ["Post"] diff --git a/src/plugins/nonebot_bison/post/abstract_post.py b/src/plugins/nonebot_bison/post/abstract_post.py new file mode 100644 index 0000000..153cc67 --- /dev/null +++ b/src/plugins/nonebot_bison/post/abstract_post.py @@ -0,0 +1,50 @@ +from abc import abstractmethod +from dataclasses import dataclass, field +from functools import reduce +from typing import Optional + +from nonebot.adapters.onebot.v11.message import Message, MessageSegment + +from ..plugin_config import plugin_config + + +@dataclass +class BasePost: + @abstractmethod + async def generate_text_messages(self) -> list[MessageSegment]: + "Generate Message list from this instance" + ... + + @abstractmethod + async def generate_pic_messages(self) -> list[MessageSegment]: + "Generate Message list from this instance with `use_pic`" + ... + + +@dataclass +class OptionalMixin: + # Because of https://stackoverflow.com/questions/51575931/class-inheritance-in-python-3-7-dataclasses + + override_use_pic: Optional[bool] = None + compress: bool = False + extra_msg: list[Message] = field(default_factory=list) + + def _use_pic(self): + if not self.override_use_pic is None: + return self.override_use_pic + return plugin_config.bison_use_pic + + +@dataclass +class AbstractPost(OptionalMixin, BasePost): + async def generate_messages(self) -> list[Message]: + if self._use_pic(): + msg_segments = await self.generate_pic_messages() + else: + msg_segments = await self.generate_text_messages() + if self.compress: + msgs = [reduce(lambda x, y: x.append(y), msg_segments, Message())] + else: + msgs = list(map(lambda msg_segment: Message([msg_segment]), msg_segments)) + msgs.extend(self.extra_msg) + return msgs diff --git a/src/plugins/nonebot_bison/post.py b/src/plugins/nonebot_bison/post/post.py similarity index 73% rename from src/plugins/nonebot_bison/post.py rename to src/plugins/nonebot_bison/post/post.py index 869db75..391d135 100644 --- a/src/plugins/nonebot_bison/post.py +++ b/src/plugins/nonebot_bison/post/post.py @@ -7,28 +7,21 @@ from nonebot.adapters.onebot.v11.message import Message, MessageSegment from nonebot.log import logger from PIL import Image -from .plugin_config import plugin_config -from .utils import http_client, parse_text +from ..utils import http_client, parse_text +from .abstract_post import BasePost, OptionalMixin @dataclass -class Post: +class _Post(BasePost): target_type: str text: str url: Optional[str] = None target_name: Optional[str] = None - compress: bool = False - override_use_pic: Optional[bool] = None pics: list[Union[str, bytes]] = field(default_factory=list) - extra_msg: list[Message] = field(default_factory=list) - _message: Optional[list[Message]] = None - - def _use_pic(self): - if not self.override_use_pic is None: - return self.override_use_pic - return plugin_config.bison_use_pic + _message: Optional[list[MessageSegment]] = None + _pic_message: Optional[list[MessageSegment]] = None async def _pic_url_to_image(self, data: Union[str, bytes]) -> Image.Image: pic_buffer = BytesIO() @@ -106,42 +99,49 @@ class Post: self.pics = self.pics[matrix[0] * matrix[1] :] self.pics.insert(0, target_io.getvalue()) - async def generate_messages(self) -> list[Message]: + async def generate_text_messages(self) -> list[MessageSegment]: + if self._message is None: await self._pic_merge() msg_segments: list[MessageSegment] = [] text = "" if self.text: - if self._use_pic(): - text += "{}".format(self.text) - else: - text += "{}".format( - self.text if len(self.text) < 500 else self.text[:500] + "..." - ) - text += "\n来源: {}".format(self.target_type) + text += "{}".format( + self.text if len(self.text) < 500 else self.text[:500] + "..." + ) + if text: + text += "\n" + text += "来源: {}".format(self.target_type) if self.target_name: text += " {}".format(self.target_name) - if self._use_pic(): - msg_segments.append(await parse_text(text)) - if not self.target_type == "rss" and self.url: - msg_segments.append(MessageSegment.text(self.url)) - else: - if self.url: - text += " \n详情: {}".format(self.url) - msg_segments.append(MessageSegment.text(text)) + if self.url: + text += " \n详情: {}".format(self.url) + msg_segments.append(MessageSegment.text(text)) for pic in self.pics: msg_segments.append(MessageSegment.image(pic)) - if self.compress: - msgs = [reduce(lambda x, y: x.append(y), msg_segments, Message())] - else: - msgs = list( - map(lambda msg_segment: Message([msg_segment]), msg_segments) - ) - msgs.extend(self.extra_msg) - self._message = msgs - assert len(self._message) > 0, f"message list empty, {self}" + self._message = msg_segments return self._message + async def generate_pic_messages(self) -> list[MessageSegment]: + + if self._pic_message is None: + await self._pic_merge() + msg_segments: list[MessageSegment] = [] + text = "" + if self.text: + text += "{}".format(self.text) + text += "\n" + text += "来源: {}".format(self.target_type) + if self.target_name: + text += " {}".format(self.target_name) + msg_segments.append(await parse_text(text)) + if not self.target_type == "rss" and self.url: + msg_segments.append(MessageSegment.text(self.url)) + for pic in self.pics: + msg_segments.append(MessageSegment.image(pic)) + self._pic_message = msg_segments + return self._pic_message + def __str__(self): return "type: {}\nfrom: {}\ntext: {}\nurl: {}\npic: {}".format( self.target_type, @@ -157,3 +157,8 @@ class Post: ) ), ) + + +@dataclass +class Post(OptionalMixin, _Post): + pass From 8720ff4d2bbc250c997ff690d4746aa9d81eccb6 Mon Sep 17 00:00:00 2001 From: felinae98 <731499577@qq.com> Date: Wed, 25 May 2022 21:05:09 +0800 Subject: [PATCH 02/23] fix bug --- src/plugins/nonebot_bison/post/post.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/nonebot_bison/post/post.py b/src/plugins/nonebot_bison/post/post.py index 391d135..fe0db9a 100644 --- a/src/plugins/nonebot_bison/post/post.py +++ b/src/plugins/nonebot_bison/post/post.py @@ -8,7 +8,7 @@ from nonebot.log import logger from PIL import Image from ..utils import http_client, parse_text -from .abstract_post import BasePost, OptionalMixin +from .abstract_post import AbstractPost, BasePost, OptionalMixin @dataclass @@ -160,5 +160,5 @@ class _Post(BasePost): @dataclass -class Post(OptionalMixin, _Post): +class Post(AbstractPost, _Post): pass From 1bec4f9933371a738da464fe08b9a3f27ebc6d69 Mon Sep 17 00:00:00 2001 From: felinae98 <731499577@qq.com> Date: Wed, 25 May 2022 21:26:00 +0800 Subject: [PATCH 03/23] add custom_post --- .../nonebot_bison/post/abstract_post.py | 11 +++++++--- src/plugins/nonebot_bison/post/custom_post.py | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 src/plugins/nonebot_bison/post/custom_post.py diff --git a/src/plugins/nonebot_bison/post/abstract_post.py b/src/plugins/nonebot_bison/post/abstract_post.py index 153cc67..c0902f3 100644 --- a/src/plugins/nonebot_bison/post/abstract_post.py +++ b/src/plugins/nonebot_bison/post/abstract_post.py @@ -42,9 +42,14 @@ class AbstractPost(OptionalMixin, BasePost): msg_segments = await self.generate_pic_messages() else: msg_segments = await self.generate_text_messages() - if self.compress: - msgs = [reduce(lambda x, y: x.append(y), msg_segments, Message())] + if msg_segments: + if self.compress: + msgs = [reduce(lambda x, y: x.append(y), msg_segments, Message())] + else: + msgs = list( + map(lambda msg_segment: Message([msg_segment]), msg_segments) + ) else: - msgs = list(map(lambda msg_segment: Message([msg_segment]), msg_segments)) + msgs = [] msgs.extend(self.extra_msg) return msgs diff --git a/src/plugins/nonebot_bison/post/custom_post.py b/src/plugins/nonebot_bison/post/custom_post.py new file mode 100644 index 0000000..6883717 --- /dev/null +++ b/src/plugins/nonebot_bison/post/custom_post.py @@ -0,0 +1,22 @@ +from dataclasses import dataclass + +from nonebot.adapters.onebot.v11.message import Message, MessageSegment + +from .abstract_post import AbstractPost, BasePost + + +@dataclass +class _CustomPost(BasePost): + + message_segments: list[MessageSegment] + + async def generate_text_messages(self) -> list[MessageSegment]: + return self.message_segments + + async def generate_pic_messages(self) -> list[MessageSegment]: + ... # TODO + + +@dataclass +class CustomPost(_CustomPost, AbstractPost): + ... From 14b1b8d5dc32d1adfabc2f0e397e889024a1315a Mon Sep 17 00:00:00 2001 From: felinae98 <731499577@qq.com> Date: Tue, 7 Jun 2022 01:52:06 +0800 Subject: [PATCH 04/23] fix ci --- .github/workflows/main.yml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 27acbe8..bbaa791 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -78,6 +78,7 @@ jobs: uses: codecov/codecov-action@v3 with: env_vars: OS,PYTHON_VERSION + docker-main: name: Docker main runs-on: ubuntu-latest @@ -104,13 +105,17 @@ jobs: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} + - name: Git Branch Name + id: git-branch-name + uses: EthanSK/git-branch-name-action@v1 + - name: Build and push uses: docker/build-push-action@v2 with: context: . file: ./docker/Dockerfile_with_frontend - push: ${{ github.event_name != 'pull_request' }} - tags: felinae98/nonebot-bison:${{ env.GITHUB_REF_NAME }} + push: true + tags: felinae98/nonebot-bison:${{ env.GIT_BRANCH_NAME }} cache-from: type=gha cache-to: type=gha,mode=max @@ -134,6 +139,10 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 + - name: Git Branch Name + id: git-branch-name + uses: EthanSK/git-branch-name-action@v1 + - name: Login to DockerHub if: github.event_name != 'pull_request' uses: docker/login-action@v1 @@ -147,6 +156,6 @@ jobs: context: . file: ./docker/Dockerfile_with_frontend_sentry push: ${{ github.event_name != 'pull_request' }} - tags: felinae98/nonebot-bison:${{ env.GITHUB_REF_NAME }}-sentry + tags: felinae98/nonebot-bison:${{ env.GIT_BRANCH_NAME }}-sentry cache-from: type=gha cache-to: type=gha,mode=max From 9c1f29aaad996e865a92054de6c92529d87fad38 Mon Sep 17 00:00:00 2001 From: felinae98 <731499577@qq.com> Date: Tue, 7 Jun 2022 00:46:58 +0800 Subject: [PATCH 05/23] fix ci --- .github/workflows/main.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bbaa791..b3cd5e0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -98,6 +98,17 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 + - name: Test Build + uses: docker/build-push-action@v2 + if: github.event_name == 'pull_request' + with: + context: . + file: ./docker/Dockerfile_with_frontend + push: false + tags: felinae98/nonebot-bison:dummy + cache-from: type=gha + cache-to: type=gha,mode=max + - name: Login to DockerHub if: github.event_name != 'pull_request' uses: docker/login-action@v1 @@ -111,6 +122,7 @@ jobs: - name: Build and push uses: docker/build-push-action@v2 + if: github.event_name != 'pull_request' with: context: . file: ./docker/Dockerfile_with_frontend From 4ec81468b76a61fbdc404b3e3ba6920dc0bc36c6 Mon Sep 17 00:00:00 2001 From: felinae98 <731499577@qq.com> Date: Wed, 8 Jun 2022 23:08:20 +0800 Subject: [PATCH 06/23] fix #86 --- src/plugins/nonebot_bison/platform/rss.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/nonebot_bison/platform/rss.py b/src/plugins/nonebot_bison/platform/rss.py index ed09e8a..b8f6ada 100644 --- a/src/plugins/nonebot_bison/platform/rss.py +++ b/src/plugins/nonebot_bison/platform/rss.py @@ -48,6 +48,10 @@ class Rss(NewMessage): soup = bs(raw_post.description, "html.parser") text += soup.text.strip() pics = list(map(lambda x: x.attrs["src"], soup("img"))) + if raw_post.get("media_content"): + for media in raw_post["media_content"]: + if media.get("medium") == "image" and media.get("url"): + pics.append(media.get("url")) return Post( "rss", text=text, From 1e72e655caa8b2f0c9946b02585432bb31aca773 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 8 Jun 2022 17:34:51 +0000 Subject: [PATCH 07/23] :memo: Update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f77cd73..615ddb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,10 @@ ## 最近更新 -- 添加新的订阅平台mcbbsnews [@AzideCupric](https://github.com/AzideCupric) ([#84](https://github.com/felinae98/nonebot-bison/pull/84)) - ### 新功能 +- 增加rss对media_content中图片的支持 [@felinae98](https://github.com/felinae98) ([#87](https://github.com/felinae98/nonebot-bison/pull/87)) +- 添加新的订阅平台mcbbsnews [@AzideCupric](https://github.com/AzideCupric) ([#84](https://github.com/felinae98/nonebot-bison/pull/84)) - 添加bilibili开播提醒 [@Sichongzou](https://github.com/Sichongzou) ([#60](https://github.com/felinae98/nonebot-bison/pull/60)) - 添加User-Agent配置 [@felinae98](https://github.com/felinae98) ([#78](https://github.com/felinae98/nonebot-bison/pull/78)) - 增加代理设置 [@felinae98](https://github.com/felinae98) ([#71](https://github.com/felinae98/nonebot-bison/pull/71)) From aebdb037d78597adf2a7b98aa44b78d7ed16c31b Mon Sep 17 00:00:00 2001 From: felinae98 <731499577@qq.com> Date: Sat, 11 Jun 2022 23:21:50 +0800 Subject: [PATCH 08/23] update dep --- poetry.lock | 453 ++++++++++++++++++++++++++++--------------------- pyproject.toml | 2 +- 2 files changed, 260 insertions(+), 195 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4a3c17e..bd20e2b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -70,7 +70,7 @@ python-dateutil = ">=2.7.0" [[package]] name = "asgiref" -version = "3.5.1" +version = "3.5.2" description = "ASGI specs, helper code, and adapters" category = "main" optional = false @@ -204,11 +204,11 @@ beautifulsoup4 = "*" [[package]] name = "certifi" -version = "2021.10.8" +version = "2022.5.18.1" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "cfgv" @@ -276,14 +276,14 @@ six = ">=1.10" [[package]] name = "coverage" -version = "6.4" +version = "6.4.1" description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -tomli = {version = "*", optional = true, markers = "python_version < \"3.11\" and extra == \"toml\""} +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] toml = ["tomli"] @@ -325,7 +325,7 @@ tests = ["dill", "coverage", "coveralls", "mock", "nose"] [[package]] name = "fastapi" -version = "0.73.0" +version = "0.78.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" category = "main" optional = false @@ -333,17 +333,17 @@ python-versions = ">=3.6.1" [package.dependencies] pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" -starlette = "0.17.1" +starlette = "0.19.1" [package.extras] -all = ["requests (>=2.24.0,<3.0.0)", "jinja2 (>=2.11.2,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "itsdangerous (>=1.1.0,<3.0.0)", "pyyaml (>=5.3.1,<6.0.0)", "ujson (>=4.0.1,<5.0.0)", "orjson (>=3.2.1,<4.0.0)", "email_validator (>=1.1.1,<2.0.0)", "uvicorn[standard] (>=0.12.0,<0.16.0)"] -dev = ["python-jose[cryptography] (>=3.3.0,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.16.0)"] -doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "typer-cli (>=0.0.12,<0.0.13)", "pyyaml (>=5.3.1,<6.0.0)"] -test = ["pytest (>=6.2.4,<7.0.0)", "pytest-cov (>=2.12.0,<4.0.0)", "mypy (==0.910)", "flake8 (>=3.8.3,<4.0.0)", "black (==21.9b0)", "isort (>=5.0.6,<6.0.0)", "requests (>=2.24.0,<3.0.0)", "httpx (>=0.14.0,<0.19.0)", "email_validator (>=1.1.1,<2.0.0)", "sqlalchemy (>=1.3.18,<1.5.0)", "peewee (>=3.13.3,<4.0.0)", "databases[sqlite] (>=0.3.2,<0.6.0)", "orjson (>=3.2.1,<4.0.0)", "ujson (>=4.0.1,<5.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "flask (>=1.1.2,<3.0.0)", "anyio[trio] (>=3.2.1,<4.0.0)", "types-ujson (==0.1.1)", "types-orjson (==3.6.0)", "types-dataclasses (==0.1.7)"] +all = ["requests (>=2.24.0,<3.0.0)", "jinja2 (>=2.11.2,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "itsdangerous (>=1.1.0,<3.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)", "orjson (>=3.2.1,<4.0.0)", "email_validator (>=1.1.1,<2.0.0)", "uvicorn[standard] (>=0.12.0,<0.18.0)"] +dev = ["python-jose[cryptography] (>=3.3.0,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.18.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "typer (>=0.4.1,<0.5.0)", "pyyaml (>=5.3.1,<7.0.0)"] +test = ["pytest (>=6.2.4,<7.0.0)", "pytest-cov (>=2.12.0,<4.0.0)", "mypy (==0.910)", "flake8 (>=3.8.3,<4.0.0)", "black (==22.3.0)", "isort (>=5.0.6,<6.0.0)", "requests (>=2.24.0,<3.0.0)", "httpx (>=0.14.0,<0.19.0)", "email_validator (>=1.1.1,<2.0.0)", "sqlalchemy (>=1.3.18,<1.5.0)", "peewee (>=3.13.3,<4.0.0)", "databases[sqlite] (>=0.3.2,<0.6.0)", "orjson (>=3.2.1,<4.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "flask (>=1.1.2,<3.0.0)", "anyio[trio] (>=3.2.1,<4.0.0)", "types-ujson (==4.2.1)", "types-orjson (==3.6.2)", "types-dataclasses (==0.6.5)"] [[package]] name = "feedparser" -version = "6.0.8" +version = "6.0.10" description = "Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds" category = "main" optional = false @@ -354,7 +354,7 @@ sgmllib3k = "*" [[package]] name = "filelock" -version = "3.7.0" +version = "3.7.1" description = "A platform independent file lock." category = "dev" optional = false @@ -442,7 +442,7 @@ socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "identify" -version = "2.5.0" +version = "2.5.1" description = "File identification library for Python" category = "dev" optional = false @@ -461,7 +461,7 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.11.3" +version = "4.11.4" description = "Read metadata from Python packages" category = "main" optional = false @@ -498,7 +498,7 @@ toml = {version = ">=0.10.2", markers = "python_version > \"3.6\""} [[package]] name = "ipython" -version = "8.3.0" +version = "8.4.0" description = "IPython: Productive Interactive Computing" category = "dev" optional = false @@ -634,6 +634,14 @@ python-versions = ">=3.5" [package.dependencies] traitlets = "*" +[[package]] +name = "msgpack" +version = "1.0.4" +description = "MessagePack serializer" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "multidict" version = "6.0.2" @@ -652,7 +660,7 @@ python-versions = "*" [[package]] name = "nb-cli" -version = "0.6.6" +version = "0.6.7" description = "CLI for nonebot2" category = "dev" optional = false @@ -666,7 +674,7 @@ httpx = ">=0.18.0,<1.0.0" nonebot2 = ">=2.0.0-beta.1,<3.0.0" prompt-toolkit = ">=3.0.19,<4.0.0" pyfiglet = ">=0.8.post1,<0.9" -tomlkit = ">=0.9.0,<0.10.0" +tomlkit = ">=0.10.0,<0.11.0" wcwidth = ">=0.2.5,<0.3.0" [package.extras] @@ -683,28 +691,28 @@ python-versions = "*" [[package]] name = "nonebot-adapter-onebot" -version = "2.0.0b1" +version = "2.1.0" description = "OneBot(CQHTTP) adapter for nonebot2" category = "main" optional = false python-versions = ">=3.7.3,<4.0.0" [package.dependencies] -nonebot2 = ">=2.0.0-beta.1,<3.0.0" +msgpack = ">=1.0.3,<2.0.0" +nonebot2 = ">=2.0.0-beta.3,<3.0.0" [[package]] name = "nonebot-plugin-htmlrender" -version = "0.0.4.6" +version = "0.0.4.8" description = "通过浏览器渲染图片" category = "main" optional = false -python-versions = ">=3.7.3,<4.0" +python-versions = ">=3.7.3,<4.0.0" [package.dependencies] aiofiles = ">=0.8.0,<0.9.0" jinja2 = ">=3.0.3,<4.0.0" markdown = ">=3.3.6,<4.0.0" -nonebot-adapter-onebot = ">=2.0.0-beta.1,<3.0.0" nonebot2 = ">=2.0.0-beta.1,<3.0.0" playwright = ">=1.17.2,<2.0.0" Pygments = ">=2.10.0,<3.0.0" @@ -714,25 +722,25 @@ uvicorn = ">=0.17.6,<0.18.0" [[package]] name = "nonebot2" -version = "2.0.0b2" +version = "2.0.0b3" description = "An asynchronous python bot framework." category = "main" optional = false python-versions = ">=3.7.3,<4.0.0" [package.dependencies] -fastapi = ">=0.73.0,<0.74.0" +fastapi = ">=0.78.0,<0.79.0" loguru = ">=0.6.0,<0.7.0" pydantic = {version = ">=1.9.0,<1.10.0", extras = ["dotenv"]} pygtrie = ">=2.4.1,<3.0.0" -tomlkit = ">=0.9.0,<0.10.0" +tomlkit = ">=0.10.0,<0.11.0" typing-extensions = ">=3.10.0,<5.0.0" uvicorn = {version = ">=0.17.0,<0.18.0", extras = ["standard"]} yarl = ">=1.7.2,<2.0.0" [package.extras] -quart = ["Quart (>=0.16.0,<0.17.0)"] -all = ["Quart (>=0.16.0,<0.17.0)", "websockets (>=10.0,<11.0)", "aiohttp[speedups] (>=3.7.4,<4.0.0)", "httpx[http2] (>=0.20.0,<1.0.0)"] +quart = ["Quart (>=0.17.0,<0.18.0)"] +all = ["Quart (>=0.17.0,<0.18.0)", "websockets (>=10.0,<11.0)", "aiohttp[speedups] (>=3.7.4,<4.0.0)", "httpx[http2] (>=0.20.0,<1.0.0)"] websockets = ["websockets (>=10.0,<11.0)"] aiohttp = ["aiohttp[speedups] (>=3.7.4,<4.0.0)"] httpx = ["httpx[http2] (>=0.20.0,<1.0.0)"] @@ -811,12 +819,16 @@ python-versions = "*" [[package]] name = "pillow" -version = "9.0.1" +version = "9.1.1" description = "Python Imaging Library (Fork)" category = "main" optional = false python-versions = ">=3.7" +[package.extras] +docs = ["olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinx-rtd-theme (>=1.0)", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + [[package]] name = "platformdirs" version = "2.5.2" @@ -918,8 +930,8 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pydantic" -version = "1.9.0" -description = "Data validation and settings management using python 3.6 type hinting" +version = "1.9.1" +description = "Data validation and settings management using python type hints" category = "main" optional = false python-versions = ">=3.6.1" @@ -980,7 +992,7 @@ tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"] [[package]] name = "pymdown-extensions" -version = "9.4" +version = "9.5" description = "Extension pack for Python Markdown." category = "main" optional = false @@ -1154,20 +1166,20 @@ python-versions = ">=3.6" [[package]] name = "requests" -version = "2.27.1" +version = "2.28.0" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7, <4" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +charset-normalizer = ">=2.0.0,<2.1.0" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] [[package]] @@ -1245,14 +1257,15 @@ tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] [[package]] name = "starlette" -version = "0.17.1" +version = "0.19.1" description = "The little ASGI library that shines." category = "main" optional = false python-versions = ">=3.6" [package.dependencies] -anyio = ">=3.0.0,<4" +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] @@ -1291,7 +1304,7 @@ python-versions = ">=3.7" [[package]] name = "tomlkit" -version = "0.9.2" +version = "0.10.2" description = "Style preserving TOML library" category = "main" optional = false @@ -1299,14 +1312,14 @@ python-versions = ">=3.6,<4.0" [[package]] name = "traitlets" -version = "5.2.0" -description = "Traitlets Python configuration system" +version = "5.2.2.post1" +description = "" category = "dev" optional = false python-versions = ">=3.7" [package.extras] -test = ["pytest", "pre-commit"] +test = ["pre-commit", "pytest"] [[package]] name = "typing-extensions" @@ -1472,7 +1485,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "94a6b1bdb14b41828f5acb6018568da5d2004af82e0ec8b75458f7459e7dfaa3" +content-hash = "9d8bf997d31675a65f38e1b8bb6a7652b843f2cbad72d2802971b351cf6cc0fa" [metadata.files] aiofiles = [ @@ -1496,8 +1509,8 @@ arrow = [ {file = "arrow-1.2.2.tar.gz", hash = "sha256:05caf1fd3d9a11a1135b2b6f09887421153b94558e5ef4d090b567b47173ac2b"}, ] asgiref = [ - {file = "asgiref-3.5.1-py3-none-any.whl", hash = "sha256:45a429524fba18aba9d512498b19d220c4d628e75b40cf5c627524dbaebc5cc1"}, - {file = "asgiref-3.5.1.tar.gz", hash = "sha256:fddeea3c53fa99d0cdb613c3941cc6e52d822491fc2753fba25768fb5bf4e865"}, + {file = "asgiref-3.5.2-py3-none-any.whl", hash = "sha256:1d2880b792ae8757289136f1db2b7b99100ce959b2aa57fd69dab783d05afac4"}, + {file = "asgiref-3.5.2.tar.gz", hash = "sha256:4a29362a6acebe09bf1d6640db38c1dc3d9217c68e6f9f6204d72667fc19a424"}, ] asttokens = [ {file = "asttokens-2.0.5-py2.py3-none-any.whl", hash = "sha256:0844691e88552595a6f4a4281a9f7f79b8dd45ca4ccea82e5e05b4bbdb76705c"}, @@ -1559,8 +1572,8 @@ bs4 = [ {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, ] certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, + {file = "certifi-2022.5.18.1-py3-none-any.whl", hash = "sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a"}, + {file = "certifi-2022.5.18.1.tar.gz", hash = "sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7"}, ] cfgv = [ {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, @@ -1587,47 +1600,47 @@ cookiecutter = [ {file = "cookiecutter-1.7.3.tar.gz", hash = "sha256:6b9a4d72882e243be077a7397d0f1f76fe66cf3df91f3115dbb5330e214fa457"}, ] coverage = [ - {file = "coverage-6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50ed480b798febce113709846b11f5d5ed1e529c88d8ae92f707806c50297abf"}, - {file = "coverage-6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:26f8f92699756cb7af2b30720de0c5bb8d028e923a95b6d0c891088025a1ac8f"}, - {file = "coverage-6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60c2147921da7f4d2d04f570e1838db32b95c5509d248f3fe6417e91437eaf41"}, - {file = "coverage-6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:750e13834b597eeb8ae6e72aa58d1d831b96beec5ad1d04479ae3772373a8088"}, - {file = "coverage-6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af5b9ee0fc146e907aa0f5fb858c3b3da9199d78b7bb2c9973d95550bd40f701"}, - {file = "coverage-6.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a022394996419142b33a0cf7274cb444c01d2bb123727c4bb0b9acabcb515dea"}, - {file = "coverage-6.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5a78cf2c43b13aa6b56003707c5203f28585944c277c1f3f109c7b041b16bd39"}, - {file = "coverage-6.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9229d074e097f21dfe0643d9d0140ee7433814b3f0fc3706b4abffd1e3038632"}, - {file = "coverage-6.4-cp310-cp310-win32.whl", hash = "sha256:fb45fe08e1abc64eb836d187b20a59172053999823f7f6ef4f18a819c44ba16f"}, - {file = "coverage-6.4-cp310-cp310-win_amd64.whl", hash = "sha256:3cfd07c5889ddb96a401449109a8b97a165be9d67077df6802f59708bfb07720"}, - {file = "coverage-6.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:03014a74023abaf5a591eeeaf1ac66a73d54eba178ff4cb1fa0c0a44aae70383"}, - {file = "coverage-6.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c82f2cd69c71698152e943f4a5a6b83a3ab1db73b88f6e769fabc86074c3b08"}, - {file = "coverage-6.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b546cf2b1974ddc2cb222a109b37c6ed1778b9be7e6b0c0bc0cf0438d9e45a6"}, - {file = "coverage-6.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc173f1ce9ffb16b299f51c9ce53f66a62f4d975abe5640e976904066f3c835d"}, - {file = "coverage-6.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c53ad261dfc8695062fc8811ac7c162bd6096a05a19f26097f411bdf5747aee7"}, - {file = "coverage-6.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:eef5292b60b6de753d6e7f2d128d5841c7915fb1e3321c3a1fe6acfe76c38052"}, - {file = "coverage-6.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:543e172ce4c0de533fa892034cce260467b213c0ea8e39da2f65f9a477425211"}, - {file = "coverage-6.4-cp37-cp37m-win32.whl", hash = "sha256:00c8544510f3c98476bbd58201ac2b150ffbcce46a8c3e4fb89ebf01998f806a"}, - {file = "coverage-6.4-cp37-cp37m-win_amd64.whl", hash = "sha256:b84ab65444dcc68d761e95d4d70f3cfd347ceca5a029f2ffec37d4f124f61311"}, - {file = "coverage-6.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d548edacbf16a8276af13063a2b0669d58bbcfca7c55a255f84aac2870786a61"}, - {file = "coverage-6.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:033ebec282793bd9eb988d0271c211e58442c31077976c19c442e24d827d356f"}, - {file = "coverage-6.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:742fb8b43835078dd7496c3c25a1ec8d15351df49fb0037bffb4754291ef30ce"}, - {file = "coverage-6.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55fae115ef9f67934e9f1103c9ba826b4c690e4c5bcf94482b8b2398311bf9c"}, - {file = "coverage-6.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd698341626f3c77784858427bad0cdd54a713115b423d22ac83a28303d1d95"}, - {file = "coverage-6.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:62d382f7d77eeeaff14b30516b17bcbe80f645f5cf02bb755baac376591c653c"}, - {file = "coverage-6.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:016d7f5cf1c8c84f533a3c1f8f36126fbe00b2ec0ccca47cc5731c3723d327c6"}, - {file = "coverage-6.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:69432946f154c6add0e9ede03cc43b96e2ef2733110a77444823c053b1ff5166"}, - {file = "coverage-6.4-cp38-cp38-win32.whl", hash = "sha256:83bd142cdec5e4a5c4ca1d4ff6fa807d28460f9db919f9f6a31babaaa8b88426"}, - {file = "coverage-6.4-cp38-cp38-win_amd64.whl", hash = "sha256:4002f9e8c1f286e986fe96ec58742b93484195defc01d5cc7809b8f7acb5ece3"}, - {file = "coverage-6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e4f52c272fdc82e7c65ff3f17a7179bc5f710ebc8ce8a5cadac81215e8326740"}, - {file = "coverage-6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b5578efe4038be02d76c344007b13119b2b20acd009a88dde8adec2de4f630b5"}, - {file = "coverage-6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8099ea680201c2221f8468c372198ceba9338a5fec0e940111962b03b3f716a"}, - {file = "coverage-6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a00441f5ea4504f5abbc047589d09e0dc33eb447dc45a1a527c8b74bfdd32c65"}, - {file = "coverage-6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e76bd16f0e31bc2b07e0fb1379551fcd40daf8cdf7e24f31a29e442878a827c"}, - {file = "coverage-6.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8d2e80dd3438e93b19e1223a9850fa65425e77f2607a364b6fd134fcd52dc9df"}, - {file = "coverage-6.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:341e9c2008c481c5c72d0e0dbf64980a4b2238631a7f9780b0fe2e95755fb018"}, - {file = "coverage-6.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:21e6686a95025927775ac501e74f5940cdf6fe052292f3a3f7349b0abae6d00f"}, - {file = "coverage-6.4-cp39-cp39-win32.whl", hash = "sha256:968ed5407f9460bd5a591cefd1388cc00a8f5099de9e76234655ae48cfdbe2c3"}, - {file = "coverage-6.4-cp39-cp39-win_amd64.whl", hash = "sha256:e35217031e4b534b09f9b9a5841b9344a30a6357627761d4218818b865d45055"}, - {file = "coverage-6.4-pp36.pp37.pp38-none-any.whl", hash = "sha256:e637ae0b7b481905358624ef2e81d7fb0b1af55f5ff99f9ba05442a444b11e45"}, - {file = "coverage-6.4.tar.gz", hash = "sha256:727dafd7f67a6e1cad808dc884bd9c5a2f6ef1f8f6d2f22b37b96cb0080d4f49"}, + {file = "coverage-6.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f1d5aa2703e1dab4ae6cf416eb0095304f49d004c39e9db1d86f57924f43006b"}, + {file = "coverage-6.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ce1b258493cbf8aec43e9b50d89982346b98e9ffdfaae8ae5793bc112fb0068"}, + {file = "coverage-6.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c4e737f60c6936460c5be330d296dd5b48b3963f48634c53b3f7deb0f34ec4"}, + {file = "coverage-6.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84e65ef149028516c6d64461b95a8dbcfce95cfd5b9eb634320596173332ea84"}, + {file = "coverage-6.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f69718750eaae75efe506406c490d6fc5a6161d047206cc63ce25527e8a3adad"}, + {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e57816f8ffe46b1df8f12e1b348f06d164fd5219beba7d9433ba79608ef011cc"}, + {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:01c5615d13f3dd3aa8543afc069e5319cfa0c7d712f6e04b920431e5c564a749"}, + {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:75ab269400706fab15981fd4bd5080c56bd5cc07c3bccb86aab5e1d5a88dc8f4"}, + {file = "coverage-6.4.1-cp310-cp310-win32.whl", hash = "sha256:a7f3049243783df2e6cc6deafc49ea123522b59f464831476d3d1448e30d72df"}, + {file = "coverage-6.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ee2ddcac99b2d2aec413e36d7a429ae9ebcadf912946b13ffa88e7d4c9b712d6"}, + {file = "coverage-6.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb73e0011b8793c053bfa85e53129ba5f0250fdc0392c1591fd35d915ec75c46"}, + {file = "coverage-6.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106c16dfe494de3193ec55cac9640dd039b66e196e4641fa8ac396181578b982"}, + {file = "coverage-6.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87f4f3df85aa39da00fd3ec4b5abeb7407e82b68c7c5ad181308b0e2526da5d4"}, + {file = "coverage-6.4.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:961e2fb0680b4f5ad63234e0bf55dfb90d302740ae9c7ed0120677a94a1590cb"}, + {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cec3a0f75c8f1031825e19cd86ee787e87cf03e4fd2865c79c057092e69e3a3b"}, + {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:129cd05ba6f0d08a766d942a9ed4b29283aff7b2cccf5b7ce279d50796860bb3"}, + {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bf5601c33213d3cb19d17a796f8a14a9eaa5e87629a53979a5981e3e3ae166f6"}, + {file = "coverage-6.4.1-cp37-cp37m-win32.whl", hash = "sha256:269eaa2c20a13a5bf17558d4dc91a8d078c4fa1872f25303dddcbba3a813085e"}, + {file = "coverage-6.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f02cbbf8119db68455b9d763f2f8737bb7db7e43720afa07d8eb1604e5c5ae28"}, + {file = "coverage-6.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ffa9297c3a453fba4717d06df579af42ab9a28022444cae7fa605af4df612d54"}, + {file = "coverage-6.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:145f296d00441ca703a659e8f3eb48ae39fb083baba2d7ce4482fb2723e050d9"}, + {file = "coverage-6.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d44996140af8b84284e5e7d398e589574b376fb4de8ccd28d82ad8e3bea13"}, + {file = "coverage-6.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2bd9a6fc18aab8d2e18f89b7ff91c0f34ff4d5e0ba0b33e989b3cd4194c81fd9"}, + {file = "coverage-6.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3384f2a3652cef289e38100f2d037956194a837221edd520a7ee5b42d00cc605"}, + {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b3e07152b4563722be523e8cd0b209e0d1a373022cfbde395ebb6575bf6790d"}, + {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1480ff858b4113db2718848d7b2d1b75bc79895a9c22e76a221b9d8d62496428"}, + {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:865d69ae811a392f4d06bde506d531f6a28a00af36f5c8649684a9e5e4a85c83"}, + {file = "coverage-6.4.1-cp38-cp38-win32.whl", hash = "sha256:664a47ce62fe4bef9e2d2c430306e1428ecea207ffd68649e3b942fa8ea83b0b"}, + {file = "coverage-6.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:26dff09fb0d82693ba9e6231248641d60ba606150d02ed45110f9ec26404ed1c"}, + {file = "coverage-6.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9c80df769f5ec05ad21ea34be7458d1dc51ff1fb4b2219e77fe24edf462d6df"}, + {file = "coverage-6.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39ee53946bf009788108b4dd2894bf1349b4e0ca18c2016ffa7d26ce46b8f10d"}, + {file = "coverage-6.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5b66caa62922531059bc5ac04f836860412f7f88d38a476eda0a6f11d4724f4"}, + {file = "coverage-6.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd180ed867e289964404051a958f7cccabdeed423f91a899829264bb7974d3d3"}, + {file = "coverage-6.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84631e81dd053e8a0d4967cedab6db94345f1c36107c71698f746cb2636c63e3"}, + {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8c08da0bd238f2970230c2a0d28ff0e99961598cb2e810245d7fc5afcf1254e8"}, + {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d42c549a8f41dc103a8004b9f0c433e2086add8a719da00e246e17cbe4056f72"}, + {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:309ce4a522ed5fca432af4ebe0f32b21d6d7ccbb0f5fcc99290e71feba67c264"}, + {file = "coverage-6.4.1-cp39-cp39-win32.whl", hash = "sha256:fdb6f7bd51c2d1714cea40718f6149ad9be6a2ee7d93b19e9f00934c0f2a74d9"}, + {file = "coverage-6.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:342d4aefd1c3e7f620a13f4fe563154d808b69cccef415415aece4c786665397"}, + {file = "coverage-6.4.1-pp36.pp37.pp38-none-any.whl", hash = "sha256:4803e7ccf93230accb928f3a68f00ffa80a88213af98ed338a57ad021ef06815"}, + {file = "coverage-6.4.1.tar.gz", hash = "sha256:4321f075095a096e70aff1d002030ee612b65a205a0a0f5b815280d5dc58100c"}, ] decorator = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, @@ -1645,16 +1658,16 @@ expiringdict = [ {file = "expiringdict-1.2.1.tar.gz", hash = "sha256:fe2ba427220425c3c8a3d29f6d2e2985bcee323f8bcd4021e68ebefbd90d8250"}, ] fastapi = [ - {file = "fastapi-0.73.0-py3-none-any.whl", hash = "sha256:f0a618aff5f6942862f2d3f20f39b1c037e33314d1b8207fd1c3a2cca76dfd8c"}, - {file = "fastapi-0.73.0.tar.gz", hash = "sha256:dcfee92a7f9a72b5d4b7ca364bd2b009f8fc10d95ed5769be20e94f39f7e5a15"}, + {file = "fastapi-0.78.0-py3-none-any.whl", hash = "sha256:15fcabd5c78c266fa7ae7d8de9b384bfc2375ee0503463a6febbe3bab69d6f65"}, + {file = "fastapi-0.78.0.tar.gz", hash = "sha256:3233d4a789ba018578658e2af1a4bb5e38bdd122ff722b313666a9b2c6786a83"}, ] feedparser = [ - {file = "feedparser-6.0.8-py3-none-any.whl", hash = "sha256:1b7f57841d9cf85074deb316ed2c795091a238adb79846bc46dccdaf80f9c59a"}, - {file = "feedparser-6.0.8.tar.gz", hash = "sha256:5ce0410a05ab248c8c7cfca3a0ea2203968ee9ff4486067379af4827a59f9661"}, + {file = "feedparser-6.0.10-py3-none-any.whl", hash = "sha256:79c257d526d13b944e965f6095700587f27388e50ea16fd245babe4dfae7024f"}, + {file = "feedparser-6.0.10.tar.gz", hash = "sha256:27da485f4637ce7163cdeab13a80312b93b7d0c1b775bef4a47629a3110bca51"}, ] filelock = [ - {file = "filelock-3.7.0-py3-none-any.whl", hash = "sha256:c7b5fdb219b398a5b28c8e4c1893ef5f98ece6a38c6ab2c22e26ec161556fed6"}, - {file = "filelock-3.7.0.tar.gz", hash = "sha256:b795f1b42a61bbf8ec7113c341dad679d772567b936fbd1bf43c9a238e673e20"}, + {file = "filelock-3.7.1-py3-none-any.whl", hash = "sha256:37def7b658813cda163b56fc564cdc75e86d338246458c4c28ae84cabefa2404"}, + {file = "filelock-3.7.1.tar.gz", hash = "sha256:3a0fd85166ad9dbab54c9aec96737b744106dc5f15c0b09a6744a445299fcf04"}, ] flaky = [ {file = "flaky-3.7.0-py2.py3-none-any.whl", hash = "sha256:d6eda73cab5ae7364504b7c44670f70abed9e75f77dd116352f662817592ec9c"}, @@ -1672,7 +1685,6 @@ greenlet = [ {file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e5306482182170ade15c4b0d8386ded995a07d7cc2ca8f27958d34d6736497"}, {file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6a36bb9474218c7a5b27ae476035497a6990e21d04c279884eb10d9b290f1b1"}, {file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abb7a75ed8b968f3061327c433a0fbd17b729947b400747c334a9c29a9af6c58"}, - {file = "greenlet-1.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b336501a05e13b616ef81ce329c0e09ac5ed8c732d9ba7e3e983fcc1a9e86965"}, {file = "greenlet-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:14d4f3cd4e8b524ae9b8aa567858beed70c392fdec26dbdb0a8a418392e71708"}, {file = "greenlet-1.1.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:17ff94e7a83aa8671a25bf5b59326ec26da379ace2ebc4411d690d80a7fbcf23"}, {file = "greenlet-1.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9f3cba480d3deb69f6ee2c1825060177a22c7826431458c697df88e6aeb3caee"}, @@ -1685,7 +1697,6 @@ greenlet = [ {file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9d29ca8a77117315101425ec7ec2a47a22ccf59f5593378fc4077ac5b754fce"}, {file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21915eb821a6b3d9d8eefdaf57d6c345b970ad722f856cd71739493ce003ad08"}, {file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eff9d20417ff9dcb0d25e2defc2574d10b491bf2e693b4e491914738b7908168"}, - {file = "greenlet-1.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b8c008de9d0daba7b6666aa5bbfdc23dcd78cafc33997c9b7741ff6353bafb7f"}, {file = "greenlet-1.1.2-cp36-cp36m-win32.whl", hash = "sha256:32ca72bbc673adbcfecb935bb3fb1b74e663d10a4b241aaa2f5a75fe1d1f90aa"}, {file = "greenlet-1.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f0214eb2a23b85528310dad848ad2ac58e735612929c8072f6093f3585fd342d"}, {file = "greenlet-1.1.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:b92e29e58bef6d9cfd340c72b04d74c4b4e9f70c9fa7c78b674d1fec18896dc4"}, @@ -1694,7 +1705,6 @@ greenlet = [ {file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e12bdc622676ce47ae9abbf455c189e442afdde8818d9da983085df6312e7a1"}, {file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c790abda465726cfb8bb08bd4ca9a5d0a7bd77c7ac1ca1b839ad823b948ea28"}, {file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f276df9830dba7a333544bd41070e8175762a7ac20350786b322b714b0e654f5"}, - {file = "greenlet-1.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c5d5b35f789a030ebb95bff352f1d27a93d81069f2adb3182d99882e095cefe"}, {file = "greenlet-1.1.2-cp37-cp37m-win32.whl", hash = "sha256:64e6175c2e53195278d7388c454e0b30997573f3f4bd63697f88d855f7a6a1fc"}, {file = "greenlet-1.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b11548073a2213d950c3f671aa88e6f83cda6e2fb97a8b6317b1b5b33d850e06"}, {file = "greenlet-1.1.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:9633b3034d3d901f0a46b7939f8c4d64427dfba6bbc5a36b1a67364cf148a1b0"}, @@ -1703,7 +1713,6 @@ greenlet = [ {file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e859fcb4cbe93504ea18008d1df98dee4f7766db66c435e4882ab35cf70cac43"}, {file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e44c8afdbe5467e4f7b5851be223be68adb4272f44696ee71fe46b7036a711"}, {file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec8c433b3ab0419100bd45b47c9c8551248a5aee30ca5e9d399a0b57ac04651b"}, - {file = "greenlet-1.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2bde6792f313f4e918caabc46532aa64aa27a0db05d75b20edfc5c6f46479de2"}, {file = "greenlet-1.1.2-cp38-cp38-win32.whl", hash = "sha256:288c6a76705dc54fba69fbcb59904ae4ad768b4c768839b8ca5fdadec6dd8cfd"}, {file = "greenlet-1.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:8d2f1fb53a421b410751887eb4ff21386d119ef9cde3797bf5e7ed49fb51a3b3"}, {file = "greenlet-1.1.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:166eac03e48784a6a6e0e5f041cfebb1ab400b394db188c48b3a84737f505b67"}, @@ -1712,7 +1721,6 @@ greenlet = [ {file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1692f7d6bc45e3200844be0dba153612103db241691088626a33ff1f24a0d88"}, {file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7227b47e73dedaa513cdebb98469705ef0d66eb5a1250144468e9c3097d6b59b"}, {file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff61ff178250f9bb3cd89752df0f1dd0e27316a8bd1465351652b1b4a4cdfd3"}, - {file = "greenlet-1.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0051c6f1f27cb756ffc0ffbac7d2cd48cb0362ac1736871399a739b2885134d3"}, {file = "greenlet-1.1.2-cp39-cp39-win32.whl", hash = "sha256:f70a9e237bb792c7cc7e44c531fd48f5897961701cdaa06cf22fc14965c496cf"}, {file = "greenlet-1.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:013d61294b6cd8fe3242932c1c5e36e5d1db2c8afb58606c5a67efce62c1f5fd"}, {file = "greenlet-1.1.2.tar.gz", hash = "sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a"}, @@ -1766,16 +1774,16 @@ httpx = [ {file = "httpx-0.23.0.tar.gz", hash = "sha256:f28eac771ec9eb4866d3fb4ab65abd42d38c424739e80c08d8d20570de60b0ef"}, ] identify = [ - {file = "identify-2.5.0-py2.py3-none-any.whl", hash = "sha256:3acfe15a96e4272b4ec5662ee3e231ceba976ef63fd9980ed2ce9cc415df393f"}, - {file = "identify-2.5.0.tar.gz", hash = "sha256:c83af514ea50bf2be2c4a3f2fb349442b59dc87284558ae9ff54191bff3541d2"}, + {file = "identify-2.5.1-py2.py3-none-any.whl", hash = "sha256:0dca2ea3e4381c435ef9c33ba100a78a9b40c0bab11189c7cf121f75815efeaa"}, + {file = "identify-2.5.1.tar.gz", hash = "sha256:3d11b16f3fe19f52039fb7e39c9c884b21cb1b586988114fbe42671f03de3e82"}, ] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, + {file = "importlib_metadata-4.11.4-py3-none-any.whl", hash = "sha256:c58c8eb8a762858f49e18436ff552e83914778e50e9d2f1660535ffb364552ec"}, + {file = "importlib_metadata-4.11.4.tar.gz", hash = "sha256:5d26852efe48c0a32b0509ffbc583fda1a2266545a78d104a6f4aff3db17d700"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1785,8 +1793,8 @@ ipdb = [ {file = "ipdb-0.13.9.tar.gz", hash = "sha256:951bd9a64731c444fd907a5ce268543020086a697f6be08f7cc2c9a752a278c5"}, ] ipython = [ - {file = "ipython-8.3.0-py3-none-any.whl", hash = "sha256:341456643a764c28f670409bbd5d2518f9b82c013441084ff2c2fc999698f83b"}, - {file = "ipython-8.3.0.tar.gz", hash = "sha256:807ae3cf43b84693c9272f70368440a9a7eaa2e7e6882dad943c32fbf7e51402"}, + {file = "ipython-8.4.0-py3-none-any.whl", hash = "sha256:7ca74052a38fa25fe9bedf52da0be7d3fdd2fb027c3b778ea78dfe8c212937d1"}, + {file = "ipython-8.4.0.tar.gz", hash = "sha256:f2db3a10254241d9b447232cec8b424847f338d9d36f9a577a6192c332a46abd"}, ] isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, @@ -1858,6 +1866,60 @@ matplotlib-inline = [ {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, ] +msgpack = [ + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, + {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, + {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, + {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, + {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, + {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, + {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, + {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, + {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, + {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, + {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, + {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, + {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, + {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, +] multidict = [ {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, @@ -1924,24 +1986,24 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] nb-cli = [ - {file = "nb-cli-0.6.6.tar.gz", hash = "sha256:501a747dda00b2d384421634a98b136d9976d12d950d54f1e2bb3c71236ffa73"}, - {file = "nb_cli-0.6.6-py3-none-any.whl", hash = "sha256:72a3929e0de4405f5dee7a43cd5358065b36b39125bc99d7dbb1d672bf7f7713"}, + {file = "nb-cli-0.6.7.tar.gz", hash = "sha256:394bf65eabbda6aa7c410961b901e9f7320fae12143818b1c078fc43f060fa0e"}, + {file = "nb_cli-0.6.7-py3-none-any.whl", hash = "sha256:693342ebcf4dce14fd7be4555c65e5da41707a67e5de73d7d7fe67a716a1cad9"}, ] nodeenv = [ {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, ] nonebot-adapter-onebot = [ - {file = "nonebot-adapter-onebot-2.0.0b1.tar.gz", hash = "sha256:9dad770371e577fead096ceacacc43b3ef304a8e238e8fff1163eefc4e947a75"}, - {file = "nonebot_adapter_onebot-2.0.0b1-py3-none-any.whl", hash = "sha256:ca1375de1dd503a5ab20440445026195b587e05a2b18ae8df9b6ab17c9e857b5"}, + {file = "nonebot-adapter-onebot-2.1.0.tar.gz", hash = "sha256:b3696235581a25f52dec8744b82102bf138637845d1bbaaf305b9e89423a562f"}, + {file = "nonebot_adapter_onebot-2.1.0-py3-none-any.whl", hash = "sha256:c1b4efd6a7ec22430897ba0e0698d58a95b2e28fe39c37271131c796ca366186"}, ] nonebot-plugin-htmlrender = [ - {file = "nonebot-plugin-htmlrender-0.0.4.6.tar.gz", hash = "sha256:1d3a6cb9752e27097dc5cda97f552cb1a0617c66ebd9ed6e33eabf14bea15b5d"}, - {file = "nonebot_plugin_htmlrender-0.0.4.6-py3-none-any.whl", hash = "sha256:e7f0739a3e3e779820f2894c872afcbd5e2e54a04d9540d05efac11af34d72d7"}, + {file = "nonebot-plugin-htmlrender-0.0.4.8.tar.gz", hash = "sha256:6c41afc95b8ab9980903e89841a47db5c02b3a62b9dab5bcf9714c716e69eb2a"}, + {file = "nonebot_plugin_htmlrender-0.0.4.8-py3-none-any.whl", hash = "sha256:4ed625be82dfdf469864b32a6e129e43b91e863f25b1fdbc8c936418dbd6126e"}, ] nonebot2 = [ - {file = "nonebot2-2.0.0b2-py3-none-any.whl", hash = "sha256:8166490311b607f8fbf5e31934b005e29f6d39ff222a6771ec36c9456ec337ec"}, - {file = "nonebot2-2.0.0b2.tar.gz", hash = "sha256:2950f27a62f2a98b2abf3128c19d898a24c2867e70fb5c6af231eadf558b18a8"}, + {file = "nonebot2-2.0.0b3-py3-none-any.whl", hash = "sha256:00f2ea63d5f2c665428bec4b7a33301f6b1b483d5635d2a3241f0a1ab3b5b2ea"}, + {file = "nonebot2-2.0.0b3.tar.gz", hash = "sha256:b7ee6ddf387af268e36f4276c2d94b4f717c1a29078400738ca275c3fb266dd4"}, ] nonebug = [] packaging = [ @@ -1965,41 +2027,44 @@ pickleshare = [ {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] pillow = [ - {file = "Pillow-9.0.1-1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5d24e1d674dd9d72c66ad3ea9131322819ff86250b30dc5821cbafcfa0b96b4"}, - {file = "Pillow-9.0.1-1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2632d0f846b7c7600edf53c48f8f9f1e13e62f66a6dbc15191029d950bfed976"}, - {file = "Pillow-9.0.1-1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9618823bd237c0d2575283f2939655f54d51b4527ec3972907a927acbcc5bfc"}, - {file = "Pillow-9.0.1-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:9bfdb82cdfeccec50aad441afc332faf8606dfa5e8efd18a6692b5d6e79f00fd"}, - {file = "Pillow-9.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5100b45a4638e3c00e4d2320d3193bdabb2d75e79793af7c3eb139e4f569f16f"}, - {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:528a2a692c65dd5cafc130de286030af251d2ee0483a5bf50c9348aefe834e8a"}, - {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f29d831e2151e0b7b39981756d201f7108d3d215896212ffe2e992d06bfe049"}, - {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:855c583f268edde09474b081e3ddcd5cf3b20c12f26e0d434e1386cc5d318e7a"}, - {file = "Pillow-9.0.1-cp310-cp310-win32.whl", hash = "sha256:d9d7942b624b04b895cb95af03a23407f17646815495ce4547f0e60e0b06f58e"}, - {file = "Pillow-9.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81c4b81611e3a3cb30e59b0cf05b888c675f97e3adb2c8672c3154047980726b"}, - {file = "Pillow-9.0.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:413ce0bbf9fc6278b2d63309dfeefe452835e1c78398efb431bab0672fe9274e"}, - {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80fe64a6deb6fcfdf7b8386f2cf216d329be6f2781f7d90304351811fb591360"}, - {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cef9c85ccbe9bee00909758936ea841ef12035296c748aaceee535969e27d31b"}, - {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d19397351f73a88904ad1aee421e800fe4bbcd1aeee6435fb62d0a05ccd1030"}, - {file = "Pillow-9.0.1-cp37-cp37m-win32.whl", hash = "sha256:d21237d0cd37acded35154e29aec853e945950321dd2ffd1a7d86fe686814669"}, - {file = "Pillow-9.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ede5af4a2702444a832a800b8eb7f0a7a1c0eed55b644642e049c98d589e5092"}, - {file = "Pillow-9.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:b5b3f092fe345c03bca1e0b687dfbb39364b21ebb8ba90e3fa707374b7915204"}, - {file = "Pillow-9.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:335ace1a22325395c4ea88e00ba3dc89ca029bd66bd5a3c382d53e44f0ccd77e"}, - {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db6d9fac65bd08cea7f3540b899977c6dee9edad959fa4eaf305940d9cbd861c"}, - {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f154d173286a5d1863637a7dcd8c3437bb557520b01bddb0be0258dcb72696b5"}, - {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d4b1341ac07ae07eb2cc682f459bec932a380c3b122f5540432d8977e64eae"}, - {file = "Pillow-9.0.1-cp38-cp38-win32.whl", hash = "sha256:effb7749713d5317478bb3acb3f81d9d7c7f86726d41c1facca068a04cf5bb4c"}, - {file = "Pillow-9.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:7f7609a718b177bf171ac93cea9fd2ddc0e03e84d8fa4e887bdfc39671d46b00"}, - {file = "Pillow-9.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:80ca33961ced9c63358056bd08403ff866512038883e74f3a4bf88ad3eb66838"}, - {file = "Pillow-9.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c3c33ac69cf059bbb9d1a71eeaba76781b450bc307e2291f8a4764d779a6b28"}, - {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12875d118f21cf35604176872447cdb57b07126750a33748bac15e77f90f1f9c"}, - {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:514ceac913076feefbeaf89771fd6febde78b0c4c1b23aaeab082c41c694e81b"}, - {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3c5c79ab7dfce6d88f1ba639b77e77a17ea33a01b07b99840d6ed08031cb2a7"}, - {file = "Pillow-9.0.1-cp39-cp39-win32.whl", hash = "sha256:718856856ba31f14f13ba885ff13874be7fefc53984d2832458f12c38205f7f7"}, - {file = "Pillow-9.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:f25ed6e28ddf50de7e7ea99d7a976d6a9c415f03adcaac9c41ff6ff41b6d86ac"}, - {file = "Pillow-9.0.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:011233e0c42a4a7836498e98c1acf5e744c96a67dd5032a6f666cc1fb97eab97"}, - {file = "Pillow-9.0.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253e8a302a96df6927310a9d44e6103055e8fb96a6822f8b7f514bb7ef77de56"}, - {file = "Pillow-9.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6295f6763749b89c994fcb6d8a7f7ce03c3992e695f89f00b741b4580b199b7e"}, - {file = "Pillow-9.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a9f44cd7e162ac6191491d7249cceb02b8116b0f7e847ee33f739d7cb1ea1f70"}, - {file = "Pillow-9.0.1.tar.gz", hash = "sha256:6c8bc8238a7dfdaf7a75f5ec5a663f4173f8c367e5a39f87e720495e1eed75fa"}, + {file = "Pillow-9.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:42dfefbef90eb67c10c45a73a9bc1599d4dac920f7dfcbf4ec6b80cb620757fe"}, + {file = "Pillow-9.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffde4c6fabb52891d81606411cbfaf77756e3b561b566efd270b3ed3791fde4e"}, + {file = "Pillow-9.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c857532c719fb30fafabd2371ce9b7031812ff3889d75273827633bca0c4602"}, + {file = "Pillow-9.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59789a7d06c742e9d13b883d5e3569188c16acb02eeed2510fd3bfdbc1bd1530"}, + {file = "Pillow-9.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d45dbe4b21a9679c3e8b3f7f4f42a45a7d3ddff8a4a16109dff0e1da30a35b2"}, + {file = "Pillow-9.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e9ed59d1b6ee837f4515b9584f3d26cf0388b742a11ecdae0d9237a94505d03a"}, + {file = "Pillow-9.1.1-cp310-cp310-win32.whl", hash = "sha256:b3fe2ff1e1715d4475d7e2c3e8dabd7c025f4410f79513b4ff2de3d51ce0fa9c"}, + {file = "Pillow-9.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:5b650dbbc0969a4e226d98a0b440c2f07a850896aed9266b6fedc0f7e7834108"}, + {file = "Pillow-9.1.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:0b4d5ad2cd3a1f0d1df882d926b37dbb2ab6c823ae21d041b46910c8f8cd844b"}, + {file = "Pillow-9.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9370d6744d379f2de5d7fa95cdbd3a4d92f0b0ef29609b4b1687f16bc197063d"}, + {file = "Pillow-9.1.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b761727ed7d593e49671d1827044b942dd2f4caae6e51bab144d4accf8244a84"}, + {file = "Pillow-9.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a66fe50386162df2da701b3722781cbe90ce043e7d53c1fd6bd801bca6b48d4"}, + {file = "Pillow-9.1.1-cp37-cp37m-win32.whl", hash = "sha256:2b291cab8a888658d72b575a03e340509b6b050b62db1f5539dd5cd18fd50578"}, + {file = "Pillow-9.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:1d4331aeb12f6b3791911a6da82de72257a99ad99726ed6b63f481c0184b6fb9"}, + {file = "Pillow-9.1.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8844217cdf66eabe39567118f229e275f0727e9195635a15e0e4b9227458daaf"}, + {file = "Pillow-9.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b6617221ff08fbd3b7a811950b5c3f9367f6e941b86259843eab77c8e3d2b56b"}, + {file = "Pillow-9.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20d514c989fa28e73a5adbddd7a171afa5824710d0ab06d4e1234195d2a2e546"}, + {file = "Pillow-9.1.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088df396b047477dd1bbc7de6e22f58400dae2f21310d9e2ec2933b2ef7dfa4f"}, + {file = "Pillow-9.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53c27bd452e0f1bc4bfed07ceb235663a1df7c74df08e37fd6b03eb89454946a"}, + {file = "Pillow-9.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3f6c1716c473ebd1649663bf3b42702d0d53e27af8b64642be0dd3598c761fb1"}, + {file = "Pillow-9.1.1-cp38-cp38-win32.whl", hash = "sha256:c67db410508b9de9c4694c57ed754b65a460e4812126e87f5052ecf23a011a54"}, + {file = "Pillow-9.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:f054b020c4d7e9786ae0404278ea318768eb123403b18453e28e47cdb7a0a4bf"}, + {file = "Pillow-9.1.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:c17770a62a71718a74b7548098a74cd6880be16bcfff5f937f900ead90ca8e92"}, + {file = "Pillow-9.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3f6a6034140e9e17e9abc175fc7a266a6e63652028e157750bd98e804a8ed9a"}, + {file = "Pillow-9.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f372d0f08eff1475ef426344efe42493f71f377ec52237bf153c5713de987251"}, + {file = "Pillow-9.1.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09e67ef6e430f90caa093528bd758b0616f8165e57ed8d8ce014ae32df6a831d"}, + {file = "Pillow-9.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66daa16952d5bf0c9d5389c5e9df562922a59bd16d77e2a276e575d32e38afd1"}, + {file = "Pillow-9.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d78ca526a559fb84faaaf84da2dd4addef5edb109db8b81677c0bb1aad342601"}, + {file = "Pillow-9.1.1-cp39-cp39-win32.whl", hash = "sha256:55e74faf8359ddda43fee01bffbc5bd99d96ea508d8a08c527099e84eb708f45"}, + {file = "Pillow-9.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:7c150dbbb4a94ea4825d1e5f2c5501af7141ea95825fadd7829f9b11c97aaf6c"}, + {file = "Pillow-9.1.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:769a7f131a2f43752455cc72f9f7a093c3ff3856bf976c5fb53a59d0ccc704f6"}, + {file = "Pillow-9.1.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:488f3383cf5159907d48d32957ac6f9ea85ccdcc296c14eca1a4e396ecc32098"}, + {file = "Pillow-9.1.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b525a356680022b0af53385944026d3486fc8c013638cf9900eb87c866afb4c"}, + {file = "Pillow-9.1.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6e760cf01259a1c0a50f3c845f9cad1af30577fd8b670339b1659c6d0e7a41dd"}, + {file = "Pillow-9.1.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4165205a13b16a29e1ac57efeee6be2dfd5b5408122d59ef2145bc3239fa340"}, + {file = "Pillow-9.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937a54e5694684f74dcbf6e24cc453bfc5b33940216ddd8f4cd8f0f79167f765"}, + {file = "Pillow-9.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:baf3be0b9446a4083cc0c5bb9f9c964034be5374b5bc09757be89f5d2fa247b8"}, + {file = "Pillow-9.1.1.tar.gz", hash = "sha256:7502539939b53d7565f3d11d87c78e7ec900d3c72945d4ee0e2f250d598309a0"}, ] platformdirs = [ {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, @@ -2043,41 +2108,41 @@ py = [ {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] pydantic = [ - {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"}, - {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"}, - {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"}, - {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"}, - {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"}, - {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"}, - {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"}, - {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"}, - {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"}, - {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"}, - {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, + {file = "pydantic-1.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8098a724c2784bf03e8070993f6d46aa2eeca031f8d8a048dff277703e6e193"}, + {file = "pydantic-1.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c320c64dd876e45254bdd350f0179da737463eea41c43bacbee9d8c9d1021f11"}, + {file = "pydantic-1.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f3e912f9ad1bdec27fb06b8198a2ccc32f201e24174cec1b3424dda605a310"}, + {file = "pydantic-1.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11951b404e08b01b151222a1cb1a9f0a860a8153ce8334149ab9199cd198131"}, + {file = "pydantic-1.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8bc541a405423ce0e51c19f637050acdbdf8feca34150e0d17f675e72d119580"}, + {file = "pydantic-1.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e565a785233c2d03724c4dc55464559639b1ba9ecf091288dd47ad9c629433bd"}, + {file = "pydantic-1.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:a4a88dcd6ff8fd47c18b3a3709a89adb39a6373f4482e04c1b765045c7e282fd"}, + {file = "pydantic-1.9.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:447d5521575f18e18240906beadc58551e97ec98142266e521c34968c76c8761"}, + {file = "pydantic-1.9.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:985ceb5d0a86fcaa61e45781e567a59baa0da292d5ed2e490d612d0de5796918"}, + {file = "pydantic-1.9.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059b6c1795170809103a1538255883e1983e5b831faea6558ef873d4955b4a74"}, + {file = "pydantic-1.9.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d12f96b5b64bec3f43c8e82b4aab7599d0157f11c798c9f9c528a72b9e0b339a"}, + {file = "pydantic-1.9.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ae72f8098acb368d877b210ebe02ba12585e77bd0db78ac04a1ee9b9f5dd2166"}, + {file = "pydantic-1.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:79b485767c13788ee314669008d01f9ef3bc05db9ea3298f6a50d3ef596a154b"}, + {file = "pydantic-1.9.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:494f7c8537f0c02b740c229af4cb47c0d39840b829ecdcfc93d91dcbb0779892"}, + {file = "pydantic-1.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0f047e11febe5c3198ed346b507e1d010330d56ad615a7e0a89fae604065a0e"}, + {file = "pydantic-1.9.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:969dd06110cb780da01336b281f53e2e7eb3a482831df441fb65dd30403f4608"}, + {file = "pydantic-1.9.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:177071dfc0df6248fd22b43036f936cfe2508077a72af0933d0c1fa269b18537"}, + {file = "pydantic-1.9.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9bcf8b6e011be08fb729d110f3e22e654a50f8a826b0575c7196616780683380"}, + {file = "pydantic-1.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a955260d47f03df08acf45689bd163ed9df82c0e0124beb4251b1290fa7ae728"}, + {file = "pydantic-1.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9ce157d979f742a915b75f792dbd6aa63b8eccaf46a1005ba03aa8a986bde34a"}, + {file = "pydantic-1.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0bf07cab5b279859c253d26a9194a8906e6f4a210063b84b433cf90a569de0c1"}, + {file = "pydantic-1.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d93d4e95eacd313d2c765ebe40d49ca9dd2ed90e5b37d0d421c597af830c195"}, + {file = "pydantic-1.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1542636a39c4892c4f4fa6270696902acb186a9aaeac6f6cf92ce6ae2e88564b"}, + {file = "pydantic-1.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a9af62e9b5b9bc67b2a195ebc2c2662fdf498a822d62f902bf27cccb52dbbf49"}, + {file = "pydantic-1.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fe4670cb32ea98ffbf5a1262f14c3e102cccd92b1869df3bb09538158ba90fe6"}, + {file = "pydantic-1.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:9f659a5ee95c8baa2436d392267988fd0f43eb774e5eb8739252e5a7e9cf07e0"}, + {file = "pydantic-1.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b83ba3825bc91dfa989d4eed76865e71aea3a6ca1388b59fc801ee04c4d8d0d6"}, + {file = "pydantic-1.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1dd8fecbad028cd89d04a46688d2fcc14423e8a196d5b0a5c65105664901f810"}, + {file = "pydantic-1.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02eefd7087268b711a3ff4db528e9916ac9aa18616da7bca69c1871d0b7a091f"}, + {file = "pydantic-1.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb57ba90929bac0b6cc2af2373893d80ac559adda6933e562dcfb375029acee"}, + {file = "pydantic-1.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4ce9ae9e91f46c344bec3b03d6ee9612802682c1551aaf627ad24045ce090761"}, + {file = "pydantic-1.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:72ccb318bf0c9ab97fc04c10c37683d9eea952ed526707fabf9ac5ae59b701fd"}, + {file = "pydantic-1.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:61b6760b08b7c395975d893e0b814a11cf011ebb24f7d869e7118f5a339a82e1"}, + {file = "pydantic-1.9.1-py3-none-any.whl", hash = "sha256:4988c0f13c42bfa9ddd2fe2f569c9d54646ce84adc5de84228cfe83396f3bd58"}, + {file = "pydantic-1.9.1.tar.gz", hash = "sha256:1ed987c3ff29fff7fd8c3ea3a3ea877ad310aae2ef9889a119e22d3f2db0691a"}, ] pyee = [ {file = "pyee-8.1.0-py2.py3-none-any.whl", hash = "sha256:383973b63ad7ed5e3c0311f8b179c52981f9e7b3eaea0e9a830d13ec34dde65f"}, @@ -2099,8 +2164,8 @@ pyjwt = [ {file = "PyJWT-2.4.0.tar.gz", hash = "sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba"}, ] pymdown-extensions = [ - {file = "pymdown_extensions-9.4-py3-none-any.whl", hash = "sha256:5b7432456bf555ce2b0ab3c2439401084cda8110f24f6b3ecef952b8313dfa1b"}, - {file = "pymdown_extensions-9.4.tar.gz", hash = "sha256:1baa22a60550f731630474cad28feb0405c8101f1a7ddc3ec0ed86ee510bcc43"}, + {file = "pymdown_extensions-9.5-py3-none-any.whl", hash = "sha256:ec141c0f4983755349f0c8710416348d1a13753976c028186ed14f190c8061c4"}, + {file = "pymdown_extensions-9.5.tar.gz", hash = "sha256:3ef2d998c0d5fa7eb09291926d90d69391283561cf6306f85cd588a5eb5befa0"}, ] pyparsing = [ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, @@ -2187,8 +2252,8 @@ pyyaml = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, + {file = "requests-2.28.0-py3-none-any.whl", hash = "sha256:bc7861137fbce630f17b03d3ad02ad0bf978c844f3536d0edda6499dafce2b6f"}, + {file = "requests-2.28.0.tar.gz", hash = "sha256:d568723a7ebd25875d8d1eaf5dfa068cd2fc8194b2e483d7b1f7c81918dbec6b"}, ] respx = [ {file = "respx-0.19.2-py2.py3-none-any.whl", hash = "sha256:417f986fec599b9cc6531e93e494b7a75d1cb7bccff9dde5b53edc51f7954494"}, @@ -2218,8 +2283,8 @@ stack-data = [ {file = "stack_data-0.2.0.tar.gz", hash = "sha256:45692d41bd633a9503a5195552df22b583caf16f0b27c4e58c98d88c8b648e12"}, ] starlette = [ - {file = "starlette-0.17.1-py3-none-any.whl", hash = "sha256:26a18cbda5e6b651c964c12c88b36d9898481cd428ed6e063f5f29c418f73050"}, - {file = "starlette-0.17.1.tar.gz", hash = "sha256:57eab3cc975a28af62f6faec94d355a410634940f10b30d68d31cb5ec1b44ae8"}, + {file = "starlette-0.19.1-py3-none-any.whl", hash = "sha256:5a60c5c2d051f3a8eb546136aa0c9399773a689595e099e0877704d5888279bf"}, + {file = "starlette-0.19.1.tar.gz", hash = "sha256:c6d21096774ecb9639acad41b86b7706e52ba3bf1dc13ea4ed9ad593d47e24c7"}, ] text-unidecode = [ {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, @@ -2238,12 +2303,12 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tomlkit = [ - {file = "tomlkit-0.9.2-py3-none-any.whl", hash = "sha256:daf4f9c5f2fbf6b861d6adfc51940b98dee36c13e1d88749a6dc9fb280fff304"}, - {file = "tomlkit-0.9.2.tar.gz", hash = "sha256:ebd982d61446af95a1e082b103e250cb9e6d152eae2581d4a07d31a70b34ab0f"}, + {file = "tomlkit-0.10.2-py3-none-any.whl", hash = "sha256:905cf92c2111ef80d355708f47ac24ad1b6fc2adc5107455940088c9bbecaedb"}, + {file = "tomlkit-0.10.2.tar.gz", hash = "sha256:30d54c0b914e595f3d10a87888599eab5321a2a69abc773bbefff51599b72db6"}, ] traitlets = [ - {file = "traitlets-5.2.0-py3-none-any.whl", hash = "sha256:9dd4025123fbe018a2092b2ad6984792f53ea3362c698f37473258b1fa97b0bc"}, - {file = "traitlets-5.2.0.tar.gz", hash = "sha256:60474f39bf1d39a11e0233090b99af3acee93bbc2281777e61dd8c87da8a0014"}, + {file = "traitlets-5.2.2.post1-py3-none-any.whl", hash = "sha256:1530d04badddc6a73d50b7ee34667d4b96914da352109117b4280cb56523a51b"}, + {file = "traitlets-5.2.2.post1.tar.gz", hash = "sha256:74803a1baa59af70f023671d86d5c7a834c931186df26d50d362ee6a1ff021fd"}, ] typing-extensions = [ {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, diff --git a/pyproject.toml b/pyproject.toml index c3cca6c..22d0b63 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,7 @@ classifiers = [ [tool.poetry.dependencies] python = "^3.9" -nonebot2 = "^2.0.0-beta.2" +nonebot2 = ">=2.0.0-beta.2" httpx = ">=0.16.1" bs4 = "^0.0.1" tinydb = "^4.3.0" From 658decc63e4abdb984ddccda7cf6ce3464b28b42 Mon Sep 17 00:00:00 2001 From: felinae98 <731499577@qq.com> Date: Sun, 12 Jun 2022 00:54:28 +0800 Subject: [PATCH 09/23] release! [no ci] --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 22d0b63..500b3d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nonebot-bison" -version = "0.5.3" +version = "0.5.4" description = "Subscribe message from social medias" authors = ["felinae98 "] license = "MIT" From 6a3264d101be976398c944dbd43b3276dd11a1bc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 11 Jun 2022 16:56:28 +0000 Subject: [PATCH 10/23] :bookmark: Release 0.5.4 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 615ddb6..9858d32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log -## 最近更新 +## v0.5.4 ### 新功能 From c5685daf0079c3b5cf8268adfe0f85b0c81336b2 Mon Sep 17 00:00:00 2001 From: felinae98 <731499577@qq.com> Date: Sun, 12 Jun 2022 15:32:13 +0800 Subject: [PATCH 11/23] Add .gitattributes for linguist --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f49f56c --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +tests/platforms/static/** linguist-vendored From f354f86dade1ccee4d860c6c922f905c7f1a91dd Mon Sep 17 00:00:00 2001 From: Azide Date: Mon, 4 Jul 2022 22:54:31 +0800 Subject: [PATCH 12/23] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E6=B7=BB=E5=8A=A0custo?= =?UTF-8?q?m=5Fpost=E7=9A=84=E5=9B=BE=E7=89=87=E6=B6=88=E6=81=AF=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/nonebot_bison/post/custom_post.py | 54 ++++++++- .../post/templates/custom_post.css | 112 ++++++++++++++++++ 2 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 src/plugins/nonebot_bison/post/templates/custom_post.css diff --git a/src/plugins/nonebot_bison/post/custom_post.py b/src/plugins/nonebot_bison/post/custom_post.py index 6883717..3933b14 100644 --- a/src/plugins/nonebot_bison/post/custom_post.py +++ b/src/plugins/nonebot_bison/post/custom_post.py @@ -1,6 +1,9 @@ from dataclasses import dataclass +from pathlib import Path from nonebot.adapters.onebot.v11.message import Message, MessageSegment +from nonebot.log import logger +from nonebot.plugin import require from .abstract_post import AbstractPost, BasePost @@ -9,14 +12,61 @@ from .abstract_post import AbstractPost, BasePost class _CustomPost(BasePost): message_segments: list[MessageSegment] + css_path: str = "" # 模板文件所用css路径 async def generate_text_messages(self) -> list[MessageSegment]: return self.message_segments async def generate_pic_messages(self) -> list[MessageSegment]: - ... # TODO + require("nonebot_plugin_htmlrender") + from nonebot_plugin_htmlrender import md_to_pic + + pic_bytes = await md_to_pic( + md=self._generate_md(), css_path=self._get_css_path() + ) + return [MessageSegment.image(pic_bytes)] + + def _generate_md(self) -> str: + md = "" + + for message_segment in self.message_segments: + if message_segment.type == "text": + md += "{}\n".format(message_segment.data.get("text", "")) + elif message_segment.type == "image": + try: + # 先尝试获取file的值,没有在尝试获取url的值,都没有则为空 + pic_res = message_segment.data.get( + "file", message_segment.data.get("url", "") + ) + assert pic_res + except AssertionError: + logger.warning("无法获取到图片资源:MessageSegment.image中file/url字段均为空") + else: + md += "![Image]({})\n".format(pic_res) + else: + logger.warning("custom_post不支持处理类型:{}".format(message_segment.type)) + continue + + return md + + def _get_css_path(self): + """返回css路径""" + css_path = ( + str(Path(__file__).parent / "templates" / "custom_post.css") + if not self.css_path + else self.css_path + ) + return css_path @dataclass class CustomPost(_CustomPost, AbstractPost): - ... + """ + CustomPost所支持的MessageSegment type为text/image + + 通过将text/image转换成对应的markdown语法, 生成markdown文本 + + 最后使用htmlrender渲染为图片 + """ + + pass diff --git a/src/plugins/nonebot_bison/post/templates/custom_post.css b/src/plugins/nonebot_bison/post/templates/custom_post.css new file mode 100644 index 0000000..cc761bc --- /dev/null +++ b/src/plugins/nonebot_bison/post/templates/custom_post.css @@ -0,0 +1,112 @@ +@charset "utf-8"; + +/** + * markdown.css + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see http://gnu.org/licenses/lgpl.txt. + * + * @project Weblog and Open Source Projects of Florian Wolters + * @version GIT: $Id$ + * @package xhtml-css + * @author Florian Wolters + * @copyright 2012 Florian Wolters + * @cssdoc version 1.0-pre + * @license http://gnu.org/licenses/lgpl.txt GNU Lesser General Public License + * @link http://github.com/FlorianWolters/jekyll-bootstrap-theme + * @media all + * @valid true + */ + +body { + font-family: Helvetica, Arial, Freesans, clean, sans-serif; + padding: 1em; + margin: auto; + max-width: 42em; + background: #fefefe; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: bold; +} + +h1 { + color: #000000; + font-size: 28px; +} + +h2 { + border-bottom: 1px solid #CCCCCC; + color: #000000; + font-size: 24px; +} + +h3 { + font-size: 18px; +} + +h4 { + font-size: 16px; +} + +h5 { + font-size: 14px; +} + +h6 { + color: #777777; + background-color: inherit; + font-size: 14px; +} + +hr { + height: 0.2em; + border: 0; + color: #CCCCCC; + background-color: #CCCCCC; +} + +p, blockquote, ul, ol, dl, li, table, pre { + margin: 15px 0; +} + +code, pre { + border-radius: 3px; + background-color: #F8F8F8; + color: inherit; +} + +code { + border: 1px solid #EAEAEA; + margin: 0 2px; + padding: 0 5px; +} + +pre { + border: 1px solid #CCCCCC; + line-height: 1.25em; + overflow: auto; + padding: 6px 10px; +} + +pre>code { + border: 0; + margin: 0; + padding: 0; +} + +a, a:visited { + color: #4183C4; + background-color: inherit; + text-decoration: none; +} \ No newline at end of file From 6a04e9345da0a9be8303f3a9f426e482bd0bf7aa Mon Sep 17 00:00:00 2001 From: Azide Date: Tue, 5 Jul 2022 12:54:35 +0800 Subject: [PATCH 13/23] =?UTF-8?q?=E6=B7=BB=E5=8A=A0custom-post=E5=88=9D?= =?UTF-8?q?=E6=AD=A5=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/nonebot_bison/post/custom_post.py | 2 ++ tests/test_custom_post.py | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 tests/test_custom_post.py diff --git a/src/plugins/nonebot_bison/post/custom_post.py b/src/plugins/nonebot_bison/post/custom_post.py index 3933b14..c9d8ebd 100644 --- a/src/plugins/nonebot_bison/post/custom_post.py +++ b/src/plugins/nonebot_bison/post/custom_post.py @@ -66,6 +66,8 @@ class CustomPost(_CustomPost, AbstractPost): 通过将text/image转换成对应的markdown语法, 生成markdown文本 + 理论上text部分可以直接使用markdown语法, 例如 ###123 + 最后使用htmlrender渲染为图片 """ diff --git a/tests/test_custom_post.py b/tests/test_custom_post.py new file mode 100644 index 0000000..2072388 --- /dev/null +++ b/tests/test_custom_post.py @@ -0,0 +1,28 @@ +import pytest +from nonebot.adapters.onebot.v11.message import MessageSegment +from nonebot_bison.post import custom_post +from nonebug.app import App + + +@pytest.fixture +def expect_md(): + return "【Zc】每早合约日替攻略!\n![Iamge](http://i0.hdslb.com/bfs/live/new_room_cover/cf7d4d3b2f336c6dba299644c3af952c5db82612.jpg)\n来源: Bilibili直播 魔法Zc目录\n\n详情: https://live.bilibili.com/3044248\n" + + +def test_gene_md(app: App): + + msg_segments: list[MessageSegment] = [] + msg_segments.append(MessageSegment.text("【Zc】每早合约日替攻略!")) + msg_segments.append( + MessageSegment.image( + file="http://i0.hdslb.com/bfs/live/new_room_cover/cf7d4d3b2f336c6dba299644c3af952c5db82612.jpg", + cache=0, + ) + ) + msg_segments.append(MessageSegment.text("来源: Bilibili直播 魔法Zc目录\n ")) + msg_segments.append(MessageSegment.text("详情: https://live.bilibili.com/3044248")) + + cp = custom_post.CustomPost(message_segments=msg_segments) + cp_md = cp._generate_md() + + assert cp_md == expect_md() From 6da77e24046bc52e728a35368d9a2daea01a0850 Mon Sep 17 00:00:00 2001 From: Azide Date: Tue, 5 Jul 2022 22:11:07 +0800 Subject: [PATCH 14/23] =?UTF-8?q?feat:=E5=9F=BA=E6=9C=AC=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E4=BA=86custom-post?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/nonebot_bison/post/custom_post.py | 23 +++------ tests/test_custom_post.py | 51 +++++++++++++++---- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/plugins/nonebot_bison/post/custom_post.py b/src/plugins/nonebot_bison/post/custom_post.py index c9d8ebd..800637f 100644 --- a/src/plugins/nonebot_bison/post/custom_post.py +++ b/src/plugins/nonebot_bison/post/custom_post.py @@ -1,4 +1,4 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field from pathlib import Path from nonebot.adapters.onebot.v11.message import Message, MessageSegment @@ -11,8 +11,8 @@ from .abstract_post import AbstractPost, BasePost @dataclass class _CustomPost(BasePost): - message_segments: list[MessageSegment] - css_path: str = "" # 模板文件所用css路径 + message_segments: list[MessageSegment] = field(default_factory=list) + css_path: str = None # 模板文件所用css路径 async def generate_text_messages(self) -> list[MessageSegment]: return self.message_segments @@ -21,9 +21,7 @@ class _CustomPost(BasePost): require("nonebot_plugin_htmlrender") from nonebot_plugin_htmlrender import md_to_pic - pic_bytes = await md_to_pic( - md=self._generate_md(), css_path=self._get_css_path() - ) + pic_bytes = await md_to_pic(md=self._generate_md(), css_path=self.css_path) return [MessageSegment.image(pic_bytes)] def _generate_md(self) -> str: @@ -31,7 +29,7 @@ class _CustomPost(BasePost): for message_segment in self.message_segments: if message_segment.type == "text": - md += "{}\n".format(message_segment.data.get("text", "")) + md += "{}
".format(message_segment.data.get("text", "")) elif message_segment.type == "image": try: # 先尝试获取file的值,没有在尝试获取url的值,都没有则为空 @@ -49,15 +47,6 @@ class _CustomPost(BasePost): return md - def _get_css_path(self): - """返回css路径""" - css_path = ( - str(Path(__file__).parent / "templates" / "custom_post.css") - if not self.css_path - else self.css_path - ) - return css_path - @dataclass class CustomPost(_CustomPost, AbstractPost): @@ -68,6 +57,8 @@ class CustomPost(_CustomPost, AbstractPost): 理论上text部分可以直接使用markdown语法, 例如 ###123 + 注意:list中的每一个text都会被解释为独立的一行文字 + 最后使用htmlrender渲染为图片 """ diff --git a/tests/test_custom_post.py b/tests/test_custom_post.py index 2072388..6f7c101 100644 --- a/tests/test_custom_post.py +++ b/tests/test_custom_post.py @@ -1,16 +1,14 @@ +import base64 +import hashlib +import logging + import pytest from nonebot.adapters.onebot.v11.message import MessageSegment -from nonebot_bison.post import custom_post from nonebug.app import App @pytest.fixture -def expect_md(): - return "【Zc】每早合约日替攻略!\n![Iamge](http://i0.hdslb.com/bfs/live/new_room_cover/cf7d4d3b2f336c6dba299644c3af952c5db82612.jpg)\n来源: Bilibili直播 魔法Zc目录\n\n详情: https://live.bilibili.com/3044248\n" - - -def test_gene_md(app: App): - +def ms_list(): msg_segments: list[MessageSegment] = [] msg_segments.append(MessageSegment.text("【Zc】每早合约日替攻略!")) msg_segments.append( @@ -19,10 +17,41 @@ def test_gene_md(app: App): cache=0, ) ) - msg_segments.append(MessageSegment.text("来源: Bilibili直播 魔法Zc目录\n ")) + msg_segments.append(MessageSegment.text("来源: Bilibili直播 魔法Zc目录")) msg_segments.append(MessageSegment.text("详情: https://live.bilibili.com/3044248")) - cp = custom_post.CustomPost(message_segments=msg_segments) - cp_md = cp._generate_md() + return msg_segments - assert cp_md == expect_md() + +@pytest.fixture +def pic_hash(): + return "58723fdc24b473b6dbd8ec8cbc3b7e46160c83df" + + +@pytest.fixture +def expect_md(): + return "【Zc】每早合约日替攻略!
![Image](http://i0.hdslb.com/bfs/live/new_room_cover/cf7d4d3b2f336c6dba299644c3af952c5db82612.jpg)\n来源: Bilibili直播 魔法Zc目录\n\n详情: https://live.bilibili.com/3044248\n" + + +def test_gene_md(app: App, expect_md, ms_list): + from nonebot_bison.post.custom_post import CustomPost + + cp = CustomPost(message_segments=ms_list) + cp_md = cp._generate_md() + assert cp_md == expect_md + + +@pytest.mark.asyncio +async def test_gene_pic(app: App, ms_list, pic_hash): + from nonebot_bison.post.custom_post import CustomPost + + cp = CustomPost(message_segments=ms_list) + cp_pic_bytes: list[MessageSegment] = await cp.generate_pic_messages() + + pure_b64 = base64.b64decode( + cp_pic_bytes[0].data.get("file").replace("base64://", "") + ) + sha1obj = hashlib.sha1() + sha1obj.update(pure_b64) + sha1hash = sha1obj.hexdigest() + assert sha1hash == pic_hash From 864b1e4d83938b1184ee18a19d0433244c157752 Mon Sep 17 00:00:00 2001 From: Azide Date: Tue, 5 Jul 2022 22:55:32 +0800 Subject: [PATCH 15/23] =?UTF-8?q?test(fix):=E5=90=91test=E4=B8=AD=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BA=86=E5=9B=BE=E7=89=87=E7=9A=84mock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/nonebot_bison/post/custom_post.py | 2 +- tests/platforms/static/custom_post_pic.jpg | Bin 0 -> 30682 bytes tests/test_custom_post.py | 15 ++++++++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 tests/platforms/static/custom_post_pic.jpg diff --git a/src/plugins/nonebot_bison/post/custom_post.py b/src/plugins/nonebot_bison/post/custom_post.py index 800637f..38a8e03 100644 --- a/src/plugins/nonebot_bison/post/custom_post.py +++ b/src/plugins/nonebot_bison/post/custom_post.py @@ -32,7 +32,7 @@ class _CustomPost(BasePost): md += "{}
".format(message_segment.data.get("text", "")) elif message_segment.type == "image": try: - # 先尝试获取file的值,没有在尝试获取url的值,都没有则为空 + # 先尝试获取file的值,没有再尝试获取url的值,都没有则为空 pic_res = message_segment.data.get( "file", message_segment.data.get("url", "") ) diff --git a/tests/platforms/static/custom_post_pic.jpg b/tests/platforms/static/custom_post_pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3828e8809372618337abfd46333a0e59c0409ad GIT binary patch literal 30682 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 Date: Tue, 5 Jul 2022 23:06:10 +0800 Subject: [PATCH 16/23] =?UTF-8?q?test(fix):=E8=B0=83=E6=95=B4=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_custom_post.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_custom_post.py b/tests/test_custom_post.py index 04423b2..4b7b452 100644 --- a/tests/test_custom_post.py +++ b/tests/test_custom_post.py @@ -32,7 +32,7 @@ def pic_hash(): @pytest.fixture def expect_md(): - return "【Zc】每早合约日替攻略!
      ![Image](http://i0.hdslb.com/bfs/live/new_room_cover/cf7d4d3b2f336c6dba299644c3af952c5db82612.jpg)\n来源: Bilibili直播 魔法Zc目录\n\n详情: https://live.bilibili.com/3044248\n" + return "【Zc】每早合约日替攻略!
      ![Image](http://i0.hdslb.com/bfs/live/new_room_cover/cf7d4d3b2f336c6dba299644c3af952c5db82612.jpg)\n来源: Bilibili直播 魔法Zc目录
      详情: https://live.bilibili.com/3044248
      " def test_gene_md(app: App, expect_md, ms_list): From a1e246e1b4f9b5b447e1ea8bd493e2ab3b0b7a5b Mon Sep 17 00:00:00 2001 From: Azide Date: Wed, 6 Jul 2022 21:07:07 +0800 Subject: [PATCH 17/23] =?UTF-8?q?test(fix):=E4=B8=BA=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E7=9A=84=E5=B9=B3=E5=8F=B0=E8=BF=94=E5=9B=9E=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E7=9A=84hash?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_custom_post.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/test_custom_post.py b/tests/test_custom_post.py index 4b7b452..4df3a03 100644 --- a/tests/test_custom_post.py +++ b/tests/test_custom_post.py @@ -1,5 +1,7 @@ import base64 import hashlib +import platform +from io import UnsupportedOperation from pathlib import Path import pytest @@ -27,7 +29,15 @@ def ms_list(): @pytest.fixture def pic_hash(): - return "58723fdc24b473b6dbd8ec8cbc3b7e46160c83df" + platform_name = platform.system() + if platform_name == "Windows": + return "58723fdc24b473b6dbd8ec8cbc3b7e46160c83df" + elif platform_name == "Linux": + return "4d540798108762df76de34f7bdbc667dada6b5cb" + elif platform_name == "Darwin": + return "a482bf8317d56e5ddc71437584343ace29ff545c" + else: + raise UnsupportedOperation(f"未支持的平台{platform_name}") @pytest.fixture From 8e32b40bbad4c14ae9037b8b031b62ca8180f730 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 9 Jul 2022 09:02:20 +0000 Subject: [PATCH 18/23] :memo: Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9858d32..979d28a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## 最近更新 + +* No changes + ## v0.5.4 ### 新功能 From f6ff760c5643a6de983cdd604f3e362aad9a3e40 Mon Sep 17 00:00:00 2001 From: Azide Date: Sun, 10 Jul 2022 12:51:54 +0800 Subject: [PATCH 19/23] =?UTF-8?q?fix:=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/nonebot_bison/post/custom_post.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/plugins/nonebot_bison/post/custom_post.py b/src/plugins/nonebot_bison/post/custom_post.py index 38a8e03..70e7718 100644 --- a/src/plugins/nonebot_bison/post/custom_post.py +++ b/src/plugins/nonebot_bison/post/custom_post.py @@ -31,13 +31,11 @@ class _CustomPost(BasePost): if message_segment.type == "text": md += "{}
      ".format(message_segment.data.get("text", "")) elif message_segment.type == "image": - try: - # 先尝试获取file的值,没有再尝试获取url的值,都没有则为空 - pic_res = message_segment.data.get( - "file", message_segment.data.get("url", "") - ) - assert pic_res - except AssertionError: + # 先尝试获取file的值,没有再尝试获取url的值,都没有则为空 + pic_res = message_segment.data.get("file") or message_segment.data.get( + "url", "" + ) + if not pic_res: logger.warning("无法获取到图片资源:MessageSegment.image中file/url字段均为空") else: md += "![Image]({})\n".format(pic_res) From 686b73ae2541cc6418e86dbdc0acfe01ee92bdce Mon Sep 17 00:00:00 2001 From: Azide Date: Sun, 10 Jul 2022 17:43:44 +0800 Subject: [PATCH 20/23] =?UTF-8?q?docs:=E5=AE=8C=E5=96=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev/README.md | 46 ++++++++++++++++++- src/plugins/nonebot_bison/post/custom_post.py | 9 +++- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/docs/dev/README.md b/docs/dev/README.md index f18891c..72e213a 100644 --- a/docs/dev/README.md +++ b/docs/dev/README.md @@ -38,7 +38,10 @@ Nonebot 项目使用了全异步的处理方式,所以你需要对异步,Pyt ## 基本概念 -- `nonebot_bison.post.Post`: 可以理解为推送内容,其中包含需要发送的文字,图片,链接,平台信息等 +- `nonebot_bison.post`: 可以理解为推送内容,其中包含需要发送的文字,图片,链接,平台信息等,分为: + - `nonebot_bison.post.Post`: 简单的推送内容格式,需要发送的内容由 bison 处理 + - `nonebot_bison.post.CustomPost`: 基于 markdown 语法的,自由度较高的推送内容格式 + - 详细的介绍可参见[生成 bison 的推送文本](#生成bison的推送文本) - `nonebot_bison.types.RawPost`: 从站点/平台中爬到的单条信息 - `nonebot_bison.types.Target`: 目标账号,Bilibili,微博等社交媒体中的账号 - `nonebot_bison.types.Category`: 信息分类,例如视频,动态,图文,文章等 @@ -211,3 +214,44 @@ class Weibo(NewMessage): #将需要bot推送的RawPost处理成正式推送的Post ... ``` + +## 生成 bison 的推送文本 + +### 什么是`nonebot_bison.post` + +可以认为`nonebot_bison.post`是最终要交付给 bison 推送到群内的内容,经过`parse`函数处理过后的报文应该返回属于`nonebot_bison.post`下的某个类 +目前 bison 所支持的类有: + +- `nonebot_bison.post.Post` +- `nonebot_bison.post.CustomPost` + +### 什么是`nonebot_bison.post.Post` + +Post 类能接受的消息分为`text`与`pics`,对应文本与图片类消息,其中 pics 接受的是一个列表 List,列表中的值可以为 url、base64 或者 bytes。 +Post 会将`text`与`pics`分为若干条消息进行分别发送 +使用`compress`参数将所有消息压缩为一条进行发送。 +使用`extra_msg`可以携带额外的消息进行发送 +使用`override_use_pic`参数可以无视全局配置中的 bison_use_pic 配置进行强制指定 +可参考[Post 的用法](https://github.com/felinae98/nonebot-bison/blob/v0.5.4/src/plugins/nonebot_bison/platform/arknights.py#L227) + +### 什么是`nonebot_bison.post.CustomPost` + +CustomPost 类能接受的消息为[`List[MessageSegment]`](https://github.com/botuniverse/onebot-11/blob/master/message/array.md#%E6%B6%88%E6%81%AF%E6%AE%B5) +::: tip + +消息段(Message Segment 或 Segment) +表示聊天消息的一个部分,在一些平台上,聊天消息支持图文混排,其中就会有多个消息段,分别表示每个图片和每段文字。 +::: +准确来说,CustomPost 只支持使用 MessageSegment 内的`text`和`image`类型,CustomPost 会将 List 中的每个`text`类型元素理解为一个单行的 text 文本, +当然,markdown 语法可以在每个`text`类型元素使用,但这样的话,在不开启`bison_use_pic`**全局配置项** 的情况下,bison 会将写在 text 类型元素里的 markdown 语法按原文推送,不会解析。 +对于上述情况,建议开启 CustomPost 的`only_pic`选项,这样 CustomPost 只会发送经过 markdown 语法渲染好的图片,而非文本消息。 +::: details CustomPost 例子 + +```python + async def parse(self, raw_post:RawPost) -> str: + #假定传入的raw_post为List[MessageSegment] + #do something... + return CustomPost(message_segments=raw_post, only_pic=True) +``` + +::: diff --git a/src/plugins/nonebot_bison/post/custom_post.py b/src/plugins/nonebot_bison/post/custom_post.py index 70e7718..a70a319 100644 --- a/src/plugins/nonebot_bison/post/custom_post.py +++ b/src/plugins/nonebot_bison/post/custom_post.py @@ -1,5 +1,6 @@ from dataclasses import dataclass, field from pathlib import Path +from typing import Optional from nonebot.adapters.onebot.v11.message import Message, MessageSegment from nonebot.log import logger @@ -12,10 +13,14 @@ from .abstract_post import AbstractPost, BasePost class _CustomPost(BasePost): message_segments: list[MessageSegment] = field(default_factory=list) - css_path: str = None # 模板文件所用css路径 + css_path: Optional[str] = None # 模板文件所用css路径 + only_pic: Optional[bool] = False # 开启时只发送图片 async def generate_text_messages(self) -> list[MessageSegment]: - return self.message_segments + if not self.only_pic: + return self.message_segments + else: + return self.generate_pic_messages() async def generate_pic_messages(self) -> list[MessageSegment]: require("nonebot_plugin_htmlrender") From 8d12334305f91b078159beeb087276d04343c203 Mon Sep 17 00:00:00 2001 From: Azide Date: Tue, 12 Jul 2022 22:59:47 +0800 Subject: [PATCH 21/23] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=B8=8E=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/nonebot_bison/post/custom_post.py | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/plugins/nonebot_bison/post/custom_post.py b/src/plugins/nonebot_bison/post/custom_post.py index a70a319..3f343be 100644 --- a/src/plugins/nonebot_bison/post/custom_post.py +++ b/src/plugins/nonebot_bison/post/custom_post.py @@ -14,13 +14,9 @@ class _CustomPost(BasePost): message_segments: list[MessageSegment] = field(default_factory=list) css_path: Optional[str] = None # 模板文件所用css路径 - only_pic: Optional[bool] = False # 开启时只发送图片 async def generate_text_messages(self) -> list[MessageSegment]: - if not self.only_pic: - return self.message_segments - else: - return self.generate_pic_messages() + return self.message_segments async def generate_pic_messages(self) -> list[MessageSegment]: require("nonebot_plugin_htmlrender") @@ -53,16 +49,26 @@ class _CustomPost(BasePost): @dataclass class CustomPost(_CustomPost, AbstractPost): - """ - CustomPost所支持的MessageSegment type为text/image + """基于 markdown 语法的,自由度较高的推送内容格式 - 通过将text/image转换成对应的markdown语法, 生成markdown文本 + 简介: + 支持处理text/image两种MessageSegment, + 通过将text/image转换成对应的markdown语法以生成markdown文本。 + 理论上text类型中可以直接使用markdown语法,例如`##第一章`。 + 但会导致不启用`override_use_pic`时, 发送不会被渲染的纯文本消息。 + 图片渲染最终由htmlrender执行。 - 理论上text部分可以直接使用markdown语法, 例如 ###123 + 注意: + 每一个MessageSegment元素都会被解释为单独的一行 - 注意:list中的每一个text都会被解释为独立的一行文字 + 可选参数: + `override_use_pic`:是否覆盖`bison_use_pic`全局配置 + `compress`:将所有消息压缩为一条进行发送 + `extra_msg`:需要附带发送的额外消息 - 最后使用htmlrender渲染为图片 + 成员函数: + `generate_text_messages()`:负责生成文本消息 + `generate_pic_messages()`:负责生成图片消息 """ pass From 3f9d272b01334e2952d4ee64af33141ee1f4297e Mon Sep 17 00:00:00 2001 From: Azide Date: Tue, 12 Jul 2022 23:08:47 +0800 Subject: [PATCH 22/23] =?UTF-8?q?docs:=E8=B0=83=E6=95=B4=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev/README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/dev/README.md b/docs/dev/README.md index 72e213a..38dbd53 100644 --- a/docs/dev/README.md +++ b/docs/dev/README.md @@ -227,8 +227,9 @@ class Weibo(NewMessage): ### 什么是`nonebot_bison.post.Post` -Post 类能接受的消息分为`text`与`pics`,对应文本与图片类消息,其中 pics 接受的是一个列表 List,列表中的值可以为 url、base64 或者 bytes。 +Post 类存在参数`text`与`pics`,分别对应接收文本与图片类消息,需要注意的是`pics`接收的是一个列表 List,列表中的值可以为 url 或者 bytes。 Post 会将`text`与`pics`分为若干条消息进行分别发送 +可选参数: 使用`compress`参数将所有消息压缩为一条进行发送。 使用`extra_msg`可以携带额外的消息进行发送 使用`override_use_pic`参数可以无视全局配置中的 bison_use_pic 配置进行强制指定 @@ -243,8 +244,9 @@ CustomPost 类能接受的消息为[`List[MessageSegment]`](https://github.com/b 表示聊天消息的一个部分,在一些平台上,聊天消息支持图文混排,其中就会有多个消息段,分别表示每个图片和每段文字。 ::: 准确来说,CustomPost 只支持使用 MessageSegment 内的`text`和`image`类型,CustomPost 会将 List 中的每个`text`类型元素理解为一个单行的 text 文本, -当然,markdown 语法可以在每个`text`类型元素使用,但这样的话,在不开启`bison_use_pic`**全局配置项** 的情况下,bison 会将写在 text 类型元素里的 markdown 语法按原文推送,不会解析。 -对于上述情况,建议开启 CustomPost 的`only_pic`选项,这样 CustomPost 只会发送经过 markdown 语法渲染好的图片,而非文本消息。 +当然,markdown 语法可以在每个`text`类型元素使用,但如果这样,在不开启`bison_use_pic`**全局配置项** 的情况下,bison 会将写在 text 类型元素里的 markdown 语法按原样推送,不会解析。 +对于上述情况,建议开启 CustomPost 的`override_use_pic`选项,这样 CustomPost 只会发送经过 markdown 语法渲染好的图片,而非文本消息。 +CustomPost 的可选参数及作用与上文中的[Post](#什么是nonebot-bison-post-post)一致。 ::: details CustomPost 例子 ```python From 8eba7dad7f82d4bc6ff14b291f06077a5b186e80 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 13 Jul 2022 03:41:40 +0000 Subject: [PATCH 23/23] :memo: Update changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 979d28a..2fca9a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,9 @@ ## 最近更新 -* No changes +### 新功能 + +- 添加 CustomPost [@felinae98](https://github.com/felinae98) ([#81](https://github.com/felinae98/nonebot-bison/pull/81)) ## v0.5.4