Format Compare Op

<!--
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 adds basic formatting for compare operations.

The implementation currently breaks diffeently when nesting binary like expressions. I haven't yet figured out what Black's logic is in that case but I think that this by itself is already an improvement worth merging.

<!-- What's the purpose of the change? What does it do, and why? -->

## Test Plan

I added a few new tests 

<!-- How was it tested? -->
This commit is contained in:
Micha Reiser 2023-06-23 09:35:29 +02:00 committed by GitHub
parent 2142bf6141
commit 3e12bdff45
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 735 additions and 244 deletions

View file

@ -1,23 +1,96 @@
use crate::comments::{leading_comments, Comments};
use crate::expression::binary_like::{BinaryLayout, FormatBinaryLike};
use crate::expression::parentheses::{
default_expression_needs_parentheses, NeedsParentheses, Parentheses, Parenthesize,
};
use crate::{not_yet_implemented_custom_text, FormatNodeRule, PyFormatter};
use crate::comments::Comments;
use ruff_formatter::{write, Buffer, FormatResult};
use rustpython_parser::ast::ExprCompare;
use crate::prelude::*;
use crate::FormatNodeRule;
use ruff_formatter::{
write, FormatError, FormatOwnedWithRule, FormatRefWithRule, FormatRuleWithOptions,
};
use ruff_python_ast::prelude::Expr;
use rustpython_parser::ast::{CmpOp, ExprCompare};
#[derive(Default)]
pub struct FormatExprCompare;
pub struct FormatExprCompare {
parentheses: Option<Parentheses>,
}
impl FormatRuleWithOptions<ExprCompare, PyFormatContext<'_>> for FormatExprCompare {
type Options = Option<Parentheses>;
fn with_options(mut self, options: Self::Options) -> Self {
self.parentheses = options;
self
}
}
impl FormatNodeRule<ExprCompare> for FormatExprCompare {
fn fmt_fields(&self, _item: &ExprCompare, f: &mut PyFormatter) -> FormatResult<()> {
write!(
f,
[not_yet_implemented_custom_text(
"NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right"
)]
)
fn fmt_fields(&self, item: &ExprCompare, f: &mut PyFormatter) -> FormatResult<()> {
item.fmt_binary(self.parentheses, f)
}
}
impl<'ast> FormatBinaryLike<'ast> for ExprCompare {
type FormatOperator = FormatOwnedWithRule<CmpOp, FormatCmpOp, PyFormatContext<'ast>>;
fn binary_layout(&self) -> BinaryLayout {
if self.ops.len() == 1 {
match self.comparators.as_slice() {
[right] => BinaryLayout::from_left_right(&self.left, right),
[..] => BinaryLayout::Default,
}
} else {
BinaryLayout::Default
}
}
fn fmt_default(&self, f: &mut PyFormatter<'ast, '_>) -> FormatResult<()> {
let ExprCompare {
range: _,
left,
ops,
comparators,
} = self;
let comments = f.context().comments().clone();
write!(f, [group(&left.format())])?;
assert_eq!(comparators.len(), ops.len());
for (operator, comparator) in ops.iter().zip(comparators) {
let leading_comparator_comments = comments.leading_comments(comparator);
if leading_comparator_comments.is_empty() {
write!(f, [soft_line_break_or_space()])?;
} else {
// Format the expressions leading comments **before** the operator
write!(
f,
[
hard_line_break(),
leading_comments(leading_comparator_comments)
]
)?;
}
write!(f, [operator.format(), space(), group(&comparator.format())])?;
}
Ok(())
}
fn left(&self) -> FormatResult<&Expr> {
Ok(self.left.as_ref())
}
fn right(&self) -> FormatResult<&Expr> {
self.comparators.last().ok_or(FormatError::SyntaxError)
}
fn operator(&self) -> Self::FormatOperator {
let op = *self.ops.first().unwrap();
op.into_format()
}
}
@ -28,6 +101,61 @@ impl NeedsParentheses for ExprCompare {
source: &str,
comments: &Comments,
) -> Parentheses {
default_expression_needs_parentheses(self.into(), parenthesize, source, comments)
match default_expression_needs_parentheses(self.into(), parenthesize, source, comments) {
parentheses @ Parentheses::Optional => match self.binary_layout() {
BinaryLayout::Default => parentheses,
BinaryLayout::ExpandRight
| BinaryLayout::ExpandLeft
| BinaryLayout::ExpandRightThenLeft
if self
.comparators
.last()
.map_or(false, |right| comments.has_leading_comments(right)) =>
{
parentheses
}
_ => Parentheses::Custom,
},
parentheses => parentheses,
}
}
}
#[derive(Copy, Clone)]
pub struct FormatCmpOp;
impl<'ast> AsFormat<PyFormatContext<'ast>> for CmpOp {
type Format<'a> = FormatRefWithRule<'a, CmpOp, FormatCmpOp, PyFormatContext<'ast>>;
fn format(&self) -> Self::Format<'_> {
FormatRefWithRule::new(self, FormatCmpOp)
}
}
impl<'ast> IntoFormat<PyFormatContext<'ast>> for CmpOp {
type Format = FormatOwnedWithRule<CmpOp, FormatCmpOp, PyFormatContext<'ast>>;
fn into_format(self) -> Self::Format {
FormatOwnedWithRule::new(self, FormatCmpOp)
}
}
impl FormatRule<CmpOp, PyFormatContext<'_>> for FormatCmpOp {
fn fmt(&self, item: &CmpOp, f: &mut Formatter<PyFormatContext<'_>>) -> FormatResult<()> {
let operator = match item {
CmpOp::Eq => "==",
CmpOp::NotEq => "!=",
CmpOp::Lt => "<",
CmpOp::LtE => "<=",
CmpOp::Gt => ">",
CmpOp::GtE => ">=",
CmpOp::Is => "is",
CmpOp::IsNot => "is not",
CmpOp::In => "in",
CmpOp::NotIn => "not in",
};
text(operator).fmt(f)
}
}

View file

@ -76,7 +76,7 @@ impl FormatRule<Expr, PyFormatContext<'_>> for FormatExpr {
Expr::Await(expr) => expr.format().fmt(f),
Expr::Yield(expr) => expr.format().fmt(f),
Expr::YieldFrom(expr) => expr.format().fmt(f),
Expr::Compare(expr) => expr.format().fmt(f),
Expr::Compare(expr) => expr.format().with_options(Some(parentheses)).fmt(f),
Expr::Call(expr) => expr.format().fmt(f),
Expr::FormattedValue(expr) => expr.format().fmt(f),
Expr::JoinedStr(expr) => expr.format().fmt(f),

View file

@ -19,11 +19,9 @@ lambda x=lambda y={1: 3}: y['x':lambda y: {1: 2}]: x
```diff
--- Black
+++ Ruff
@@ -1,4 +1,6 @@
@@ -1,4 +1,4 @@
-for ((x in {}) or {})["a"] in x:
+for ((NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right) or {})[
+ "NOT_YET_IMPLEMENTED_STRING"
+] in x:
+for ((x in {}) or {})["NOT_YET_IMPLEMENTED_STRING"] in x:
pass
-pem_spam = lambda l, spam={"x": 3}: not spam.get(l.strip())
-lambda x=lambda y={1: 3}: y["x" : lambda y: {1: 2}]: x
@ -34,9 +32,7 @@ lambda x=lambda y={1: 3}: y['x':lambda y: {1: 2}]: x
## Ruff Output
```py
for ((NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right) or {})[
"NOT_YET_IMPLEMENTED_STRING"
] in x:
for ((x in {}) or {})["NOT_YET_IMPLEMENTED_STRING"] in x:
pass
pem_spam = lambda x: True
lambda x: True

View file

@ -249,7 +249,7 @@ instruction()#comment with bad spacing
-if "PYTHON" in os.environ:
- add_compiler(compiler_from_env())
+if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+if "NOT_YET_IMPLEMENTED_STRING" in os.environ:
+ NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
else:
# for compiler in compilers.values():
@ -283,15 +283,13 @@ instruction()#comment with bad spacing
+ parameters.children[-1],
+ ] # type: ignore
if (
- self._proc is not None
+ NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
self._proc is not None
# has the child process finished?
- and self._returncode is None
+ and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
and self._returncode is None
# the child process has finished, but the
# transport hasn't been notified yet?
- and self._proc.poll() is None
+ and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ and NOT_IMPLEMENTED_call() is None
):
pass
# no newline before or after
@ -349,7 +347,7 @@ instruction()#comment with bad spacing
while True:
if False:
continue
@@ -141,24 +111,18 @@
@@ -141,24 +111,19 @@
# and round and round we go
# let's return
@ -374,13 +372,14 @@ instruction()#comment with bad spacing
def _init_host(self, parsed) -> None:
- if parsed.hostname is None or not parsed.hostname.strip(): # type: ignore
+ if (
+ NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right # type: ignore
+ parsed.hostname
+ is None # type: ignore
+ or not NOT_IMPLEMENTED_call()
+ ):
pass
@@ -167,7 +131,7 @@
@@ -167,7 +132,7 @@
#######################
@ -440,7 +439,7 @@ not_shareables = [
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg),
]
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if "NOT_YET_IMPLEMENTED_STRING" in os.environ:
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
else:
# for compiler in compilers.values():
@ -474,12 +473,12 @@ def inline_comments_in_brackets_ruin_everything():
parameters.children[-1],
] # type: ignore
if (
NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
self._proc is not None
# has the child process finished?
and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
and self._returncode is None
# the child process has finished, but the
# transport hasn't been notified yet?
and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
and NOT_IMPLEMENTED_call() is None
):
pass
# no newline before or after
@ -516,7 +515,8 @@ CONFIG_FILES = [CONFIG_FILE] + SHARED_CONFIG_FILES + USER_CONFIG_FILES # type:
class Test:
def _init_host(self, parsed) -> None:
if (
NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right # type: ignore
parsed.hostname
is None # type: ignore
or not NOT_IMPLEMENTED_call()
):
pass

View file

@ -83,7 +83,7 @@ def func():
+ if NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg):
embedded = []
for exc in exc_value.exceptions:
- if exc not in _seen:
if exc not in _seen:
- embedded.append(
- # This should be left alone (before)
- traceback.TracebackException.from_exception(
@ -97,7 +97,6 @@ def func():
- )
- # This should be left alone (after)
- )
+ if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+ NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
# everything is fine if the expression isn't nested
@ -130,7 +129,7 @@ def func():
if NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg):
embedded = []
for exc in exc_value.exceptions:
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if exc not in _seen:
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
# everything is fine if the expression isn't nested

