mirror of
https://github.com/astral-sh/ruff
synced 2026-01-23 06:20:55 -05:00
# This commit was automatically generated by running the following
# script (followed by `cargo +nightly fmt`):
import glob
import re
from typing import NamedTuple
class Rule(NamedTuple):
code: str
name: str
path: str
def rules() -> list[Rule]:
"""Returns all the rules defined in `src/registry.rs`."""
file = open('src/registry.rs')
rules = []
while next(file) != 'ruff_macros::define_rule_mapping!(\n':
continue
while (line := next(file)) != ');\n':
line = line.strip().rstrip(',')
if line.startswith('//'):
continue
code, path = line.split(' => ')
name = path.rsplit('::')[-1]
rules.append(Rule(code, name, path))
return rules
code2name = {r.code: r.name for r in rules()}
for pattern in ('src/**/*.rs', 'ruff_cli/**/*.rs', 'ruff_dev/**/*.rs', 'scripts/add_*.py'):
for name in glob.glob(pattern, recursive=True):
with open(name) as f:
text = f.read()
text = re.sub('Rule(?:Code)?::([A-Z]\w+)', lambda m: 'Rule::' + code2name[m.group(1)], text)
text = re.sub(r'(?<!"<FilePattern>:<)RuleCode\b', 'Rule', text)
text = re.sub('(use crate::registry::{.*, Rule), Rule(.*)', r'\1\2', text) # fix duplicate import
with open(name, 'w') as f:
f.write(text)
54 lines
2.2 KiB
Rust
54 lines
2.2 KiB
Rust
use rustpython_ast::{Constant, Expr, ExprKind};
|
|
|
|
use crate::ast::types::Range;
|
|
use crate::checkers::ast::Checker;
|
|
use crate::registry::{Diagnostic, Rule};
|
|
use crate::violations;
|
|
|
|
/// EM101, EM102, EM103
|
|
pub fn string_in_exception(checker: &mut Checker, exc: &Expr) {
|
|
if let ExprKind::Call { args, .. } = &exc.node {
|
|
if let Some(first) = args.first() {
|
|
match &first.node {
|
|
// Check for string literals
|
|
ExprKind::Constant {
|
|
value: Constant::Str(string),
|
|
..
|
|
} => {
|
|
if checker.settings.rules.enabled(&Rule::RawStringInException) {
|
|
if string.len() > checker.settings.flake8_errmsg.max_string_length {
|
|
checker.diagnostics.push(Diagnostic::new(
|
|
violations::RawStringInException,
|
|
Range::from_located(first),
|
|
));
|
|
}
|
|
}
|
|
}
|
|
// Check for f-strings
|
|
ExprKind::JoinedStr { .. } => {
|
|
if checker.settings.rules.enabled(&Rule::FStringInException) {
|
|
checker.diagnostics.push(Diagnostic::new(
|
|
violations::FStringInException,
|
|
Range::from_located(first),
|
|
));
|
|
}
|
|
}
|
|
// Check for .format() calls
|
|
ExprKind::Call { func, .. } => {
|
|
if checker.settings.rules.enabled(&Rule::DotFormatInException) {
|
|
if let ExprKind::Attribute { value, attr, .. } = &func.node {
|
|
if attr == "format" && matches!(value.node, ExprKind::Constant { .. }) {
|
|
checker.diagnostics.push(Diagnostic::new(
|
|
violations::DotFormatInException,
|
|
Range::from_located(first),
|
|
));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_ => {}
|
|
}
|
|
}
|
|
}
|
|
}
|