Skip to content

🐛 fix(codegen): 规范无前缀模板输出路径 - #166

Merged
ZhaoXingPeng merged 2 commits into
fix/163-mcp-json-boundaryfrom
fix/165-codegen-path-normalization
Sep 9, 2026
Merged

ZhaoXingPeng merged 2 commits into
fix/163-mcp-json-boundaryfrom
fix/165-codegen-path-normalization

Conversation

@ZhaoXingPeng

Copy link
Copy Markdown
Owner

关联 Issue

Closes #165

背景(Situation)

TemplateConfigManager.get_output_path_mapping() 使用 entity/{packageSuffix}/{className}.java 等模板。旧的 JavaCodeGenerator._get_output_path()packageSuffix 为空时直接格式化,得到 entity//Account.javadao//AccountDao.java 等双分隔符路径。Windows 当前能容忍该路径,但它会污染返回文件路径、日志和下游脚本;跨平台路径比较也可能出现不一致。

任务(Task)

在不改变模板内容、包声明、文件名、输出目录边界或原子 MCP 路径合同的前提下,规范旧 Java 生成器的相对输出路径:空后缀不产生空目录段,有前缀时保留独立包目录。

行动(Action)

  • 提交:60b1f2a
  • JavaCodeGenerator._get_output_path() 的占位符格式化后调用标准库 os.path.normpath,把归一化限定在静态模板相对路径边界。
  • 新增无前缀、有 sys_* 前缀和实际写盘返回路径回归测试。
  • 机械格式化本次触碰的历史未格式化 Python 文件,以满足 changed-file format gate;没有改变运行逻辑。
  • 不重构原子 codegen 的 _resolve_codegen_output_path,避免扩大公共 MCP 行为;不新增 ADR,这是局部路径实现修复。

验证(Verification)

环境:Windows,仓库 .venv,Python 3.12.12,pytest 9.1.1,Ruff 来自 .venv

python -m pytest tests/unit/ -q
688 passed in 11.81s

ruff check src/ tests/ scripts/
All checks passed!

ruff format --check(本次修改的 Java generator 与测试文件)
2 files already formatted

git diff --check
无输出

实验与证据(Evidence)

  • 固定 Account 表输入、packageSuffix="":归一化前可复现 out\\entity//Account.java,当前返回相对路径 entity/Account.java
  • 固定 sys_accountsys_role 表输入:前缀分析得到 system,当前返回 entity/system/SysAccount.java,没有丢失包层级。
  • generate_from_table(..., include_dto_vo=False) 实际写盘后,返回路径相对输出目录为 entity/Account.java,文件存在且仍包含 class Accountprivate Long id
  • 没有运行真实 MySQL/PostgreSQL 或性能实验;这是纯路径格式修复,不宣称吞吐收益。

兼容性、风险与回滚

  • 兼容性:模板类别、模板内容、包声明、文件名和输出目录参数保持不变;仅移除由空占位符产生的重复分隔符。
  • 风险:os.path.normpath 遵循宿主平台路径规则;模板映射是仓库内静态相对路径,不接受用户提供的任意路径片段。
  • 回滚:恢复单一提交 60b1f2a 即可;不涉及数据库、配置迁移或生成物。
  • 依赖:本 PR base 为 fix/163-mcp-json-boundary,待前置 PR 🐛 fix(mcp): 统一跨工具驱动值 JSON 序列化 #162🐛 fix(mcp): 收口全部 MCP 响应 JSON 序列化 #164 按顺序合并后再以 main 为最终基线检查。

后续(Next)

合并前只对最终 HEAD 检查一次 required checks;若未来新增模板映射,继续通过路径回归测试验证空段、前缀和跨平台行为。

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

实现完成(2026-09-09)

当前结论

Issue #165 已实现并推送。旧 JavaCodeGenerator 的空 packageSuffix 路径现在在格式化后经 os.path.normpath 归一化,entity//Account.java 不再暴露给调用方;有前缀时包目录保持不变。

变更与设计取舍

  • 提交:60b1f2a
  • 归一化位于输出路径边界,模板映射和模板内容不变;使用标准库路径语义,避免手写替换误伤合法段。
  • 新增无前缀、sys_* 前缀和实际写盘路径测试。
  • 本 PR 以 fix/163-mcp-json-boundary 为 base,仅包含本主题一个新增提交,依赖前置序列化 PR 的合并顺序。

