Skip to content

Commit 8950ce4

Browse files
authored
✨ upgrade to pydantic v2
1 parent 8ce61a7 commit 8950ce4

File tree

5 files changed

+458
-314
lines changed

5 files changed

+458
-314
lines changed

nonebot_plugin_sentry/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import sentry_sdk
2-
from nonebot import logger, get_driver
2+
from nonebot.compat import model_dump
33
from nonebot.plugin import PluginMetadata
4+
from nonebot import logger, get_driver, get_plugin_config
45

56
from .config import Config
67

@@ -15,12 +16,11 @@
1516
)
1617

1718
driver = get_driver()
18-
global_config = driver.config
19-
config = Config(**global_config.dict())
19+
config = get_plugin_config(Config)
2020

2121

2222
def init_sentry(config: Config):
23-
sentry_config = {key[7:]: value for key, value in config.dict().items()}
23+
sentry_config = {key[7:]: value for key, value in model_dump(config).items()}
2424
sentry_sdk.init(**sentry_config)
2525

2626

nonebot_plugin_sentry/compat.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from typing import Literal, overload
2+
3+
from nonebot.compat import PYDANTIC_V2
4+
5+
__all__ = ("model_validator",)
6+
7+
if PYDANTIC_V2:
8+
from pydantic import field_validator as field_validator
9+
from pydantic import model_validator as model_validator
10+
else:
11+
from pydantic import validator, root_validator
12+
13+
@overload
14+
def model_validator(*, mode: Literal["before"]): ...
15+
16+
@overload
17+
def model_validator(*, mode: Literal["after"]): ...
18+
19+
def model_validator(*, mode: Literal["before", "after"] = "after"):
20+
return root_validator(pre=mode == "before", allow_reuse=True)
21+
22+
def field_validator(__field, *fields, mode: Literal["before", "after"] = "after"):
23+
return validator(__field, *fields, pre=mode == "before", allow_reuse=True)

nonebot_plugin_sentry/config.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,44 @@
11
from typing import Any, Dict, List, Optional
22

33
from nonebot import get_driver
4+
from pydantic import Field, BaseModel
45
from sentry_sdk.integrations import Integration
6+
from nonebot.compat import PYDANTIC_V2, ConfigDict
57
from sentry_sdk.integrations.loguru import LoguruIntegration
6-
from pydantic import Extra, Field, BaseModel, validator, root_validator
8+
9+
from .compat import field_validator, model_validator
710

811
driver = get_driver()
912

1013

1114
class Config(BaseModel):
1215
sentry_dsn: Optional[str] = None
1316
sentry_environment: str = driver.env
14-
sentry_integrations: List[Integration] = Field(default_factory=list)
17+
sentry_integrations: List[Integration] = Field(
18+
default_factory=lambda: [LoguruIntegration()]
19+
)
1520

1621
# [FIXED] https://github.com/getsentry/sentry-python/issues/653
1722
# sentry_default_integrations: bool = False
1823

19-
class Config:
20-
extra = Extra.allow
21-
arbitrary_types_allowed = True
24+
if PYDANTIC_V2:
25+
model_config: ConfigDict = ConfigDict(
26+
extra="allow", arbitrary_types_allowed=True
27+
)
28+
else:
29+
30+
class Config:
31+
extra = "allow"
32+
arbitrary_types_allowed = True
2233

23-
@root_validator(pre=True)
34+
@model_validator(mode="before")
35+
@classmethod
2436
def filter_sentry_configs(cls, values: Dict[str, Any]):
2537
return {
2638
key: value for key, value in values.items() if key.startswith("sentry_")
2739
}
2840

29-
@validator("sentry_integrations", allow_reuse=True, always=True)
41+
@field_validator("sentry_integrations", mode="after")
3042
def validate_integrations(cls, v: List[Integration]):
3143
ids = {i.identifier for i in v}
3244
if LoguruIntegration.identifier not in ids:

0 commit comments

Comments
 (0)