diff --git a/README.md b/README.md
index 4089414..3f17955 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,9 @@ _✨ NoneBot2 更实用的初始项目新建工具 ✨_
+
+
+
@@ -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" }