验证与证据

  • python -m pytest tests/unit/test_java_generator.py tests/unit/test_template_context_builder.py -q78 passed
  • python -m pytest tests/unit/ -q688 passed in 11.81s
  • ruff check src/ tests/ scripts/All checks passed!
  • ruff format --check(2 个变更 Python 文件):2 files already formatted
  • git diff --check:无输出。

兼容性与下一步

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

验证完成(2026-09-09)

当前结论

路径回归和完整单元测试均已完成。测试证明空后缀和前缀后缀两种输出路径都稳定,实际文件写盘结果与返回值一致;没有观察到模板内容或既有类别注册回归。

变更与设计取舍

  • 提交:60b1f2a
  • 输入一:Account 表、空 packageSuffix,归一化后的相对路径为 entity/Account.java
  • 输入二:sys_accountsys_role 表,前缀分组为 system,相对路径为 entity/system/SysAccount.java
  • 输出路径使用 Path(...).relative_to(output_dir) 断言,避免把 Windows 分隔符差异误判为功能差异。

验证与证据

  • python -m pytest tests/unit/ -q688 passed in 11.81s
  • 新增断言覆盖 _get_output_path 以及 generate_from_table 实际写盘文件存在性。
  • ruff check src/ tests/ scripts/All checks passed!
  • ruff format --check(本次变更文件):2 files already formatted
  • git diff --check:无输出。
  • 未运行真实数据库、Java/Maven 或性能实验;本次只修复本地路径字符串。

兼容性与下一步

  • 公共生成器方法签名、模板类别和输出文件名保持不变;回滚提交为 60b1f2a
  • CI 尚未查询,准备 squash merge 时再检查一次最终 HEAD 的 required checks。
  • 后续新模板路径应继续补充空段和前缀回归,避免重新引入双分隔符。

* 🐛 fix(codegen): 统一分析结果与模板导入映射

