certflow.config.settings_ui 源代码
"""声明式配置中心 spec 加载器(T9)。
加载 ``config/settings_ui.yaml``,提供 :func:`load_settings_ui_spec` 返回 spec 字典,
供 ``ConfigCenterBackend``(T10)与配置中心 UI(T13)自动渲染分区/控件,无需手写每个 widget。
spec 结构见 ``config/settings_ui.yaml`` 顶部注释:每个 section 含 ``layer``(决定写哪一层)、
``editable``(是否可编辑)、``fields``(字段列表,含 ``key/label/type``)。
"""
from __future__ import annotations
import functools
from pathlib import Path
import yaml
# src/certflow/config/settings_ui.py -> 上溯 4 级到项目根 -> config/settings_ui.yaml
_SPEC_PATH = Path(__file__).resolve().parent.parent.parent.parent / "config" / "settings_ui.yaml"
[文档]
@functools.lru_cache(maxsize=1)
def load_settings_ui_spec() -> dict:
"""加载配置中心声明式 spec。
Returns:
spec 字典(含 ``sections`` 列表);文件缺失时返回空字典。
"""
if not _SPEC_PATH.exists():
return {}
with open(_SPEC_PATH, encoding="utf-8") as f:
data = yaml.safe_load(f) or {}
return data.get("config_center", {})
[文档]
def list_editable_fields() -> list[dict]:
"""展开所有可编辑字段(供 UI 渲染 / 测试)。
Returns:
扁平字段列表,每项含 ``section``/``key``/``label``/``type``/``layer``。
"""
spec = load_settings_ui_spec()
out: list[dict] = []
for section in spec.get("sections", []):
if not section.get("editable", False):
continue
for field in section.get("fields", []):
out.append(
{
"section": section.get("id"),
"key": field.get("key"),
"label": field.get("label"),
"type": field.get("type"),
"layer": section.get("layer"),
}
)
return out