开发与测试¶
项目结构¶
DevConfig-Gen/
├── src/devconfig_gen/ 核心包(见 docs/index.md 模块地图)
│ ├── providers/ custom / json / env 三个内置 Provider
│ └── py.typed 类型标记
├── tests/ unittest 测试套件(143 个用例)
├── examples/ 示例输入(custom.json / custom.yaml / vars.yaml)
├── docs/ 本技术文档(MkDocs 源)
├── mkdocs.yml MkDocs + Material 站点配置
├── ARCHITECTURE.md 架构与设计决策
├── PROVIDER_STANDARD.md Provider 铁标准(白皮书)
├── PIPELINE_PLAN.md 全链路 pluggable 定调
├── CHANGELOG.md 版本变更记录
├── pyproject.toml PEP 517/621 打包配置
└── .github/workflows/ CI / 文档 / 发布流水线
运行测试¶
PYTHONPATH=src python3 -m unittest discover -s tests -v
已安装到当前环境时也可直接:
python -m unittest discover -s tests -v
测试套件共 143 个用例,不需要 PyYAML:默认走内置 YAML 子集解析器/序列化器;
PyYAML 分支在源码中以 # pragma: no cover 标注,不作为 CI 的必需路径。
测试文件与覆盖范围¶
| 文件 | 覆盖内容 |
|---|---|
test_formats.py |
JSON/YAML 解析与序列化、格式检测、coerce_scalar、媒体类型 |
test_validation.py |
校验辅助函数、ValidationError、Diagnostic 序列化 |
test_devconfig_core.py |
json Provider 持久化、注册表、产物名越界拒绝 |
test_custom_provider.py |
custom 的任意结构、上下文解包、命名与媒体类型 |
test_env_provider.py |
env 的扁平化、标量转换、诊断、.env 持久化 |
test_merge.py |
deep_merge 规则、多输入顺序、--set 语义 |
test_provider_metadata.py |
ProviderStep/ProviderField、i18n、diagnose 降级、内置注册 |
test_cli_e2e.py |
以子进程方式端到端执行各 CLI 子命令与退出码 |
test_api_parity.py |
CLI 与 Python API 产物逐字节一致 |
test_interactive.py |
向导的字段提示、重试、EOF、文件加载 |
test_web_ui.py |
单页 HTML 与全部 JSON 接口、Host 校验、导出沙箱 |
test_web_ui_widgets.py |
默认 Widget 渲染、注册表覆盖与回退、/api/widgets、自定义 Widget 注入 |
运行单个测试文件:
PYTHONPATH=src python3 -m unittest discover -s tests -p 'test_env_provider.py' -v
CI¶
.github/workflows/ci.yml 在 push、pull request 和手动触发时运行:
Ubuntu 与 macOS 双平台 × Python 3.8–3.14 矩阵,执行
PYTHONPATH=src python -m unittest discover -s tests -v。
打包¶
pip install -e ".[dev]" # 安装 build / wheel / PyYAML
python -m build # 生成 dist/*.whl 与 dist/*.tar.gz
- 包名:
devconfig-gen,导入名:devconfig_gen; - 控制台脚本:
devconfig-gen = devconfig_gen.cli:main; - 运行时依赖为空;可选依赖
yaml(PyYAML)、dev(构建工具)与docs(mkdocs-material); - 版本同时出现在
pyproject.toml与src/devconfig_gen/__init__.py的__version__;CLI--version直接读取__version__,因此发布时两处需 保持一致(测试test_version_matches_package_version会校验 CLI 与包 版本一致)。当前版本为1.1.0。
文档站点(GitHub Pages)¶
docs/ 目录通过根目录 mkdocs.yml(MkDocs + Material 主题)发布为项目文档
站点,Markdown 文件本身仍是唯一内容来源,发布地址为
https://henryliu443.github.io/DevConfig-Gen/。本地构建:
pip install -e ".[docs]" # 安装 mkdocs-material
mkdocs build --strict # 输出到 site/(已加入 .gitignore)
mkdocs serve # 本地预览 http://127.0.0.1:8000
- 导航在
mkdocs.yml的nav中定义; - 标题锚点使用
pymdownx.slugs.slugify(保留中文),因此文档中的文件.md#中文锚点链接在站点内依然有效; - 构建开启
--strict:文档内失效链接会直接导致构建失败。
发布分支与锁定¶
文档不通过 main 发布,而是走专用分支 docs:
.github/workflows/docs.yml只在推送到docs分支且改动docs/**、mkdocs.yml、pyproject.toml或工作流自身时触发;build与deploy两个 job 都带有if: github.ref == 'refs/heads/docs',因此即使在其它分支手动workflow_dispatch也不会构建或部署;- 构建步骤先
pip install -e ".[docs]",再执行mkdocs build --strict, 并把site/作为 Pages 产物上传; permissions只申请contents: read、pages: write、id-token: write, 且concurrency: pages保证同一时间只有一次发布。
仓库设置侧的锁定(无法写入代码,需在 GitHub 上配置一次):
- 分支保护:Settings → Branches,为
docs添加保护规则(禁止直接 push、要求 PR/审查/状态检查),使文档改动只能经评审合入; - 环境限制:Settings → Environments →
github-pages,在 Deployment branches 中只允许docs,避免其它分支触发部署; - Pages 来源:Settings → Pages → Source 选择 “GitHub Actions”。
本地开发与预览不需要任何部署权限。
发布¶
.github/workflows/release.yml 在推送 v* 标签(或手动指定 tag)时:
检出代码 → 构建 sdist/wheel → 创建/覆盖 GitHub Release → 通过 PyPI
Trusted Publishing(OIDC)发布。发布操作只在 CI 中执行;本地开发不需要
配置任何凭据。
开发约定¶
来自 AGENTS.md 的项目约束:
- 不要向核心引擎添加网络、部署、服务管理、凭据或系统修改行为;
- CLI 与
init/ui客户端保持“薄”:只调用devconfig_gen.engine的共享流水线,不重复实现生成逻辑; - 保持输出确定性:JSON/YAML 保留插入顺序,产物逐字节稳定;
- 每个行为变更都要有测试;完成前运行完整测试套件;
- 公共 API、CLI、格式或 Provider 契约变化时,同步更新
README.md与ARCHITECTURE.md; - 未经明确要求,不发布包、不创建 Release、不推送远端。
文档维护¶
docs/index.md是文档总入口与能力清单,按“CLI 优先”的顺序组织;- CLI 是主要使用面:命令/参数变化时更新
docs/cli.md,并同步docs/cli-cookbook.md中受影响的配方; - 新增/修改 Provider、格式行为、合并语义时,更新对应主题页
(
providers.md、formats.md、input-and-merge.md); - 修改 Widget 协议或
ctx字段时,同步更新PROVIDER_STANDARD.md、ARCHITECTURE.md与docs/web-ui.md; - 架构或设计决策变化时更新根目录
ARCHITECTURE.md,并同步docs/architecture.md的摘要; docs/cli.md的命令/参数应与devconfig-gen <command> --help保持一致, 可直接用该命令核对。