diff --git a/README.md b/README.md index 4089414..3f17955 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,9 @@ _✨ NoneBot2 更实用的初始项目新建工具 ✨_
+ + Pydantic Version 1 Or 2 + license @@ -104,6 +107,11 @@ Telegram:[@lgc2333](https://t.me/lgc2333) ## 📝 更新日志 +### 0.2.0 + +- 适配 Pydantic V1 & V2 +- 可能再次修复了更新所有插件后统计归类不正确的问题 + ### 0.1.6 - 修复由于下划线横线不统一导致的显示错误 diff --git a/nb_cli_plugin_bootstrap/__init__.py b/nb_cli_plugin_bootstrap/__init__.py index 0a8da88..d3ec452 100644 --- a/nb_cli_plugin_bootstrap/__init__.py +++ b/nb_cli_plugin_bootstrap/__init__.py @@ -1 +1 @@ -__version__ = "0.1.6" +__version__ = "0.2.0" diff --git a/nb_cli_plugin_bootstrap/handlers/bootstrap.py b/nb_cli_plugin_bootstrap/handlers/bootstrap.py index 7d13fbc..e7390d0 100644 --- a/nb_cli_plugin_bootstrap/handlers/bootstrap.py +++ b/nb_cli_plugin_bootstrap/handlers/bootstrap.py @@ -14,6 +14,7 @@ project_name_validator, ) from nb_cli.cli.utils import CLI_DEFAULT_STYLE +from nb_cli.compat import type_validate_python from nb_cli.config.parser import ConfigManager from nb_cli.handlers.adapter import list_adapters from nb_cli.handlers.plugin import list_builtin_plugins @@ -21,10 +22,7 @@ from nb_cli.handlers.venv import create_virtualenv from noneprompt import CheckboxPrompt, Choice, ConfirmPrompt, InputPrompt from noneprompt.prompts.list import ListPrompt -from pydantic.config import BaseConfig -from pydantic.errors import IPvAnyAddressError -from pydantic.fields import ModelField -from pydantic.networks import AnyHttpUrl, IPvAnyAddress +from pydantic import AnyHttpUrl, BaseModel, IPvAnyAddress, ValidationError from ..utils import call_pip_no_output, call_pip_update_no_output @@ -45,26 +43,23 @@ def validate_ip_v_any_addr(addr: str) -> bool: + class ValidateModel(BaseModel): + addr: IPvAnyAddress + try: - IPvAnyAddress.validate(addr) - except IPvAnyAddressError: + type_validate_python(ValidateModel, {"addr": addr}) + except ValidationError: return False return True def validate_http_url(url: str) -> bool: + class ValidateModel(BaseModel): + url: AnyHttpUrl + try: - AnyHttpUrl.validate( - url, - ModelField( - name="", - type_=AnyHttpUrl, - class_validators=None, - model_config=BaseConfig, - ), - BaseConfig(), - ) - except Exception: + type_validate_python(ValidateModel, {"url": url}) + except ValidationError: return False return True diff --git a/nb_cli_plugin_bootstrap/handlers/update_project.py b/nb_cli_plugin_bootstrap/handlers/update_project.py index d5ea922..ee39548 100644 --- a/nb_cli_plugin_bootstrap/handlers/update_project.py +++ b/nb_cli_plugin_bootstrap/handlers/update_project.py @@ -16,6 +16,7 @@ InstallInfoType, SuccessInstallInfo, list_all_packages, + normalize_pkg_name, update_package, ) @@ -30,7 +31,7 @@ def guess_adapter_pkg_name(module_names: List[str]) -> List[str]: name = name[LEN_ADAPTER_PKG_PFX:] name = name.split(".", maxsplit=1)[0] pkg_names.append(f"nonebot-adapter-{name}") - return pkg_names + return [normalize_pkg_name(x) for x in pkg_names] def style_change(*change: Optional[str]) -> str: @@ -73,11 +74,7 @@ async def summary_infos( for k, v in changed_pkgs.items() if any(True for x in success_infos if x.name == k) } - changed_others = { - k: v - for k, v in changed_pkgs.items() - if k.replace("_", "-") not in changed_targets - } + changed_others = {k: v for k, v in changed_pkgs.items() if k not in changed_targets} info_li: List[str] = [] if unchanged_infos: @@ -163,7 +160,7 @@ async def update_project_handler( pkgs = [ *guess_adapter_pkg_name([x.module_name for x in bot_config.adapters]), - *(x.replace("_", "-") for x in bot_config.plugins), + *(normalize_pkg_name(x) for x in bot_config.plugins), ] if not pkgs: click.secho("你还没有安装过商店插件或适配器,没有需要更新的包", fg="green") diff --git a/nb_cli_plugin_bootstrap/plugin.py b/nb_cli_plugin_bootstrap/plugin.py index 9059d36..ef01f97 100644 --- a/nb_cli_plugin_bootstrap/plugin.py +++ b/nb_cli_plugin_bootstrap/plugin.py @@ -1,9 +1,13 @@ +from typing import cast + import click -from nb_cli.cli import ClickAliasedGroup, cli, run_async +from nb_cli.cli import ClickAliasedGroup, cli as cli_, run_async from .handlers.bootstrap import bootstrap_handler from .handlers.update_project import update_project_handler +cli = cast(ClickAliasedGroup, cli_) + @click.group( cls=ClickAliasedGroup, diff --git a/nb_cli_plugin_bootstrap/utils.py b/nb_cli_plugin_bootstrap/utils.py index 79e39db..693ddd4 100644 --- a/nb_cli_plugin_bootstrap/utils.py +++ b/nb_cli_plugin_bootstrap/utils.py @@ -93,6 +93,10 @@ async def call_pip_update_no_output( ) +def normalize_pkg_name(name: str) -> str: + return name.replace("_", "-").lower() + + async def list_all_packages(python_path: Optional[str] = None) -> Dict[str, str]: proc = await call_pip_no_output(["list", "--format=json"], python_path=python_path) return_code = await proc.wait() @@ -100,7 +104,7 @@ async def list_all_packages(python_path: Optional[str] = None) -> Dict[str, str] raise RuntimeError("Failed to execute command `pip list`") assert proc.stdout stdout = decode(await proc.stdout.read()) - return {x["name"]: x["version"] for x in json.loads(stdout)} + return {normalize_pkg_name(x["name"]): x["version"] for x in json.loads(stdout)} async def update_package( diff --git a/pyproject.toml b/pyproject.toml index 12a6ae9..bf8f4a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "nb-cli-plugin-bootstrap" dynamic = ["version"] description = "A nb-cli plugin for quickly create and bootstrap a NoneBot2 project." authors = [{ name = "student_2333", email = "lgc2333@126.com" }] -dependencies = ["nb-cli>=1.2.7"] +dependencies = ["nb-cli>=1.4.0"] requires-python = ">=3.9,<4.0" readme = "README.md" license = { text = "MIT" }