🔧 修改 basedpyright 配置 (#573)

* 🔧 修改 basedpyright 配置

* 🚨 auto fix by pre-commit hooks

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
呵呵です
2025-12-25 22:32:25 +08:00
committed by GitHub
parent a4ffb6bbc6
commit fcecf5a01f
16 changed files with 43 additions and 35 deletions

View File

@@ -67,7 +67,7 @@ def upgrade(name: str = '') -> None: # noqa: C901
logger.critical(msg) logger.critical(msg)
raise RuntimeError(msg) raise RuntimeError(msg)
from nonebot_plugin_tetris_stats.game_data_processor.schemas import ( # type: ignore[import-untyped] # noqa: PLC0415 from nonebot_plugin_tetris_stats.game_data_processor.schemas import ( # type: ignore[import-untyped] # pyright: ignore[reportMissingImports] # noqa: PLC0415
BaseProcessedData, BaseProcessedData,
) )

View File

@@ -66,7 +66,7 @@ def upgrade(name: str = '') -> None: # noqa: C901
msg = '本迁移需要1.0.4版本, 请先锁定版本至1.0.4版本再执行本迁移' msg = '本迁移需要1.0.4版本, 请先锁定版本至1.0.4版本再执行本迁移'
logger.critical(msg) logger.critical(msg)
raise RuntimeError(msg) raise RuntimeError(msg)
from nonebot_plugin_tetris_stats.game_data_processor.schemas import ( # type: ignore[import-untyped] # noqa: PLC0415 from nonebot_plugin_tetris_stats.game_data_processor.schemas import ( # type: ignore[import-untyped] # pyright: ignore[reportMissingImports] # noqa: PLC0415
BaseUser, BaseUser,
) )

View File

@@ -2,6 +2,7 @@ from abc import ABC, abstractmethod
from typing import Generic, TypeVar from typing import Generic, TypeVar
from pydantic import BaseModel from pydantic import BaseModel
from typing_extensions import override
from ..utils.typedefs import GameType from ..utils.typedefs import GameType
@@ -13,6 +14,7 @@ class BaseUser(BaseModel, ABC, Generic[T]):
platform: T platform: T
@override
def __eq__(self, other: object) -> bool: def __eq__(self, other: object) -> bool:
if isinstance(other, BaseUser): if isinstance(other, BaseUser):
return self.unique_identifier == other.unique_identifier return self.unique_identifier == other.unique_identifier

View File

