Skip to content

Commit

Permalink
Use stdin for formatter when --stdin-filename is provided (#6926)
Browse files Browse the repository at this point in the history
## Summary

Just making the formatter CLI more consistent with the linter -- e.g.,
we now use stdin on invocations like `cat foo.py | cargo run -p ruff_cli
-- format -- --stdin-filename=foo.py`, instead of _only_ relying on the
`-` file (and use the same helper as the linter to facilitate this).
  • Loading branch information
charliermarsh authored Aug 27, 2023
1 parent cd47368 commit 6bc1ba6
Showing 1 changed file with 23 additions and 22 deletions.
45 changes: 23 additions & 22 deletions crates/ruff_cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ quoting the executed command, along with the relevant file contents and `pyproje
Command::Linter { format } => commands::linter::linter(format)?,
Command::Clean => commands::clean::clean(log_level)?,
Command::GenerateShellCompletion { shell } => {
shell.generate(&mut Args::command(), &mut io::stdout());
shell.generate(&mut Args::command(), &mut stdout());
}
Command::Check(args) => return check(args, log_level),
Command::Format { files } => return format(&files),
Expand All @@ -161,27 +161,28 @@ fn format(paths: &[PathBuf]) -> Result<ExitStatus> {
experimentation."
);

match &paths {
// Check if we should read from stdin
[path] if path == Path::new("-") => {
let unformatted = read_from_stdin()?;
let options = PyFormatOptions::from_extension(Path::new("stdin.py"));
let formatted = format_module(&unformatted, options)?;
stdout().lock().write_all(formatted.as_code().as_bytes())?;
Ok(ExitStatus::Success)
}
_ => {
// We want to use the same as `ruff check <files>`, but we don't actually want to allow
// any of the linter settings.
// TODO(@konstin): Refactor this to allow getting config and resolver without going
// though clap.
let args_matches = CheckArgs::command()
.no_binary_name(true)
.get_matches_from(paths);
let check_args: CheckArgs = CheckArgs::from_arg_matches(&args_matches)?;
let (cli, overrides) = check_args.partition();
commands::format::format(&cli, &overrides)
}
// We want to use the same as `ruff check <files>`, but we don't actually want to allow
// any of the linter settings.
// TODO(konstin): Refactor this to allow getting config and resolver without going
// though clap.
let args_matches = CheckArgs::command()
.no_binary_name(true)
.get_matches_from(paths);
let check_args: CheckArgs = CheckArgs::from_arg_matches(&args_matches)?;
let (cli, overrides) = check_args.partition();

if is_stdin(&cli.files, cli.stdin_filename.as_deref()) {
let unformatted = read_from_stdin()?;
let options = cli
.stdin_filename
.as_deref()
.map(PyFormatOptions::from_extension)
.unwrap_or_default();
let formatted = format_module(&unformatted, options)?;
stdout().lock().write_all(formatted.as_code().as_bytes())?;
Ok(ExitStatus::Success)
} else {
commands::format::format(&cli, &overrides)
}
}

Expand Down

0 comments on commit 6bc1ba6

Please sign in to comment.