* 🐛 fix(mcp): 补齐 PostgreSQL 时间类型别名映射 (#170)

* 🐛 fix(mcp): 补齐 PostgreSQL 时间类型别名映射

* 🐛 fix(codegen): 补齐自增主键模板上下文标记 (#172)

* 🐛 fix(codegen): 补齐自增主键模板上下文标记

* 🐛 fix(generator): 修正遗留实体上下文自增标志 (#174)

* 🐛 fix(generator): 修正遗留实体上下文自增标志

* 🐛 fix(generator): 保留 Java 属性名内部大小写 (#176)

* 🐛 fix(generator): 保留 Java 属性名内部大小写

* 🐛 fix(template): 仅为自增主键启用 generated keys (#178)

* 🐛 fix(template): 仅为自增主键启用 generated keys

* 🐛 fix(codegen): 统一主键列表与列上下文 (#180)

* 🐛 fix(codegen): 统一主键列表与列上下文

* 🐛 fix(mcp): 统一描述与代码生成类型映射 (#182)

* 🐛 fix(mcp): 统一描述与代码生成类型映射

* 🐛 fix(codegen): 统一旧入口方言表名发现 (#184)

* 🐛 fix(codegen): 统一旧入口方言表名发现

* ♻️ refactor(codegen): 复用统一表名元数据合同 (#186)

* ♻️ refactor(codegen): 复用统一表名元数据合同

* 🐛 fix(codegen): 补齐批量分析表名上下文 (#188)

* 🐛 fix(codegen): 补齐批量分析表名上下文

* 🐛 fix(database): 持久化 SQLite execute_query 写入 (#190)

* 🐛 fix(database): 持久化 SQLite execute_query 写入

* 🐛 fix(governance): 对齐工具注册表数据库能力 (#192)

* 🐛 fix(governance): 对齐工具注册表数据库能力

* 🔒 security(mcp-apps): 收紧代码 diff 路径边界 (#194)

* 🔒 security(mcp-apps): 收紧代码 diff 路径边界

* 🐛 fix(codegen): 对齐生成文件写入统计与结果状态 (#196)

* 🐛 fix(codegen): 对齐生成文件写入统计与结果状态

* ✨ feat(codegen): 统一 DTO 与 VO 生成选项合同 (#198)

* ✨ feat(codegen): 统一 DTO 与 VO 生成选项合同

* 📚 docs(governance): 固化 GitHub 元数据正文门禁 (#200)

* 📚 docs(governance): 固化 GitHub 元数据正文门禁

* 🐛 fix(database): 回滚失败 SQLite 查询事务 (#202)

* 🐛 fix(database): 回滚失败 SQLite 查询事务

* 🐛 fix(schema): 规范图算法重复表输入 (#204)

* 🐛 fix(schema): 规范图算法重复表输入

* 🐛 fix(dependencies): 隔离版本分析状态 (#206)

* 🐛 fix(dependencies): 隔离版本分析状态

* 🐛 fix(cli): 统一解析 MCP 响应 (#208)

* 🐛 fix(cli): 统一解析 MCP 响应

* ✨ feat(connection): 增加 MCP 连接释放工具 (#210)

* ✨ feat(connection): 增加 MCP 连接释放工具

* ⚡ perf(mcp): 隔离同步数据库调用与事件循环 (#212)
@ZhaoXingPeng
ZhaoXingPeng merged commit f233b4a into fix/163-mcp-json-boundary Sep 9, 2026
ZhaoXingPeng added a commit that referenced this pull request Sep 9, 2026
* 🐛 fix(codegen): 规范无前缀模板输出路径

* 🐛 fix(codegen): 统一分析结果与模板导入映射 (#168)

* 🐛 fix(codegen): 统一分析结果与模板导入映射

* 🐛 fix(mcp): 补齐 PostgreSQL 时间类型别名映射 (#170)

* 🐛 fix(mcp): 补齐 PostgreSQL 时间类型别名映射

* 🐛 fix(codegen): 补齐自增主键模板上下文标记 (#172)

* 🐛 fix(codegen): 补齐自增主键模板上下文标记

* 🐛 fix(generator): 修正遗留实体上下文自增标志 (#174)

* 🐛 fix(generator): 修正遗留实体上下文自增标志

* 🐛 fix(generator): 保留 Java 属性名内部大小写 (#176)

* 🐛 fix(generator): 保留 Java 属性名内部大小写

* 🐛 fix(template): 仅为自增主键启用 generated keys (#178)

* 🐛 fix(template): 仅为自增主键启用 generated keys

* 🐛 fix(codegen): 统一主键列表与列上下文 (#180)

* 🐛 fix(codegen): 统一主键列表与列上下文

* 🐛 fix(mcp): 统一描述与代码生成类型映射 (#182)

* 🐛 fix(mcp): 统一描述与代码生成类型映射

* 🐛 fix(codegen): 统一旧入口方言表名发现 (#184)

* 🐛 fix(codegen): 统一旧入口方言表名发现

* ♻️ refactor(codegen): 复用统一表名元数据合同 (#186)

* ♻️ refactor(codegen): 复用统一表名元数据合同

* 🐛 fix(codegen): 补齐批量分析表名上下文 (#188)

* 🐛 fix(codegen): 补齐批量分析表名上下文

* 🐛 fix(database): 持久化 SQLite execute_query 写入 (#190)

* 🐛 fix(database): 持久化 SQLite execute_query 写入

* 🐛 fix(governance): 对齐工具注册表数据库能力 (#192)

* 🐛 fix(governance): 对齐工具注册表数据库能力

* 🔒 security(mcp-apps): 收紧代码 diff 路径边界 (#194)

* 🔒 security(mcp-apps): 收紧代码 diff 路径边界

* 🐛 fix(codegen): 对齐生成文件写入统计与结果状态 (#196)

* 🐛 fix(codegen): 对齐生成文件写入统计与结果状态

* ✨ feat(codegen): 统一 DTO 与 VO 生成选项合同 (#198)

* ✨ feat(codegen): 统一 DTO 与 VO 生成选项合同

* 📚 docs(governance): 固化 GitHub 元数据正文门禁 (#200)

* 📚 docs(governance): 固化 GitHub 元数据正文门禁

* 🐛 fix(database): 回滚失败 SQLite 查询事务 (#202)

* 🐛 fix(database): 回滚失败 SQLite 查询事务

* 🐛 fix(schema): 规范图算法重复表输入 (#204)

* 🐛 fix(schema): 规范图算法重复表输入

* 🐛 fix(dependencies): 隔离版本分析状态 (#206)

* 🐛 fix(dependencies): 隔离版本分析状态

* 🐛 fix(cli): 统一解析 MCP 响应 (#208)

* 🐛 fix(cli): 统一解析 MCP 响应

* ✨ feat(connection): 增加 MCP 连接释放工具 (#210)

* ✨ feat(connection): 增加 MCP 连接释放工具

* ⚡ perf(mcp): 隔离同步数据库调用与事件循环 (#212)
ZhaoXingPeng added a commit that referenced this pull request Sep 9, 2026
* 🐛 fix(mcp): 收口全部 MCP 响应 JSON 序列化

* 🐛 fix(codegen): 规范无前缀模板输出路径 (#166)

* 🐛 fix(codegen): 规范无前缀模板输出路径

* 🐛 fix(codegen): 统一分析结果与模板导入映射 (#168)

* 🐛 fix(codegen): 统一分析结果与模板导入映射

* 🐛 fix(mcp): 补齐 PostgreSQL 时间类型别名映射 (#170)

* 🐛 fix(mcp): 补齐 PostgreSQL 时间类型别名映射

* 🐛 fix(codegen): 补齐自增主键模板上下文标记 (#172)

* 🐛 fix(codegen): 补齐自增主键模板上下文标记

* 🐛 fix(generator): 修正遗留实体上下文自增标志 (#174)

* 🐛 fix(generator): 修正遗留实体上下文自增标志

* 🐛 fix(generator): 保留 Java 属性名内部大小写 (#176)

* 🐛 fix(generator): 保留 Java 属性名内部大小写

* 🐛 fix(template): 仅为自增主键启用 generated keys (#178)

* 🐛 fix(template): 仅为自增主键启用 generated keys

* 🐛 fix(codegen): 统一主键列表与列上下文 (#180)

* 🐛 fix(codegen): 统一主键列表与列上下文

* 🐛 fix(mcp): 统一描述与代码生成类型映射 (#182)

* 🐛 fix(mcp): 统一描述与代码生成类型映射

* 🐛 fix(codegen): 统一旧入口方言表名发现 (#184)

* 🐛 fix(codegen): 统一旧入口方言表名发现

* ♻️ refactor(codegen): 复用统一表名元数据合同 (#186)

* ♻️ refactor(codegen): 复用统一表名元数据合同

* 🐛 fix(codegen): 补齐批量分析表名上下文 (#188)

* 🐛 fix(codegen): 补齐批量分析表名上下文

* 🐛 fix(database): 持久化 SQLite execute_query 写入 (#190)

* 🐛 fix(database): 持久化 SQLite execute_query 写入

* 🐛 fix(governance): 对齐工具注册表数据库能力 (#192)

* 🐛 fix(governance): 对齐工具注册表数据库能力

* 🔒 security(mcp-apps): 收紧代码 diff 路径边界 (#194)

* 🔒 security(mcp-apps): 收紧代码 diff 路径边界

* 🐛 fix(codegen): 对齐生成文件写入统计与结果状态 (#196)

* 🐛 fix(codegen): 对齐生成文件写入统计与结果状态

* ✨ feat(codegen): 统一 DTO 与 VO 生成选项合同 (#198)

* ✨ feat(codegen): 统一 DTO 与 VO 生成选项合同

* 📚 docs(governance): 固化 GitHub 元数据正文门禁 (#200)

* 📚 docs(governance): 固化 GitHub 元数据正文门禁

* 🐛 fix(database): 回滚失败 SQLite 查询事务 (#202)

* 🐛 fix(database): 回滚失败 SQLite 查询事务

* 🐛 fix(schema): 规范图算法重复表输入 (#204)

* 🐛 fix(schema): 规范图算法重复表输入

* 🐛 fix(dependencies): 隔离版本分析状态 (#206)

* 🐛 fix(dependencies): 隔离版本分析状态

* 🐛 fix(cli): 统一解析 MCP 响应 (#208)

* 🐛 fix(cli): 统一解析 MCP 响应

* ✨ feat(connection): 增加 MCP 连接释放工具 (#210)

* ✨ feat(connection): 增加 MCP 连接释放工具

* ⚡ perf(mcp): 隔离同步数据库调用与事件循环 (#212)
@ZhaoXingPeng
ZhaoXingPeng deleted the fix/165-codegen-path-normalization branch September 9, 2026 02:30
ZhaoXingPeng added a commit that referenced this pull request Sep 9, 2026
* 🐛 fix(mcp): 收口全部 MCP 响应 JSON 序列化

* 🐛 fix(codegen): 规范无前缀模板输出路径 (#166)

* 🐛 fix(codegen): 规范无前缀模板输出路径

* 🐛 fix(codegen): 统一分析结果与模板导入映射 (#168)

* 🐛 fix(codegen): 统一分析结果与模板导入映射

* 🐛 fix(mcp): 补齐 PostgreSQL 时间类型别名映射 (#170)

* 🐛 fix(mcp): 补齐 PostgreSQL 时间类型别名映射

* 🐛 fix(codegen): 补齐自增主键模板上下文标记 (#172)

* 🐛 fix(codegen): 补齐自增主键模板上下文标记

* 🐛 fix(generator): 修正遗留实体上下文自增标志 (#174)

* 🐛 fix(generator): 修正遗留实体上下文自增标志

* 🐛 fix(generator): 保留 Java 属性名内部大小写 (#176)

* 🐛 fix(generator): 保留 Java 属性名内部大小写

* 🐛 fix(template): 仅为自增主键启用 generated keys (#178)

* 🐛 fix(template): 仅为自增主键启用 generated keys

* 🐛 fix(codegen): 统一主键列表与列上下文 (#180)

* 🐛 fix(codegen): 统一主键列表与列上下文

* 🐛 fix(mcp): 统一描述与代码生成类型映射 (#182)

* 🐛 fix(mcp): 统一描述与代码生成类型映射

* 🐛 fix(codegen): 统一旧入口方言表名发现 (#184)

* 🐛 fix(codegen): 统一旧入口方言表名发现

* ♻️ refactor(codegen): 复用统一表名元数据合同 (#186)

* ♻️ refactor(codegen): 复用统一表名元数据合同

* 🐛 fix(codegen): 补齐批量分析表名上下文 (#188)

* 🐛 fix(codegen): 补齐批量分析表名上下文

* 🐛 fix(database): 持久化 SQLite execute_query 写入 (#190)

* 🐛 fix(database): 持久化 SQLite execute_query 写入

* 🐛 fix(governance): 对齐工具注册表数据库能力 (#192)

* 🐛 fix(governance): 对齐工具注册表数据库能力

* 🔒 security(mcp-apps): 收紧代码 diff 路径边界 (#194)

* 🔒 security(mcp-apps): 收紧代码 diff 路径边界

* 🐛 fix(codegen): 对齐生成文件写入统计与结果状态 (#196)

* 🐛 fix(codegen): 对齐生成文件写入统计与结果状态

* ✨ feat(codegen): 统一 DTO 与 VO 生成选项合同 (#198)

* ✨ feat(codegen): 统一 DTO 与 VO 生成选项合同

* 📚 docs(governance): 固化 GitHub 元数据正文门禁 (#200)

* 📚 docs(governance): 固化 GitHub 元数据正文门禁

* 🐛 fix(database): 回滚失败 SQLite 查询事务 (#202)

* 🐛 fix(database): 回滚失败 SQLite 查询事务

* 🐛 fix(schema): 规范图算法重复表输入 (#204)

* 🐛 fix(schema): 规范图算法重复表输入

* 🐛 fix(dependencies): 隔离版本分析状态 (#206)

* 🐛 fix(dependencies): 隔离版本分析状态

* 🐛 fix(cli): 统一解析 MCP 响应 (#208)

* 🐛 fix(cli): 统一解析 MCP 响应

* ✨ feat(connection): 增加 MCP 连接释放工具 (#210)

* ✨ feat(connection): 增加 MCP 连接释放工具

* ⚡ perf(mcp): 隔离同步数据库调用与事件循环 (#212)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant