launcher/launcher/config/conf.py

83 lines
2 KiB
Python

from typing import List, Literal, get_args, get_origin
from pydantic import BaseModel, model_validator
from pydantic_core import PydanticUndefined
class ConfModel(BaseModel):
@model_validator(mode="before")
@classmethod
def nested_defaults(cls, data):
for name, field in cls.model_fields.items():
expected_type = field.annotation
if name not in data:
if field.default is PydanticUndefined:
data[name] = expected_type
else:
data[name] = field.default
value = data[name]
# 检查 Literal 类型并修正
if get_origin(expected_type) is Literal:
valid_literals = get_args(expected_type)
if value not in valid_literals:
# 修正为默认值
data[name] = (
field.default
if field.default is not PydanticUndefined
else None
)
return data
class Total(ConfModel):
"""整体"""
# 所在页面
page: str = "init"
# 是否已展示帮助文档
is_already_show_doc: bool = False
class UpdatePart(ConfModel):
"""更新代码"""
# mower-ng 代码分支
branch: str = "slow"
# PyPI 仓库镜像
mirror: str = "aliyun"
class LaunchPart(ConfModel):
"""启动程序"""
class Instance(ConfModel):
"""实例"""
# 是否选中
checked: bool = False
# 实例名
name: str = ""
# 实例路径
path: str = ""
# 实例列表
instances: List[Instance] = []
# 是否展示日志窗口
is_show_log: bool = False
class OtherPart(ConfModel):
"""其他配置"""
# xx.zhaozuohong.vip镜像 (访问xx.zhaozuohong.vip url时,0=原路径 1=在.zhaozuohong.vip前添加-cf前缀)
base_mirror: Literal["0", "1"] = "0"
class Conf(
Total,
UpdatePart,
LaunchPart,
OtherPart,
):
pass