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