mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-28 04:45:01 +00:00
Add hidden --preview
/ --no-preview
options to ruff check
(#7009)
Per discussion at https://github.com/astral-sh/ruff/discussions/6998 <!-- Thank you for contributing to Ruff! To help us out with reviewing, please consider the following: - Does this pull request include a summary of the change? (See below.) - Does this pull request include a descriptive title? - Does this pull request include references to any relevant issues? --> ## Summary <!-- What's the purpose of the change? What does it do, and why? --> Adds a `--preview` and `--no-preview` option to the CLI for `ruff check` and corresponding settings. The CLI options are hidden for now. Available in the settings as `preview = true` or `preview = false`. Does not include environment variable configuration, although we may add it in the future. ## Test Plan <!-- How was it tested? --> `cargo build` Future work will build on this setting, such as toggling the mode during a test.
This commit is contained in:
parent
f4ba0ea144
commit
96a9717c1a
8 changed files with 57 additions and 3 deletions
|
@ -4,7 +4,7 @@ use regex::Regex;
|
||||||
use rustc_hash::FxHashSet;
|
use rustc_hash::FxHashSet;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use super::types::{FilePattern, PythonVersion};
|
use super::types::{FilePattern, PreviewMode, PythonVersion};
|
||||||
use super::Settings;
|
use super::Settings;
|
||||||
use crate::codes::{self, RuleCodePrefix};
|
use crate::codes::{self, RuleCodePrefix};
|
||||||
use crate::line_width::{LineLength, TabSize};
|
use crate::line_width::{LineLength, TabSize};
|
||||||
|
@ -84,6 +84,7 @@ impl Default for Settings {
|
||||||
line_length: LineLength::default(),
|
line_length: LineLength::default(),
|
||||||
logger_objects: vec![],
|
logger_objects: vec![],
|
||||||
namespace_packages: vec![],
|
namespace_packages: vec![],
|
||||||
|
preview: PreviewMode::default(),
|
||||||
per_file_ignores: vec![],
|
per_file_ignores: vec![],
|
||||||
project_root: path_dedot::CWD.clone(),
|
project_root: path_dedot::CWD.clone(),
|
||||||
respect_gitignore: true,
|
respect_gitignore: true,
|
||||||
|
|
|
@ -24,6 +24,7 @@ use crate::settings::types::{FilePatternSet, PerFileIgnore, PythonVersion, Seria
|
||||||
use super::line_width::{LineLength, TabSize};
|
use super::line_width::{LineLength, TabSize};
|
||||||
|
|
||||||
use self::rule_table::RuleTable;
|
use self::rule_table::RuleTable;
|
||||||
|
use self::types::PreviewMode;
|
||||||
|
|
||||||
pub mod defaults;
|
pub mod defaults;
|
||||||
pub mod flags;
|
pub mod flags;
|
||||||
|
@ -55,6 +56,7 @@ pub struct Settings {
|
||||||
pub per_file_ignores: Vec<(GlobMatcher, GlobMatcher, RuleSet)>,
|
pub per_file_ignores: Vec<(GlobMatcher, GlobMatcher, RuleSet)>,
|
||||||
|
|
||||||
pub target_version: PythonVersion,
|
pub target_version: PythonVersion,
|
||||||
|
pub preview: PreviewMode,
|
||||||
|
|
||||||
// Resolver settings
|
// Resolver settings
|
||||||
pub exclude: FilePatternSet,
|
pub exclude: FilePatternSet,
|
||||||
|
|
|
@ -92,6 +92,23 @@ impl PythonVersion {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Default, CacheKey, is_macro::Is)]
|
||||||
|
pub enum PreviewMode {
|
||||||
|
#[default]
|
||||||
|
Disabled,
|
||||||
|
Enabled,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<bool> for PreviewMode {
|
||||||
|
fn from(version: bool) -> Self {
|
||||||
|
if version {
|
||||||
|
PreviewMode::Enabled
|
||||||
|
} else {
|
||||||
|
PreviewMode::Disabled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, CacheKey, PartialEq, PartialOrd, Eq, Ord)]
|
#[derive(Debug, Clone, CacheKey, PartialEq, PartialOrd, Eq, Ord)]
|
||||||
pub enum FilePattern {
|
pub enum FilePattern {
|
||||||
Builtin(&'static str),
|
Builtin(&'static str),
|
||||||
|
|
|
@ -9,7 +9,7 @@ use rustc_hash::FxHashMap;
|
||||||
use ruff::logging::LogLevel;
|
use ruff::logging::LogLevel;
|
||||||
use ruff::registry::Rule;
|
use ruff::registry::Rule;
|
||||||
use ruff::settings::types::{
|
use ruff::settings::types::{
|
||||||
FilePattern, PatternPrefixPair, PerFileIgnore, PythonVersion, SerializationFormat,
|
FilePattern, PatternPrefixPair, PerFileIgnore, PreviewMode, PythonVersion, SerializationFormat,
|
||||||
};
|
};
|
||||||
use ruff::RuleSelector;
|
use ruff::RuleSelector;
|
||||||
use ruff_workspace::configuration::{Configuration, RuleSelection};
|
use ruff_workspace::configuration::{Configuration, RuleSelection};
|
||||||
|
@ -115,6 +115,11 @@ pub struct CheckCommand {
|
||||||
/// The minimum Python version that should be supported.
|
/// The minimum Python version that should be supported.
|
||||||
#[arg(long, value_enum)]
|
#[arg(long, value_enum)]
|
||||||
pub target_version: Option<PythonVersion>,
|
pub target_version: Option<PythonVersion>,
|
||||||
|
/// Enable preview mode; checks will include unstable rules and fixes.
|
||||||
|
#[arg(long, overrides_with("no_preview"), hide = true)]
|
||||||
|
preview: bool,
|
||||||
|
#[clap(long, overrides_with("preview"), hide = true)]
|
||||||
|
no_preview: bool,
|
||||||
/// Path to the `pyproject.toml` or `ruff.toml` file to use for
|
/// Path to the `pyproject.toml` or `ruff.toml` file to use for
|
||||||
/// configuration.
|
/// configuration.
|
||||||
#[arg(long, conflicts_with = "isolated")]
|
#[arg(long, conflicts_with = "isolated")]
|
||||||
|
@ -458,6 +463,7 @@ impl CheckCommand {
|
||||||
ignore: self.ignore,
|
ignore: self.ignore,
|
||||||
line_length: self.line_length,
|
line_length: self.line_length,
|
||||||
per_file_ignores: self.per_file_ignores,
|
per_file_ignores: self.per_file_ignores,
|
||||||
|
preview: resolve_bool_arg(self.preview, self.no_preview).map(PreviewMode::from),
|
||||||
respect_gitignore: resolve_bool_arg(
|
respect_gitignore: resolve_bool_arg(
|
||||||
self.respect_gitignore,
|
self.respect_gitignore,
|
||||||
self.no_respect_gitignore,
|
self.no_respect_gitignore,
|
||||||
|
@ -569,6 +575,7 @@ pub struct Overrides {
|
||||||
pub ignore: Option<Vec<RuleSelector>>,
|
pub ignore: Option<Vec<RuleSelector>>,
|
||||||
pub line_length: Option<LineLength>,
|
pub line_length: Option<LineLength>,
|
||||||
pub per_file_ignores: Option<Vec<PatternPrefixPair>>,
|
pub per_file_ignores: Option<Vec<PatternPrefixPair>>,
|
||||||
|
pub preview: Option<PreviewMode>,
|
||||||
pub respect_gitignore: Option<bool>,
|
pub respect_gitignore: Option<bool>,
|
||||||
pub select: Option<Vec<RuleSelector>>,
|
pub select: Option<Vec<RuleSelector>>,
|
||||||
pub show_source: Option<bool>,
|
pub show_source: Option<bool>,
|
||||||
|
@ -632,6 +639,9 @@ impl ConfigProcessor for Overrides {
|
||||||
if let Some(line_length) = &self.line_length {
|
if let Some(line_length) = &self.line_length {
|
||||||
config.line_length = Some(*line_length);
|
config.line_length = Some(*line_length);
|
||||||
}
|
}
|
||||||
|
if let Some(preview) = &self.preview {
|
||||||
|
config.preview = Some(*preview);
|
||||||
|
}
|
||||||
if let Some(per_file_ignores) = &self.per_file_ignores {
|
if let Some(per_file_ignores) = &self.per_file_ignores {
|
||||||
config.per_file_ignores = Some(collect_per_file_ignores(per_file_ignores.clone()));
|
config.per_file_ignores = Some(collect_per_file_ignores(per_file_ignores.clone()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,6 +128,7 @@ impl Workspace {
|
||||||
external: Some(Vec::default()),
|
external: Some(Vec::default()),
|
||||||
ignore: Some(Vec::default()),
|
ignore: Some(Vec::default()),
|
||||||
line_length: Some(LineLength::default()),
|
line_length: Some(LineLength::default()),
|
||||||
|
preview: Some(false),
|
||||||
select: Some(defaults::PREFIXES.to_vec()),
|
select: Some(defaults::PREFIXES.to_vec()),
|
||||||
tab_size: Some(TabSize::default()),
|
tab_size: Some(TabSize::default()),
|
||||||
target_version: Some(PythonVersion::default()),
|
target_version: Some(PythonVersion::default()),
|
||||||
|
|
|
@ -23,7 +23,8 @@ use ruff::registry::{Rule, RuleSet, INCOMPATIBLE_CODES};
|
||||||
use ruff::rule_selector::Specificity;
|
use ruff::rule_selector::Specificity;
|
||||||
use ruff::settings::rule_table::RuleTable;
|
use ruff::settings::rule_table::RuleTable;
|
||||||
use ruff::settings::types::{
|
use ruff::settings::types::{
|
||||||
FilePattern, FilePatternSet, PerFileIgnore, PythonVersion, SerializationFormat, Version,
|
FilePattern, FilePatternSet, PerFileIgnore, PreviewMode, PythonVersion, SerializationFormat,
|
||||||
|
Version,
|
||||||
};
|
};
|
||||||
use ruff::settings::{defaults, resolve_per_file_ignores, AllSettings, CliSettings, Settings};
|
use ruff::settings::{defaults, resolve_per_file_ignores, AllSettings, CliSettings, Settings};
|
||||||
use ruff::{fs, warn_user_once_by_id, RuleSelector, RUFF_PKG_VERSION};
|
use ruff::{fs, warn_user_once_by_id, RuleSelector, RUFF_PKG_VERSION};
|
||||||
|
@ -67,6 +68,7 @@ pub struct Configuration {
|
||||||
pub line_length: Option<LineLength>,
|
pub line_length: Option<LineLength>,
|
||||||
pub logger_objects: Option<Vec<String>>,
|
pub logger_objects: Option<Vec<String>>,
|
||||||
pub namespace_packages: Option<Vec<PathBuf>>,
|
pub namespace_packages: Option<Vec<PathBuf>>,
|
||||||
|
pub preview: Option<PreviewMode>,
|
||||||
pub required_version: Option<Version>,
|
pub required_version: Option<Version>,
|
||||||
pub respect_gitignore: Option<bool>,
|
pub respect_gitignore: Option<bool>,
|
||||||
pub show_fixes: Option<bool>,
|
pub show_fixes: Option<bool>,
|
||||||
|
@ -174,6 +176,7 @@ impl Configuration {
|
||||||
.collect()
|
.collect()
|
||||||
}),
|
}),
|
||||||
logger_objects: self.logger_objects.unwrap_or_default(),
|
logger_objects: self.logger_objects.unwrap_or_default(),
|
||||||
|
preview: self.preview.unwrap_or_default(),
|
||||||
typing_modules: self.typing_modules.unwrap_or_default(),
|
typing_modules: self.typing_modules.unwrap_or_default(),
|
||||||
// Plugins
|
// Plugins
|
||||||
flake8_annotations: self
|
flake8_annotations: self
|
||||||
|
@ -387,6 +390,7 @@ impl Configuration {
|
||||||
.namespace_packages
|
.namespace_packages
|
||||||
.map(|namespace_package| resolve_src(&namespace_package, project_root))
|
.map(|namespace_package| resolve_src(&namespace_package, project_root))
|
||||||
.transpose()?,
|
.transpose()?,
|
||||||
|
preview: options.preview.map(PreviewMode::from),
|
||||||
per_file_ignores: options.per_file_ignores.map(|per_file_ignores| {
|
per_file_ignores: options.per_file_ignores.map(|per_file_ignores| {
|
||||||
per_file_ignores
|
per_file_ignores
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
@ -676,6 +680,7 @@ impl Configuration {
|
||||||
show_fixes: self.show_fixes.or(config.show_fixes),
|
show_fixes: self.show_fixes.or(config.show_fixes),
|
||||||
src: self.src.or(config.src),
|
src: self.src.or(config.src),
|
||||||
target_version: self.target_version.or(config.target_version),
|
target_version: self.target_version.or(config.target_version),
|
||||||
|
preview: self.preview.or(config.preview),
|
||||||
task_tags: self.task_tags.or(config.task_tags),
|
task_tags: self.task_tags.or(config.task_tags),
|
||||||
typing_modules: self.typing_modules.or(config.typing_modules),
|
typing_modules: self.typing_modules.or(config.typing_modules),
|
||||||
// Plugins
|
// Plugins
|
||||||
|
|
|
@ -482,6 +482,17 @@ pub struct Options {
|
||||||
/// field (e.g., `requires-python = ">=3.8"`). If Ruff is configured via
|
/// field (e.g., `requires-python = ">=3.8"`). If Ruff is configured via
|
||||||
/// `ruff.toml` or `.ruff.toml`, no such inference will be performed.
|
/// `ruff.toml` or `.ruff.toml`, no such inference will be performed.
|
||||||
pub target_version: Option<PythonVersion>,
|
pub target_version: Option<PythonVersion>,
|
||||||
|
#[option(
|
||||||
|
default = "false",
|
||||||
|
value_type = "bool",
|
||||||
|
example = r#"
|
||||||
|
# Enable preview features
|
||||||
|
preview = true
|
||||||
|
"#
|
||||||
|
)]
|
||||||
|
/// Whether to enable preview mode. When preview mode is enabled, Ruff will
|
||||||
|
/// use unstable rules and fixes.
|
||||||
|
pub preview: Option<bool>,
|
||||||
#[option(
|
#[option(
|
||||||
default = r#"["TODO", "FIXME", "XXX"]"#,
|
default = r#"["TODO", "FIXME", "XXX"]"#,
|
||||||
value_type = "list[str]",
|
value_type = "list[str]",
|
||||||
|
|
7
ruff.schema.json
generated
7
ruff.schema.json
generated
|
@ -441,6 +441,13 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"preview": {
|
||||||
|
"description": "Whether to enable preview mode. When preview mode is enabled, Ruff will use unstable rules and fixes.",
|
||||||
|
"type": [
|
||||||
|
"boolean",
|
||||||
|
"null"
|
||||||
|
]
|
||||||
|
},
|
||||||
"pycodestyle": {
|
"pycodestyle": {
|
||||||
"description": "Options for the `pycodestyle` plugin.",
|
"description": "Options for the `pycodestyle` plugin.",
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue