Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions src/plugins/publish/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,21 +57,21 @@
)

# 匹配信息的正则表达式
ISSUE_PATTERN = r"\*\*{}:\*\*\s+([^\s*].*?)(?=(?:\s+\*\*|$))"
ISSUE_PATTERN = r"### {}\s+([^\s#].*?)(?=(?:\s+###|$))"
# 基本信息
PROJECT_LINK_PATTERN = re.compile(ISSUE_PATTERN.format("PyPI 项目名"))
TAGS_PATTERN = re.compile(ISSUE_PATTERN.format("标签"))
# 机器人
BOT_NAME_PATTERN = re.compile(ISSUE_PATTERN.format("机器人名称"))
BOT_DESC_PATTERN = re.compile(ISSUE_PATTERN.format("机器人功能"))
BOT_DESC_PATTERN = re.compile(ISSUE_PATTERN.format("机器人描述"))
BOT_HOMEPAGE_PATTERN = re.compile(ISSUE_PATTERN.format("机器人项目仓库/主页链接"))
# 插件
PLUGIN_NAME_PATTERN = re.compile(ISSUE_PATTERN.format("插件名称"))
PLUGIN_DESC_PATTERN = re.compile(ISSUE_PATTERN.format("插件功能"))
PLUGIN_DESC_PATTERN = re.compile(ISSUE_PATTERN.format("插件描述"))
PLUGIN_MODULE_NAME_PATTERN = re.compile(ISSUE_PATTERN.format("插件 import 包名"))
PLUGIN_HOMEPAGE_PATTERN = re.compile(ISSUE_PATTERN.format("插件项目仓库/主页链接"))
# 协议
ADAPTER_NAME_PATTERN = re.compile(ISSUE_PATTERN.format("协议名称"))
ADAPTER_DESC_PATTERN = re.compile(ISSUE_PATTERN.format("协议功能"))
ADAPTER_MODULE_NAME_PATTERN = re.compile(ISSUE_PATTERN.format("协议 import 包名"))
ADAPTER_HOMEPAGE_PATTERN = re.compile(ISSUE_PATTERN.format("协议项目仓库/主页链接"))
ADAPTER_NAME_PATTERN = re.compile(ISSUE_PATTERN.format("适配器名称"))
ADAPTER_DESC_PATTERN = re.compile(ISSUE_PATTERN.format("适配器描述"))
ADAPTER_MODULE_NAME_PATTERN = re.compile(ISSUE_PATTERN.format("适配器 import 包名"))
ADAPTER_HOMEPAGE_PATTERN = re.compile(ISSUE_PATTERN.format("适配器项目仓库/主页链接"))
23 changes: 7 additions & 16 deletions tests/publish/models/test_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,7 @@
import pytest
from pytest_mock import MockerFixture


def generate_issue_body(
name: str = "name",
desc: str = "desc",
module_name: str = "module_name",
project_link: str = "project_link",
homepage: str = "https://v2.nonebot.dev",
tags: list = [{"label": "test", "color": "#ffffff"}],
):
return f"""**协议名称:**\n\n{name}\n\n**协议功能:**\n\n{desc}\n\n**PyPI 项目名:**\n\n{project_link}\n\n**协议 import 包名:**\n\n{module_name}\n\n**协议项目仓库/主页链接:**\n\n{homepage}\n\n**标签:**\n\n{json.dumps(tags)}"""
from tests.publish.utils import generate_issue_body_adapter


def mocked_httpx_get(url: str):
Expand All @@ -40,7 +31,7 @@ async def test_adapter_from_issue(mocker: MockerFixture) -> None:

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body()
mock_issue.body = generate_issue_body_adapter()
mock_issue.user.login = "author"

info = AdapterPublishInfo.from_issue(mock_issue)
Expand Down Expand Up @@ -75,7 +66,7 @@ async def test_adapter_from_issue_trailing_whitespace(mocker: MockerFixture) ->

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(
mock_issue.body = generate_issue_body_adapter(
name="name ",
desc="desc ",
module_name="module_name ",
Expand Down Expand Up @@ -140,7 +131,7 @@ async def test_adapter_info_validation_failed(mocker: MockerFixture) -> None:

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(
mock_issue.body = generate_issue_body_adapter(
project_link="project_link_failed",
homepage="https://www.baidu.com",
tags=[{"label": "test", "color": "#fffffff"}],
Expand Down Expand Up @@ -168,7 +159,7 @@ async def test_adapter_info_validation_partial_failed(mocker: MockerFixture) ->

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(
mock_issue.body = generate_issue_body_adapter(
homepage="https://www.baidu.com",
)
mock_issue.user.login = "author"
Expand All @@ -194,7 +185,7 @@ async def test_adapter_info_name_validation_failed(mocker: MockerFixture) -> Non

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(
mock_issue.body = generate_issue_body_adapter(
module_name="module_name1",
project_link="project_link1",
)
Expand Down Expand Up @@ -223,7 +214,7 @@ async def test_adapter_info_validation_failed_http_exception(

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(homepage="exception")
mock_issue.body = generate_issue_body_adapter(homepage="exception")
mock_issue.user.login = "author"

with pytest.raises(MyValidationError) as e:
Expand Down
25 changes: 8 additions & 17 deletions tests/publish/models/test_bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,7 @@
import pytest
from pytest_mock import MockerFixture


def generate_issue_body(
name: str = "name",
desc: str = "desc",
homepage: str = "https://v2.nonebot.dev",
tags: list | str = [{"label": "test", "color": "#ffffff"}],
):
if isinstance(tags, list):
tags = json.dumps(tags)
return f"""**机器人名称:**\n\n{name}\n\n**机器人功能:**\n\n{desc}\n\n**机器人项目仓库/主页链接:**\n\n{homepage}\n\n**标签:**\n\n{tags}"""
from tests.publish.utils import generate_issue_body_bot


def mocked_httpx_get(url: str):
Expand All @@ -38,7 +29,7 @@ async def test_bot_from_issue(mocker: MockerFixture) -> None:

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body()
mock_issue.body = generate_issue_body_bot()
mock_issue.user.login = "author"

info = BotPublishInfo.from_issue(mock_issue)
Expand Down Expand Up @@ -66,7 +57,7 @@ async def test_bot_from_issue_trailing_whitespace(mocker: MockerFixture) -> None

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(
mock_issue.body = generate_issue_body_bot(
name="name ",
desc="desc ",
homepage="https://v2.nonebot.dev ",
Expand Down Expand Up @@ -118,7 +109,7 @@ async def test_bot_info_validation_failed(mocker: MockerFixture) -> None:

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(
mock_issue.body = generate_issue_body_bot(
homepage="https://www.baidu.com",
tags=[
{"label": "test", "color": "#ffffff"},
Expand Down Expand Up @@ -147,7 +138,7 @@ async def test_bot_info_validation_failed_json_error(mocker: MockerFixture) -> N

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(
mock_issue.body = generate_issue_body_bot(
homepage="https://www.baidu.com",
tags="not a json",
)
Expand Down Expand Up @@ -175,7 +166,7 @@ async def test_bot_info_validation_failed_tag_field_missing(

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(
mock_issue.body = generate_issue_body_bot(
homepage="https://www.baidu.com",
tags=[{"label": "test"}],
)
Expand Down Expand Up @@ -203,7 +194,7 @@ async def test_bot_info_validation_failed_name_tags_missing(

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(name="", tags="")
mock_issue.body = generate_issue_body_bot(name="", tags="")
mock_issue.user.login = "author"

with pytest.raises(MyValidationError) as e:
Expand All @@ -226,7 +217,7 @@ async def test_bot_info_validation_failed_http_exception(mocker: MockerFixture)

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(homepage="exception")
mock_issue.body = generate_issue_body_bot(homepage="exception")
mock_issue.user.login = "author"

with pytest.raises(MyValidationError) as e:
Expand Down
11 changes: 0 additions & 11 deletions tests/publish/models/test_name.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,6 @@
from pytest_mock import MockerFixture


def generate_issue_body(
name: str = "name",
desc: str = "desc",
module_name: str = "module_name",
project_link: str = "project_link",
homepage: str = "https://v2.nonebot.dev",
tags: list = [{"label": "test", "color": "#ffffff"}],
):
return f"""**协议名称:**\n\n{name}\n\n**协议功能:**\n\n{desc}\n\n**PyPI 项目名:**\n\n{project_link}\n\n**协议 import 包名:**\n\n{module_name}\n\n**协议项目仓库/主页链接:**\n\n{homepage}\n\n**标签:**\n\n{json.dumps(tags)}"""


def mocked_httpx_get(url: str):
class MockResponse:
def __init__(self, status_code: int):
Expand Down
25 changes: 8 additions & 17 deletions tests/publish/models/test_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,7 @@
import pytest
from pytest_mock import MockerFixture


def generate_issue_body(
name: str = "name",
desc: str = "desc",
module_name: str = "module_name",
project_link: str = "project_link",
homepage: str = "https://v2.nonebot.dev",
tags: list = [{"label": "test", "color": "#ffffff"}],
):
return f"""**插件名称:**\n\n{name}\n\n**插件功能:**\n\n{desc}\n\n**PyPI 项目名:**\n\n{project_link}\n\n**插件 import 包名:**\n\n{module_name}\n\n**插件项目仓库/主页链接:**\n\n{homepage}\n\n**标签:**\n\n{json.dumps(tags)}"""
from tests.publish.utils import generate_issue_body_plugin


def mocked_httpx_get(url: str):
Expand All @@ -40,7 +31,7 @@ async def test_plugin_from_issue(mocker: MockerFixture) -> None:

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body()
mock_issue.body = generate_issue_body_plugin()
mock_issue.user.login = "author"

info = PluginPublishInfo.from_issue(mock_issue)
Expand Down Expand Up @@ -78,7 +69,7 @@ async def test_plugin_from_issue_plugin_test_empty(mocker: MockerFixture) -> Non

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body()
mock_issue.body = generate_issue_body_plugin()
mock_issue.user.login = "author"

info = PluginPublishInfo.from_issue(mock_issue)
Expand Down Expand Up @@ -109,7 +100,7 @@ async def test_plugin_from_issue_trailing_whitespace(mocker: MockerFixture) -> N

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(
mock_issue.body = generate_issue_body_plugin(
module_name="module_name ",
project_link="project_link ",
name="name ",
Expand Down Expand Up @@ -172,7 +163,7 @@ async def test_plugin_info_validation_failed(mocker: MockerFixture) -> None:

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(
mock_issue.body = generate_issue_body_plugin(
project_link="project_link_failed",
homepage="https://www.baidu.com",
tags=[
Expand Down Expand Up @@ -206,7 +197,7 @@ async def test_plugin_info_validation_partial_failed(mocker: MockerFixture) -> N

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(
mock_issue.body = generate_issue_body_plugin(
homepage="https://www.baidu.com",
)
mock_issue.user.login = "author"
Expand Down Expand Up @@ -236,7 +227,7 @@ async def test_plugin_info_skip_plugin_test(mocker: MockerFixture) -> None:

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(
mock_issue.body = generate_issue_body_plugin(
homepage="https://www.baidu.com",
)
mock_issue.user.login = "author"
Expand Down Expand Up @@ -267,7 +258,7 @@ async def test_plugin_info_validation_failed_http_exception(

mock_httpx = mocker.patch("httpx.get", side_effect=mocked_httpx_get)
mock_issue = mocker.MagicMock()
mock_issue.body = generate_issue_body(homepage="exception")
mock_issue.body = generate_issue_body_plugin(homepage="exception")
mock_issue.user.login = "author"

with pytest.raises(MyValidationError) as e:
Expand Down
11 changes: 0 additions & 11 deletions tests/publish/models/test_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,6 @@
from pytest_mock import MockerFixture


def generate_issue_body(
name: str = "name",
desc: str = "desc",
module_name: str = "module_name",
project_link: str = "project_link",
homepage: str = "https://v2.nonebot.dev",
tags: list = [{"label": "test", "color": "#ffffff"}],
):
return f"""**协议名称:**\n\n{name}\n\n**协议功能:**\n\n{desc}\n\n**PyPI 项目名:**\n\n{project_link}\n\n**协议 import 包名:**\n\n{module_name}\n\n**协议项目仓库/主页链接:**\n\n{homepage}\n\n**标签:**\n\n{json.dumps(tags)}"""


def mocked_httpx_get(url: str):
class MockResponse:
def __init__(self, status_code: int):
Expand Down
8 changes: 5 additions & 3 deletions tests/publish/process/test_publish_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
from nonebug import App
from pytest_mock import MockerFixture

from tests.publish.utils import generate_issue_body_bot


def mocked_httpx_get(url: str):
class MockResponse:
Expand Down Expand Up @@ -52,7 +54,7 @@ async def test_process_publish_check(
mock_issue.title = "Bot: test"
mock_issue.number = 80
mock_issue.state = "open"
mock_issue.body = """**机器人名称:**\n\ntest\n\n**机器人功能:**\n\ndesc\n\n**机器人项目仓库/主页链接:**\n\nhttps://v2.nonebot.dev\n\n**标签:**\n\n[{"label": "test", "color": "#ffffff"}]"""
mock_issue.body = generate_issue_body_bot(name="test")
mock_issue.user.login = "test"

mock_event = mocker.MagicMock()
Expand Down Expand Up @@ -242,7 +244,7 @@ async def test_edit_title(app: App, mocker: MockerFixture, tmp_path: Path) -> No
mock_issue.title = "Bot: test"
mock_issue.number = 80
mock_issue.state = "open"
mock_issue.body = """**机器人名称:**\n\ntest1\n\n**机器人功能:**\n\ndesc\n\n**机器人项目仓库/主页链接:**\n\nhttps://v2.nonebot.dev\n\n**标签:**\n\n[{"label": "test", "color": "#ffffff"}]"""
mock_issue.body = generate_issue_body_bot(name="test1")
mock_issue.user.login = "test"

mock_event = mocker.MagicMock()
Expand Down Expand Up @@ -444,7 +446,7 @@ async def test_process_publish_check_not_pass(
mock_issue.title = "Bot: test"
mock_issue.number = 1
mock_issue.state = "open"
mock_issue.body = """**机器人名称:**\n\ntest\n\n**机器人功能:**\n\ndesc\n\n**机器人项目仓库/主页链接:**\n\nhttps://test\n\n**标签:**\n\n[{"label": "test", "color": "#ffffff"}]"""
mock_issue.body = generate_issue_body_bot(name="test", homepage="https://test")
mock_issue.user.login = "test"

mock_issues_resp = mocker.MagicMock()
Expand Down
34 changes: 34 additions & 0 deletions tests/publish/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import json


def generate_issue_body_adapter(
name: str = "name",
desc: str = "desc",
module_name: str = "module_name",
project_link: str = "project_link",
homepage: str = "https://v2.nonebot.dev",
tags: list = [{"label": "test", "color": "#ffffff"}],
):
return f"""### 适配器名称\n\n{name}\n\n### 适配器描述\n\n{desc}\n\n### PyPI 项目名\n\n{project_link}\n\n### 适配器 import 包名\n\n{module_name}\n\n### 适配器项目仓库/主页链接\n\n{homepage}\n\n### 标签\n\n{json.dumps(tags)}"""


def generate_issue_body_bot(
name: str = "name",
desc: str = "desc",
homepage: str = "https://v2.nonebot.dev",
tags: list | str = [{"label": "test", "color": "#ffffff"}],
):
if isinstance(tags, list):
tags = json.dumps(tags)
return f"""### 机器人名称\n\n{name}\n\n### 机器人描述\n\n{desc}\n\n### 机器人项目仓库/主页链接\n\n{homepage}\n\n### 标签\n\n{tags}"""


def generate_issue_body_plugin(
name: str = "name",
desc: str = "desc",
module_name: str = "module_name",
project_link: str = "project_link",
homepage: str = "https://v2.nonebot.dev",
tags: list = [{"label": "test", "color": "#ffffff"}],
):
return f"""### 插件名称\n\n{name}\n\n### 插件描述\n\n{desc}\n\n### PyPI 项目名\n\n{project_link}\n\n### 插件 import 包名\n\n{module_name}\n\n### 插件项目仓库/主页链接\n\n{homepage}\n\n### 标签\n\n{json.dumps(tags)}"""
2 changes: 1 addition & 1 deletion tests/publish/utils/test_re.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ async def test_missing_info():
TAGS_PATTERN,
)

body = """**插件名称:**\r\n\r\n监测群事件\r\n\r\n**插件功能:**\r\n\r\n监测群成员变动、文件上传、红包运气王、管理员变动等等...\r\n\r\n**PyPI 项目名:**\r\n\r\n\r\n\r\n**插件 import 包名:**\r\n\r\n\r\n\r\n**插件项目仓库/主页链接:**\r\n\r\nhttps://github.com/cjladmin/nonebot_plugin_monitor\r\n\r\n**标签:**\r\n\r\n[]"""
body = """### 插件名称\r\n\r\n监测群事件\r\n\r\n### 插件描述\r\n\r\n监测群成员变动、文件上传、红包运气王、管理员变动等等...\r\n\r\n### PyPI 项目名\r\n\r\n\r\n\r\n### 插件 import 包名\r\n\r\n\r\n\r\n### 插件项目仓库/主页链接\r\n\r\nhttps://github.com/cjladmin/nonebot_plugin_monitor\r\n\r\n### 标签\r\n\r\n[]"""

module_name = PLUGIN_MODULE_NAME_PATTERN.search(body)
project_link = PROJECT_LINK_PATTERN.search(body)
Expand Down
4 changes: 3 additions & 1 deletion tests/publish/utils/test_resolve_conflict_pull_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
from nonebug import App
from pytest_mock import MockerFixture

from tests.publish.utils import generate_issue_body_bot


def mocked_httpx_get(url: str):
class MockResponse:
Expand Down Expand Up @@ -45,7 +47,7 @@ async def test_resolve_conflict_pull_requests(
mock_issue.title = "Bot: test"
mock_issue.number = 1
mock_issue.state = "open"
mock_issue.body = """**机器人名称:**\n\ntest\n\n**机器人功能:**\n\ndesc\n\n**机器人项目仓库/主页链接:**\n\nhttps://v2.nonebot.dev\n\n**标签:**\n\n[{"label": "test", "color": "#ffffff"}]"""
mock_issue.body = generate_issue_body_bot(name="test")
mock_issue.user.login = "test"
mock_issue.labels = [mock_label]

Expand Down