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!("{FIX_SYMBOL}")
+ format!("{FIX_SYMBOL}")
}
};
- let preview_token = if rule.is_preview() || rule.is_nursery() {
- format!("{PREVIEW_SYMBOL}")
- } else {
- format!("{PREVIEW_SYMBOL}")
- };
- 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() {