This commit is contained in:
tuna2134
2026-07-23 11:51:07 +09:00
parent 4f3bcfd252
commit 9cfaa27f3f
5 changed files with 87 additions and 17 deletions

View File

@@ -9,7 +9,13 @@ from enum import Enum
from re import findall, fullmatch
from typing import List, Optional
from pydantic import BaseModel, Field, validator
from pydantic import (
BaseModel,
ConfigDict,
Field,
ValidationInfo,
field_validator,
)
USER_DICT_MIN_PRIORITY = 0
@@ -39,11 +45,11 @@ class UserDictWord(BaseModel):
mora_count: Optional[int] = Field(title="モーラ数", default=None)
accent_associative_rule: str = Field(title="アクセント結合規則")
class Config:
validate_assignment = True
model_config = ConfigDict(validate_assignment=True, validate_default=True)
@validator("surface")
def convert_to_zenkaku(cls, surface):
@field_validator("surface")
@classmethod
def convert_to_zenkaku(cls, surface: str) -> str:
return surface.translate(
str.maketrans(
"".join(chr(0x21 + i) for i in range(94)),
@@ -51,8 +57,9 @@ class UserDictWord(BaseModel):
)
)
@validator("pronunciation", pre=True)
def check_is_katakana(cls, pronunciation):
@field_validator("pronunciation", mode="before")
@classmethod
def check_is_katakana(cls, pronunciation: str) -> str:
if not fullmatch(r"[ァ-ヴー]+", pronunciation):
raise ValueError("発音は有効なカタカナでなくてはいけません。")
sutegana = ["", "", "", "", "", "", "", "", "", ""]
@@ -75,9 +82,12 @@ class UserDictWord(BaseModel):
)
return pronunciation
@validator("mora_count", pre=True, always=True)
def check_mora_count_and_accent_type(cls, mora_count, values):
if "pronunciation" not in values or "accent_type" not in values:
@field_validator("mora_count", mode="before")
@classmethod
def check_mora_count_and_accent_type(
cls, mora_count: Optional[int], info: ValidationInfo
) -> Optional[int]:
if "pronunciation" not in info.data or "accent_type" not in info.data:
# 適切な場所でエラーを出すようにする
return mora_count
@@ -91,14 +101,14 @@ class UserDictWord(BaseModel):
mora_count = len(
findall(
f"(?:{rule_others}|{rule_line_i}|{rule_line_u}|{rule_one_mora})",
values["pronunciation"],
info.data["pronunciation"],
)
)
if not 0 <= values["accent_type"] <= mora_count:
if not 0 <= info.data["accent_type"] <= mora_count:
raise ValueError(
"誤ったアクセント型です({})。 expect: 0 <= accent_type <= {}".format(
values["accent_type"], mora_count
info.data["accent_type"], mora_count
)
)
return mora_count