Release v0.6.0
代码质量与测试改进
本次发布专注于显著提升代码质量、测试覆盖率和开发者体验。我们完成了 TODO 列表中的所有 P0(高优先级)和 P1(中优先级)改进。
测试覆盖率提升 11.7%
总测试数:248 → 277(新增 29 个测试)
所有核心模块现在都具有全面的测试覆盖:
- ✅ Provider 验证:9 个测试
- ✅ Git 仓库操作:14 个测试
- ✅ Review 命令:6 个测试
Provider 真实 API 健康检查
gcop config validate 命令已显著增强,现在会执行真实的 API 连接检查,而不仅仅是检查 API key 是否非空。
v0.6.0 之前:
$ gcop config validate
✓ Configuration loaded
✓ Provider 'claude' configured
# 只检查 API key 是否存在,不测试实际连接v0.6.0 之后:
$ gcop config validate
[1/2] Validating configuration...
[2/2] Testing provider connection...
✓ Provider 'claude' validated successfully
# 实际发送测试请求验证 API 是否可用!新功能:
Claude/OpenAI Provider:发送最小化测试请求(
max_tokens=1)验证 API 连接- 检测无效 API key(401 错误)
- 检测速率限制(429 错误)
- 成本极低:每次验证仅消耗 1 token
Ollama Provider:检查
/api/tags健康端点- 验证 Ollama 服务器是否运行
- 检查配置的模型是否已下载
- 提供有用建议:如果模型未找到,提示
ollama pull <model>
FallbackProvider:验证所有配置的 provider
- 显示 fallback 链中每个 provider 的状态
- 汇总结果,如果所有 provider 都失败则警告
更好的错误消息:增强的错误输出,提供可操作的建议
bash✗ Validation failed: Claude API validation failed: Invalid API key 💡 Suggestion: Check your ANTHROPIC_API_KEY environment variable or api_key in config file (~/.config/gcop/config.toml)
影响:
- 在运行
gcop commit之前捕获配置问题 - 节省调试 API 连接问题的时间
- 为新用户提供更好的入门体验
Git Repository 测试覆盖
为 Git 仓库操作添加了全面的测试套件(tests/git_repository_test.rs,14 个测试):
覆盖的边界情况:
- ✅ 空仓库(尚未有 commit)
- ✅ 大文件大小限制(默认 10MB,自定义限制)
- ✅ 包含空格和 Unicode 字符的路径
- ✅ 仓库中的第一个 commit(无父节点)
- ✅ 无效的 commit hash 和 range 格式
- ✅ Detached HEAD 状态
- ✅ 并发测试安全(使用
serial_testcrate)
测试示例:
#[test]
fn test_get_file_content_exceeds_max_size() {
// 创建 11MB 文件(超过默认 10MB 限制)
// 预期:返回 InvalidInput 错误,消息为 "File too large"
}这些测试确保在处理异常仓库状态时的健壮性,并防止回归。
Review 命令测试
为 gcop review 命令添加了集成测试(tests/review_command_test.rs,6 个测试):
覆盖范围:
- ✅ 所有 4 种 target 类型:
--changes、--commit <hash>、--range <range>、--file <path> - ✅ 错误处理:空 diff、LLM 失败
- ✅ 正确路由到 Git 操作
架构改进:
重构 review.rs 以支持依赖注入:
// 公共 API(未改变)
pub async fn run(cli: &Cli, config: &AppConfig, ...) -> Result<()>
// 内部实现(可使用 mock 测试)
pub async fn run_internal(
config: &AppConfig,
git: &dyn GitOperations, // ← 可注入用于测试
llm: &dyn LLMProvider, // ← 可注入用于测试
) -> Result<()>此模式在保持向后兼容的同时,支持使用 mock 对象进行彻底测试。
固定 MSRV(最小支持 Rust 版本)
Rust 1.92.0 或更高版本现在是正式要求(Rust 2024 edition)。
新增内容:
rust-toolchain.toml:确保所有环境使用一致的 Rust 版本toml[toolchain] channel = "stable" components = ["rustfmt", "clippy"]Cargo.toml:为 crates.io 和 cargo 声明 MSRVtomlrust-version = "1.92.0"CI/CD:在 GitHub Actions 中添加 MSRV 检查任务
- 确保代码可使用最低 Rust 版本编译
- 防止意外使用更新的 Rust 特性
文档:更新所有安装指南(中英文)
- README.md
- README_ZH.md
- docs/guide/installation.md
- docs/zh/guide/installation.md
为什么重要:
- 为贡献者设定清晰的期望
- 防止"在我机器上可以运行"的问题
- 保持与 Rust 2024 edition 要求的兼容性
技术细节
Provider 验证实现
每个 provider 实现 LLMProvider trait 的 validate() 方法:
async fn validate(&self) -> Result<()> {
// Claude/OpenAI: 发送测试请求
let test_request = Request {
model: self.model.clone(),
max_tokens: 1, // 成本最小
...
};
let response = self.client.post(&self.endpoint)
.json(&test_request)
.send()
.await?;
if !response.status().is_success() {
return Err(GcopError::LlmApi { ... });
}
Ok(())
}对于 Ollama,我们使用 /api/tags 端点:
async fn validate(&self) -> Result<()> {
let tags_response = self.client
.get(&health_endpoint)
.send()
.await?;
// 检查配置的模型是否存在
if !models.iter().any(|m| m.name.starts_with(&self.model)) {
return Err(GcopError::Config(
"Model not found. Run 'ollama pull <model>' first."
));
}
Ok(())
}测试基础设施
新增测试使用:
mockito:用于 provider 测试的 HTTP mockmockall:用于 Git/LLM 操作的 trait mocktempfile:用于 Git 仓库测试的临时目录serial_test:为修改全局状态的测试提供串行执行tokio::test:异步测试支持
升级说明
从 v0.5.1 升级无需任何操作。此版本完全向后兼容。
保持不变的部分:
- 所有公共 API 保持不变
- 配置文件格式不变
- 命令行界面不变
改进的部分:
gcop config validate现在执行真实 API 检查- 更好的错误消息和建议
- 通过全面的测试覆盖提高健壮性
破坏性变更
无。这是一个次要版本更新(0.5.1 → 0.6.0),包含新功能和改进,但没有破坏性变更。
安装
# Homebrew (macOS/Linux)
brew tap AptS-1547/gcop-rs
brew upgrade gcop-rs
# pipx (Python 用户,推荐)
pipx upgrade gcop-rs
# cargo-binstall (无需编译)
cargo binstall gcop-rs
# cargo install (从源码编译)
cargo install gcop-rs --force或从 Releases 下载预编译二进制。
下一步
剩余的低优先级改进(P2):
- UI 模块可测试性改进
- 使用
syntect的 diff 语法高亮
详见 TODO.md。
统计数据
- 修改文件数:22
- 新增行数:+1,726
- 删除行数:-64
- 新增测试文件:3
- 新增测试:29
- 测试覆盖率增长:248 → 277(+11.7%)
贡献者
- AptS-1547(卞雨涵 / Yuhan Bian)
- AptS-1548(48)
反馈
如有问题或建议,欢迎提交 Issue。
完整变更日志:v0.5.1...v0.6.0