Skip to content

Commit 39eef79

Browse files
authored
chore(deps): 更新至最新依赖并修复测试 (#286)
1 parent 703cd43 commit 39eef79

9 files changed

Lines changed: 759 additions & 695 deletions

File tree

nonebot_plugin_wordcloud/config.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from datetime import datetime, time
22
from pathlib import Path
3-
from typing import Any, Dict, List, Optional, Set, Union
3+
from typing import Any, Optional, Union
44
from zoneinfo import ZoneInfo
55

66
from nonebot import get_driver, get_plugin_config
@@ -16,7 +16,7 @@ class Config(BaseModel):
1616
wordcloud_width: int = 1920
1717
wordcloud_height: int = 1200
1818
wordcloud_background_color: str = "black"
19-
wordcloud_colormap: Union[str, List[str]] = "viridis"
19+
wordcloud_colormap: Union[str, list[str]] = "viridis"
2020
wordcloud_font_path: str
2121
wordcloud_stopwords_path: Optional[Path] = None
2222
wordcloud_userdict_path: Optional[Path] = None
@@ -26,8 +26,8 @@ class Config(BaseModel):
2626
2727
如果群内不单独设置则使用这个值,默认为晚上 10 点,时区为设定的时区
2828
"""
29-
wordcloud_options: Dict[str, Any] = {}
30-
wordcloud_exclude_user_ids: Set[str] = set()
29+
wordcloud_options: dict[str, Any] = {}
30+
wordcloud_exclude_user_ids: set[str] = set()
3131
"""排除的用户 ID 列表(全局,不区分平台)"""
3232

3333
@model_validator(mode="before")

nonebot_plugin_wordcloud/data_source.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from functools import partial
66
from io import BytesIO
77
from random import choice
8-
from typing import Dict, List, Optional
8+
from typing import Optional
99

1010
import jieba
1111
import jieba.analyse
@@ -37,7 +37,7 @@ def pre_precess(msg: str) -> str:
3737
return msg
3838

3939

40-
def analyse_message(msg: str) -> Dict[str, float]:
40+
def analyse_message(msg: str) -> dict[str, float]:
4141
"""分析消息
4242
4343
分词,并统计词频
@@ -65,7 +65,7 @@ def get_mask(key: str):
6565
return np.array(Image.open(default_mask_path))
6666

6767

68-
def _get_wordcloud(messages: List[str], mask_key: str) -> Optional[bytes]:
68+
def _get_wordcloud(messages: list[str], mask_key: str) -> Optional[bytes]:
6969
# 过滤掉命令
7070
command_start = tuple(i for i in global_config.command_start if i)
7171
message = " ".join(m for m in messages if not m.startswith(command_start))
@@ -98,7 +98,7 @@ def _get_wordcloud(messages: List[str], mask_key: str) -> Optional[bytes]:
9898
return image_bytes.getvalue()
9999

100100

101-
async def get_wordcloud(messages: List[str], mask_key: str) -> Optional[bytes]:
101+
async def get_wordcloud(messages: list[str], mask_key: str) -> Optional[bytes]:
102102
loop = asyncio.get_running_loop()
103103
pfunc = partial(_get_wordcloud, messages, mask_key)
104104
# 虽然不知道具体是哪里泄漏了,但是通过每次关闭线程池可以避免这个问题

nonebot_plugin_wordcloud/schedule.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from datetime import time
2-
from typing import Dict, Optional, Tuple
2+
from typing import Optional
33

44
import nonebot_plugin_saa as saa
55
from apscheduler.job import Job
@@ -29,7 +29,7 @@ class Scheduler:
2929
def __init__(self):
3030
# 默认定时任务的 key 为 default
3131
# 其他则为 ISO 8601 格式的时间字符串
32-
self.schedules: Dict[str, Job] = {}
32+
self.schedules: dict[str, Job] = {}
3333

3434
# 转换到 APScheduler 的时区
3535
scheduler_time = get_time_with_scheduler_timezone(
@@ -160,7 +160,7 @@ async def remove_schedule(self, target: saa.PlatformTarget):
160160
@staticmethod
161161
def select_target_statement(
162162
target: saa.PlatformTarget, session: AsyncSession
163-
) -> Select[Tuple[Schedule]]:
163+
) -> Select[tuple[Schedule]]:
164164
"""获取查询目标的语句
165165
166166
MySQL 需要手动将 JSON 类型的字段转换为 JSON 类型

poetry.lock

Lines changed: 623 additions & 618 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,40 +31,40 @@ nonebug-saa = "^0.4.1"
3131
nonebot-adapter-onebot = "^2.2.4"
3232
nonebot-plugin-orm = { extras = ["default"], version = ">=0.7.0" }
3333
nonebot-plugin-datastore = "^1.2.0"
34+
asyncpg = "*"
35+
aiomysql = "*"
3436
pytest-cov = ">=4,<6"
3537
pytest-xdist = "^3.1.0"
3638
pytest-mock = "^3.7.0"
3739
pytest-asyncio = ">=0.21,<0.24"
38-
asyncpg = "*"
39-
aiomysql = "*"
4040
respx = ">=0.20.2,<0.22.0"
4141
httpx = ">=0.24.1,<0.28.0"
4242
gevent = ">=23.7,<25.0"
4343

44+
[build-system]
45+
requires = ["poetry-core>=1.0.0"]
46+
build-backend = "poetry.core.masonry.api"
47+
4448
[tool.nonebot]
4549
plugins = ["nonebot_plugin_wordcloud"]
4650
adapters = [
4751
{ name = "OneBot V12", module_name = "nonebot.adapters.onebot.v12", project_link = "nonebot-adapter-onebot", desc = "OneBot V12 协议" },
4852
{ name = "OneBot V11", module_name = "nonebot.adapters.onebot.v11", project_link = "nonebot-adapter-onebot", desc = "OneBot V11 协议" },
4953
]
5054

51-
[tool.black]
52-
line-length = 88
53-
54-
[tool.isort]
55-
profile = "black"
56-
line_length = 88
57-
skip_gitignore = true
58-
5955
[tool.pytest.ini_options]
6056
asyncio_mode = "auto"
6157

6258
[tool.pyright]
6359
pythonVersion = "3.9"
6460
pythonPlatform = "All"
65-
typeCheckingMode = "basic"
61+
typeCheckingMode = "standard"
6662
defineConstant = { PYDANTIC_V2 = true }
6763

64+
[tool.ruff]
65+
line-length = 88
66+
target-version = "py39"
67+
6868
[tool.ruff.lint]
6969
select = [
7070
"W", # pycodestyle warnings
@@ -89,7 +89,3 @@ concurrency = ["thread", "gevent"]
8989

9090
[tool.coverage.report]
9191
omit = ["*/compat.py", "*/migrations/*"]
92-
93-
[build-system]
94-
requires = ["poetry-core>=1.0.0"]
95-
build-backend = "poetry.core.masonry.api"

tests/test_config.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from typing import Dict
21
from zoneinfo import ZoneInfo
32

43
import pytest
@@ -17,7 +16,7 @@
1716
),
1817
],
1918
)
20-
async def test_default_schedule_time(app: App, default_config: Dict[str, str]):
19+
async def test_default_schedule_time(app: App, default_config: dict[str, str]):
2120
"""测试设置默认定时发送时间"""
2221
from nonebot_plugin_wordcloud.config import Config
2322

@@ -47,7 +46,7 @@ async def test_default_schedule_time(app: App, default_config: Dict[str, str]):
4746
],
4847
)
4948
async def test_default_schedule_time_with_timezone(
50-
app: App, default_config: Dict[str, str]
49+
app: App, default_config: dict[str, str]
5150
):
5251
"""测试设置默认定时发送时间,同时设置时区"""
5352
from nonebot_plugin_wordcloud.config import Config

tests/test_masked.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ async def test_masked_by_command(app: App, mocker: MockerFixture):
6767
test_image = f.read()
6868

6969
async with app.test_matcher(wordcloud_cmd) as ctx:
70-
bot = ctx.create_bot(base=Bot)
70+
adapter = get_adapter(Adapter)
71+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
7172
event = fake_group_message_event_v11(message=Message("/今日词云"))
7273

7374
ctx.receive_event(bot, event)
@@ -77,7 +78,7 @@ async def test_masked_by_command(app: App, mocker: MockerFixture):
7778
bot,
7879
event=event,
7980
)
80-
ctx.should_finished()
81+
ctx.should_finished(wordcloud_cmd)
8182

8283
mocked_random.assert_called()
8384
mocked_get_messages_plain_text.assert_called_once()
@@ -203,7 +204,8 @@ async def test_set_mask_get_args(app: App, respx_mock: respx.MockRouter):
203204
)
204205

205206
async with app.test_matcher(set_mask_cmd) as ctx:
206-
bot = ctx.create_bot(base=Bot)
207+
adapter = get_adapter(Adapter)
208+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
207209
message = Message("/设置词云形状")
208210
event = fake_group_message_event_v11(message=message, sender={"role": "owner"})
209211

@@ -291,7 +293,8 @@ async def test_remove_mask(app: App):
291293
assert mask_group_path.exists()
292294

293295
async with app.test_matcher(remove_mask_cmd) as ctx:
294-
bot = ctx.create_bot(base=Bot)
296+
adapter = get_adapter(Adapter)
297+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
295298
message = Message("/删除词云形状")
296299
event = fake_group_message_event_v11(message=message, sender={"role": "owner"})
297300

@@ -312,7 +315,8 @@ async def test_set_mask_private(app: App, mocker: MockerFixture):
312315
mocker.patch.object(config, "superusers", {"10"})
313316

314317
async with app.test_matcher(set_mask_cmd) as ctx:
315-
bot = ctx.create_bot(base=Bot)
318+
adapter = get_adapter(Adapter)
319+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
316320
event = fake_private_message_event_v11(message=Message("/设置词云形状"))
317321

318322
ctx.receive_event(bot, event)
@@ -333,7 +337,8 @@ async def test_remove_mask_private(app: App, mocker: MockerFixture):
333337
mocker.patch.object(config, "superusers", {"10"})
334338

335339
async with app.test_matcher(remove_mask_cmd) as ctx:
336-
bot = ctx.create_bot(base=Bot)
340+
adapter = get_adapter(Adapter)
341+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
337342
event = fake_private_message_event_v11(message=Message("/删除词云形状"))
338343

339344
ctx.receive_event(bot, event)

tests/test_schedule.py

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from datetime import time
22
from io import BytesIO
33

4-
from nonebot import get_driver
5-
from nonebot.adapters.onebot.v11 import Bot, Message
4+
from nonebot import get_adapter, get_driver
5+
from nonebot.adapters.onebot.v11 import Adapter, Bot, Message
6+
from nonebot.adapters.onebot.v12 import Adapter as AdapterV12
67
from nonebot.adapters.onebot.v12 import Bot as BotV12
78
from nonebot.adapters.onebot.v12 import Message as MessageV12
89
from nonebug import App
@@ -22,7 +23,8 @@ async def test_enable_schedule(app: App):
2223
from nonebot_plugin_wordcloud import schedule_cmd, schedule_service
2324

2425
async with app.test_matcher(schedule_cmd) as ctx:
25-
bot = ctx.create_bot(base=Bot)
26+
adapter = get_adapter(Adapter)
27+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
2628
event = fake_group_message_event_v11(
2729
message=Message("/开启词云每日定时发送"), sender={"role": "admin"}
2830
)
@@ -36,7 +38,8 @@ async def test_enable_schedule(app: App):
3638
assert len(schedule_service.schedules) == 1
3739

3840
async with app.test_matcher(schedule_cmd) as ctx:
39-
bot = ctx.create_bot(base=Bot)
41+
adapter = get_adapter(Adapter)
42+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
4043
event = fake_group_message_event_v11(
4144
message=Message("/开启词云每日定时发送 10:00"), sender={"role": "admin"}
4245
)
@@ -51,7 +54,8 @@ async def test_enable_schedule(app: App):
5154
assert len(schedule_service.schedules) == 2
5255

5356
async with app.test_matcher(schedule_cmd) as ctx:
54-
bot = ctx.create_bot(base=Bot)
57+
adapter = get_adapter(Adapter)
58+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
5559
event = fake_group_message_event_v11(
5660
message=Message("/开启词云每日定时发送 10:"), sender={"role": "admin"}
5761
)
@@ -63,7 +67,10 @@ async def test_enable_schedule(app: App):
6367

6468
# OneBot V12
6569
async with app.test_matcher(schedule_cmd) as ctx:
66-
bot = ctx.create_bot(base=BotV12, platform="qq", impl="test")
70+
adapter = get_adapter(AdapterV12)
71+
bot = ctx.create_bot(
72+
base=BotV12, adapter=adapter, auto_connect=False, platform="qq", impl="test"
73+
)
6774
event = fake_group_message_event_v12(
6875
message=MessageV12("/开启词云每日定时发送")
6976
)
@@ -78,7 +85,10 @@ async def test_enable_schedule(app: App):
7885
assert len(schedule_service.schedules) == 2
7986

8087
async with app.test_matcher(schedule_cmd) as ctx:
81-
bot = ctx.create_bot(base=BotV12, platform="qq", impl="test")
88+
adapter = get_adapter(AdapterV12)
89+
bot = ctx.create_bot(
90+
base=BotV12, adapter=adapter, auto_connect=False, platform="qq", impl="test"
91+
)
8292
event = fake_channel_message_event_v12(
8393
message=MessageV12("/开启词云每日定时发送 09:00")
8494
)
@@ -102,7 +112,8 @@ async def test_enable_schedule_private(app: App, mocker: MockerFixture):
102112
mocker.patch.object(config, "superusers", {"10"})
103113

104114
async with app.test_matcher(schedule_cmd) as ctx:
105-
bot = ctx.create_bot(base=Bot)
115+
adapter = get_adapter(Adapter)
116+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
106117
event = fake_private_message_event_v11(message=Message("/开启词云每日定时发送"))
107118
ctx.receive_event(bot, event)
108119
ctx.should_pass_permission(schedule_cmd)
@@ -115,7 +126,8 @@ async def test_enable_schedule_without_permission(app: App, mocker: MockerFixtur
115126
from nonebot_plugin_wordcloud import schedule_cmd
116127

117128
async with app.test_matcher(schedule_cmd) as ctx:
118-
bot = ctx.create_bot(base=Bot)
129+
adapter = get_adapter(Adapter)
130+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
119131
event = fake_group_message_event_v11(message=Message("/开启词云每日定时发送"))
120132
ctx.receive_event(bot, event)
121133
ctx.should_not_pass_permission(schedule_cmd)
@@ -142,7 +154,8 @@ async def test_disable_schedule(app: App):
142154
assert len(schedule_service.schedules) == 2
143155

144156
async with app.test_matcher(schedule_cmd) as ctx:
145-
bot = ctx.create_bot(base=Bot)
157+
adapter = get_adapter(Adapter)
158+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
146159
event = fake_group_message_event_v11(
147160
message=Message("/关闭词云每日定时发送"), sender={"role": "admin"}
148161
)
@@ -165,7 +178,8 @@ async def test_schedule_status(app: App):
165178
from nonebot_plugin_wordcloud import schedule_cmd, schedule_service
166179

167180
async with app.test_matcher(schedule_cmd) as ctx:
168-
bot = ctx.create_bot(base=Bot)
181+
adapter = get_adapter(Adapter)
182+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
169183
event = fake_group_message_event_v11(
170184
message=Message("/词云每日定时发送状态"), sender={"role": "admin"}
171185
)
@@ -177,7 +191,8 @@ async def test_schedule_status(app: App):
177191
await schedule_service.add_schedule(TargetQQGroup(group_id=10000))
178192

179193
async with app.test_matcher(schedule_cmd) as ctx:
180-
bot = ctx.create_bot(base=Bot)
194+
adapter = get_adapter(Adapter)
195+
bot = ctx.create_bot(base=Bot, adapter=adapter, auto_connect=False)
181196
event = fake_group_message_event_v11(
182197
message=Message("/词云每日定时发送状态"), sender={"role": "admin"}
183198
)
@@ -191,7 +206,10 @@ async def test_schedule_status(app: App):
191206
await schedule_service.add_schedule(TargetQQGroup(group_id=10000), time=time(23, 0))
192207

193208
async with app.test_matcher(schedule_cmd) as ctx:
194-
bot = ctx.create_bot(base=Bot, self_id="test2")
209+
adapter = get_adapter(Adapter)
210+
bot = ctx.create_bot(
211+
base=Bot, adapter=adapter, auto_connect=False, self_id="test2"
212+
)
195213
event = fake_group_message_event_v11(
196214
message=Message("/词云每日定时发送状态"), sender={"role": "admin"}
197215
)
@@ -239,7 +257,7 @@ async def test_run_task_group(app: App, mocker: MockerFixture):
239257
)
240258

241259
async with app.test_api() as ctx:
242-
bot = ctx.create_bot(base=BotV12, impl="test", platform="qq")
260+
bot = ctx.create_bot(base=BotV12, platform="qq", impl="test")
243261
should_send_saa(ctx, MessageFactory(Image(image)), bot, target=target)
244262
await schedule_service.run_task()
245263

0 commit comments

Comments
 (0)