@@ -17,7 +17,7 @@ UTC = timezone.utc
request = Request(config.tetris.proxy.tetrio or config.tetris.proxy.main) request = Request(config.tetris.proxy.tetrio or config.tetris.proxy.main)
request.request = limit(timedelta(seconds=1))(request.request) # type: ignore[method-assign] request.request = limit(timedelta(seconds=1))(request.request) # type: ignore[method-assign] # pyright: ignore[reportAttributeAccessIssue]
class Cache: class Cache:
@@ -32,7 +32,7 @@ class Cache:
logger.debug(f'{url}: Cache hit!') logger.debug(f'{url}: Cache hit!')
return cached_data return cached_data
response_data = await request.request(url, extra_headers, enable_anti_cloudflare=True) response_data = await request.request(url, extra_headers, enable_anti_cloudflare=True)
parsed_data: SuccessModel | FailedModel = type_validate_json(SuccessModel | FailedModel, response_data) # type: ignore[arg-type] parsed_data: SuccessModel | FailedModel = type_validate_json(SuccessModel | FailedModel, response_data) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
if isinstance(parsed_data, SuccessModel): if isinstance(parsed_data, SuccessModel):
await cls.cache.add( await cls.cache.add(
url, url,

View File

@@ -20,7 +20,7 @@ async def by(
by_type: Literal['league', 'xp', 'ar'], parameter: Parameter, x_session_id: UUID | None = None by_type: Literal['league', 'xp', 'ar'], parameter: Parameter, x_session_id: UUID | None = None
) -> BySuccessModel: ) -> BySuccessModel:
model: By = type_validate_json( model: By = type_validate_json(
By, # type: ignore[arg-type] By, # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
await get( await get(
BASE_URL / f'users/by/{by_type}', BASE_URL / f'users/by/{by_type}',
parameter, parameter,
@@ -69,7 +69,7 @@ async def records(
match records_type: match records_type:
case '40l' | 'blitz': case '40l' | 'blitz':
model = type_validate_json( model = type_validate_json(
Solo, # type: ignore[arg-type] Solo, # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
await get( await get(
BASE_URL / 'records' / f'{records_type}{scope}{revolution_id if revolution_id is not None else ""}', BASE_URL / 'records' / f'{records_type}{scope}{revolution_id if revolution_id is not None else ""}',
parameter, parameter,
@@ -77,17 +77,14 @@ async def records(
) )
case 'zenith' | 'zenithex': case 'zenith' | 'zenithex':
model = type_validate_json( model = type_validate_json(
Zenith, # type: ignore[arg-type] Zenith, # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
await get( await get(
BASE_URL / 'records' / f'{records_type}{scope}{revolution_id if revolution_id is not None else ""}', BASE_URL / 'records' / f'{records_type}{scope}{revolution_id if revolution_id is not None else ""}',
parameter, parameter,
), ),
) )
case _:
msg = f'records_type: {records_type} is not supported'
raise ValueError(msg)
if isinstance(model, FailedModel): if isinstance(model, FailedModel):
msg = f'排行榜信息请求错误:\n{model.error}' # type: ignore[attr-defined] msg = f'排行榜信息请求错误:\n{model.error}'
raise RequestError(msg) raise RequestError(msg)
return model return model

View File

@@ -114,7 +114,7 @@ class Player:
"""Get User Info""" """Get User Info"""
if self._user_info is None: if self._user_info is None:
raw_user_info = await Cache.get(BASE_URL / 'users' / self._request_user_parameter) raw_user_info = await Cache.get(BASE_URL / 'users' / self._request_user_parameter)
user_info: UserInfo = type_validate_json(UserInfo, raw_user_info) # type: ignore[arg-type] user_info: UserInfo = type_validate_json(UserInfo, raw_user_info) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
if isinstance(user_info, FailedModel): if isinstance(user_info, FailedModel):
msg = f'用户信息请求错误:\n{user_info.error}' msg = f'用户信息请求错误:\n{user_info.error}'
raise RequestError(msg) raise RequestError(msg)
@@ -146,7 +146,7 @@ class Player:
BASE_URL / 'users' / self._request_user_parameter / 'summaries' / summaries_type BASE_URL / 'users' / self._request_user_parameter / 'summaries' / summaries_type
) )
summaries: SummariesModel | FailedModel = type_validate_json( summaries: SummariesModel | FailedModel = type_validate_json(
self.__SUMMARIES_MAPPING[summaries_type] | FailedModel, # type: ignore[assignment, arg-type] #! waiting for [PEP 747](https://peps.python.org/pep-0747/) self.__SUMMARIES_MAPPING[summaries_type] | FailedModel, # type: ignore[assignment, arg-type] # pyright: ignore[reportArgumentType] #! waiting for [PEP 747](https://peps.python.org/pep-0747/)
raw_summaries, raw_summaries,
) )
if isinstance(summaries, FailedModel): if isinstance(summaries, FailedModel):
@@ -166,7 +166,7 @@ class Player:
async def get_leagueflow(self) -> LeagueFlowSuccess: async def get_leagueflow(self) -> LeagueFlowSuccess:
if self._leagueflow is None: if self._leagueflow is None:
leagueflow: LeagueFlow = type_validate_json( leagueflow: LeagueFlow = type_validate_json(
LeagueFlow, # type: ignore[arg-type] LeagueFlow, # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
await Cache.get(BASE_URL / 'labs/leagueflow' / self._request_user_parameter), await Cache.get(BASE_URL / 'labs/leagueflow' / self._request_user_parameter),
) )
if isinstance(leagueflow, FailedModel): if isinstance(leagueflow, FailedModel):
@@ -227,7 +227,7 @@ class Player:
raw_records = await Cache.get( raw_records = await Cache.get(
BASE_URL / 'users' / self._request_user_parameter / 'records' / mode_type / records_type, BASE_URL / 'users' / self._request_user_parameter / 'records' / mode_type / records_type,
) )
records: RecordsSoloSuccessModel | FailedModel = type_validate_json(SoloRecord, raw_records) # type: ignore[arg-type] records: RecordsSoloSuccessModel | FailedModel = type_validate_json(SoloRecord, raw_records) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
if isinstance(records, FailedModel): if isinstance(records, FailedModel):
msg = f'用户Summaries数据请求错误:\n{records.error}' msg = f'用户Summaries数据请求错误:\n{records.error}'
raise RequestError(msg) raise RequestError(msg)

View File

@@ -52,12 +52,12 @@ class P(BaseModel):
# fmt: off # fmt: off
class ArCounts(BaseModel): class ArCounts(BaseModel):
bronze: int | None = Field(default=None, alias='1') # pyright: ignore [reportGeneralTypeIssues] bronze: int | None = Field(default=None, alias='1')
silver: int | None = Field(default=None, alias='2') # pyright: ignore [reportGeneralTypeIssues] silver: int | None = Field(default=None, alias='2')
gold: int | None = Field(default=None, alias='3') # pyright: ignore [reportGeneralTypeIssues] gold: int | None = Field(default=None, alias='3')
platinum: int | None = Field(default=None, alias='4') # pyright: ignore [reportGeneralTypeIssues] platinum: int | None = Field(default=None, alias='4')
diamond: int | None = Field(default=None, alias='5') # pyright: ignore [reportGeneralTypeIssues] diamond: int | None = Field(default=None, alias='5')
issued: int | None = Field(default=None, alias='100') # pyright: ignore [reportGeneralTypeIssues] issued: int | None = Field(default=None, alias='100')
top3: int | None = Field(default=None, alias='t3') top3: int | None = Field(default=None, alias='t3')
top5: int | None = Field(default=None, alias='t5') top5: int | None = Field(default=None, alias='t5')
top10: int | None = Field(default=None, alias='t10') top10: int | None = Field(default=None, alias='t10')

View File

@@ -32,7 +32,7 @@ class PastInner(BaseModel):
class Past(BaseModel): class Past(BaseModel):
first: PastInner | None = Field(default=None, alias='1') # pyright: ignore [reportGeneralTypeIssues] first: PastInner | None = Field(default=None, alias='1')
class BaseData(BaseModel): class BaseData(BaseModel):

View File

@@ -5,7 +5,6 @@ from hashlib import md5
from yarl import URL from yarl import URL
from ....utils.chart import get_split, get_value_bounds, handle_history_data from ....utils.chart import get_split, get_value_bounds, handle_history_data
from ....utils.exception import FallbackError
from ....utils.host import get_self_netloc from ....utils.host import get_self_netloc
from ....utils.lang import get_lang from ....utils.lang import get_lang
from ....utils.metrics import get_metrics from ....utils.metrics import get_metrics
@@ -28,8 +27,6 @@ async def make_query_image_v1(player: Player) -> bytes:
gather(player.avatar_revision), gather(player.avatar_revision),
) )
league_data = get_league_data(league, RatedData) league_data = get_league_data(league, RatedData)
if league_data.vs is None:
raise FallbackError
histories = flow_to_history(leagueflow, handle_history_data) histories = flow_to_history(leagueflow, handle_history_data)
values = get_value_bounds([i.score for i in histories]) values = get_value_bounds([i.score for i in histories])
split_value, offset = get_split(values, TR_MAX, TR_MIN) split_value, offset = get_split(values, TR_MAX, TR_MIN)

View File

@@ -68,7 +68,7 @@ class Player:
raw_user_info = await request.failover_request( raw_user_info = await request.failover_request(
[i / path % query for i in BASE_URL], failover_code=[502], failover_exc=(TimeoutException,) [i / path % query for i in BASE_URL], failover_code=[502], failover_exc=(TimeoutException,)
) )
user_info: UserInfo = type_validate_json(UserInfo, raw_user_info) # type: ignore[arg-type] user_info: UserInfo = type_validate_json(UserInfo, raw_user_info) # type: ignore[arg-type] # pyright: ignore[reportArgumentType]
if not isinstance(user_info, UserInfoSuccess): if not isinstance(user_info, UserInfoSuccess):
msg = f'用户信息请求错误:\n{user_info.error}' msg = f'用户信息请求错误:\n{user_info.error}'
raise RequestError(msg) raise RequestError(msg)

View File

@@ -178,7 +178,7 @@ async def get_game_data(player: Player, query_num: int = 50) -> GameData | None:
for i in user_profile.data: for i in user_profile.data:
# 排除单人局和时间为0的游戏 # 排除单人局和时间为0的游戏
# 茶: 不计算没挖掘的局, 即使apm和lpm也如此 # 茶: 不计算没挖掘的局, 即使apm和lpm也如此
if i.num_players == 1 or i.time == 0 or i.dig is None: if i.num_players == 1 or i.time == 0:
continue continue
# 加权计算 # 加权计算
time = i.time / 1000 time = i.time / 1000

View File

@@ -1,12 +1,17 @@
from typing_extensions import override
class TetrisStatsError(Exception): class TetrisStatsError(Exception):
"""所有 TetrisStats 发生的异常基类""" """所有 TetrisStats 发生的异常基类"""
def __init__(self, message: str = ''): def __init__(self, message: str = ''):
self.message = message self.message = message
@override
def __str__(self) -> str: def __str__(self) -> str:
return self.message return self.message
@override
def __repr__(self) -> str: def __repr__(self) -> str:
return self.message return self.message

View File

@@ -20,7 +20,11 @@ from .templates import TEMPLATES_DIR
if TYPE_CHECKING: if TYPE_CHECKING:
from pydantic import IPvAnyAddress from pydantic import IPvAnyAddress
app: FastAPI = get_app() app = get_app()
if not isinstance(app, FastAPI):
msg = '本插件需要 FastAPI 驱动器才能运行'
raise RuntimeError(msg) # noqa: TRY004
driver = get_driver() driver = get_driver()
@@ -28,10 +32,6 @@ global_config = driver.config
BASE_URL = URL('https://tetr.io/user-content/') BASE_URL = URL('https://tetr.io/user-content/')
if not isinstance(app, FastAPI):
msg = '本插件需要 FastAPI 驱动器才能运行'
raise RuntimeError(msg) # noqa: TRY004
NOT_FOUND = HTMLResponse('404 Not Found', status_code=status.HTTP_404_NOT_FOUND) NOT_FOUND = HTMLResponse('404 Not Found', status_code=status.HTTP_404_NOT_FOUND)

View File

@@ -1,4 +1,4 @@
from abc import abstractmethod from abc import ABC, abstractmethod
from datetime import datetime from datetime import datetime
from typing import Literal from typing import Literal
@@ -8,7 +8,7 @@ from strenum import StrEnum
from ...typedefs import Lang, Number from ...typedefs import Lang, Number
class Base(BaseModel): class Base(BaseModel, ABC):
@property @property
@abstractmethod @abstractmethod
def path(self) -> str: def path(self) -> str:

View File

@@ -1,3 +1,4 @@
from abc import ABC
from datetime import datetime from datetime import datetime
from typing import Literal from typing import Literal
@@ -61,7 +62,7 @@ class Statistic(BaseModel):
finesse: Finesse finesse: Finesse
class Record(Base): class Record(Base, ABC):
type: Literal['best', 'personal_best', 'recent', 'disputed'] type: Literal['best', 'personal_best', 'recent', 'disputed']
user: User user: User

View File

@@ -160,6 +160,12 @@ pythonVersion = "3.10"
pythonPlatform = "All" pythonPlatform = "All"
defineConstant = { PYDANTIC_V2 = true } defineConstant = { PYDANTIC_V2 = true }
typeCheckingMode = "standard" typeCheckingMode = "standard"
reportExplicitAny = 'hint'
reportUnnecessaryTypeIgnoreComment = 'error'
reportImplicitOverride = 'error'
reportUnnecessaryComparison = 'error'
reportImplicitAbstractClass = 'error'
enableTypeIgnoreComments = false
[tool.bumpversion] [tool.bumpversion]
current_version = "1.11.0" current_version = "1.11.0"