Respect tab-size setting in formatter (#8006)

This commit is contained in:
Micha Reiser 2023-10-19 08:48:14 +09:00 committed by GitHub
parent 46d5db56cc
commit 4786abac7a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 33 additions and 10 deletions

View file

@ -51,6 +51,9 @@ fn format_options() -> Result<()> {
fs::write( fs::write(
&ruff_toml, &ruff_toml,
r#" r#"
tab-size = 8
line-length = 84
[format] [format]
indent-style = "tab" indent-style = "tab"
quote-style = "single" quote-style = "single"
@ -65,7 +68,7 @@ line-ending = "cr-lf"
.arg("-") .arg("-")
.pass_stdin(r#" .pass_stdin(r#"
def foo(arg1, arg2,): def foo(arg1, arg2,):
print("Shouldn't change quotes") print("Shouldn't change quotes. It exceeds the line width with the tab size 8")
if condition: if condition:
@ -77,7 +80,9 @@ if condition:
exit_code: 0 exit_code: 0
----- stdout ----- ----- stdout -----
def foo(arg1, arg2): def foo(arg1, arg2):
print("Shouldn't change quotes") print(
"Shouldn't change quotes. It exceeds the line width with the tab size 8"
)
if condition: if condition:

View file

@ -95,7 +95,7 @@ impl std::fmt::Display for IndentStyle {
/// ///
/// Determines the visual width of a tab character (`\t`) and the number of /// Determines the visual width of a tab character (`\t`) and the number of
/// spaces per indent when using [`IndentStyle::Space`]. /// spaces per indent when using [`IndentStyle::Space`].
#[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Clone, Copy, Debug, Eq, PartialEq, CacheKey)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub struct IndentWidth(NonZeroU8); pub struct IndentWidth(NonZeroU8);

View file

@ -253,3 +253,9 @@ impl From<NonZeroU8> for TabSize {
Self(tab_size) Self(tab_size)
} }
} }
impl From<TabSize> for NonZeroU8 {
fn from(value: TabSize) -> Self {
value.0
}
}

View file

@ -4,7 +4,7 @@
use std::borrow::Cow; use std::borrow::Cow;
use std::env::VarError; use std::env::VarError;
use std::num::NonZeroU16; use std::num::{NonZeroU16, NonZeroU8};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
@ -16,7 +16,7 @@ use shellexpand::LookupError;
use strum::IntoEnumIterator; use strum::IntoEnumIterator;
use ruff_cache::cache_dir; use ruff_cache::cache_dir;
use ruff_formatter::{IndentStyle, LineWidth}; use ruff_formatter::{IndentStyle, IndentWidth, LineWidth};
use ruff_linter::line_width::{LineLength, TabSize}; use ruff_linter::line_width::{LineLength, TabSize};
use ruff_linter::registry::RuleNamespace; use ruff_linter::registry::RuleNamespace;
use ruff_linter::registry::{Rule, RuleSet, INCOMPATIBLE_CODES}; use ruff_linter::registry::{Rule, RuleSet, INCOMPATIBLE_CODES};
@ -155,7 +155,7 @@ impl Configuration {
let format = self.format; let format = self.format;
let format_defaults = FormatterSettings::default(); let format_defaults = FormatterSettings::default();
// TODO(micha): Support changing the tab-width but disallow changing the number of spaces
let formatter = FormatterSettings { let formatter = FormatterSettings {
exclude: FilePatternSet::try_from_iter(format.exclude.unwrap_or_default())?, exclude: FilePatternSet::try_from_iter(format.exclude.unwrap_or_default())?,
preview: match format.preview.unwrap_or(global_preview) { preview: match format.preview.unwrap_or(global_preview) {
@ -169,6 +169,11 @@ impl Configuration {
}), }),
line_ending: format.line_ending.unwrap_or(format_defaults.line_ending), line_ending: format.line_ending.unwrap_or(format_defaults.line_ending),
indent_style: format.indent_style.unwrap_or(format_defaults.indent_style), indent_style: format.indent_style.unwrap_or(format_defaults.indent_style),
indent_width: self
.tab_size
.map_or(format_defaults.indent_width, |tab_size| {
IndentWidth::from(NonZeroU8::from(tab_size))
}),
quote_style: format.quote_style.unwrap_or(format_defaults.quote_style), quote_style: format.quote_style.unwrap_or(format_defaults.quote_style),
magic_trailing_comma: format magic_trailing_comma: format
.magic_trailing_comma .magic_trailing_comma

View file

@ -363,7 +363,11 @@ pub struct Options {
)] )]
pub line_length: Option<LineLength>, pub line_length: Option<LineLength>,
/// The tabulation size to calculate line length. /// The number of spaces a tab is equal to when enforcing long-line violations (like `E501`)
/// or formatting code with the formatter.
///
/// This option changes the number of spaces inserted by the formatter when
/// using soft-tabs (`indent-style = space`).
#[option( #[option(
default = "4", default = "4",
value_type = "int", value_type = "int",

View file

@ -1,6 +1,6 @@
use path_absolutize::path_dedot; use path_absolutize::path_dedot;
use ruff_cache::cache_dir; use ruff_cache::cache_dir;
use ruff_formatter::{FormatOptions, IndentStyle, LineWidth}; use ruff_formatter::{FormatOptions, IndentStyle, IndentWidth, LineWidth};
use ruff_linter::settings::types::{FilePattern, FilePatternSet, SerializationFormat, UnsafeFixes}; use ruff_linter::settings::types::{FilePattern, FilePatternSet, SerializationFormat, UnsafeFixes};
use ruff_linter::settings::LinterSettings; use ruff_linter::settings::LinterSettings;
use ruff_macros::CacheKey; use ruff_macros::CacheKey;
@ -117,6 +117,7 @@ pub struct FormatterSettings {
pub line_width: LineWidth, pub line_width: LineWidth,
pub indent_style: IndentStyle, pub indent_style: IndentStyle,
pub indent_width: IndentWidth,
pub quote_style: QuoteStyle, pub quote_style: QuoteStyle,
@ -150,6 +151,7 @@ impl FormatterSettings {
PyFormatOptions::from_source_type(source_type) PyFormatOptions::from_source_type(source_type)
.with_indent_style(self.indent_style) .with_indent_style(self.indent_style)
.with_indent_width(self.indent_width)
.with_quote_style(self.quote_style) .with_quote_style(self.quote_style)
.with_magic_trailing_comma(self.magic_trailing_comma) .with_magic_trailing_comma(self.magic_trailing_comma)
.with_preview(self.preview) .with_preview(self.preview)
@ -164,10 +166,11 @@ impl Default for FormatterSettings {
Self { Self {
exclude: FilePatternSet::default(), exclude: FilePatternSet::default(),
preview: ruff_python_formatter::PreviewMode::Disabled, preview: PreviewMode::Disabled,
line_width: default_options.line_width(), line_width: default_options.line_width(),
line_ending: LineEnding::Lf, line_ending: LineEnding::Lf,
indent_style: default_options.indent_style(), indent_style: default_options.indent_style(),
indent_width: default_options.indent_width(),
quote_style: default_options.quote_style(), quote_style: default_options.quote_style(),
magic_trailing_comma: default_options.magic_trailing_comma(), magic_trailing_comma: default_options.magic_trailing_comma(),
} }

2
ruff.schema.json generated
View file

@ -605,7 +605,7 @@
} }
}, },
"tab-size": { "tab-size": {
"description": "The tabulation size to calculate line length.", "description": "The number of spaces a tab is equal to when enforcing long-line violations (like `E501`) or formatting code with the formatter.\n\nThis option changes the number of spaces inserted by the formatter when using soft-tabs (`indent-style = space`).",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/TabSize" "$ref": "#/definitions/TabSize"