Files
DDSRem 2de976f6b3 Merge pull request #7050 from DDSRem-Dev/codex-comment-migration
docs: 统一全项目中文注释和结构化契约说明
2026-10-17 19:26:29 +08:00

103 lines
3.1 KiB
Python

"""
媒体分类策略配置、外部引用校验和稳定错误合同。
"""
from collections.abc import Callable
from typing import Any, Protocol
from app.schemas.category import (
ClassificationPolicy,
ClassificationPolicyState,
ClassificationValidationResult,
)
# 在持久化事务内校验候选策略与外部引用快照的纯函数。
ClassificationReferenceSnapshotValidator = Callable[
[ClassificationPolicy, Any],
ClassificationValidationResult,
]
class ClassificationPolicyConflictError(RuntimeError):
"""
表示策略发布使用了已经过期的版本。
"""
def __init__(self, *, expected_revision: int, current_revision: int) -> None:
"""
保存客户端期望和持久化事实源中的当前版本。
"""
self.expected_revision = expected_revision
self.current_revision = current_revision
super().__init__(
"分类策略已被其他请求修改:"
f"期望 revision {expected_revision},当前 revision {current_revision}"
)
class ClassificationPolicyStateCorruptError(RuntimeError):
"""
表示持久化分类策略状态包无法通过强类型结构校验。
"""
class ClassificationPolicyReferenceViolationError(RuntimeError):
"""
表示事务内外部稳定引用会被候选策略破坏。
"""
def __init__(self, result: ClassificationValidationResult) -> None:
"""
保存事务内复验产生的完整结构化问题。
"""
self.result = result.model_copy(deep=True)
super().__init__("分类策略会破坏现有稳定引用")
class ClassificationPolicyReferenceValidator(Protocol):
"""
从当前运行配置读取外部稳定引用并校验候选策略。
"""
def validate(
self,
policy: ClassificationPolicy,
) -> ClassificationValidationResult:
"""
返回候选策略对当前外部引用的结构化校验结果。
:param policy: 待校验的候选分类策略
:return: 当前外部分类引用的结构化校验结果,包含阻止发布的问题
"""
...
class ClassificationPolicyStore(Protocol):
"""
Application 使用的分类策略状态原子持久化端口。
"""
def load(self) -> ClassificationPolicyState | None:
"""
读取当前完整状态包;配置不存在时返回空值。
:return: 完整持久化策略状态;尚未初始化时返回 None
"""
...
def compare_and_set(
self,
*,
expected_revision: int,
state: ClassificationPolicyState,
) -> None:
"""
仅在当前版本等于期望值时原子替换完整状态包。
:param expected_revision: 调用方读取到的策略版本,初次初始化使用 0
:param state: 拟整体替换的活动策略及历史,活动版本必须为 expected_revision 加 1
:raises ClassificationPolicyConflictError: 持久化版本已变化,拒绝覆盖其他发布结果
:raises ValueError: 新活动版本不是期望版本加 1
"""
...