Skip to content

Commit b1348e7

Browse files
committed
Fix exclusion of redirected removed rules from schema
1 parent d145c23 commit b1348e7

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

crates/ruff_linter/src/rule_selector.rs

+37-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::str::FromStr;
2-
31
use serde::de::{self, Visitor};
42
use serde::{Deserialize, Serialize};
53
use strum::IntoEnumIterator;
@@ -48,6 +46,7 @@ impl FromStr for RuleSelector {
4846
type Err = ParseError;
4947

5048
fn from_str(s: &str) -> Result<Self, Self::Err> {
49+
// **Changes should be reflected in `parse_no_redirect` as well**
5150
match s {
5251
"ALL" => Ok(Self::All),
5352
#[allow(deprecated)]
@@ -67,7 +66,6 @@ impl FromStr for RuleSelector {
6766
return Ok(Self::Linter(linter));
6867
}
6968

70-
// Does the selector select a single rule?
7169
let prefix = RuleCodePrefix::parse(&linter, code)
7270
.map_err(|_| ParseError::Unknown(s.to_string()))?;
7371

@@ -302,7 +300,7 @@ mod schema {
302300
.filter(|p| {
303301
// Exclude any prefixes where all of the rules are removed
304302
if let Ok(Self::Rule { prefix, .. } | Self::Prefix { prefix, .. }) =
305-
RuleSelector::from_str(p)
303+
RuleSelector::parse_no_redirect(p)
306304
{
307305
!prefix.rules().all(|rule| rule.is_removed())
308306
} else {
@@ -341,6 +339,41 @@ impl RuleSelector {
341339
}
342340
}
343341
}
342+
343+
/// Parse [`RuleSelector`] from a string; but do not follow redirects.
344+
pub fn parse_no_redirect(s: &str) -> Result<Self, ParseError> {
345+
// **Changes should be reflected in `from_str` as well**
346+
match s {
347+
"ALL" => Ok(Self::All),
348+
#[allow(deprecated)]
349+
"NURSERY" => Ok(Self::Nursery),
350+
"C" => Ok(Self::C),
351+
"T" => Ok(Self::T),
352+
_ => {
353+
let (linter, code) =
354+
Linter::parse_code(s).ok_or_else(|| ParseError::Unknown(s.to_string()))?;
355+
356+
if code.is_empty() {
357+
return Ok(Self::Linter(linter));
358+
}
359+
360+
let prefix = RuleCodePrefix::parse(&linter, code)
361+
.map_err(|_| ParseError::Unknown(s.to_string()))?;
362+
363+
if is_single_rule_selector(&prefix) {
364+
Ok(Self::Rule {
365+
prefix,
366+
redirected_from: None,
367+
})
368+
} else {
369+
Ok(Self::Prefix {
370+
prefix,
371+
redirected_from: None,
372+
})
373+
}
374+
}
375+
}
376+
}
344377
}
345378

346379
#[derive(EnumIter, PartialEq, Eq, PartialOrd, Ord, Copy, Clone, Debug)]

ruff.schema.json

-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)