mirror of https://github.com/astral-sh/ruff
Enable UTC-import for `datetime-utc-alias` fix (#5100)
## Summary Small update to leverage `get_or_import_symbol` to fix `UP017` in more cases (e.g., when we need to import `UTC`, or access it from an alias or something). ## Test Plan Check out the updated snapshot.
This commit is contained in:
parent
56476dfd61
commit
848f184b8c
|
|
@ -2,9 +2,9 @@ use rustpython_parser::ast::{Expr, Ranged};
|
||||||
|
|
||||||
use ruff_diagnostics::{AutofixKind, Diagnostic, Edit, Fix, 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::call_path::collect_call_path;
|
|
||||||
|
|
||||||
use crate::checkers::ast::Checker;
|
use crate::checkers::ast::Checker;
|
||||||
|
use crate::importer::ImportRequest;
|
||||||
use crate::registry::AsRule;
|
use crate::registry::AsRule;
|
||||||
|
|
||||||
#[violation]
|
#[violation]
|
||||||
|
|
@ -34,17 +34,15 @@ pub(crate) fn datetime_utc_alias(checker: &mut Checker, expr: &Expr) {
|
||||||
{
|
{
|
||||||
let mut diagnostic = Diagnostic::new(DatetimeTimezoneUTC, expr.range());
|
let mut diagnostic = Diagnostic::new(DatetimeTimezoneUTC, expr.range());
|
||||||
if checker.patch(diagnostic.kind.rule()) {
|
if checker.patch(diagnostic.kind.rule()) {
|
||||||
// If the reference was structured as, e.g., `datetime.timezone.utc`, then we can
|
diagnostic.try_set_fix(|| {
|
||||||
// replace it with `datetime.UTC`. If `timezone` was imported via `from datetime import
|
let (import_edit, binding) = checker.importer.get_or_import_symbol(
|
||||||
// timezone`, then the replacement is more complicated.
|
&ImportRequest::import_from("datetime", "UTC"),
|
||||||
if collect_call_path(expr).map_or(false, |call_path| {
|
expr.start(),
|
||||||
matches!(call_path.as_slice(), ["datetime", "timezone", "utc"])
|
checker.semantic(),
|
||||||
}) {
|
)?;
|
||||||
diagnostic.set_fix(Fix::suggested(Edit::range_replacement(
|
let reference_edit = Edit::range_replacement(binding, expr.range());
|
||||||
"datetime.UTC".to_string(),
|
Ok(Fix::suggested_edits(import_edit, [reference_edit]))
|
||||||
expr.range(),
|
});
|
||||||
)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
checker.diagnostics.push(diagnostic);
|
checker.diagnostics.push(diagnostic);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
source: crates/ruff/src/rules/pyupgrade/mod.rs
|
source: crates/ruff/src/rules/pyupgrade/mod.rs
|
||||||
---
|
---
|
||||||
UP017.py:7:7: UP017 Use `datetime.UTC` alias
|
UP017.py:7:7: UP017 [*] Use `datetime.UTC` alias
|
||||||
|
|
|
|
||||||
6 | print(datetime.timezone(-1))
|
6 | print(datetime.timezone(-1))
|
||||||
7 | print(timezone.utc)
|
7 | print(timezone.utc)
|
||||||
|
|
@ -10,7 +10,17 @@ UP017.py:7:7: UP017 Use `datetime.UTC` alias
|
||||||
|
|
|
|
||||||
= help: Convert to `datetime.UTC` alias
|
= help: Convert to `datetime.UTC` alias
|
||||||
|
|
||||||
UP017.py:8:7: UP017 Use `datetime.UTC` alias
|
ℹ Suggested fix
|
||||||
|
4 4 | from datetime import timezone as tz
|
||||||
|
5 5 |
|
||||||
|
6 6 | print(datetime.timezone(-1))
|
||||||
|
7 |-print(timezone.utc)
|
||||||
|
7 |+print(datetime.UTC)
|
||||||
|
8 8 | print(tz.utc)
|
||||||
|
9 9 |
|
||||||
|
10 10 | print(datetime.timezone.utc)
|
||||||
|
|
||||||
|
UP017.py:8:7: UP017 [*] Use `datetime.UTC` alias
|
||||||
|
|
|
|
||||||
6 | print(datetime.timezone(-1))
|
6 | print(datetime.timezone(-1))
|
||||||
7 | print(timezone.utc)
|
7 | print(timezone.utc)
|
||||||
|
|
@ -21,6 +31,16 @@ UP017.py:8:7: UP017 Use `datetime.UTC` alias
|
||||||
|
|
|
|
||||||
= help: Convert to `datetime.UTC` alias
|
= help: Convert to `datetime.UTC` alias
|
||||||
|
|
||||||
|
ℹ Suggested fix
|
||||||
|
5 5 |
|
||||||
|
6 6 | print(datetime.timezone(-1))
|
||||||
|
7 7 | print(timezone.utc)
|
||||||
|
8 |-print(tz.utc)
|
||||||
|
8 |+print(datetime.UTC)
|
||||||
|
9 9 |
|
||||||
|
10 10 | print(datetime.timezone.utc)
|
||||||
|
11 11 | print(dt.timezone.utc)
|
||||||
|
|
||||||
UP017.py:10:7: UP017 [*] Use `datetime.UTC` alias
|
UP017.py:10:7: UP017 [*] Use `datetime.UTC` alias
|
||||||
|
|
|
|
||||||
8 | print(tz.utc)
|
8 | print(tz.utc)
|
||||||
|
|
@ -39,7 +59,7 @@ UP017.py:10:7: UP017 [*] Use `datetime.UTC` alias
|
||||||
10 |+print(datetime.UTC)
|
10 |+print(datetime.UTC)
|
||||||
11 11 | print(dt.timezone.utc)
|
11 11 | print(dt.timezone.utc)
|
||||||
|
|
||||||
UP017.py:11:7: UP017 Use `datetime.UTC` alias
|
UP017.py:11:7: UP017 [*] Use `datetime.UTC` alias
|
||||||
|
|
|
|
||||||
10 | print(datetime.timezone.utc)
|
10 | print(datetime.timezone.utc)
|
||||||
11 | print(dt.timezone.utc)
|
11 | print(dt.timezone.utc)
|
||||||
|
|
@ -47,4 +67,11 @@ UP017.py:11:7: UP017 Use `datetime.UTC` alias
|
||||||
|
|
|
|
||||||
= help: Convert to `datetime.UTC` alias
|
= help: Convert to `datetime.UTC` alias
|
||||||
|
|
||||||
|
ℹ Suggested fix
|
||||||
|
8 8 | print(tz.utc)
|
||||||
|
9 9 |
|
||||||
|
10 10 | print(datetime.timezone.utc)
|
||||||
|
11 |-print(dt.timezone.utc)
|
||||||
|
11 |+print(datetime.UTC)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue