ruff/crates/ruff_python_ast/src
Dan Parizher 1fd852fb3f
[ruff] Ignore str() when not used for simple conversion (RUF065) (#21330)
## Summary

Fixed RUF065 (`logging-eager-conversion`) to only flag `str()` calls
when they perform a simple conversion that can be safely removed. The
rule now ignores `str()` calls with no arguments, multiple arguments,
starred arguments, or keyword unpacking, preventing false positives.

Fixes #21315

## Problem Analysis

The RUF065 rule was incorrectly flagging all `str()` calls in logging
statements, even when `str()` was performing actual conversion work
beyond simple type coercion. Specifically, the rule flagged:

- `str()` with no arguments - which returns an empty string
- `str(b"data", "utf-8")` with multiple arguments - which performs
encoding conversion
- `str(*args)` with starred arguments - which unpacks arguments
- `str(**kwargs)` with keyword unpacking - which passes keyword
arguments

These cases cannot be safely removed because `str()` is doing meaningful
work (encoding conversion, argument unpacking, etc.), not just redundant
type conversion.

The root cause was that the rule only checked if the function was
`str()` without validating the call signature. It didn't distinguish
between simple `str(value)` conversions (which can be removed) and more
complex `str()` calls that perform actual work.

## Approach

The fix adds validation to the `str()` detection logic in
`logging_eager_conversion.rs`:

1. **Check argument count**: Only flag `str()` calls with exactly one
positional argument (`str_call_args.args.len() == 1`)
2. **Check for starred arguments**: Ensure the single argument is not
starred (`!str_call_args.args[0].is_starred_expr()`)
3. **Check for keyword arguments**: Ensure there are no keyword
arguments (`str_call_args.keywords.is_empty()`)

This ensures the rule only flags cases like `str(value)` where `str()`
is truly redundant and can be removed, while ignoring cases where
`str()` performs actual conversion work.

The fix maintains backward compatibility - all existing valid test cases
continue to be flagged correctly, while the new edge cases are properly
ignored.

---------

Co-authored-by: Brent Westbrook <brentrwestbrook@gmail.com>
2025-11-10 18:04:41 -05:00
..
visitor Disallow implicit concatenation of t-strings and other string types (#19485) 2025-07-27 12:41:03 +00:00
comparable.rs Update Rust toolchain to 1.89 (#19807) 2025-08-07 18:21:50 +02:00
docstrings.rs
expression.rs Disallow implicit concatenation of t-strings and other string types (#19485) 2025-07-27 12:41:03 +00:00
generated.rs [ruff] Autogenerate TypeParam nodes (#21028) 2025-10-22 14:06:24 +02:00
helpers.rs [flake8-simplify] Fix SIM222 false positive for tuple(generator) or None (SIM222) (#21187) 2025-11-10 14:27:31 +01:00
identifier.rs Switch to Rust 2024 edition (#18129) 2025-05-16 13:25:28 +02:00
int.rs [ty] Add environment variable to dump Salsa memory usage stats (#18928) 2025-06-26 21:27:51 +00:00
lib.rs include .pyw files by default when linting and formatting (#20458) 2025-09-24 08:39:30 -07:00
name.rs [ruff] Update schemars to v1 (#20942) 2025-10-20 08:59:52 +02:00
node.rs [ruff] Autogenerate TypeParam nodes (#21028) 2025-10-22 14:06:24 +02:00
node_index.rs [ty] Shrink size of AstNodeRef (#20028) 2025-08-22 17:03:22 -04:00
nodes.rs [ruff] Ignore str() when not used for simple conversion (RUF065) (#21330) 2025-11-10 18:04:41 -05:00
operator_precedence.rs Implement template strings (#17851) 2025-05-30 15:00:56 -05:00
parenthesize.rs Remove customizable reference enum names (#15647) 2025-01-21 13:46:31 -05:00
python_version.rs [ruff] Update schemars to v1 (#20942) 2025-10-20 08:59:52 +02:00
relocate.rs [ty] AST garbage collection (#18482) 2025-06-13 08:40:11 -04:00
script.rs bump MSRV to 1.83 (#16294) 2025-02-26 06:12:43 -08:00
statement_visitor.rs
stmt_if.rs Update Rust toolchain to 1.89 (#19807) 2025-08-07 18:21:50 +02:00
str.rs Track t-strings and f-strings for token-based rules and suppression comments (#20357) 2025-09-12 13:00:12 -05:00
str_prefix.rs Implement template strings (#17851) 2025-05-30 15:00:56 -05:00
traversal.rs Use referencial equality in traversal helper methods (#13895) 2024-10-24 11:30:22 +02:00
types.rs
visitor.rs Disallow implicit concatenation of t-strings and other string types (#19485) 2025-07-27 12:41:03 +00:00
whitespace.rs Switch to Rust 2024 edition (#18129) 2025-05-16 13:25:28 +02:00