mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-02 06:41:23 +00:00
Autofix EM101
, EM102
, EM103
if possible (#4123)
This commit is contained in:
parent
3e81403fbe
commit
089b64e9c1
5 changed files with 502 additions and 24 deletions
|
@ -21,3 +21,36 @@ def f_c():
|
||||||
def f_ok():
|
def f_ok():
|
||||||
msg = "hello"
|
msg = "hello"
|
||||||
raise RuntimeError(msg)
|
raise RuntimeError(msg)
|
||||||
|
|
||||||
|
|
||||||
|
def f_unfixable():
|
||||||
|
msg = "hello"
|
||||||
|
raise RuntimeError("This is an example exception")
|
||||||
|
|
||||||
|
|
||||||
|
def f_msg_in_nested_scope():
|
||||||
|
def nested():
|
||||||
|
msg = "hello"
|
||||||
|
|
||||||
|
raise RuntimeError("This is an example exception")
|
||||||
|
|
||||||
|
|
||||||
|
def f_msg_in_parent_scope():
|
||||||
|
msg = "hello"
|
||||||
|
|
||||||
|
def nested():
|
||||||
|
raise RuntimeError("This is an example exception")
|
||||||
|
|
||||||
|
|
||||||
|
def f_fix_indentation_check(foo):
|
||||||
|
if foo:
|
||||||
|
raise RuntimeError("This is an example exception")
|
||||||
|
else:
|
||||||
|
if foo == "foo":
|
||||||
|
raise RuntimeError(f"This is an exception: {foo}")
|
||||||
|
raise RuntimeError("This is an exception: {}".format(foo))
|
||||||
|
|
||||||
|
|
||||||
|
# Report these, but don't fix them
|
||||||
|
if foo: raise RuntimeError("This is an example exception")
|
||||||
|
if foo: x = 1; raise RuntimeError("This is an example exception")
|
||||||
|
|
|
@ -1512,7 +1512,7 @@ where
|
||||||
Rule::DotFormatInException,
|
Rule::DotFormatInException,
|
||||||
]) {
|
]) {
|
||||||
if let Some(exc) = exc {
|
if let Some(exc) = exc {
|
||||||
flake8_errmsg::rules::string_in_exception(self, exc);
|
flake8_errmsg::rules::string_in_exception(self, stmt, exc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if self.settings.rules.enabled(Rule::OSErrorAlias) {
|
if self.settings.rules.enabled(Rule::OSErrorAlias) {
|
||||||
|
|
|
@ -1,10 +1,13 @@
|
||||||
use rustpython_parser::ast::{Constant, Expr, ExprKind};
|
use rustpython_parser::ast::{Constant, Expr, ExprContext, ExprKind, Stmt, StmtKind};
|
||||||
|
|
||||||
use ruff_diagnostics::{Diagnostic, Violation};
|
use ruff_diagnostics::{AutofixKind, Diagnostic, Edit, Fix, Violation};
|
||||||
use ruff_macros::{derive_message_formats, violation};
|
use ruff_macros::{derive_message_formats, violation};
|
||||||
|
use ruff_python_ast::helpers::{create_expr, create_stmt, unparse_stmt};
|
||||||
|
use ruff_python_ast::source_code::Stylist;
|
||||||
|
use ruff_python_ast::whitespace;
|
||||||
|
|
||||||
use crate::checkers::ast::Checker;
|
use crate::checkers::ast::Checker;
|
||||||
use crate::registry::Rule;
|
use crate::registry::{AsRule, Rule};
|
||||||
|
|
||||||
/// ## What it does
|
/// ## What it does
|
||||||
/// Checks for the use of string literals in exception constructors.
|
/// Checks for the use of string literals in exception constructors.
|
||||||
|
@ -44,13 +47,22 @@ use crate::registry::Rule;
|
||||||
/// RuntimeError: 'Some value' is incorrect
|
/// RuntimeError: 'Some value' is incorrect
|
||||||
/// ```
|
/// ```
|
||||||
#[violation]
|
#[violation]
|
||||||
pub struct RawStringInException;
|
pub struct RawStringInException {
|
||||||
|
pub fixable: bool,
|
||||||
|
}
|
||||||
|
|
||||||
impl Violation for RawStringInException {
|
impl Violation for RawStringInException {
|
||||||
|
const AUTOFIX: AutofixKind = AutofixKind::Sometimes;
|
||||||
|
|
||||||
#[derive_message_formats]
|
#[derive_message_formats]
|
||||||
fn message(&self) -> String {
|
fn message(&self) -> String {
|
||||||
format!("Exception must not use a string literal, assign to variable first")
|
format!("Exception must not use a string literal, assign to variable first")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn autofix_title_formatter(&self) -> Option<fn(&Self) -> String> {
|
||||||
|
self.fixable
|
||||||
|
.then_some(|_| format!("Assign to variable; remove string literal"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ## What it does
|
/// ## What it does
|
||||||
|
@ -92,13 +104,22 @@ impl Violation for RawStringInException {
|
||||||
/// RuntimeError: 'Some value' is incorrect
|
/// RuntimeError: 'Some value' is incorrect
|
||||||
/// ```
|
/// ```
|
||||||
#[violation]
|
#[violation]
|
||||||
pub struct FStringInException;
|
pub struct FStringInException {
|
||||||
|
pub fixable: bool,
|
||||||
|
}
|
||||||
|
|
||||||
impl Violation for FStringInException {
|
impl Violation for FStringInException {
|
||||||
|
const AUTOFIX: AutofixKind = AutofixKind::Sometimes;
|
||||||
|
|
||||||
#[derive_message_formats]
|
#[derive_message_formats]
|
||||||
fn message(&self) -> String {
|
fn message(&self) -> String {
|
||||||
format!("Exception must not use an f-string literal, assign to variable first")
|
format!("Exception must not use an f-string literal, assign to variable first")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn autofix_title_formatter(&self) -> Option<fn(&Self) -> String> {
|
||||||
|
self.fixable
|
||||||
|
.then_some(|_| format!("Assign to variable; remove f-string literal"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ## What it does
|
/// ## What it does
|
||||||
|
@ -142,17 +163,62 @@ impl Violation for FStringInException {
|
||||||
/// RuntimeError: 'Some value' is incorrect
|
/// RuntimeError: 'Some value' is incorrect
|
||||||
/// ```
|
/// ```
|
||||||
#[violation]
|
#[violation]
|
||||||
pub struct DotFormatInException;
|
pub struct DotFormatInException {
|
||||||
|
pub fixable: bool,
|
||||||
|
}
|
||||||
|
|
||||||
impl Violation for DotFormatInException {
|
impl Violation for DotFormatInException {
|
||||||
|
const AUTOFIX: AutofixKind = AutofixKind::Sometimes;
|
||||||
|
|
||||||
#[derive_message_formats]
|
#[derive_message_formats]
|
||||||
fn message(&self) -> String {
|
fn message(&self) -> String {
|
||||||
format!("Exception must not use a `.format()` string directly, assign to variable first")
|
format!("Exception must not use a `.format()` string directly, assign to variable first")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn autofix_title_formatter(&self) -> Option<fn(&Self) -> String> {
|
||||||
|
self.fixable
|
||||||
|
.then_some(|_| format!("Assign to variable; remove `.format()` string"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Generate the [`Fix`] for EM001, EM002, and EM003 violations.
|
||||||
|
///
|
||||||
|
/// This assumes that the violation is fixable and that the patch should
|
||||||
|
/// be generated. The exception argument should be either a string literal,
|
||||||
|
/// an f-string, or a `.format` string.
|
||||||
|
///
|
||||||
|
/// The fix includes two edits:
|
||||||
|
/// 1. Insert the exception argument into a variable assignment before the
|
||||||
|
/// `raise` statement. The variable name is `msg`.
|
||||||
|
/// 2. Replace the exception argument with the variable name.
|
||||||
|
fn generate_fix(stylist: &Stylist, stmt: &Stmt, exc_arg: &Expr, indentation: &str) -> Fix {
|
||||||
|
let assignment = unparse_stmt(
|
||||||
|
&create_stmt(StmtKind::Assign {
|
||||||
|
targets: vec![create_expr(ExprKind::Name {
|
||||||
|
id: String::from("msg"),
|
||||||
|
ctx: ExprContext::Store,
|
||||||
|
})],
|
||||||
|
value: Box::new(exc_arg.clone()),
|
||||||
|
type_comment: None,
|
||||||
|
}),
|
||||||
|
stylist,
|
||||||
|
);
|
||||||
|
Fix::from_iter([
|
||||||
|
Edit::insertion(
|
||||||
|
format!(
|
||||||
|
"{}{}{}",
|
||||||
|
assignment,
|
||||||
|
stylist.line_ending().as_str(),
|
||||||
|
indentation,
|
||||||
|
),
|
||||||
|
stmt.start(),
|
||||||
|
),
|
||||||
|
Edit::range_replacement(String::from("msg"), exc_arg.range()),
|
||||||
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
/// EM101, EM102, EM103
|
/// EM101, EM102, EM103
|
||||||
pub fn string_in_exception(checker: &mut Checker, exc: &Expr) {
|
pub fn string_in_exception(checker: &mut Checker, stmt: &Stmt, exc: &Expr) {
|
||||||
if let ExprKind::Call { args, .. } = &exc.node {
|
if let ExprKind::Call { args, .. } = &exc.node {
|
||||||
if let Some(first) = args.first() {
|
if let Some(first) = args.first() {
|
||||||
match &first.node {
|
match &first.node {
|
||||||
|
@ -163,18 +229,63 @@ pub fn string_in_exception(checker: &mut Checker, exc: &Expr) {
|
||||||
} => {
|
} => {
|
||||||
if checker.settings.rules.enabled(Rule::RawStringInException) {
|
if checker.settings.rules.enabled(Rule::RawStringInException) {
|
||||||
if string.len() > checker.settings.flake8_errmsg.max_string_length {
|
if string.len() > checker.settings.flake8_errmsg.max_string_length {
|
||||||
checker
|
let indentation = whitespace::indentation(checker.locator, stmt)
|
||||||
.diagnostics
|
.and_then(|indentation| {
|
||||||
.push(Diagnostic::new(RawStringInException, first.range()));
|
if checker.ctx.find_binding("msg").is_none() {
|
||||||
|
Some(indentation)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let mut diagnostic = Diagnostic::new(
|
||||||
|
RawStringInException {
|
||||||
|
fixable: indentation.is_some(),
|
||||||
|
},
|
||||||
|
first.range(),
|
||||||
|
);
|
||||||
|
if let Some(indentation) = indentation {
|
||||||
|
if checker.patch(diagnostic.kind.rule()) {
|
||||||
|
diagnostic.set_fix(generate_fix(
|
||||||
|
checker.stylist,
|
||||||
|
stmt,
|
||||||
|
first,
|
||||||
|
indentation,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
checker.diagnostics.push(diagnostic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Check for f-strings
|
// Check for f-strings
|
||||||
ExprKind::JoinedStr { .. } => {
|
ExprKind::JoinedStr { .. } => {
|
||||||
if checker.settings.rules.enabled(Rule::FStringInException) {
|
if checker.settings.rules.enabled(Rule::FStringInException) {
|
||||||
checker
|
let indentation = whitespace::indentation(checker.locator, stmt).and_then(
|
||||||
.diagnostics
|
|indentation| {
|
||||||
.push(Diagnostic::new(FStringInException, first.range()));
|
if checker.ctx.find_binding("msg").is_none() {
|
||||||
|
Some(indentation)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
let mut diagnostic = Diagnostic::new(
|
||||||
|
FStringInException {
|
||||||
|
fixable: indentation.is_some(),
|
||||||
|
},
|
||||||
|
first.range(),
|
||||||
|
);
|
||||||
|
if let Some(indentation) = indentation {
|
||||||
|
if checker.patch(diagnostic.kind.rule()) {
|
||||||
|
diagnostic.set_fix(generate_fix(
|
||||||
|
checker.stylist,
|
||||||
|
stmt,
|
||||||
|
first,
|
||||||
|
indentation,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
checker.diagnostics.push(diagnostic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Check for .format() calls
|
// Check for .format() calls
|
||||||
|
@ -182,9 +293,31 @@ pub fn string_in_exception(checker: &mut Checker, exc: &Expr) {
|
||||||
if checker.settings.rules.enabled(Rule::DotFormatInException) {
|
if checker.settings.rules.enabled(Rule::DotFormatInException) {
|
||||||
if let ExprKind::Attribute { value, attr, .. } = &func.node {
|
if let ExprKind::Attribute { value, attr, .. } = &func.node {
|
||||||
if attr == "format" && matches!(value.node, ExprKind::Constant { .. }) {
|
if attr == "format" && matches!(value.node, ExprKind::Constant { .. }) {
|
||||||
checker
|
let indentation = whitespace::indentation(checker.locator, stmt)
|
||||||
.diagnostics
|
.and_then(|indentation| {
|
||||||
.push(Diagnostic::new(DotFormatInException, first.range()));
|
if checker.ctx.find_binding("msg").is_none() {
|
||||||
|
Some(indentation)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let mut diagnostic = Diagnostic::new(
|
||||||
|
DotFormatInException {
|
||||||
|
fixable: indentation.is_some(),
|
||||||
|
},
|
||||||
|
first.range(),
|
||||||
|
);
|
||||||
|
if let Some(indentation) = indentation {
|
||||||
|
if checker.patch(diagnostic.kind.rule()) {
|
||||||
|
diagnostic.set_fix(generate_fix(
|
||||||
|
checker.stylist,
|
||||||
|
stmt,
|
||||||
|
first,
|
||||||
|
indentation,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
checker.diagnostics.push(diagnostic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,26 +1,176 @@
|
||||||
---
|
---
|
||||||
source: crates/ruff/src/rules/flake8_errmsg/mod.rs
|
source: crates/ruff/src/rules/flake8_errmsg/mod.rs
|
||||||
---
|
---
|
||||||
EM.py:5:24: EM101 Exception must not use a string literal, assign to variable first
|
EM.py:5:24: EM101 [*] Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
|
||||||
5 | def f_a():
|
5 | def f_a():
|
||||||
6 | raise RuntimeError("This is an example exception")
|
6 | raise RuntimeError("This is an example exception")
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
|
|
|
||||||
|
= help: Assign to variable; remove string literal
|
||||||
|
|
||||||
EM.py:14:24: EM102 Exception must not use an f-string literal, assign to variable first
|
ℹ Suggested fix
|
||||||
|
2 2 |
|
||||||
|
3 3 |
|
||||||
|
4 4 | def f_a():
|
||||||
|
5 |- raise RuntimeError("This is an example exception")
|
||||||
|
5 |+ msg = "This is an example exception"
|
||||||
|
6 |+ raise RuntimeError(msg)
|
||||||
|
6 7 |
|
||||||
|
7 8 |
|
||||||
|
8 9 | def f_a_short():
|
||||||
|
|
||||||
|
EM.py:14:24: EM102 [*] Exception must not use an f-string literal, assign to variable first
|
||||||
|
|
|
|
||||||
14 | def f_b():
|
14 | def f_b():
|
||||||
15 | example = "example"
|
15 | example = "example"
|
||||||
16 | raise RuntimeError(f"This is an {example} exception")
|
16 | raise RuntimeError(f"This is an {example} exception")
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM102
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM102
|
||||||
|
|
|
|
||||||
|
= help: Assign to variable; remove f-string literal
|
||||||
|
|
||||||
EM.py:18:24: EM103 Exception must not use a `.format()` string directly, assign to variable first
|
ℹ Suggested fix
|
||||||
|
11 11 |
|
||||||
|
12 12 | def f_b():
|
||||||
|
13 13 | example = "example"
|
||||||
|
14 |- raise RuntimeError(f"This is an {example} exception")
|
||||||
|
14 |+ msg = f"This is an {example} exception"
|
||||||
|
15 |+ raise RuntimeError(msg)
|
||||||
|
15 16 |
|
||||||
|
16 17 |
|
||||||
|
17 18 | def f_c():
|
||||||
|
|
||||||
|
EM.py:18:24: EM103 [*] Exception must not use a `.format()` string directly, assign to variable first
|
||||||
|
|
|
|
||||||
18 | def f_c():
|
18 | def f_c():
|
||||||
19 | raise RuntimeError("This is an {example} exception".format(example="example"))
|
19 | raise RuntimeError("This is an {example} exception".format(example="example"))
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM103
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM103
|
||||||
|
|
|
|
||||||
|
= help: Assign to variable; remove `.format()` string
|
||||||
|
|
||||||
|
ℹ Suggested fix
|
||||||
|
15 15 |
|
||||||
|
16 16 |
|
||||||
|
17 17 | def f_c():
|
||||||
|
18 |- raise RuntimeError("This is an {example} exception".format(example="example"))
|
||||||
|
18 |+ msg = "This is an {example} exception".format(example="example")
|
||||||
|
19 |+ raise RuntimeError(msg)
|
||||||
|
19 20 |
|
||||||
|
20 21 |
|
||||||
|
21 22 | def f_ok():
|
||||||
|
|
||||||
|
EM.py:28:24: EM101 Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
||||||
|
28 | def f_unfixable():
|
||||||
|
29 | msg = "hello"
|
||||||
|
30 | raise RuntimeError("This is an example exception")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
|
|
||||||
|
|
||||||
|
EM.py:35:24: EM101 [*] Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
||||||
|
35 | msg = "hello"
|
||||||
|
36 |
|
||||||
|
37 | raise RuntimeError("This is an example exception")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
|
|
||||||
|
= help: Assign to variable; remove string literal
|
||||||
|
|
||||||
|
ℹ Suggested fix
|
||||||
|
32 32 | def nested():
|
||||||
|
33 33 | msg = "hello"
|
||||||
|
34 34 |
|
||||||
|
35 |- raise RuntimeError("This is an example exception")
|
||||||
|
35 |+ msg = "This is an example exception"
|
||||||
|
36 |+ raise RuntimeError(msg)
|
||||||
|
36 37 |
|
||||||
|
37 38 |
|
||||||
|
38 39 | def f_msg_in_parent_scope():
|
||||||
|
|
||||||
|
EM.py:42:28: EM101 Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
||||||
|
42 | def nested():
|
||||||
|
43 | raise RuntimeError("This is an example exception")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
|
|
||||||
|
|
||||||
|
EM.py:47:28: EM101 [*] Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
||||||
|
47 | def f_fix_indentation_check(foo):
|
||||||
|
48 | if foo:
|
||||||
|
49 | raise RuntimeError("This is an example exception")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
50 | else:
|
||||||
|
51 | if foo == "foo":
|
||||||
|
|
|
||||||
|
= help: Assign to variable; remove string literal
|
||||||
|
|
||||||
|
ℹ Suggested fix
|
||||||
|
44 44 |
|
||||||
|
45 45 | def f_fix_indentation_check(foo):
|
||||||
|
46 46 | if foo:
|
||||||
|
47 |- raise RuntimeError("This is an example exception")
|
||||||
|
47 |+ msg = "This is an example exception"
|
||||||
|
48 |+ raise RuntimeError(msg)
|
||||||
|
48 49 | else:
|
||||||
|
49 50 | if foo == "foo":
|
||||||
|
50 51 | raise RuntimeError(f"This is an exception: {foo}")
|
||||||
|
|
||||||
|
EM.py:50:32: EM102 [*] Exception must not use an f-string literal, assign to variable first
|
||||||
|
|
|
||||||
|
50 | else:
|
||||||
|
51 | if foo == "foo":
|
||||||
|
52 | raise RuntimeError(f"This is an exception: {foo}")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM102
|
||||||
|
53 | raise RuntimeError("This is an exception: {}".format(foo))
|
||||||
|
|
|
||||||
|
= help: Assign to variable; remove f-string literal
|
||||||
|
|
||||||
|
ℹ Suggested fix
|
||||||
|
47 47 | raise RuntimeError("This is an example exception")
|
||||||
|
48 48 | else:
|
||||||
|
49 49 | if foo == "foo":
|
||||||
|
50 |- raise RuntimeError(f"This is an exception: {foo}")
|
||||||
|
50 |+ msg = f"This is an exception: {foo}"
|
||||||
|
51 |+ raise RuntimeError(msg)
|
||||||
|
51 52 | raise RuntimeError("This is an exception: {}".format(foo))
|
||||||
|
52 53 |
|
||||||
|
53 54 |
|
||||||
|
|
||||||
|
EM.py:51:24: EM103 [*] Exception must not use a `.format()` string directly, assign to variable first
|
||||||
|
|
|
||||||
|
51 | if foo == "foo":
|
||||||
|
52 | raise RuntimeError(f"This is an exception: {foo}")
|
||||||
|
53 | raise RuntimeError("This is an exception: {}".format(foo))
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM103
|
||||||
|
|
|
||||||
|
= help: Assign to variable; remove `.format()` string
|
||||||
|
|
||||||
|
ℹ Suggested fix
|
||||||
|
48 48 | else:
|
||||||
|
49 49 | if foo == "foo":
|
||||||
|
50 50 | raise RuntimeError(f"This is an exception: {foo}")
|
||||||
|
51 |- raise RuntimeError("This is an exception: {}".format(foo))
|
||||||
|
51 |+ msg = "This is an exception: {}".format(foo)
|
||||||
|
52 |+ raise RuntimeError(msg)
|
||||||
|
52 53 |
|
||||||
|
53 54 |
|
||||||
|
54 55 | # Report these, but don't fix them
|
||||||
|
|
||||||
|
EM.py:55:28: EM101 Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
||||||
|
55 | # Report these, but don't fix them
|
||||||
|
56 | if foo: raise RuntimeError("This is an example exception")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
57 | if foo: x = 1; raise RuntimeError("This is an example exception")
|
||||||
|
|
|
||||||
|
|
||||||
|
EM.py:56:35: EM101 Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
||||||
|
56 | # Report these, but don't fix them
|
||||||
|
57 | if foo: raise RuntimeError("This is an example exception")
|
||||||
|
58 | if foo: x = 1; raise RuntimeError("This is an example exception")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,33 +1,195 @@
|
||||||
---
|
---
|
||||||
source: crates/ruff/src/rules/flake8_errmsg/mod.rs
|
source: crates/ruff/src/rules/flake8_errmsg/mod.rs
|
||||||
---
|
---
|
||||||
EM.py:5:24: EM101 Exception must not use a string literal, assign to variable first
|
EM.py:5:24: EM101 [*] Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
|
||||||
5 | def f_a():
|
5 | def f_a():
|
||||||
6 | raise RuntimeError("This is an example exception")
|
6 | raise RuntimeError("This is an example exception")
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
|
|
|
||||||
|
= help: Assign to variable; remove string literal
|
||||||
|
|
||||||
EM.py:9:24: EM101 Exception must not use a string literal, assign to variable first
|
ℹ Suggested fix
|
||||||
|
2 2 |
|
||||||
|
3 3 |
|
||||||
|
4 4 | def f_a():
|
||||||
|
5 |- raise RuntimeError("This is an example exception")
|
||||||
|
5 |+ msg = "This is an example exception"
|
||||||
|
6 |+ raise RuntimeError(msg)
|
||||||
|
6 7 |
|
||||||
|
7 8 |
|
||||||
|
8 9 | def f_a_short():
|
||||||
|
|
||||||
|
EM.py:9:24: EM101 [*] Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
|
||||||
9 | def f_a_short():
|
9 | def f_a_short():
|
||||||
10 | raise RuntimeError("Error")
|
10 | raise RuntimeError("Error")
|
||||||
| ^^^^^^^ EM101
|
| ^^^^^^^ EM101
|
||||||
|
|
|
|
||||||
|
= help: Assign to variable; remove string literal
|
||||||
|
|
||||||
EM.py:14:24: EM102 Exception must not use an f-string literal, assign to variable first
|
ℹ Suggested fix
|
||||||
|
6 6 |
|
||||||
|
7 7 |
|
||||||
|
8 8 | def f_a_short():
|
||||||
|
9 |- raise RuntimeError("Error")
|
||||||
|
9 |+ msg = "Error"
|
||||||
|
10 |+ raise RuntimeError(msg)
|
||||||
|
10 11 |
|
||||||
|
11 12 |
|
||||||
|
12 13 | def f_b():
|
||||||
|
|
||||||
|
EM.py:14:24: EM102 [*] Exception must not use an f-string literal, assign to variable first
|
||||||
|
|
|
|
||||||
14 | def f_b():
|
14 | def f_b():
|
||||||
15 | example = "example"
|
15 | example = "example"
|
||||||
16 | raise RuntimeError(f"This is an {example} exception")
|
16 | raise RuntimeError(f"This is an {example} exception")
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM102
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM102
|
||||||
|
|
|
|
||||||
|
= help: Assign to variable; remove f-string literal
|
||||||
|
|
||||||
EM.py:18:24: EM103 Exception must not use a `.format()` string directly, assign to variable first
|
ℹ Suggested fix
|
||||||
|
11 11 |
|
||||||
|
12 12 | def f_b():
|
||||||
|
13 13 | example = "example"
|
||||||
|
14 |- raise RuntimeError(f"This is an {example} exception")
|
||||||
|
14 |+ msg = f"This is an {example} exception"
|
||||||
|
15 |+ raise RuntimeError(msg)
|
||||||
|
15 16 |
|
||||||
|
16 17 |
|
||||||
|
17 18 | def f_c():
|
||||||
|
|
||||||
|
EM.py:18:24: EM103 [*] Exception must not use a `.format()` string directly, assign to variable first
|
||||||
|
|
|
|
||||||
18 | def f_c():
|
18 | def f_c():
|
||||||
19 | raise RuntimeError("This is an {example} exception".format(example="example"))
|
19 | raise RuntimeError("This is an {example} exception".format(example="example"))
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM103
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM103
|
||||||
|
|
|
|
||||||
|
= help: Assign to variable; remove `.format()` string
|
||||||
|
|
||||||
|
ℹ Suggested fix
|
||||||
|
15 15 |
|
||||||
|
16 16 |
|
||||||
|
17 17 | def f_c():
|
||||||
|
18 |- raise RuntimeError("This is an {example} exception".format(example="example"))
|
||||||
|
18 |+ msg = "This is an {example} exception".format(example="example")
|
||||||
|
19 |+ raise RuntimeError(msg)
|
||||||
|
19 20 |
|
||||||
|
20 21 |
|
||||||
|
21 22 | def f_ok():
|
||||||
|
|
||||||
|
EM.py:28:24: EM101 Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
||||||
|
28 | def f_unfixable():
|
||||||
|
29 | msg = "hello"
|
||||||
|
30 | raise RuntimeError("This is an example exception")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
|
|
||||||
|
|
||||||
|
EM.py:35:24: EM101 [*] Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
||||||
|
35 | msg = "hello"
|
||||||
|
36 |
|
||||||
|
37 | raise RuntimeError("This is an example exception")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
|
|
||||||
|
= help: Assign to variable; remove string literal
|
||||||
|
|
||||||
|
ℹ Suggested fix
|
||||||
|
32 32 | def nested():
|
||||||
|
33 33 | msg = "hello"
|
||||||
|
34 34 |
|
||||||
|
35 |- raise RuntimeError("This is an example exception")
|
||||||
|
35 |+ msg = "This is an example exception"
|
||||||
|
36 |+ raise RuntimeError(msg)
|
||||||
|
36 37 |
|
||||||
|
37 38 |
|
||||||
|
38 39 | def f_msg_in_parent_scope():
|
||||||
|
|
||||||
|
EM.py:42:28: EM101 Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
||||||
|
42 | def nested():
|
||||||
|
43 | raise RuntimeError("This is an example exception")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
|
|
||||||
|
|
||||||
|
EM.py:47:28: EM101 [*] Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
||||||
|
47 | def f_fix_indentation_check(foo):
|
||||||
|
48 | if foo:
|
||||||
|
49 | raise RuntimeError("This is an example exception")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
50 | else:
|
||||||
|
51 | if foo == "foo":
|
||||||
|
|
|
||||||
|
= help: Assign to variable; remove string literal
|
||||||
|
|
||||||
|
ℹ Suggested fix
|
||||||
|
44 44 |
|
||||||
|
45 45 | def f_fix_indentation_check(foo):
|
||||||
|
46 46 | if foo:
|
||||||
|
47 |- raise RuntimeError("This is an example exception")
|
||||||
|
47 |+ msg = "This is an example exception"
|
||||||
|
48 |+ raise RuntimeError(msg)
|
||||||
|
48 49 | else:
|
||||||
|
49 50 | if foo == "foo":
|
||||||
|
50 51 | raise RuntimeError(f"This is an exception: {foo}")
|
||||||
|
|
||||||
|
EM.py:50:32: EM102 [*] Exception must not use an f-string literal, assign to variable first
|
||||||
|
|
|
||||||
|
50 | else:
|
||||||
|
51 | if foo == "foo":
|
||||||
|
52 | raise RuntimeError(f"This is an exception: {foo}")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM102
|
||||||
|
53 | raise RuntimeError("This is an exception: {}".format(foo))
|
||||||
|
|
|
||||||
|
= help: Assign to variable; remove f-string literal
|
||||||
|
|
||||||
|
ℹ Suggested fix
|
||||||
|
47 47 | raise RuntimeError("This is an example exception")
|
||||||
|
48 48 | else:
|
||||||
|
49 49 | if foo == "foo":
|
||||||
|
50 |- raise RuntimeError(f"This is an exception: {foo}")
|
||||||
|
50 |+ msg = f"This is an exception: {foo}"
|
||||||
|
51 |+ raise RuntimeError(msg)
|
||||||
|
51 52 | raise RuntimeError("This is an exception: {}".format(foo))
|
||||||
|
52 53 |
|
||||||
|
53 54 |
|
||||||
|
|
||||||
|
EM.py:51:24: EM103 [*] Exception must not use a `.format()` string directly, assign to variable first
|
||||||
|
|
|
||||||
|
51 | if foo == "foo":
|
||||||
|
52 | raise RuntimeError(f"This is an exception: {foo}")
|
||||||
|
53 | raise RuntimeError("This is an exception: {}".format(foo))
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM103
|
||||||
|
|
|
||||||
|
= help: Assign to variable; remove `.format()` string
|
||||||
|
|
||||||
|
ℹ Suggested fix
|
||||||
|
48 48 | else:
|
||||||
|
49 49 | if foo == "foo":
|
||||||
|
50 50 | raise RuntimeError(f"This is an exception: {foo}")
|
||||||
|
51 |- raise RuntimeError("This is an exception: {}".format(foo))
|
||||||
|
51 |+ msg = "This is an exception: {}".format(foo)
|
||||||
|
52 |+ raise RuntimeError(msg)
|
||||||
|
52 53 |
|
||||||
|
53 54 |
|
||||||
|
54 55 | # Report these, but don't fix them
|
||||||
|
|
||||||
|
EM.py:55:28: EM101 Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
||||||
|
55 | # Report these, but don't fix them
|
||||||
|
56 | if foo: raise RuntimeError("This is an example exception")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
57 | if foo: x = 1; raise RuntimeError("This is an example exception")
|
||||||
|
|
|
||||||
|
|
||||||
|
EM.py:56:35: EM101 Exception must not use a string literal, assign to variable first
|
||||||
|
|
|
||||||
|
56 | # Report these, but don't fix them
|
||||||
|
57 | if foo: raise RuntimeError("This is an example exception")
|
||||||
|
58 | if foo: x = 1; raise RuntimeError("This is an example exception")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ EM101
|
||||||
|
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue