mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-04 10:48:32 +00:00
![]() <!-- Thank you for contributing to Ruff! To help us out with reviewing, please consider the following: - Does this pull request include a summary of the change? (See below.) - Does this pull request include a descriptive title? - Does this pull request include references to any relevant issues? --> ## Summary This PR improves the parentheses handling for with items to get closer to black's formatting. ### Case 1: ```python # Black / Input with ( [ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "bbbbbbbbbb", "cccccccccccccccccccccccccccccccccccccccccc", dddddddddddddddddddddddddddddddd, ] as example1, aaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccccc + ddddddddddddddddd as example2, CtxManager2() as example2, CtxManager2() as example2, CtxManager2() as example2, ): ... # Before with ( [ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "bbbbbbbbbb", "cccccccccccccccccccccccccccccccccccccccccc", dddddddddddddddddddddddddddddddd, ] as example1, ( aaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccccc + ddddddddddddddddd ) as example2, CtxManager2() as example2, CtxManager2() as example2, CtxManager2() as example2, ): ... ``` Notice how Ruff wraps the binary expression in an extra set of parentheses ### Case 2: Black does not expand the with-items if the with has no parentheses: ```python # Black / Input with aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb as c: ... # Before with ( aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb as c ): ... ``` Or ```python # Black / Input with [ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "bbbbbbbbbb", "cccccccccccccccccccccccccccccccccccccccccc", dddddddddddddddddddddddddddddddd, ] as example1, aaaaaaaaaaaaaaaaaaaaaaaaaa * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb * cccccccccccccccccccccccccccc + ddddddddddddddddd as example2, CtxManager222222222222222() as example2: ... # Before (Same as Case 1) with ( [ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "bbbbbbbbbb", "cccccccccccccccccccccccccccccccccccccccccc", dddddddddddddddddddddddddddddddd, ] as example1, ( aaaaaaaaaaaaaaaaaaaaaaaaaa * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb * cccccccccccccccccccccccccccc + ddddddddddddddddd ) as example2, CtxManager222222222222222() as example2, ): ... ``` ## Test Plan I added new snapshot tests Improves the django similarity index from 0.973 to 0.977 |
||
---|---|---|
.. | ||
black_compatibility@conditional_expression.py.snap | ||
black_compatibility@miscellaneous__blackd_diff.py.snap | ||
black_compatibility@miscellaneous__debug_visitor.py.snap | ||
black_compatibility@miscellaneous__decorators.py.snap | ||
black_compatibility@miscellaneous__docstring_no_string_normalization.py.snap | ||
black_compatibility@miscellaneous__docstring_preview_no_string_normalization.py.snap | ||
black_compatibility@miscellaneous__force_pyi.py.snap | ||
black_compatibility@miscellaneous__long_strings_flag_disabled.py.snap | ||
black_compatibility@miscellaneous__power_op_newline.py.snap | ||
black_compatibility@miscellaneous__string_quotes.py.snap | ||
black_compatibility@py_36__numeric_literals.py.snap | ||
black_compatibility@py_36__numeric_literals_skip_underscores.py.snap | ||
black_compatibility@py_37__python37.py.snap | ||
black_compatibility@py_38__pep_570.py.snap | ||
black_compatibility@py_38__pep_572.py.snap | ||
black_compatibility@py_38__python38.py.snap | ||
black_compatibility@py_39__pep_572_py39.py.snap | ||
black_compatibility@py_39__python39.py.snap | ||
black_compatibility@py_310__pattern_matching_complex.py.snap | ||
black_compatibility@py_310__pattern_matching_extras.py.snap | ||
black_compatibility@py_310__pattern_matching_generic.py.snap | ||
black_compatibility@py_310__pattern_matching_simple.py.snap | ||
black_compatibility@py_310__pattern_matching_style.py.snap | ||
black_compatibility@py_310__pep_572_py310.py.snap | ||
black_compatibility@py_310__remove_newline_after_match.py.snap | ||
black_compatibility@py_310__starred_for_target.py.snap | ||
black_compatibility@simple_cases__attribute_access_on_number_literals.py.snap | ||
black_compatibility@simple_cases__bracketmatch.py.snap | ||
black_compatibility@simple_cases__class_methods_new_line.py.snap | ||
black_compatibility@simple_cases__collections.py.snap | ||
black_compatibility@simple_cases__comment_after_escaped_newline.py.snap | ||
black_compatibility@simple_cases__comments2.py.snap | ||
black_compatibility@simple_cases__comments4.py.snap | ||
black_compatibility@simple_cases__comments6.py.snap | ||
black_compatibility@simple_cases__comments9.py.snap | ||
black_compatibility@simple_cases__comments_non_breaking_space.py.snap | ||
black_compatibility@simple_cases__composition.py.snap | ||
black_compatibility@simple_cases__composition_no_trailing_comma.py.snap | ||
black_compatibility@simple_cases__docstring.py.snap | ||
black_compatibility@simple_cases__docstring_preview.py.snap | ||
black_compatibility@simple_cases__empty_lines.py.snap | ||
black_compatibility@simple_cases__expression.py.snap | ||
black_compatibility@simple_cases__fmtonoff.py.snap | ||
black_compatibility@simple_cases__fmtonoff2.py.snap | ||
black_compatibility@simple_cases__fmtonoff3.py.snap | ||
black_compatibility@simple_cases__fmtonoff4.py.snap | ||
black_compatibility@simple_cases__fmtonoff5.py.snap | ||
black_compatibility@simple_cases__fmtskip.py.snap | ||
black_compatibility@simple_cases__fmtskip2.py.snap | ||
black_compatibility@simple_cases__fmtskip3.py.snap | ||
black_compatibility@simple_cases__fmtskip5.py.snap | ||
black_compatibility@simple_cases__fmtskip7.py.snap | ||
black_compatibility@simple_cases__fmtskip8.py.snap | ||
black_compatibility@simple_cases__fstring.py.snap | ||
black_compatibility@simple_cases__function.py.snap | ||
black_compatibility@simple_cases__function2.py.snap | ||
black_compatibility@simple_cases__import_spacing.py.snap | ||
black_compatibility@simple_cases__power_op_spacing.py.snap | ||
black_compatibility@simple_cases__remove_await_parens.py.snap | ||
black_compatibility@simple_cases__remove_except_parens.py.snap | ||
black_compatibility@simple_cases__remove_for_brackets.py.snap | ||
black_compatibility@simple_cases__remove_newline_after_code_block_open.py.snap | ||
black_compatibility@simple_cases__remove_parens.py.snap | ||
black_compatibility@simple_cases__return_annotation_brackets.py.snap | ||
black_compatibility@simple_cases__slices.py.snap | ||
black_compatibility@simple_cases__string_prefixes.py.snap | ||
black_compatibility@simple_cases__torture.py.snap | ||
black_compatibility@simple_cases__trailing_comma_optional_parens3.py.snap | ||
black_compatibility@simple_cases__trailing_commas_in_leading_parts.py.snap | ||
black_compatibility@simple_cases__tupleassign.py.snap | ||
black_compatibility@simple_cases__whitespace.py.snap | ||
format@carriage_return__string.py.snap | ||
format@expression__annotated_assign.py.snap | ||
format@expression__attribute.py.snap | ||
format@expression__binary.py.snap | ||
format@expression__boolean_operation.py.snap | ||
format@expression__call.py.snap | ||
format@expression__compare.py.snap | ||
format@expression__dict.py.snap | ||
format@expression__if.py.snap | ||
format@expression__list.py.snap | ||
format@expression__list_comp.py.snap | ||
format@expression__named_expr.py.snap | ||
format@expression__set_comp.py.snap | ||
format@expression__slice.py.snap | ||
format@expression__starred.py.snap | ||
format@expression__string.py.snap | ||
format@expression__tuple.py.snap | ||
format@expression__unary.py.snap | ||
format@skip_magic_trailing_comma.py.snap | ||
format@statement__ann_assign.py.snap | ||
format@statement__assert.py.snap | ||
format@statement__assign.py.snap | ||
format@statement__aug_assign.py.snap | ||
format@statement__break.py.snap | ||
format@statement__class_definition.py.snap | ||
format@statement__delete.py.snap | ||
format@statement__for.py.snap | ||
format@statement__function.py.snap | ||
format@statement__if.py.snap | ||
format@statement__import.py.snap | ||
format@statement__import_from.py.snap | ||
format@statement__raise.py.snap | ||
format@statement__try.py.snap | ||
format@statement__while.py.snap | ||
format@statement__with.py.snap | ||
format@trivia.py.snap |