View file

@ -101,8 +101,7 @@ if __name__ == "__main__":
-for i in range(100):
+for i in NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg):
# first we do this
- if i % 33 == 0:
+ if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if i % 33 == 0:
break
# then we do this
@ -117,11 +116,11 @@ if __name__ == "__main__":
-try:
- with open(some_other_file) as w:
- w.write(data)
-
-except OSError:
- print("problems")
+NOT_YET_IMPLEMENTED_StmtTry
-except OSError:
- print("problems")
-
-import sys
+NOT_YET_IMPLEMENTED_StmtImport
@ -151,7 +150,7 @@ if __name__ == "__main__":
-if __name__ == "__main__":
- main()
+if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+if __name__ == "NOT_YET_IMPLEMENTED_STRING":
+ NOT_IMPLEMENTED_call()
```
@ -170,7 +169,7 @@ while True:
for i in NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg):
# first we do this
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if i % 33 == 0:
break
# then we do this
@ -223,7 +222,7 @@ def g():
...
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if __name__ == "NOT_YET_IMPLEMENTED_STRING":
NOT_IMPLEMENTED_call()
```

View file

@ -105,7 +105,7 @@ def g():
```diff
--- Black
+++ Ruff
@@ -1,59 +1,46 @@
@@ -1,11 +1,11 @@
-"""Docstring."""
+"NOT_YET_IMPLEMENTED_STRING"
@ -121,13 +121,8 @@ def g():
t = leaf.type
p = leaf.parent # trailing comment
v = leaf.value
- if t in ALWAYS_NO_SPACE:
+ if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
pass
- if t == token.COMMENT: # another trailing comment
+ if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right: # another trailing comment
@@ -16,44 +16,51 @@
if t == token.COMMENT: # another trailing comment
return DOUBLESPACE
- assert p is not None, f"INTERNAL ERROR: hand-made leaf without parent: {leaf!r}"
@ -136,12 +131,11 @@ def g():
prev = leaf.prev_sibling
if not prev:
- prevp = preceding_leaf(p)
- if not prevp or prevp.type in OPENING_BRACKETS:
+ prevp = NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
+ if not prevp or NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if not prevp or prevp.type in OPENING_BRACKETS:
return NO
- if prevp.type == token.EQUAL:
if prevp.type == token.EQUAL:
- if prevp.parent and prevp.parent.type in {
- syms.typedargslist,
- syms.varargslist,
@ -149,11 +143,20 @@ def g():
- syms.arglist,
- syms.argument,
- }:
+ if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+ if prevp.parent and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+ if (
+ prevp.parent
+ and prevp.parent.type
+ in {
+ syms.typedargslist,
+ syms.varargslist,
+ syms.parameters,
+ syms.arglist,
+ syms.argument,
+ }
+ ):
return NO
- elif prevp.type == token.DOUBLESTAR:
elif prevp.type == token.DOUBLESTAR:
- if prevp.parent and prevp.parent.type in {
- syms.typedargslist,
- syms.varargslist,
@ -161,8 +164,17 @@ def g():
- syms.arglist,
- syms.dictsetmaker,
- }:
+ elif NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+ if prevp.parent and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+ if (
+ prevp.parent
+ and prevp.parent.type
+ in {
+ syms.typedargslist,
+ syms.varargslist,
+ syms.parameters,
+ syms.arglist,
+ syms.dictsetmaker,
+ }
+ ):
return NO
@ -181,15 +193,7 @@ def g():
t = leaf.type
p = leaf.parent
@@ -61,29 +48,23 @@
# Comment because comments
- if t in ALWAYS_NO_SPACE:
+ if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
pass
- if t == token.COMMENT:
+ if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
@@ -67,11 +74,11 @@
return DOUBLESPACE
# Another comment because more comments
@ -201,13 +205,12 @@ def g():
- prevp = preceding_leaf(p)
+ prevp = NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
- if not prevp or prevp.type in OPENING_BRACKETS:
+ if not prevp or NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if not prevp or prevp.type in OPENING_BRACKETS:
# Start of the line or a bracketed expression.
# More than one line for the comment.
@@ -79,11 +86,15 @@
return NO
- if prevp.type == token.EQUAL:
if prevp.type == token.EQUAL:
- if prevp.parent and prevp.parent.type in {
- syms.typedargslist,
- syms.varargslist,
@ -215,8 +218,17 @@ def g():
- syms.arglist,
- syms.argument,
- }:
+ if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+ if prevp.parent and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+ if (
+ prevp.parent
+ and prevp.parent.type
+ in {
+ syms.typedargslist,
+ syms.varargslist,
+ syms.parameters,
+ syms.arglist,
+ syms.argument,
+ }
+ ):
return NO
```
@ -236,9 +248,9 @@ def f():
p = leaf.parent # trailing comment
v = leaf.value
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if t in ALWAYS_NO_SPACE:
pass
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right: # another trailing comment
if t == token.COMMENT: # another trailing comment
return DOUBLESPACE
NOT_YET_IMPLEMENTED_StmtAssert
@ -246,15 +258,35 @@ def f():
prev = leaf.prev_sibling
if not prev:
prevp = NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
if not prevp or NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if not prevp or prevp.type in OPENING_BRACKETS:
return NO
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if prevp.parent and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if prevp.type == token.EQUAL:
if (
prevp.parent
and prevp.parent.type
in {
syms.typedargslist,
syms.varargslist,
syms.parameters,
syms.arglist,
syms.argument,
}
):
return NO
elif NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if prevp.parent and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
elif prevp.type == token.DOUBLESTAR:
if (
prevp.parent
and prevp.parent.type
in {
syms.typedargslist,
syms.varargslist,
syms.parameters,
syms.arglist,
syms.dictsetmaker,
}
):
return NO
@ -273,9 +305,9 @@ def g():
# Comment because comments
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if t in ALWAYS_NO_SPACE:
pass
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if t == token.COMMENT:
return DOUBLESPACE
# Another comment because more comments
@ -285,13 +317,23 @@ def g():
if not prev:
prevp = NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
if not prevp or NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if not prevp or prevp.type in OPENING_BRACKETS:
# Start of the line or a bracketed expression.
# More than one line for the comment.
return NO
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if prevp.parent and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if prevp.type == token.EQUAL:
if (
prevp.parent
and prevp.parent.type
in {
syms.typedargslist,
syms.varargslist,
syms.parameters,
syms.arglist,
syms.argument,
}
):
return NO
```

View file

@ -281,7 +281,8 @@ last_call()
~int and not v1 ^ 123 + v2 | True
(~int) and (not ((v1 ^ (123 + v2)) | True))
-+(really ** -(confusing ** ~(operator**-precedence)))
-flags & ~select.EPOLLIN and waiters.write_task is not None
++really ** -confusing ** ~operator**-precedence
flags & ~select.EPOLLIN and waiters.write_task is not None
-lambda arg: None
-lambda a=True: a
-lambda a, b, c=True: a
@ -304,8 +305,6 @@ last_call()
-)
-{"2.7": dead, "3.7": (long_live or die_hard)}
-{"2.7": dead, "3.7": (long_live or die_hard), **{"3.6": verygood}}
++really ** -confusing ** ~operator**-precedence
+flags & ~select.EPOLLIN and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+lambda x: True
+lambda x: True
+lambda x: True
@ -364,17 +363,17 @@ last_call()
- 4,
- 5,
-]
-[
- 4,
- *a,
- 5,
-]
+[1, 2, 3]
+[NOT_YET_IMPLEMENTED_ExprStarred]
+[NOT_YET_IMPLEMENTED_ExprStarred]
+[NOT_YET_IMPLEMENTED_ExprStarred, 4, 5]
+[4, NOT_YET_IMPLEMENTED_ExprStarred, 5]
[
- 4,
- *a,
- 5,
-]
-[
this_is_a_very_long_variable_which_will_force_a_delimiter_split,
element,
another,
@ -397,8 +396,21 @@ last_call()
- k: v
- for k, v in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension
-}
-Python3 > Python2 > COBOL
-Life is Life
+NOT_YET_IMPLEMENTED_ExprSetComp
+NOT_YET_IMPLEMENTED_ExprSetComp
+NOT_YET_IMPLEMENTED_ExprSetComp
+NOT_YET_IMPLEMENTED_ExprSetComp
+[i for i in []]
+[i for i in []]
+[i for i in []]
+[i for i in []]
+{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
+{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
+{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
+{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
+{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
Python3 > Python2 > COBOL
Life is Life
-call()
-call(arg)
-call(kwarg="hey")
@ -415,21 +427,6 @@ last_call()
-call(a, *gidgets[:2])
-call(**self.screen_kwargs)
-call(b, **self.screen_kwargs)
+NOT_YET_IMPLEMENTED_ExprSetComp
+NOT_YET_IMPLEMENTED_ExprSetComp
+NOT_YET_IMPLEMENTED_ExprSetComp
+NOT_YET_IMPLEMENTED_ExprSetComp
+[i for i in []]
+[i for i in []]
+[i for i in []]
+[i for i in []]
+{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
+{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
+{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
+{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
+{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
+NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+NOT_IMPLEMENTED_call()
+NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
+NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
@ -556,19 +553,10 @@ last_call()
-g = 1, *"ten"
-what_is_up_with_those_new_coord_names = (coord_names + set(vars_to_create)) + set(
- vars_to_remove
+e = NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
+f = 1, NOT_YET_IMPLEMENTED_ExprStarred
+g = 1, NOT_YET_IMPLEMENTED_ExprStarred
+what_is_up_with_those_new_coord_names = (
+ (coord_names + NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg))
+ + NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
)
-)
-what_is_up_with_those_new_coord_names = (coord_names | set(vars_to_create)) - set(
- vars_to_remove
+what_is_up_with_those_new_coord_names = (
+ (coord_names | NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg))
+ - NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
)
-)
-result = (
- session.query(models.Customer.id)
- .filter(
@ -576,7 +564,13 @@ last_call()
- )
- .order_by(models.Customer.id.asc())
- .all()
-)
+e = NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
+f = 1, NOT_YET_IMPLEMENTED_ExprStarred
+g = 1, NOT_YET_IMPLEMENTED_ExprStarred
+what_is_up_with_those_new_coord_names = (
+ (coord_names + NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg))
+ + NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
)
-result = (
- session.query(models.Customer.id)
- .filter(
@ -586,7 +580,10 @@ last_call()
- models.Customer.id.asc(),
- )
- .all()
-)
+what_is_up_with_those_new_coord_names = (
+ (coord_names | NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg))
+ - NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
)
-Ø = set()
-authors.łukasz.say_thanks()
+result = NOT_IMPLEMENTED_call()
@ -641,44 +638,29 @@ last_call()
...
for j in 1 + (2 + 3):
...
@@ -272,28 +254,16 @@
@@ -272,7 +254,7 @@
addr_proto,
addr_canonname,
addr_sockaddr,
-) in socket.getaddrinfo("google.com", "http"):
+) in NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg):
pass
-a = (
- aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
- in qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
-)
-a = (
- aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
- not in qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
-)
-a = (
- aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
- is qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
-)
-a = (
- aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
- is not qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
-)
+a = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+a = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+a = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+a = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
a = (
aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
@@ -291,9 +273,9 @@
is not qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
)
if (
- threading.current_thread() != threading.main_thread()
- and threading.current_thread() != threading.main_thread()
- or signal.getsignal(signal.SIGINT) != signal.default_int_handler
+ NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ or NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ NOT_IMPLEMENTED_call() != NOT_IMPLEMENTED_call()
+ and NOT_IMPLEMENTED_call() != NOT_IMPLEMENTED_call()
+ or NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg) != signal.default_int_handler
):
return True
if (
@@ -327,13 +297,18 @@
@@ -327,13 +309,18 @@
):
return True
if (
@ -700,7 +682,7 @@ last_call()
^ aaaaaaaa.i << aaaaaaaa.k >> aaaaaaaa.l**aaaaaaaa.m // aaaaaaaa.n
):
return True
@@ -341,7 +316,8 @@
@@ -341,7 +328,8 @@
~aaaaaaaaaaaaaaaa.a
+ aaaaaaaaaaaaaaaa.b
- aaaaaaaaaaaaaaaa.c * aaaaaaaaaaaaaaaa.d @ aaaaaaaaaaaaaaaa.e
@ -710,7 +692,7 @@ last_call()
^ aaaaaaaaaaaaaaaa.i
<< aaaaaaaaaaaaaaaa.k
>> aaaaaaaaaaaaaaaa.l**aaaaaaaaaaaaaaaa.m // aaaaaaaaaaaaaaaa.n
@@ -366,5 +342,5 @@
@@ -366,5 +354,5 @@
^ bbbb.a & aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
^ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
)
@ -756,7 +738,7 @@ not great
~int and not v1 ^ 123 + v2 | True
(~int) and (not ((v1 ^ (123 + v2)) | True))
+really ** -confusing ** ~operator**-precedence
flags & ~select.EPOLLIN and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
flags & ~select.EPOLLIN and waiters.write_task is not None
lambda x: True
lambda x: True
lambda x: True
@ -825,8 +807,8 @@ NOT_YET_IMPLEMENTED_ExprSetComp
{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
{NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
Python3 > Python2 > COBOL
Life is Life
NOT_IMPLEMENTED_call()
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
@ -980,14 +962,26 @@ for (
addr_sockaddr,
) in NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg):
pass
a = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
a = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
a = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
a = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
a = (
aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
in qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
)
a = (
aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
not in qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
)
a = (
aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
is qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
)
a = (
aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
is not qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
)
if (
NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
or NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
NOT_IMPLEMENTED_call() != NOT_IMPLEMENTED_call()
and NOT_IMPLEMENTED_call() != NOT_IMPLEMENTED_call()
or NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg) != signal.default_int_handler
):
return True
if (

View file

@ -152,21 +152,22 @@ elif unformatted:
# Regression test for https://github.com/psf/black/issues/3184.
@@ -52,29 +34,27 @@
async def call(param):
@@ -53,28 +35,29 @@
if param:
# fmt: off
- if param[0:4] in (
if param[0:4] in (
- "ABCD", "EFGH"
- ) :
+ if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+ "NOT_YET_IMPLEMENTED_STRING",
+ "NOT_YET_IMPLEMENTED_STRING",
+ ):
# fmt: on
- print ( "This won't be formatted" )
+ NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
- elif param[0:4] in ("ZZZZ",):
- print ( "This won't be formatted either" )
+ elif NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+ elif param[0:4] in ("NOT_YET_IMPLEMENTED_STRING",):
+ NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
- print("This will be formatted")
@ -189,7 +190,7 @@ elif unformatted:
# fmt: on
@@ -82,6 +62,6 @@
@@ -82,6 +65,6 @@
if x:
return x
# fmt: off
@ -239,11 +240,14 @@ class A:
async def call(param):
if param:
# fmt: off
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if param[0:4] in (
"NOT_YET_IMPLEMENTED_STRING",
"NOT_YET_IMPLEMENTED_STRING",
):
# fmt: on
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
elif NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
elif param[0:4] in ("NOT_YET_IMPLEMENTED_STRING",):
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)

View file

@ -411,7 +411,7 @@ d={'a':1,
- because . the . handling . inside . generate_ignored_nodes()
- now . considers . multiple . fmt . directives . within . one . prefix
+ this = NOT_IMPLEMENTED_call()
+ and_ = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ and_ = indeed.it is not formatted
+ NOT_IMPLEMENTED_call()
+ now.considers.multiple.fmt.directives.within.one.prefix
# fmt: on
@ -663,7 +663,7 @@ def on_and_off_broken():
# fmt: on
# fmt: off
this = NOT_IMPLEMENTED_call()
and_ = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
and_ = indeed.it is not formatted
NOT_IMPLEMENTED_call()
now.considers.multiple.fmt.directives.within.one.prefix
# fmt: on

View file

@ -22,15 +22,14 @@ else:
```diff
--- Black
+++ Ruff
@@ -1,9 +1,9 @@
@@ -1,9 +1,10 @@
a, b, c = 3, 4, 5
if (
- a == 3
a == 3
- and b != 9 # fmt: skip
- and c is not None
+ NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right # fmt: skip
+ and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ and b
+ != 9 # fmt: skip
and c is not None
):
- print("I'm good!")
+ NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
@ -44,9 +43,10 @@ else:
```py
a, b, c = 3, 4, 5
if (
NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right # fmt: skip
and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
a == 3
and b
!= 9 # fmt: skip
and c is not None
):
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
else:

View file

@ -107,7 +107,7 @@ with hmm_but_this_should_get_two_preceding_newlines():
-if os.name == "posix":
- import termios
+if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+if os.name == "NOT_YET_IMPLEMENTED_STRING":
+ NOT_YET_IMPLEMENTED_StmtImport
def i_should_be_followed_by_only_one_newline():
@ -124,7 +124,7 @@ with hmm_but_this_should_get_two_preceding_newlines():
-
- def i_should_be_followed_by_only_one_newline():
- pass
+elif NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+elif os.name == "NOT_YET_IMPLEMENTED_STRING":
+ NOT_YET_IMPLEMENTED_StmtTry
elif False:
@ -173,12 +173,12 @@ def h():
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if os.name == "NOT_YET_IMPLEMENTED_STRING":
NOT_YET_IMPLEMENTED_StmtImport
def i_should_be_followed_by_only_one_newline():
pass
elif NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
elif os.name == "NOT_YET_IMPLEMENTED_STRING":
NOT_YET_IMPLEMENTED_StmtTry
elif False:

View file

@ -94,7 +94,7 @@ some_module.some_function(
}
tup = (
1,
@@ -24,45 +24,23 @@
@@ -24,45 +24,37 @@
def f(
a: int = 1,
):
@ -112,9 +112,14 @@ some_module.some_function(
- "a": 1,
- "b": 2,
- }["a"]
- if (
- a
- == {
+ "NOT_YET_IMPLEMENTED_STRING": 1,
+ "NOT_YET_IMPLEMENTED_STRING": 2,
+ }[
+ "NOT_YET_IMPLEMENTED_STRING"
+ ]
if (
a
== {
- "a": 1,
- "b": 2,
- "c": 3,
@ -124,13 +129,18 @@ some_module.some_function(
- "g": 7,
- "h": 8,
- }["a"]
- ):
+ "NOT_YET_IMPLEMENTED_STRING": 1,
+ "NOT_YET_IMPLEMENTED_STRING": 2,
+ }[
+ "NOT_YET_IMPLEMENTED_STRING"
+ ]
+ if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+ "NOT_YET_IMPLEMENTED_STRING": 1,
+ "NOT_YET_IMPLEMENTED_STRING": 2,
+ "NOT_YET_IMPLEMENTED_STRING": 3,
+ "NOT_YET_IMPLEMENTED_STRING": 4,
+ "NOT_YET_IMPLEMENTED_STRING": 5,
+ "NOT_YET_IMPLEMENTED_STRING": 6,
+ "NOT_YET_IMPLEMENTED_STRING": 7,
+ "NOT_YET_IMPLEMENTED_STRING": 8,
+ }[
+ "NOT_YET_IMPLEMENTED_STRING"
+ ]
):
pass
@ -152,7 +162,7 @@ some_module.some_function(
}
@@ -80,35 +58,16 @@
@@ -80,35 +72,16 @@
pass
@ -231,7 +241,21 @@ def f(
}[
"NOT_YET_IMPLEMENTED_STRING"
]
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if (
a
== {
"NOT_YET_IMPLEMENTED_STRING": 1,
"NOT_YET_IMPLEMENTED_STRING": 2,
"NOT_YET_IMPLEMENTED_STRING": 3,
"NOT_YET_IMPLEMENTED_STRING": 4,
"NOT_YET_IMPLEMENTED_STRING": 5,
"NOT_YET_IMPLEMENTED_STRING": 6,
"NOT_YET_IMPLEMENTED_STRING": 7,
"NOT_YET_IMPLEMENTED_STRING": 8,
}[
"NOT_YET_IMPLEMENTED_STRING"
]
):
pass

View file

@ -99,13 +99,12 @@ return np.divide(
+i = NOT_IMPLEMENTED_call() ** 5
+j = NOT_IMPLEMENTED_call().name ** 5
+k = [i for i in []]
+l = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+l = mod.weights_[0] == NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
m = [([2**63], [1, 2**63])]
-n = count <= 10**5
n = count <= 10**5
-o = settings(max_examples=10**6)
-p = {(k, k**2): v**2 for k, v in pairs}
-q = [10**i for i in range(6)]
+n = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+o = NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
+p = {NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
+q = [i for i in []]
@ -131,13 +130,12 @@ return np.divide(
+i = NOT_IMPLEMENTED_call() ** 5.0
+j = NOT_IMPLEMENTED_call().name ** 5.0
+k = [i for i in []]
+l = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+l = mod.weights_[0] == NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
m = [([2.0**63.0], [1.0, 2**63.0])]
-n = count <= 10**5.0
n = count <= 10**5.0
-o = settings(max_examples=10**6.0)
-p = {(k, k**2): v**2.0 for k, v in pairs}
-q = [10.5**i for i in range(6)]
+n = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+o = NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
+p = {NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
+q = [i for i in []]
@ -187,9 +185,9 @@ h = 5 ** NOT_IMPLEMENTED_call()
i = NOT_IMPLEMENTED_call() ** 5
j = NOT_IMPLEMENTED_call().name ** 5
k = [i for i in []]
l = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
l = mod.weights_[0] == NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
m = [([2**63], [1, 2**63])]
n = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
n = count <= 10**5
o = NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
p = {NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
q = [i for i in []]
@ -206,9 +204,9 @@ h = 5.0 ** NOT_IMPLEMENTED_call()
i = NOT_IMPLEMENTED_call() ** 5.0
j = NOT_IMPLEMENTED_call().name ** 5.0
k = [i for i in []]
l = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
l = mod.weights_[0] == NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
m = [([2.0**63.0], [1.0, 2**63.0])]
n = NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
n = count <= 10**5.0
o = NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
p = {NOT_IMPLEMENTED_dict_key: NOT_IMPLEMENTED_dict_value for key, value in NOT_IMPLEMENTED_dict}
q = [i for i in []]

View file

@ -179,21 +179,21 @@ with open("/path/to/file.txt", mode="r") as read_file:
-if random.randint(0, 3) == 0:
- print("The new line above me is about to be removed!")
+if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+if NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg) == 0:
+ NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
-if random.randint(0, 3) == 0:
- print("The new lines above me is about to be removed!")
+if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+if NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg) == 0:
+ NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
-if random.randint(0, 3) == 0:
- if random.uniform(0, 1) > 0.5:
- print("Two lines above me are about to be removed!")
+if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+ if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
+if NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg) == 0:
+ if NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg) > 0.5:
+ NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
@ -273,16 +273,16 @@ for i in NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg):
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg) == 0:
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg) == 0:
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg) == 0:
if NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg) > 0.5:
NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)

View file

@ -95,10 +95,9 @@ x[
+slice[lambda x: True : lambda x: True]
+slice[lambda x: True :, None::]
slice[1 or 2 : True and False]
-slice[not so_simple : 1 < val <= 10]
slice[not so_simple : 1 < val <= 10]
-slice[(1 for i in range(42)) : x]
-slice[:: [i for i in range(42)]]
+slice[not so_simple : NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right]
+slice[(i for i in []) : x]
+slice[ :: [i for i in []]]
@ -161,7 +160,7 @@ slice[ : -1 :]
slice[lambda x: True : lambda x: True]
slice[lambda x: True :, None::]
slice[1 or 2 : True and False]
slice[not so_simple : NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right]
slice[not so_simple : 1 < val <= 10]
slice[(i for i in []) : x]
slice[ :: [i for i in []]]

View file

@ -65,7 +65,7 @@ assert (
importA
0
@@ -24,35 +14,15 @@
@@ -24,35 +14,34 @@
class A:
def foo(self):
@ -97,8 +97,27 @@ assert (
- othr.meta_data,
- othr.schedule,
+ return (
+ NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ 1 == 2
+ and (
+ name,
+ description,
+ self.default,
+ self.selected,
+ self.auto_generated,
+ self.parameters,
+ self.meta_data,
+ self.schedule,
+ )
+ == (
+ name,
+ description,
+ othr.default,
+ othr.selected,
+ othr.auto_generated,
+ othr.parameters,
+ othr.meta_data,
+ othr.schedule,
+ )
)
@ -134,8 +153,27 @@ class A:
def test(self, othr):
return (
NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
1 == 2
and (
name,
description,
self.default,
self.selected,
self.auto_generated,
self.parameters,
self.meta_data,
self.schedule,
)
== (
name,
description,
othr.default,
othr.selected,
othr.auto_generated,
othr.parameters,
othr.meta_data,
othr.schedule,
)
)

View file

@ -38,13 +38,14 @@ class A:
```diff
--- Black
+++ Ruff
@@ -1,34 +1,25 @@
@@ -1,34 +1,32 @@
-if e1234123412341234.winerror not in (
- _winapi.ERROR_SEM_TIMEOUT,
- _winapi.ERROR_PIPE_BUSY,
-) or _check_timeout(t):
+if (
+ NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ e1234123412341234.winerror
+ not in (_winapi.ERROR_SEM_TIMEOUT, _winapi.ERROR_PIPE_BUSY)
+ or NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
+):
pass
@ -82,7 +83,13 @@ class A:
- ) < self.connection.mysql_version < (10, 5, 2):
+ if (
+ self.connection.mysql_is_mariadb
+ and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ and (
+ 10,
+ 4,
+ 3,
+ )
+ < self.connection.mysql_version
+ < (10, 5, 2)
+ ):
pass
```
@ -91,7 +98,8 @@ class A:
```py
if (
NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
e1234123412341234.winerror
not in (_winapi.ERROR_SEM_TIMEOUT, _winapi.ERROR_PIPE_BUSY)
or NOT_IMPLEMENTED_call(NOT_IMPLEMENTED_arg)
):
pass
@ -112,7 +120,13 @@ class A:
def b(self):
if (
self.connection.mysql_is_mariadb
and NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
and (
10,
4,
3,
)
< self.connection.mysql_version
< (10, 5, 2)
):
pass
```

View file

@ -23,8 +23,8 @@ if (e123456.get_tk_patchlevel() >= (8, 6, 0, 'final') or
- 8,
-) <= get_tk_patchlevel() < (8, 6):
+if (
+ NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ or NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
+ NOT_IMPLEMENTED_call() >= (8, 6, 0, "NOT_YET_IMPLEMENTED_STRING")
+ or (8, 5, 8) <= NOT_IMPLEMENTED_call() < (8, 6)
+):
pass
```
@ -33,8 +33,8 @@ if (e123456.get_tk_patchlevel() >= (8, 6, 0, 'final') or
```py
if (
NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
or NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right
NOT_IMPLEMENTED_call() >= (8, 6, 0, "NOT_YET_IMPLEMENTED_STRING")
or (8, 5, 8) <= NOT_IMPLEMENTED_call() < (8, 6)
):
pass
```

View file

@ -252,7 +252,13 @@ aaaaaaaaaaaaaa + NOT_YET_IMPLEMENTED_ExprSetComp
# But only for expressions that have a statement parent.
not (aaaaaaaaaaaaaa + NOT_YET_IMPLEMENTED_ExprSetComp)
[NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right]
[
a
+ [
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,
]
in c,
]
# leading comment

View file

@ -0,0 +1,189 @@
---
source: crates/ruff_python_formatter/src/lib.rs
expression: snapshot
---
## Input
```py
a == b
a != b
a < b
a <= b
a > b
a >= b
a is b
a is not b
a in b
a not in b
(a ==
# comment
b
)
(a == # comment
b
)
a < b > c == d
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb > ccccccccccccccccccccccccccccc == ddddddddddddddddddddd
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa < [
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,
ff,
] < [ccccccccccccccccccccccccccccc, dddd] < ddddddddddddddddddddddddddddddddddddddddddd
return 1 == 2 and (
name,
description,
self_default,
self_selected,
self_auto_generated,
self_parameters,
self_meta_data,
self_schedule,
) == (
name,
description,
othr_default,
othr_selected,
othr_auto_generated,
othr_parameters,
othr_meta_data,
othr_schedule,
)
(name, description, self_default, self_selected, self_auto_generated, self_parameters, self_meta_data, self_schedule) == (name, description, other_default, othr_selected, othr_auto_generated, othr_parameters, othr_meta_data, othr_schedule)
((name, description, self_default, self_selected, self_auto_generated, self_parameters, self_meta_data, self_schedule) == (name, description, other_default, othr_selected, othr_auto_generated, othr_parameters, othr_meta_data, othr_schedule))
[
(
a
+ [
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
]
>= c
)
]
```
## Output
```py
a == b
a != b
a < b
a <= b
a > b
a >= b
a is b
a is not b
a in b
a not in b
(
a
# comment
== b
)
(
a # comment
== b
)
a < b > c == d
(
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
< bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
> ccccccccccccccccccccccccccccc
== ddddddddddddddddddddd
)
(
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
< [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, ff]
< [ccccccccccccccccccccccccccccc, dddd]
< ddddddddddddddddddddddddddddddddddddddddddd
)
return (
1 == 2
and (
name,
description,
self_default,
self_selected,
self_auto_generated,
self_parameters,
self_meta_data,
self_schedule,
)
== (
name,
description,
othr_default,
othr_selected,
othr_auto_generated,
othr_parameters,
othr_meta_data,
othr_schedule,
)
)
(
name,
description,
self_default,
self_selected,
self_auto_generated,
self_parameters,
self_meta_data,
self_schedule,
) == (
name,
description,
other_default,
othr_selected,
othr_auto_generated,
othr_parameters,
othr_meta_data,
othr_schedule,
)
(
(
name,
description,
self_default,
self_selected,
self_auto_generated,
self_parameters,
self_meta_data,
self_schedule,
)
== (
name,
description,
other_default,
othr_selected,
othr_auto_generated,
othr_parameters,
othr_meta_data,
othr_schedule,
)
)
[
(
a
+ [
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,
]
>= c
),
]
```

View file

@ -74,12 +74,12 @@ x = 3
## Output
```py
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right: # trailing if condition
if x == y: # trailing if condition
pass # trailing `pass` comment
# Root `if` trailing comment
# Leading elif comment
elif NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right: # trailing elif condition
elif x < y: # trailing elif condition
pass
# `elif` trailing comment
@ -89,11 +89,11 @@ else: # trailing else condition
# `else` trailing comment
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if x == y:
if y == z:
...
if NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
if a == b:
...
else: # trailing comment
...

View file

@ -62,7 +62,7 @@ class Test:
c = 30
while NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
while a == 10:
...
# trailing comment with one line before
@ -71,7 +71,7 @@ while NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
d = 40
while NOT_IMPLEMENTED_left < NOT_IMPLEMENTED_right:
while b == 20:
...
# no empty line before