From 96a9717c1a77796bc23d15625b60e8c03851e54c Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Thu, 31 Aug 2023 09:51:59 -0500 Subject: [PATCH] Add hidden `--preview` / `--no-preview` options to `ruff check` (#7009) Per discussion at https://github.com/astral-sh/ruff/discussions/6998 ## Summary 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 `cargo build` Future work will build on this setting, such as toggling the mode during a test. --- crates/ruff/src/settings/defaults.rs | 3 ++- crates/ruff/src/settings/mod.rs | 2 ++ crates/ruff/src/settings/types.rs | 17 +++++++++++++++++ crates/ruff_cli/src/args.rs | 12 +++++++++++- crates/ruff_wasm/src/lib.rs | 1 + crates/ruff_workspace/src/configuration.rs | 7 ++++++- crates/ruff_workspace/src/options.rs | 11 +++++++++++ ruff.schema.json | 7 +++++++ 8 files changed, 57 insertions(+), 3 deletions(-) diff --git a/crates/ruff/src/settings/defaults.rs b/crates/ruff/src/settings/defaults.rs index a7ef3d3b88e67..69dd446e3e254 100644 --- a/crates/ruff/src/settings/defaults.rs +++ b/crates/ruff/src/settings/defaults.rs @@ -4,7 +4,7 @@ use regex::Regex; use rustc_hash::FxHashSet; use std::collections::HashSet; -use super::types::{FilePattern, PythonVersion}; +use super::types::{FilePattern, PreviewMode, PythonVersion}; use super::Settings; use crate::codes::{self, RuleCodePrefix}; use crate::line_width::{LineLength, TabSize}; @@ -84,6 +84,7 @@ impl Default for Settings { line_length: LineLength::default(), logger_objects: vec![], namespace_packages: vec![], + preview: PreviewMode::default(), per_file_ignores: vec![], project_root: path_dedot::CWD.clone(), respect_gitignore: true, diff --git a/crates/ruff/src/settings/mod.rs b/crates/ruff/src/settings/mod.rs index edf5aaaebd8d2..ea5d38aa98830 100644 --- a/crates/ruff/src/settings/mod.rs +++ b/crates/ruff/src/settings/mod.rs @@ -24,6 +24,7 @@ use crate::settings::types::{FilePatternSet, PerFileIgnore, PythonVersion, Seria use super::line_width::{LineLength, TabSize}; use self::rule_table::RuleTable; +use self::types::PreviewMode; pub mod defaults; pub mod flags; @@ -55,6 +56,7 @@ pub struct Settings { pub per_file_ignores: Vec<(GlobMatcher, GlobMatcher, RuleSet)>, pub target_version: PythonVersion, + pub preview: PreviewMode, // Resolver settings pub exclude: FilePatternSet, diff --git a/crates/ruff/src/settings/types.rs b/crates/ruff/src/settings/types.rs index 8461604425ba4..bb293d3986bca 100644 --- a/crates/ruff/src/settings/types.rs +++ b/crates/ruff/src/settings/types.rs @@ -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 for PreviewMode { + fn from(version: bool) -> Self { + if version { + PreviewMode::Enabled + } else { + PreviewMode::Disabled + } + } +} + #[derive(Debug, Clone, CacheKey, PartialEq, PartialOrd, Eq, Ord)] pub enum FilePattern { Builtin(&'static str), diff --git a/crates/ruff_cli/src/args.rs b/crates/ruff_cli/src/args.rs index 6971867dfc27e..50cb562c1d4b2 100644 --- a/crates/ruff_cli/src/args.rs +++ b/crates/ruff_cli/src/args.rs @@ -9,7 +9,7 @@ use rustc_hash::FxHashMap; use ruff::logging::LogLevel; use ruff::registry::Rule; use ruff::settings::types::{ - FilePattern, PatternPrefixPair, PerFileIgnore, PythonVersion, SerializationFormat, + FilePattern, PatternPrefixPair, PerFileIgnore, PreviewMode, PythonVersion, SerializationFormat, }; use ruff::RuleSelector; use ruff_workspace::configuration::{Configuration, RuleSelection}; @@ -115,6 +115,11 @@ pub struct CheckCommand { /// The minimum Python version that should be supported. #[arg(long, value_enum)] pub target_version: Option, + /// 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 /// configuration. #[arg(long, conflicts_with = "isolated")] @@ -458,6 +463,7 @@ impl CheckCommand { ignore: self.ignore, line_length: self.line_length, per_file_ignores: self.per_file_ignores, + preview: resolve_bool_arg(self.preview, self.no_preview).map(PreviewMode::from), respect_gitignore: resolve_bool_arg( self.respect_gitignore, self.no_respect_gitignore, @@ -569,6 +575,7 @@ pub struct Overrides { pub ignore: Option>, pub line_length: Option, pub per_file_ignores: Option>, + pub preview: Option, pub respect_gitignore: Option, pub select: Option>, pub show_source: Option, @@ -632,6 +639,9 @@ impl ConfigProcessor for Overrides { if let Some(line_length) = &self.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 { config.per_file_ignores = Some(collect_per_file_ignores(per_file_ignores.clone())); } diff --git a/crates/ruff_wasm/src/lib.rs b/crates/ruff_wasm/src/lib.rs index 07a5b749bb02a..799963dc4da04 100644 --- a/crates/ruff_wasm/src/lib.rs +++ b/crates/ruff_wasm/src/lib.rs @@ -128,6 +128,7 @@ impl Workspace { external: Some(Vec::default()), ignore: Some(Vec::default()), line_length: Some(LineLength::default()), + preview: Some(false), select: Some(defaults::PREFIXES.to_vec()), tab_size: Some(TabSize::default()), target_version: Some(PythonVersion::default()), diff --git a/crates/ruff_workspace/src/configuration.rs b/crates/ruff_workspace/src/configuration.rs index a7ad93e686ac5..68a505adb0258 100644 --- a/crates/ruff_workspace/src/configuration.rs +++ b/crates/ruff_workspace/src/configuration.rs @@ -23,7 +23,8 @@ use ruff::registry::{Rule, RuleSet, INCOMPATIBLE_CODES}; use ruff::rule_selector::Specificity; use ruff::settings::rule_table::RuleTable; 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::{fs, warn_user_once_by_id, RuleSelector, RUFF_PKG_VERSION}; @@ -67,6 +68,7 @@ pub struct Configuration { pub line_length: Option, pub logger_objects: Option>, pub namespace_packages: Option>, + pub preview: Option, pub required_version: Option, pub respect_gitignore: Option, pub show_fixes: Option, @@ -174,6 +176,7 @@ impl Configuration { .collect() }), logger_objects: self.logger_objects.unwrap_or_default(), + preview: self.preview.unwrap_or_default(), typing_modules: self.typing_modules.unwrap_or_default(), // Plugins flake8_annotations: self @@ -387,6 +390,7 @@ impl Configuration { .namespace_packages .map(|namespace_package| resolve_src(&namespace_package, project_root)) .transpose()?, + preview: options.preview.map(PreviewMode::from), per_file_ignores: options.per_file_ignores.map(|per_file_ignores| { per_file_ignores .into_iter() @@ -676,6 +680,7 @@ impl Configuration { show_fixes: self.show_fixes.or(config.show_fixes), src: self.src.or(config.src), target_version: self.target_version.or(config.target_version), + preview: self.preview.or(config.preview), task_tags: self.task_tags.or(config.task_tags), typing_modules: self.typing_modules.or(config.typing_modules), // Plugins diff --git a/crates/ruff_workspace/src/options.rs b/crates/ruff_workspace/src/options.rs index 599f4626393d3..dc711227986a9 100644 --- a/crates/ruff_workspace/src/options.rs +++ b/crates/ruff_workspace/src/options.rs @@ -482,6 +482,17 @@ pub struct Options { /// field (e.g., `requires-python = ">=3.8"`). If Ruff is configured via /// `ruff.toml` or `.ruff.toml`, no such inference will be performed. pub target_version: Option, + #[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, #[option( default = r#"["TODO", "FIXME", "XXX"]"#, value_type = "list[str]", diff --git a/ruff.schema.json b/ruff.schema.json index 0e09a47eb91cc..bce237bcb1a6d 100644 --- a/ruff.schema.json +++ b/ruff.schema.json @@ -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": { "description": "Options for the `pycodestyle` plugin.", "anyOf": [