Skip to content

Commit

Permalink
feat: 适配议题模板 (#131)
Browse files Browse the repository at this point in the history
适配最新的议题模板。

<nonebot/nonebot2#2010>
  • Loading branch information
he0119 authored May 13, 2023
1 parent eeb485a commit 54ac207
Show file tree
Hide file tree
Showing 10 changed files with 73 additions and 84 deletions.
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

0 comments on commit 54ac207

Please sign in to comment.