mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-03 15:15:33 +00:00
Add prototype of ruff format
for projects (#6871)
**Summary** Add recursive formatting based on `ruff check` file discovery for `ruff format`, as a prototype for the formatter alpha. This allows e.g. `format ../projects/django/`. It's still lacking support for any settings except line length. Note just like the existing `ruff format` this will become part of the production build, i.e. you'll be able to use it - hidden by default and with a prominent warning - with `ruff format .` after the next release. Error handling works in my manual tests (the colors do also work): ``` $ target/debug/ruff format scripts/ warning: `ruff format` is a work-in-progress, subject to change at any time, and intended for internal use only. ``` (the above changes `add_rule.py` where we have the wrong bin op breaking) ``` $ target/debug/ruff format ../projects/django/ warning: `ruff format` is a work-in-progress, subject to change at any time, and intended for internal use only. Failed to format /home/konsti/projects/django/tests/test_runner_apps/tagged/tests_syntax_error.py: source contains syntax errors: ParseError { error: UnrecognizedToken(Name { name: "syntax_error" }, None), offset: 131, source_path: "<filename>" } ``` ``` $ target/debug/ruff format a warning: `ruff format` is a work-in-progress, subject to change at any time, and intended for internal use only. Failed to read /home/konsti/ruff/a/d.py: Permission denied (os error 13) ``` **Test Plan** Missing! I'm not sure if it's worth building tests at this stage or how they should look like.
This commit is contained in:
parent
059757a8c8
commit
c2413dcd2c
7 changed files with 142 additions and 16 deletions
|
@ -4,8 +4,9 @@ use std::path::{Path, PathBuf};
|
|||
use std::process::ExitCode;
|
||||
use std::sync::mpsc::channel;
|
||||
|
||||
use anyhow::{Context, Result};
|
||||
use anyhow::Result;
|
||||
use clap::CommandFactory;
|
||||
use clap::FromArgMatches;
|
||||
use log::warn;
|
||||
use notify::{recommended_watcher, RecursiveMode, Watcher};
|
||||
|
||||
|
@ -154,32 +155,34 @@ quoting the executed command, along with the relevant file contents and `pyproje
|
|||
Ok(ExitStatus::Success)
|
||||
}
|
||||
|
||||
fn format(files: &[PathBuf]) -> Result<ExitStatus> {
|
||||
fn format(paths: &[PathBuf]) -> Result<ExitStatus> {
|
||||
warn_user_once!(
|
||||
"`ruff format` is a work-in-progress, subject to change at any time, and intended for \
|
||||
internal use only."
|
||||
"`ruff format` is a work-in-progress, subject to change at any time, and intended only for \
|
||||
experimentation."
|
||||
);
|
||||
|
||||
match &files {
|
||||
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)
|
||||
}
|
||||
_ => {
|
||||
for file in files {
|
||||
let unformatted = std::fs::read_to_string(file)
|
||||
.with_context(|| format!("Could not read {}: ", file.display()))?;
|
||||
let options = PyFormatOptions::from_extension(file);
|
||||
let formatted = format_module(&unformatted, options)?;
|
||||
std::fs::write(file, formatted.as_code().as_bytes())
|
||||
.with_context(|| format!("Could not write to {}, exiting", file.display()))?;
|
||||
}
|
||||
// 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)
|
||||
}
|
||||
}
|
||||
Ok(ExitStatus::Success)
|
||||
}
|
||||
|
||||
pub fn check(args: CheckArgs, log_level: LogLevel) -> Result<ExitStatus> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue