From 0096938789a909f158094d62fa6479c05d048d39 Mon Sep 17 00:00:00 2001 From: konstin Date: Wed, 10 May 2023 17:45:57 +0200 Subject: [PATCH] Optionally show fixes when using `--features ecosystem_ci` with cargo and `--show-fixes` at runtime (#4191) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Generate fixes when using --show-fixes Example command: `cargo run --bin ruff -- --no-cache --select F401 --show-source --show-fixes crates/ruff/resources/test/fixtures/pyflakes/F401_9.py` Before, `--show-fixes` was ignored: ``` crates/ruff/resources/test/fixtures/pyflakes/F401_9.py:4:22: F401 [*] `foo.baz` imported but unused | 4 | __all__ = ("bar",) 5 | from foo import bar, baz | ^^^ F401 | = help: Remove unused import: `foo.baz` Found 1 error. [*] 1 potentially fixable with the --fix option. ``` After: ``` crates/ruff/resources/test/fixtures/pyflakes/F401_9.py:4:22: F401 [*] `foo.baz` imported but unused | 4 | __all__ = ("bar",) 5 | from foo import bar, baz | ^^^ F401 | = help: Remove unused import: `foo.baz` ℹ Suggested fix 1 1 | """Test: late-binding of `__all__`.""" 2 2 | 3 3 | __all__ = ("bar",) 4 |-from foo import bar, baz 4 |+from foo import bar Found 1 error. [*] 1 potentially fixable with the --fix option. ``` * Add `--format ecosystem-ci` * cargo dev generate-all * Put behind cargo feature * Regenerate docs * Don't test ecosystem_ci feature on CI * Use top level flag instead * Fix * Simplify code based on #4191 * Remove old TODO comment --- .gitignore | 1 + crates/ruff/Cargo.toml | 1 + crates/ruff_cli/Cargo.toml | 1 + crates/ruff_cli/src/args.rs | 4 ++++ crates/ruff_cli/src/commands/run.rs | 2 ++ crates/ruff_cli/src/lib.rs | 11 ++++++++++- crates/ruff_cli/src/printer.rs | 12 ++++++++++++ scripts/Dockerfile.ecosystem | 10 +++++----- 8 files changed, 36 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index ef50cdef6f..e8c2d72509 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ crates/ruff/resources/test/cpython mkdocs.yml .overrides github_search.jsonl +ruff-old ### # Rust.gitignore diff --git a/crates/ruff/Cargo.toml b/crates/ruff/Cargo.toml index 1fdd481adc..949c9b1c11 100644 --- a/crates/ruff/Cargo.toml +++ b/crates/ruff/Cargo.toml @@ -83,3 +83,4 @@ default = [] schemars = ["dep:schemars"] logical_lines = [] jupyter_notebook = [] +ecosystem_ci = [] diff --git a/crates/ruff_cli/Cargo.toml b/crates/ruff_cli/Cargo.toml index 509d9eddd1..2a59febb46 100644 --- a/crates/ruff_cli/Cargo.toml +++ b/crates/ruff_cli/Cargo.toml @@ -66,6 +66,7 @@ ureq = { version = "2.6.2", features = [] } [features] jupyter_notebook = ["ruff/jupyter_notebook"] +ecosystem_ci = ["ruff/ecosystem_ci"] [package.metadata.maturin] name = "ruff" diff --git a/crates/ruff_cli/src/args.rs b/crates/ruff_cli/src/args.rs index 1cd9ae59cf..6b037e6217 100644 --- a/crates/ruff_cli/src/args.rs +++ b/crates/ruff_cli/src/args.rs @@ -291,6 +291,10 @@ pub struct CheckArgs { conflicts_with = "watch", )] pub show_settings: bool, + /// Dev-only argument to show fixes + #[cfg(feature = "ecosystem_ci")] + #[arg(long, hide = true)] + pub ecosystem_ci: bool, } #[derive(Debug, Clone, Copy, clap::ValueEnum)] diff --git a/crates/ruff_cli/src/commands/run.rs b/crates/ruff_cli/src/commands/run.rs index 6eea564bc1..85d329577f 100644 --- a/crates/ruff_cli/src/commands/run.rs +++ b/crates/ruff_cli/src/commands/run.rs @@ -254,6 +254,8 @@ mod test { LogLevel::Default, FixMode::None, Flags::SHOW_VIOLATIONS, + #[cfg(feature = "ecosystem_ci")] + false, ); let mut writer: Vec = Vec::new(); // Mute the terminal color codes diff --git a/crates/ruff_cli/src/lib.rs b/crates/ruff_cli/src/lib.rs index 6f7bd6f058..752f6efa25 100644 --- a/crates/ruff_cli/src/lib.rs +++ b/crates/ruff_cli/src/lib.rs @@ -123,6 +123,8 @@ quoting the executed command, along with the relevant file contents and `pyproje } fn check(args: CheckArgs, log_level: LogLevel) -> Result { + #[cfg(feature = "ecosystem_ci")] + let ecosystem_ci = args.ecosystem_ci; let (cli, overrides) = args.partition(); // Construct the "default" settings. These are used when no `pyproject.toml` @@ -209,7 +211,14 @@ fn check(args: CheckArgs, log_level: LogLevel) -> Result { return Ok(ExitStatus::Success); } - let printer = Printer::new(format, log_level, autofix, printer_flags); + let printer = Printer::new( + format, + log_level, + autofix, + printer_flags, + #[cfg(feature = "ecosystem_ci")] + ecosystem_ci, + ); if cli.watch { if format != SerializationFormat::Text { diff --git a/crates/ruff_cli/src/printer.rs b/crates/ruff_cli/src/printer.rs index 6e0b08bbe0..aeeae31024 100644 --- a/crates/ruff_cli/src/printer.rs +++ b/crates/ruff_cli/src/printer.rs @@ -70,6 +70,9 @@ pub(crate) struct Printer { log_level: LogLevel, autofix_level: flags::FixMode, flags: Flags, + /// Dev-only argument to show fixes + #[cfg(feature = "ecosystem_ci")] + ecosystem_ci: bool, } impl Printer { @@ -78,12 +81,15 @@ impl Printer { log_level: LogLevel, autofix_level: flags::FixMode, flags: Flags, + #[cfg(feature = "ecosystem_ci")] ecosystem_ci: bool, ) -> Self { Self { format, log_level, autofix_level, flags, + #[cfg(feature = "ecosystem_ci")] + ecosystem_ci, } } @@ -179,8 +185,14 @@ impl Printer { JunitEmitter::default().emit(writer, &diagnostics.messages, &context)?; } SerializationFormat::Text => { + #[cfg(feature = "ecosystem_ci")] + let show_fixes = self.ecosystem_ci && self.flags.contains(Flags::SHOW_FIXES); + #[cfg(not(feature = "ecosystem_ci"))] + let show_fixes = false; + TextEmitter::default() .with_show_fix_status(show_fix_status(self.autofix_level)) + .with_show_fix(show_fixes) .with_show_source(self.flags.contains(Flags::SHOW_SOURCE)) .emit(writer, &diagnostics.messages, &context)?; diff --git a/scripts/Dockerfile.ecosystem b/scripts/Dockerfile.ecosystem index 89198d79d8..a4a593b41e 100644 --- a/scripts/Dockerfile.ecosystem +++ b/scripts/Dockerfile.ecosystem @@ -13,15 +13,15 @@ # ``` # From the project root: # ``` -# cargo build --target x86_64-unknown-linux-musl +# cargo build --target x86_64-unknown-linux-musl --features ecosystem_ci # docker buildx build -f scripts/Dockerfile.ecosystem -t ruff-ecosystem-checker --load . -# docker run --rm ruff-ecosystem-checker +# docker run --rm -v ./target/x86_64-unknown-linux-musl/debug/ruff:/app/ruff-new -v ./ruff-old:/app/ruff-old ruff-ecosystem-checker # ``` FROM python:3.11 -RUN python -m venv .venv && .venv/bin/pip install ruff +RUN mkdir /app +WORKDIR /app ADD scripts/check_ecosystem.py check_ecosystem.py ADD github_search.jsonl github_search.jsonl -ADD target/x86_64-unknown-linux-musl/debug/ruff ruff-new -CMD ["python", "check_ecosystem.py", "--verbose", "--projects", "github_search.jsonl", "ruff-new", ".venv/bin/ruff"] +CMD ["python", "check_ecosystem.py", "--verbose", "--projects", "github_search.jsonl", "ruff-new", "ruff-old"]