ruff/crates/ruff_linter/resources/test/fixtures
Dylan 008bbfdf5a
Disallow implicit concatenation of t-strings and other string types (#19485)
As of [this cpython PR](https://github.com/python/cpython/pull/135996),
it is not allowed to concatenate t-strings with non-t-strings,
implicitly or explicitly. Expressions such as `"foo" t"{bar}"` are now
syntax errors.

This PR updates some AST nodes and parsing to reflect this change.

The structural change is that `TStringPart` is no longer needed, since,
as in the case of `BytesStringLiteral`, the only possibilities are that
we have a single `TString` or a vector of such (representing an implicit
concatenation of t-strings). This removes a level of nesting from many
AST expressions (which is what all the snapshot changes reflect), and
simplifies some logic in the implementation of visitors, for example.

The other change of note is in the parser. When we meet an implicit
concatenation of string-like literals, we now count the number of
t-string literals. If these do not exhaust the total number of
implicitly concatenated pieces, then we emit a syntax error. To recover
from this syntax error, we encode any t-string pieces as _invalid_
string literals (which means we flag them as invalid, record their
range, and record the value as `""`). Note that if at least one of the
pieces is an f-string we prefer to parse the entire string as an
f-string; otherwise we parse it as a string.

This logic is exactly the same as how we currently treat
`BytesStringLiteral` parsing and error recovery - and carries with it
the same pros and cons.

Finally, note that I have not implemented any changes in the
implementation of the formatter. As far as I can tell, none are needed.
I did change a few of the fixtures so that we are always concatenating
t-strings with t-strings.
2025-07-27 12:41:03 +00:00
..
airflow [`airflow`] Add unsafe fix for module moved cases (`AIR312`) (#18363) 2025-05-30 09:36:20 -04:00
control-flow-graph [`pylint`] Fix `unreachable` infinite loop (`PLW0101`) (#15278) 2025-01-08 09:45:04 -06:00
eradicate [`eradicate`] Correctly handle metadata blocks directly followed by normal blocks (`ERA001`) (#15330) 2025-01-07 16:22:22 -05:00
fastapi [`fastapi`] Avoid false positive for class dependencies (`FAST003`) (#18271) 2025-06-02 14:34:50 -04:00
filesystem
flake8_2020
flake8_annotations [ruff 0.8] [`flake8-annotations`] Remove deprecated rules ANN101 and ANN102 (#14384) 2024-11-20 13:11:51 +01:00
flake8_async [`flake8-async`] Mark autofix for `ASYNC115` as unsafe if the call expression contains comments (#18753) 2025-06-19 13:01:33 +02:00
flake8_bandit Disallow implicit concatenation of t-strings and other string types (#19485) 2025-07-27 12:41:03 +00:00
flake8_blind_except [`flake8-blind-except`] Change `BLE001` to permit `logging.critical(..., exc_info=True)`. (#19520) 2025-07-25 17:52:58 -04:00
flake8_boolean_trap FBT001: exclude boolean operators (#14203) 2024-11-10 22:40:37 +00:00
flake8_bugbear [`flake8-bugbear`] Fix B017 false negatives for keyword exception arguments (#19217) 2025-07-11 16:43:09 +00:00
flake8_builtins [flake8-builtins] Ignore variables matching module attribute names (A001) (#16454) 2025-03-03 11:10:23 +01:00
flake8_commas Enable token-based rules on source with syntax errors (#11950) 2024-07-02 08:57:46 +00:00
flake8_comprehensions [`flake8-comprehensions`] Fix `C420` to prepend whitespace when needed (#18616) 2025-06-30 12:38:26 -04:00
flake8_datetimez [`flake8-datetime`] Ignore `.replace()` calls while looking for `.astimezone` (#16050) 2025-02-09 15:48:59 +00:00
flake8_debugger [`flake8-debugger`] Also flag `sys.breakpointhook` and `sys.__breakpointhook__` (`T100`) (#16191) 2025-02-16 14:50:16 -05:00
flake8_django [`flake8_django`] Fix DJ008 false positive for abstract models with type-annotated `abstract` field (#19221) 2025-07-11 16:50:59 +00:00
flake8_errmsg [`flake8-errmsg`] Extend `EM101` to support byte strings (#18867) 2025-06-25 10:53:56 -04:00
flake8_executable [`flake8-executable`] Allow `uvx` in shebang line (`EXE003`) (#18967) 2025-06-30 09:38:18 -04:00
flake8_fixme Fix TODO directive out of bounds acccess (#13756) 2024-10-15 10:49:53 +02:00
flake8_future_annotations Avoid flagging `__future__` annotations as required for non-evaluated type annotations (#11414) 2024-05-21 18:57:13 +00:00
flake8_gettext Add t-string fixtures for rules that do not need to be modified (#19146) 2025-07-14 09:46:31 -05:00
flake8_implicit_str_concat Add Autofix for ISC003 (#18256) 2025-05-28 09:30:51 +02:00
flake8_import_conventions [flake8-import-conventions] Add import `numpy.typing as npt` to default `flake8-import-conventions.aliases` (#17133) 2025-04-02 09:25:46 +02:00
flake8_logging [`flake8-logging`] Avoid false positive for `exc_info=True` outside `logger.exception` (`LOG014`) (#18737) 2025-06-20 14:43:08 -04:00
flake8_logging_format Add t-string fixtures for rules that do not need to be modified (#19146) 2025-07-14 09:46:31 -05:00
flake8_no_pep420 Skip namespace package enforcement for PEP 723 scripts (#13974) 2024-10-29 02:11:31 +00:00
flake8_pie Fix F701 to F707 errors in tests (#19125) 2025-07-04 13:43:18 -05:00
flake8_print
flake8_pyi [`flake8-pyi`] Skip fix if all `Union` members are `None` (`PYI016`) (#19416) 2025-07-22 17:03:14 +00:00
flake8_pytest_style Add t-string fixtures for rules that do not need to be modified (#19146) 2025-07-14 09:46:31 -05:00
flake8_quotes Implement template strings (#17851) 2025-05-30 15:00:56 -05:00
flake8_raise [`flake8-raise`] Make fix unsafe if it deletes comments (`RSE102`) (#18788) 2025-06-21 19:09:40 +02:00
flake8_return [`flake8-return`] Fix false-positive for variables used inside nested functions in `RET504` (#18433) 2025-07-10 16:10:22 -04:00
flake8_self [`flake8-self`] Ignore attribute accesses on instance-like variables (`SLF001`) (#16149) 2025-02-23 10:00:49 +00:00
flake8_simplify Fix F701 to F707 errors in tests (#19125) 2025-07-04 13:43:18 -05:00
flake8_slots Avoid recommending `__slots__` for classes that inherit from more than `namedtuple` (#12531) 2024-07-26 14:24:40 +00:00
flake8_tidy_imports
flake8_todos [`flake8-todos`] Allow VSCode GitHub PR extension style links in `missing-todo-link` (`TD003`) (#15519) 2025-01-15 23:47:33 +00:00
flake8_type_checking [`flake8-type-checking`, `pyupgrade`, `ruff`] Add `from __future__ import annotations` when it would allow new fixes (`TC001`, `TC002`, `TC003`, `UP037`, `RUF013`) (#19100) 2025-07-16 08:50:52 -04:00
flake8_unused_arguments Add t-string fixtures for rules that do not need to be modified (#19146) 2025-07-14 09:46:31 -05:00
flake8_use_pathlib [`flake8-use-pathlib`] Add autofix for `PTH101`, `PTH104`, `PTH105`, `PTH121` (#19404) 2025-07-23 12:13:43 -04:00
flynt
isort Treat form feed as valid whitespace before a semicolon (#19343) 2025-07-16 16:39:05 -04:00
mccabe
numpy Ignore `NPY201` inside `except` blocks for compatibility with older numpy versions (#12490) 2024-07-24 20:03:23 +00:00
pandas_vet Limit inplace diagnostics to methods that accept inplace (#9495) 2024-01-12 14:12:54 -05:00
pep8_naming [`pep8-naming`] Fix `N802` false positives for `CGIHTTPRequestHandler` and `SimpleHTTPRequestHandler` (#19432) 2025-07-23 12:04:11 -04:00
perflint [`perflint`] Parenthesize generator expressions (`PERF401`) (#19325) 2025-07-23 12:08:15 -04:00
pycodestyle [`pycodestyle`] Handle brace escapes for t-strings in logical lines (#19358) 2025-07-15 14:48:48 +00:00
pydoclint Fix typos found by codespell (#14863) 2024-12-09 09:32:12 +00:00
pydocstyle [`pydoclint`] Fix `SyntaxError` from fixes with line continuations (`D201`, `D202`) (#19246) 2025-07-14 13:31:36 -04:00
pyflakes [`pyflakes`] Mark `F504`/`F522`/`F523` autofix as unsafe if there's a call with side effect (#18839) 2025-06-26 08:48:29 +00:00
pygrep_hooks [`pygrep_hooks`] Add `AsyncMock` methods to `invalid-mock-access` (`PGH005`) (#18547) 2025-06-24 17:27:21 -04:00
pylint [`pylint`] Handle empty comments after line continuation (`PLR2044`) (#19405) 2025-07-23 11:56:49 -04:00
pyupgrade Add t-string fixtures for rules that do not need to be modified (#19146) 2025-07-14 09:46:31 -05:00
refurb [`refurb`] Ignore decorated functions for `FURB118` (#19339) 2025-07-25 10:43:17 -05:00
ruff [`ruff`] Offer fixes for `RUF039` in more cases (#19065) 2025-07-24 11:45:45 -04:00
syntax_errors [semantic-syntax-tests] Add test fixtures for `AwaitOutsideAsyncFunction` (#17785) 2025-05-05 14:02:06 -04:00
tryceratops Recode `TRY302` to `TRY203` (#13502) 2024-10-17 16:35:12 +01:00
__init__.py [`pylint`] (Re-)Implement `import-private-name` (`C2701`) (#9553) 2024-01-16 14:03:11 -05:00