mirror of https://github.com/astral-sh/ruff
Merge 1134e85972 into b0bc990cbf
This commit is contained in:
commit
92c02f21b3
|
|
@ -136,4 +136,38 @@ os.chmod("pth1_file", 0o700, None, True, 1, *[1], **{"x": 1}, foo=1)
|
||||||
os.rename("pth1_file", "pth1_file1", None, None, 1, *[1], **{"x": 1}, foo=1)
|
os.rename("pth1_file", "pth1_file1", None, None, 1, *[1], **{"x": 1}, foo=1)
|
||||||
os.replace("pth1_file1", "pth1_file", None, None, 1, *[1], **{"x": 1}, foo=1)
|
os.replace("pth1_file1", "pth1_file", None, None, 1, *[1], **{"x": 1}, foo=1)
|
||||||
|
|
||||||
os.path.samefile("pth1_file", "pth1_link", 1, *[1], **{"x": 1}, foo=1)
|
os.path.samefile("pth1_file", "pth1_link", 1, *[1], **{"x": 1}, foo=1)
|
||||||
|
|
||||||
|
# See: https://github.com/astral-sh/ruff/issues/21794
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if os.rename("pth1.py", "pth1.py.bak"):
|
||||||
|
print("rename: truthy")
|
||||||
|
else:
|
||||||
|
print("rename: falsey")
|
||||||
|
|
||||||
|
if os.replace("pth1.py.bak", "pth1.py"):
|
||||||
|
print("replace: truthy")
|
||||||
|
else:
|
||||||
|
print("replace: falsey")
|
||||||
|
|
||||||
|
try:
|
||||||
|
for _ in os.getcwd():
|
||||||
|
print("getcwd: iterable")
|
||||||
|
break
|
||||||
|
except TypeError as e:
|
||||||
|
print("getcwd: not iterable")
|
||||||
|
|
||||||
|
try:
|
||||||
|
for _ in os.getcwdb():
|
||||||
|
print("getcwdb: iterable")
|
||||||
|
break
|
||||||
|
except TypeError as e:
|
||||||
|
print("getcwdb: not iterable")
|
||||||
|
|
||||||
|
try:
|
||||||
|
for _ in os.readlink(sys.executable):
|
||||||
|
print("readlink: iterable")
|
||||||
|
break
|
||||||
|
except TypeError as e:
|
||||||
|
print("readlink: not iterable")
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use ruff_python_ast::{self as ast, Arguments, Expr, ExprCall};
|
use ruff_python_ast::{self as ast, Arguments, Expr, ExprCall, Stmt};
|
||||||
use ruff_python_semantic::{SemanticModel, analyze::typing};
|
use ruff_python_semantic::{SemanticModel, analyze::typing};
|
||||||
use ruff_text_size::Ranged;
|
use ruff_text_size::Ranged;
|
||||||
|
|
||||||
|
|
@ -93,7 +93,9 @@ pub(crate) fn check_os_pathlib_single_arg_calls(
|
||||||
|
|
||||||
let applicability = match applicability {
|
let applicability = match applicability {
|
||||||
Applicability::DisplayOnly => Applicability::DisplayOnly,
|
Applicability::DisplayOnly => Applicability::DisplayOnly,
|
||||||
_ if checker.comment_ranges().intersects(range) => Applicability::Unsafe,
|
_ if checker.comment_ranges().intersects(range) || is_statement(checker) => {
|
||||||
|
Applicability::Unsafe
|
||||||
|
}
|
||||||
_ => applicability,
|
_ => applicability,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -174,7 +176,9 @@ pub(crate) fn check_os_pathlib_two_arg_calls(
|
||||||
|
|
||||||
let applicability = match applicability {
|
let applicability = match applicability {
|
||||||
Applicability::DisplayOnly => Applicability::DisplayOnly,
|
Applicability::DisplayOnly => Applicability::DisplayOnly,
|
||||||
_ if checker.comment_ranges().intersects(range) => Applicability::Unsafe,
|
_ if checker.comment_ranges().intersects(range) || is_statement(checker) => {
|
||||||
|
Applicability::Unsafe
|
||||||
|
}
|
||||||
_ => applicability,
|
_ => applicability,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -213,3 +217,10 @@ pub(crate) fn is_argument_non_default(arguments: &Arguments, name: &str, positio
|
||||||
pub(crate) fn is_top_level_expression_call(checker: &Checker) -> bool {
|
pub(crate) fn is_top_level_expression_call(checker: &Checker) -> bool {
|
||||||
checker.semantic().current_expression_parent().is_none()
|
checker.semantic().current_expression_parent().is_none()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn is_statement(checker: &Checker) -> bool {
|
||||||
|
matches!(
|
||||||
|
checker.semantic().current_statement(),
|
||||||
|
Stmt::If(_) | Stmt::For(_) | Stmt::While(_)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ use ruff_text_size::Ranged;
|
||||||
use crate::checkers::ast::Checker;
|
use crate::checkers::ast::Checker;
|
||||||
use crate::importer::ImportRequest;
|
use crate::importer::ImportRequest;
|
||||||
use crate::preview::is_fix_os_getcwd_enabled;
|
use crate::preview::is_fix_os_getcwd_enabled;
|
||||||
use crate::rules::flake8_use_pathlib::helpers::is_top_level_expression_call;
|
use crate::rules::flake8_use_pathlib::helpers::{is_statement, is_top_level_expression_call};
|
||||||
use crate::{FixAvailability, Violation};
|
use crate::{FixAvailability, Violation};
|
||||||
|
|
||||||
/// ## What it does
|
/// ## What it does
|
||||||
|
|
@ -90,6 +90,7 @@ pub(crate) fn os_getcwd(checker: &Checker, call: &ExprCall, segments: &[&str]) {
|
||||||
// Unsafe when the fix would delete comments or change a used return value
|
// Unsafe when the fix would delete comments or change a used return value
|
||||||
let applicability = if checker.comment_ranges().intersects(range)
|
let applicability = if checker.comment_ranges().intersects(range)
|
||||||
|| !is_top_level_expression_call(checker)
|
|| !is_top_level_expression_call(checker)
|
||||||
|
|| is_statement(checker)
|
||||||
{
|
{
|
||||||
Applicability::Unsafe
|
Applicability::Unsafe
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -567,5 +567,64 @@ PTH121 `os.path.samefile()` should be replaced by `Path.samefile()`
|
||||||
138 |
|
138 |
|
||||||
139 | os.path.samefile("pth1_file", "pth1_link", 1, *[1], **{"x": 1}, foo=1)
|
139 | os.path.samefile("pth1_file", "pth1_link", 1, *[1], **{"x": 1}, foo=1)
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
140 |
|
||||||
|
141 | # See: https://github.com/astral-sh/ruff/issues/21794
|
||||||
|
|
|
|
||||||
help: Replace with `Path(...).samefile()`
|
help: Replace with `Path(...).samefile()`
|
||||||
|
|
||||||
|
PTH104 `os.rename()` should be replaced by `Path.rename()`
|
||||||
|
--> full_name.py:144:4
|
||||||
|
|
|
||||||
|
142 | import sys
|
||||||
|
143 |
|
||||||
|
144 | if os.rename("pth1.py", "pth1.py.bak"):
|
||||||
|
| ^^^^^^^^^
|
||||||
|
145 | print("rename: truthy")
|
||||||
|
146 | else:
|
||||||
|
|
|
||||||
|
help: Replace with `Path(...).rename(...)`
|
||||||
|
|
||||||
|
PTH105 `os.replace()` should be replaced by `Path.replace()`
|
||||||
|
--> full_name.py:149:4
|
||||||
|
|
|
||||||
|
147 | print("rename: falsey")
|
||||||
|
148 |
|
||||||
|
149 | if os.replace("pth1.py.bak", "pth1.py"):
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
150 | print("replace: truthy")
|
||||||
|
151 | else:
|
||||||
|
|
|
||||||
|
help: Replace with `Path(...).replace(...)`
|
||||||
|
|
||||||
|
PTH109 `os.getcwd()` should be replaced by `Path.cwd()`
|
||||||
|
--> full_name.py:155:14
|
||||||
|
|
|
||||||
|
154 | try:
|
||||||
|
155 | for _ in os.getcwd():
|
||||||
|
| ^^^^^^^^^
|
||||||
|
156 | print("getcwd: iterable")
|
||||||
|
157 | break
|
||||||
|
|
|
||||||
|
help: Replace with `Path.cwd()`
|
||||||
|
|
||||||
|
PTH109 `os.getcwd()` should be replaced by `Path.cwd()`
|
||||||
|
--> full_name.py:162:14
|
||||||
|
|
|
||||||
|
161 | try:
|
||||||
|
162 | for _ in os.getcwdb():
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
163 | print("getcwdb: iterable")
|
||||||
|
164 | break
|
||||||
|
|
|
||||||
|
help: Replace with `Path.cwd()`
|
||||||
|
|
||||||
|
PTH115 `os.readlink()` should be replaced by `Path.readlink()`
|
||||||
|
--> full_name.py:169:14
|
||||||
|
|
|
||||||
|
168 | try:
|
||||||
|
169 | for _ in os.readlink(sys.executable):
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
170 | print("readlink: iterable")
|
||||||
|
171 | break
|
||||||
|
|
|
||||||
|
help: Replace with `Path(...).readlink()`
|
||||||
|
|
|
||||||
|
|
@ -1037,5 +1037,142 @@ PTH121 `os.path.samefile()` should be replaced by `Path.samefile()`
|
||||||
138 |
|
138 |
|
||||||
139 | os.path.samefile("pth1_file", "pth1_link", 1, *[1], **{"x": 1}, foo=1)
|
139 | os.path.samefile("pth1_file", "pth1_link", 1, *[1], **{"x": 1}, foo=1)
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
140 |
|
||||||
|
141 | # See: https://github.com/astral-sh/ruff/issues/21794
|
||||||
|
|
|
|
||||||
help: Replace with `Path(...).samefile()`
|
help: Replace with `Path(...).samefile()`
|
||||||
|
|
||||||
|
PTH104 [*] `os.rename()` should be replaced by `Path.rename()`
|
||||||
|
--> full_name.py:144:4
|
||||||
|
|
|
||||||
|
142 | import sys
|
||||||
|
143 |
|
||||||
|
144 | if os.rename("pth1.py", "pth1.py.bak"):
|
||||||
|
| ^^^^^^^^^
|
||||||
|
145 | print("rename: truthy")
|
||||||
|
146 | else:
|
||||||
|
|
|
||||||
|
help: Replace with `Path(...).rename(...)`
|
||||||
|
140 |
|
||||||
|
141 | # See: https://github.com/astral-sh/ruff/issues/21794
|
||||||
|
142 | import sys
|
||||||
|
143 + import pathlib
|
||||||
|
144 |
|
||||||
|
- if os.rename("pth1.py", "pth1.py.bak"):
|
||||||
|
145 + if pathlib.Path("pth1.py").rename("pth1.py.bak"):
|
||||||
|
146 | print("rename: truthy")
|
||||||
|
147 | else:
|
||||||
|
148 | print("rename: falsey")
|
||||||
|
note: This is an unsafe fix and may change runtime behavior
|
||||||
|
|
||||||
|
PTH105 [*] `os.replace()` should be replaced by `Path.replace()`
|
||||||
|
--> full_name.py:149:4
|
||||||
|
|
|
||||||
|
147 | print("rename: falsey")
|
||||||
|
148 |
|
||||||
|
149 | if os.replace("pth1.py.bak", "pth1.py"):
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
150 | print("replace: truthy")
|
||||||
|
151 | else:
|
||||||
|
|
|
||||||
|
help: Replace with `Path(...).replace(...)`
|
||||||
|
140 |
|
||||||
|
141 | # See: https://github.com/astral-sh/ruff/issues/21794
|
||||||
|
142 | import sys
|
||||||
|
143 + import pathlib
|
||||||
|
144 |
|
||||||
|
145 | if os.rename("pth1.py", "pth1.py.bak"):
|
||||||
|
146 | print("rename: truthy")
|
||||||
|
147 | else:
|
||||||
|
148 | print("rename: falsey")
|
||||||
|
149 |
|
||||||
|
- if os.replace("pth1.py.bak", "pth1.py"):
|
||||||
|
150 + if pathlib.Path("pth1.py.bak").replace("pth1.py"):
|
||||||
|
151 | print("replace: truthy")
|
||||||
|
152 | else:
|
||||||
|
153 | print("replace: falsey")
|
||||||
|
note: This is an unsafe fix and may change runtime behavior
|
||||||
|
|
||||||
|
PTH109 [*] `os.getcwd()` should be replaced by `Path.cwd()`
|
||||||
|
--> full_name.py:155:14
|
||||||
|
|
|
||||||
|
154 | try:
|
||||||
|
155 | for _ in os.getcwd():
|
||||||
|
| ^^^^^^^^^
|
||||||
|
156 | print("getcwd: iterable")
|
||||||
|
157 | break
|
||||||
|
|
|
||||||
|
help: Replace with `Path.cwd()`
|
||||||
|
140 |
|
||||||
|
141 | # See: https://github.com/astral-sh/ruff/issues/21794
|
||||||
|
142 | import sys
|
||||||
|
143 + import pathlib
|
||||||
|
144 |
|
||||||
|
145 | if os.rename("pth1.py", "pth1.py.bak"):
|
||||||
|
146 | print("rename: truthy")
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
153 | print("replace: falsey")
|
||||||
|
154 |
|
||||||
|
155 | try:
|
||||||
|
- for _ in os.getcwd():
|
||||||
|
156 + for _ in pathlib.Path.cwd():
|
||||||
|
157 | print("getcwd: iterable")
|
||||||
|
158 | break
|
||||||
|
159 | except TypeError as e:
|
||||||
|
note: This is an unsafe fix and may change runtime behavior
|
||||||
|
|
||||||
|
PTH109 [*] `os.getcwd()` should be replaced by `Path.cwd()`
|
||||||
|
--> full_name.py:162:14
|
||||||
|
|
|
||||||
|
161 | try:
|
||||||
|
162 | for _ in os.getcwdb():
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
163 | print("getcwdb: iterable")
|
||||||
|
164 | break
|
||||||
|
|
|
||||||
|
help: Replace with `Path.cwd()`
|
||||||
|
140 |
|
||||||
|
141 | # See: https://github.com/astral-sh/ruff/issues/21794
|
||||||
|
142 | import sys
|
||||||
|
143 + import pathlib
|
||||||
|
144 |
|
||||||
|
145 | if os.rename("pth1.py", "pth1.py.bak"):
|
||||||
|
146 | print("rename: truthy")
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
160 | print("getcwd: not iterable")
|
||||||
|
161 |
|
||||||
|
162 | try:
|
||||||
|
- for _ in os.getcwdb():
|
||||||
|
163 + for _ in pathlib.Path.cwd():
|
||||||
|
164 | print("getcwdb: iterable")
|
||||||
|
165 | break
|
||||||
|
166 | except TypeError as e:
|
||||||
|
note: This is an unsafe fix and may change runtime behavior
|
||||||
|
|
||||||
|
PTH115 [*] `os.readlink()` should be replaced by `Path.readlink()`
|
||||||
|
--> full_name.py:169:14
|
||||||
|
|
|
||||||
|
168 | try:
|
||||||
|
169 | for _ in os.readlink(sys.executable):
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
170 | print("readlink: iterable")
|
||||||
|
171 | break
|
||||||
|
|
|
||||||
|
help: Replace with `Path(...).readlink()`
|
||||||
|
140 |
|
||||||
|
141 | # See: https://github.com/astral-sh/ruff/issues/21794
|
||||||
|
142 | import sys
|
||||||
|
143 + import pathlib
|
||||||
|
144 |
|
||||||
|
145 | if os.rename("pth1.py", "pth1.py.bak"):
|
||||||
|
146 | print("rename: truthy")
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
167 | print("getcwdb: not iterable")
|
||||||
|
168 |
|
||||||
|
169 | try:
|
||||||
|
- for _ in os.readlink(sys.executable):
|
||||||
|
170 + for _ in pathlib.Path(sys.executable).readlink():
|
||||||
|
171 | print("readlink: iterable")
|
||||||
|
172 | break
|
||||||
|
173 | except TypeError as e:
|
||||||
|
note: This is an unsafe fix and may change runtime behavior
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue