From dc021dd4d2184848efa6eec6417c19f4394f605a Mon Sep 17 00:00:00 2001 From: Auguste Lalande Date: Sun, 17 Mar 2024 21:27:39 -0400 Subject: [PATCH] Fix pylint upstream categories not showing in docs (#10441) ## Summary The upstream category check here https://github.com/astral-sh/ruff/blob/fd26b299865997fc9a89608d5e090f9c05360997/crates/ruff_linter/src/upstream_categories.rs#L54-L65 was not working because the code is actually "E0001" not "PLE0001", I changed it so it will detect the upstream category correctly. I also sorted the upstream categories alphabetically, so that the document generation will be deterministic. ## Test Plan I compared the diff before and after the change. --- crates/ruff_dev/src/generate_rules_table.rs | 16 ++++++- crates/ruff_linter/src/upstream_categories.rs | 42 +++++++------------ 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/crates/ruff_dev/src/generate_rules_table.rs b/crates/ruff_dev/src/generate_rules_table.rs index c167c018d0..453700c1e8 100644 --- a/crates/ruff_dev/src/generate_rules_table.rs +++ b/crates/ruff_dev/src/generate_rules_table.rs @@ -180,8 +180,22 @@ pub(crate) fn generate() -> String { .map(|rule| (rule.upstream_category(&linter), rule)) .into_group_map(); + let mut rules_by_upstream_category: Vec<_> = rules_by_upstream_category.iter().collect(); + + // Sort the upstream categories alphabetically by prefix. + rules_by_upstream_category.sort_by(|(a, _), (b, _)| { + a.as_ref() + .map(|category| category.prefix) + .unwrap_or_default() + .cmp( + b.as_ref() + .map(|category| category.prefix) + .unwrap_or_default(), + ) + }); + if rules_by_upstream_category.len() > 1 { - for (opt, rules) in &rules_by_upstream_category { + for (opt, rules) in rules_by_upstream_category { if opt.is_some() { let UpstreamCategoryAndPrefix { category, prefix } = opt.unwrap(); table_out.push_str(&format!("#### {category} ({prefix})")); diff --git a/crates/ruff_linter/src/upstream_categories.rs b/crates/ruff_linter/src/upstream_categories.rs index c27c79e2f5..9f94759e26 100644 --- a/crates/ruff_linter/src/upstream_categories.rs +++ b/crates/ruff_linter/src/upstream_categories.rs @@ -8,24 +8,9 @@ pub struct UpstreamCategoryAndPrefix { pub prefix: &'static str, } -const PLC: UpstreamCategoryAndPrefix = UpstreamCategoryAndPrefix { +const C: UpstreamCategoryAndPrefix = UpstreamCategoryAndPrefix { category: "Convention", - prefix: "PLC", -}; - -const PLE: UpstreamCategoryAndPrefix = UpstreamCategoryAndPrefix { - category: "Error", - prefix: "PLE", -}; - -const PLR: UpstreamCategoryAndPrefix = UpstreamCategoryAndPrefix { - category: "Refactor", - prefix: "PLR", -}; - -const PLW: UpstreamCategoryAndPrefix = UpstreamCategoryAndPrefix { - category: "Warning", - prefix: "PLW", + prefix: "C", }; const E: UpstreamCategoryAndPrefix = UpstreamCategoryAndPrefix { @@ -33,6 +18,11 @@ const E: UpstreamCategoryAndPrefix = UpstreamCategoryAndPrefix { prefix: "E", }; +const R: UpstreamCategoryAndPrefix = UpstreamCategoryAndPrefix { + category: "Refactor", + prefix: "R", +}; + const W: UpstreamCategoryAndPrefix = UpstreamCategoryAndPrefix { category: "Warning", prefix: "W", @@ -52,14 +42,14 @@ impl Rule { } } Linter::Pylint => { - if code.starts_with("PLC") { - Some(PLC) - } else if code.starts_with("PLE") { - Some(PLE) - } else if code.starts_with("PLR") { - Some(PLR) - } else if code.starts_with("PLW") { - Some(PLW) + if code.starts_with('C') { + Some(C) + } else if code.starts_with('E') { + Some(E) + } else if code.starts_with('R') { + Some(R) + } else if code.starts_with('W') { + Some(W) } else { None } @@ -73,7 +63,7 @@ impl Linter { pub const fn upstream_categories(&self) -> Option<&'static [UpstreamCategoryAndPrefix]> { match self { Linter::Pycodestyle => Some(&[E, W]), - Linter::Pylint => Some(&[PLC, PLE, PLR, PLW]), + Linter::Pylint => Some(&[C, E, R, W]), _ => None, } }