diff --git a/src/plugins/publish/constants.py b/src/plugins/publish/constants.py index 91b0b789..59e8180c 100644 --- a/src/plugins/publish/constants.py +++ b/src/plugins/publish/constants.py @@ -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("适配器项目仓库/主页链接")) diff --git a/tests/publish/models/test_adapter.py b/tests/publish/models/test_adapter.py index 6949825a..10f0c054 100644 --- a/tests/publish/models/test_adapter.py +++ b/tests/publish/models/test_adapter.py @@ -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): @@ -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) @@ -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 ", @@ -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"}], @@ -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" @@ -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", ) @@ -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: diff --git a/tests/publish/models/test_bot.py b/tests/publish/models/test_bot.py index efe71bb1..c949f405 100644 --- a/tests/publish/models/test_bot.py +++ b/tests/publish/models/test_bot.py @@ -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): @@ -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) @@ -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 ", @@ -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"}, @@ -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", ) @@ -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"}], ) @@ -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: @@ -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: diff --git a/tests/publish/models/test_name.py b/tests/publish/models/test_name.py index b2a2bd3b..6f77611e 100644 --- a/tests/publish/models/test_name.py +++ b/tests/publish/models/test_name.py @@ -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): diff --git a/tests/publish/models/test_plugin.py b/tests/publish/models/test_plugin.py index cc18a986..18f474c2 100644 --- a/tests/publish/models/test_plugin.py +++ b/tests/publish/models/test_plugin.py @@ -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): @@ -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) @@ -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) @@ -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 ", @@ -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=[ @@ -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" @@ -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" @@ -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: diff --git a/tests/publish/models/test_tags.py b/tests/publish/models/test_tags.py index 0baa8963..2dfdc5db 100644 --- a/tests/publish/models/test_tags.py +++ b/tests/publish/models/test_tags.py @@ -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): diff --git a/tests/publish/process/test_publish_check.py b/tests/publish/process/test_publish_check.py index ba2c5569..f9598513 100644 --- a/tests/publish/process/test_publish_check.py +++ b/tests/publish/process/test_publish_check.py @@ -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: @@ -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() @@ -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() @@ -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() diff --git a/tests/publish/utils.py b/tests/publish/utils.py new file mode 100644 index 00000000..3b40441b --- /dev/null +++ b/tests/publish/utils.py @@ -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)}""" diff --git a/tests/publish/utils/test_re.py b/tests/publish/utils/test_re.py index 52932026..5b21e79e 100644 --- a/tests/publish/utils/test_re.py +++ b/tests/publish/utils/test_re.py @@ -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) diff --git a/tests/publish/utils/test_resolve_conflict_pull_requests.py b/tests/publish/utils/test_resolve_conflict_pull_requests.py index f6bd16ce..e713ad06 100644 --- a/tests/publish/utils/test_resolve_conflict_pull_requests.py +++ b/tests/publish/utils/test_resolve_conflict_pull_requests.py @@ -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: @@ -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]