Skip to content

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 之前:

bash
$ gcop config validate
 Configuration loaded
 Provider 'claude' configured
# 只检查 API key 是否存在,不测试实际连接

v0.6.0 之后:

bash
$ gcop config validate
[1/2] Validating configuration...
[2/2] Testing provider connection...
 Provider 'claude' validated successfully
# 实际发送测试请求验证 API 是否可用!

新功能:

  1. Claude/OpenAI Provider:发送最小化测试请求(max_tokens=1)验证 API 连接

    • 检测无效 API key(401 错误)
    • 检测速率限制(429 错误)
    • 成本极低:每次验证仅消耗 1 token
  2. Ollama Provider:检查 /api/tags 健康端点

    • 验证 Ollama 服务器是否运行
    • 检查配置的模型是否已下载
    • 提供有用建议:如果模型未找到,提示 ollama pull <model>
  3. FallbackProvider:验证所有配置的 provider

    • 显示 fallback 链中每个 provider 的状态
    • 汇总结果,如果所有 provider 都失败则警告
  4. 更好的错误消息:增强的错误输出,提供可操作的建议

    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_test crate)

测试示例:

rust
#[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 以支持依赖注入:

rust
// 公共 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)。

新增内容:

  1. rust-toolchain.toml:确保所有环境使用一致的 Rust 版本

    toml
    [toolchain]
    channel = "stable"
    components = ["rustfmt", "clippy"]
  2. Cargo.toml:为 crates.io 和 cargo 声明 MSRV

    toml
    rust-version = "1.92.0"
  3. CI/CD:在 GitHub Actions 中添加 MSRV 检查任务

    • 确保代码可使用最低 Rust 版本编译
    • 防止意外使用更新的 Rust 特性
  4. 文档:更新所有安装指南(中英文)

    • README.md
    • README_ZH.md
    • docs/guide/installation.md
    • docs/zh/guide/installation.md

为什么重要:

  • 为贡献者设定清晰的期望
  • 防止"在我机器上可以运行"的问题
  • 保持与 Rust 2024 edition 要求的兼容性

技术细节

Provider 验证实现

每个 provider 实现 LLMProvider trait 的 validate() 方法:

rust
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 端点:

rust
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 mock
  • mockall:用于 Git/LLM 操作的 trait mock
  • tempfile:用于 Git 仓库测试的临时目录
  • serial_test:为修改全局状态的测试提供串行执行
  • tokio::test:异步测试支持

升级说明

从 v0.5.1 升级无需任何操作。此版本完全向后兼容

保持不变的部分:

  • 所有公共 API 保持不变
  • 配置文件格式不变
  • 命令行界面不变

改进的部分:

  • gcop config validate 现在执行真实 API 检查
  • 更好的错误消息和建议
  • 通过全面的测试覆盖提高健壮性

破坏性变更

无。这是一个次要版本更新(0.5.1 → 0.6.0),包含新功能和改进,但没有破坏性变更。

安装

bash
# 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