跳转至

Tasks: Ruff Integration for Python Linting & Formatting

Feature Overview

Replace flake8 (linter) and black (formatter) with ruff for Python file processing in linthis, providing 10-100x speed improvements.

Status: COMPLETED

All tasks have been implemented.

User Stories

ID Priority Story Status
US1 P1 As a developer, I want Python linting to use ruff instead of flake8 so that lint checks are faster Done
US2 P1 As a developer, I want Python formatting to use ruff instead of black so that formatting is faster Done
US3 P2 As a developer, I want ruff configuration generated by --init-configs so that I can customize rules Done
US4 P3 As a developer, I want to benchmark ruff vs flake8+black so that I can see the speed improvement Done

Phase 1: Setup

  • [x] T001 Verify ruff is installed and accessible via ruff --version
  • [x] T002 Review existing Python checker implementation in src/checkers/python.rs
  • [x] T003 Review existing Python formatter implementation in src/formatters/python.rs

Phase 2: Foundational - Data Types for Ruff JSON Parsing

  • [x] T004 [P] Add RuffIssue struct for JSON deserialization in src/checkers/python.rs
  • [x] T005 [P] Add RuffLocation struct for JSON deserialization in src/checkers/python.rs
  • [x] T006 [P] Add RuffFix and RuffEdit structs for JSON deserialization in src/checkers/python.rs

Phase 3: User Story 1 - Python Linting with Ruff

Goal: Replace flake8 with ruff check for Python linting

Test Criteria: cargo test passes, linthis correctly detects Python lint issues using ruff

Tasks

  • [x] T007 [US1] Update name() method to return "ruff" in src/checkers/python.rs
  • [x] T008 [US1] Update is_available() to check for ruff binary in src/checkers/python.rs
  • [x] T009 [US1] Implement parse_ruff_json_output() method to parse ruff JSON output in src/checkers/python.rs
  • [x] T010 [US1] Implement severity mapping from ruff codes (E/F->Error, W/N/B/S/A->Warning, others->Info) in src/checkers/python.rs
  • [x] T011 [US1] Update check() method to run ruff check --output-format json in src/checkers/python.rs
  • [x] T012 [US1] Remove old parse_flake8_output() and parse_flake8_line() methods in src/checkers/python.rs
  • [x] T013 [US1] Update module docstring from "pylint/flake8" to "ruff" in src/checkers/python.rs
  • [x] T014 [US1] Manual test: run cargo run -- --check-only --lang python on Python files with issues

Phase 4: User Story 2 - Python Formatting with Ruff

Goal: Replace black with ruff format for Python formatting

Test Criteria: cargo test passes, linthis correctly formats Python files using ruff

Tasks

  • [x] T015 [US2] Update name() method to return "ruff" in src/formatters/python.rs
  • [x] T016 [US2] Update is_available() to check for ruff binary in src/formatters/python.rs
  • [x] T017 [US2] Update format() method to run ruff format in src/formatters/python.rs
  • [x] T018 [US2] Update check() method to run ruff format --check in src/formatters/python.rs
  • [x] T019 [US2] Remove hard-coded --line-length 120 argument (use ruff config instead) in src/formatters/python.rs
  • [x] T020 [US2] Update module docstring from "black" to "ruff" in src/formatters/python.rs
  • [x] T021 [US2] Manual test: run cargo run -- --format-only --lang python on unformatted Python files

Phase 5: User Story 3 - Configuration Updates

Goal: Update default config and --init-configs for ruff

Test Criteria: linthis --init-configs generates valid ruff configuration

Tasks

  • [x] T022 [US3] Add [python] section with ruff settings in defaults/config.toml
  • [x] T023 [US3] Update generate_tool_configs() to create ruff.toml instead of .flake8 in src/main.rs
  • [x] T024 [US3] Update generate_tool_configs() to update pyproject.toml [tool.ruff] section in src/main.rs
  • [x] T025 [US3] Remove .flake8 generation from generate_tool_configs() in src/main.rs
  • [x] T026 [US3] Manual test: run cargo run -- --init-configs and verify ruff.toml is created

Phase 6: User Story 4 - Benchmark Mode

Goal: Add --benchmark flag to compare ruff vs flake8+black performance

Test Criteria: linthis --benchmark --lang python outputs comparison table

Tasks

  • [x] T027 [US4] Add --benchmark CLI flag in src/main.rs
  • [x] T028 [US4] Create src/benchmark.rs module for benchmark logic
  • [x] T029 [US4] Implement run_flake8_benchmark() to time flake8 execution in src/benchmark.rs
  • [x] T030 [US4] Implement run_black_benchmark() to time black execution in src/benchmark.rs
  • [x] T031 [US4] Implement run_ruff_check_benchmark() to time ruff check execution in src/benchmark.rs
  • [x] T032 [US4] Implement run_ruff_format_benchmark() to time ruff format execution in src/benchmark.rs
  • [x] T033 [US4] Implement format_benchmark_table() to output ASCII table comparison in src/benchmark.rs
  • [x] T034 [US4] Add benchmark module to src/lib.rs
  • [x] T035 [US4] Wire --benchmark flag to benchmark execution in src/main.rs
  • [x] T036 [US4] Manual test: run cargo run -- --benchmark --lang python on a Python project

Phase 7: Polish & Documentation

  • [x] T037 Update README.md to document ruff as the Python linter/formatter
  • [x] T038 Add migration notes for users switching from flake8+black to ruff in README.md
  • [x] T039 Run cargo clippy and fix any warnings
  • [x] T040 Run cargo test to verify all tests pass
  • [x] T041 Final manual test: run full linthis workflow on a Python project

Summary

Metric Count Status
Total Tasks 41 Completed
Phase 1 (Setup) 3 Completed
Phase 2 (Foundational) 3 Completed
Phase 3 (US1 - Linting) 8 Completed
Phase 4 (US2 - Formatting) 7 Completed
Phase 5 (US3 - Config) 5 Completed
Phase 6 (US4 - Benchmark) 10 Completed
Phase 7 (Polish) 5 Completed

Files Modified

  1. src/checkers/python.rs - Replaced flake8 with ruff check
  2. src/formatters/python.rs - Replaced black with ruff format
  3. src/benchmark.rs - New module for benchmark comparison
  4. src/lib.rs - Added benchmark module
  5. src/main.rs - Added --benchmark flag and ruff config generation
  6. defaults/config.toml - Added Python/ruff configuration
  7. README.md - Updated documentation
  8. src/utils/walker.rs - Fixed clippy warning