diff --git a/crates/ruff_dev/src/generate_rules_table.rs b/crates/ruff_dev/src/generate_rules_table.rs index 8499a6d900d81..ad0aaa4e658f0 100644 --- a/crates/ruff_dev/src/generate_rules_table.rs +++ b/crates/ruff_dev/src/generate_rules_table.rs @@ -3,6 +3,7 @@ //! Used for . use itertools::Itertools; +use ruff_linter::codes::RuleGroup; use std::borrow::Cow; use strum::IntoEnumIterator; @@ -14,6 +15,9 @@ use ruff_workspace::options_base::OptionsMetadata; const FIX_SYMBOL: &str = "🛠️"; const PREVIEW_SYMBOL: &str = "🧪"; +const WARNING_SYMBOL: &str = "⚠️"; +const STABLE_SYMBOL: &str = "✔️"; +const SPACER: &str = "    "; fn generate_table(table_out: &mut String, rules: impl IntoIterator, linter: &Linter) { table_out.push_str("| Code | Name | Message | |"); @@ -21,20 +25,30 @@ fn generate_table(table_out: &mut String, rules: impl IntoIterator, table_out.push_str("| ---- | ---- | ------- | ------: |"); table_out.push('\n'); for rule in rules { + let status_token = match rule.group() { + RuleGroup::Deprecated => { + format!("{WARNING_SYMBOL}") + } + #[allow(deprecated)] + RuleGroup::Preview | RuleGroup::Nursery => { + format!("{PREVIEW_SYMBOL}") + } + RuleGroup::Stable => { + // A full opacity checkmark is a bit aggressive for indicating stable + format!("{STABLE_SYMBOL}") + } + }; + let fix_token = match rule.fixable() { FixAvailability::Always | FixAvailability::Sometimes => { format!("{FIX_SYMBOL}") } FixAvailability::None => { - format!("") + format!("") } }; - let preview_token = if rule.is_preview() || rule.is_nursery() { - format!("{PREVIEW_SYMBOL}") - } else { - format!("") - }; - let status_token = format!("{fix_token} {preview_token}"); + + let tokens = format!("{status_token} {fix_token}"); let rule_name = rule.as_ref(); @@ -58,7 +72,7 @@ fn generate_table(table_out: &mut String, rules: impl IntoIterator, .then_some(format_args!("[{rule_name}](rules/{rule_name}.md)")) .unwrap_or(format_args!("{rule_name}")), message, - status_token, + tokens, )); table_out.push('\n'); } @@ -69,15 +83,28 @@ pub(crate) fn generate() -> String { // Generate the table string. let mut table_out = String::new(); - table_out.push_str(&format!( - "The {FIX_SYMBOL} emoji indicates that a rule is automatically fixable by the `--fix` command-line option.")); - table_out.push('\n'); + table_out.push_str("### Legend"); table_out.push('\n'); table_out.push_str(&format!( - "The {PREVIEW_SYMBOL} emoji indicates that a rule is in [\"preview\"](faq.md#what-is-preview)." + "{SPACER}{STABLE_SYMBOL}{SPACER} The rule is stable." )); - table_out.push('\n'); + table_out.push_str("
"); + + table_out.push_str(&format!( + "{SPACER}{PREVIEW_SYMBOL}{SPACER} The rule is unstable and is in [\"preview\"](faq.md#what-is-preview)." + )); + table_out.push_str("
"); + + table_out.push_str(&format!( + "{SPACER}{WARNING_SYMBOL}{SPACER} The rule has been deprecated and will be removed in a future release." + )); + table_out.push_str("
"); + + table_out.push_str(&format!( + "{SPACER}{FIX_SYMBOL}{SPACER} The rule is automatically fixable by the `--fix` command-line option." + )); + table_out.push_str("
"); table_out.push('\n'); for linter in Linter::iter() {