Hello community,
here is the log from the commit of package python-yapf for openSUSE:Factory checked in at 2019-04-14 12:22:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-yapf (Old)
and /work/SRC/openSUSE:Factory/.python-yapf.new.27019 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-yapf"
Sun Apr 14 12:22:04 2019 rev:6 rq:692780 version:0.27.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-yapf/python-yapf.changes 2019-02-27 17:28:02.843344481 +0100
+++ /work/SRC/openSUSE:Factory/.python-yapf.new.27019/python-yapf.changes 2019-04-14 12:22:09.899742619 +0200
@@ -1,0 +2,6 @@
+Tue Apr 9 11:51:52 UTC 2019 - Marketa Calabkova
+
+- update to version 0.27.0
+ * mostly bugfix release, see CHANGELOG for details
+
+-------------------------------------------------------------------
Old:
----
yapf-0.26.0.tar.gz
New:
----
yapf-0.27.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-yapf.spec ++++++
--- /var/tmp/diff_new_pack.ofZ7zM/_old 2019-04-14 12:22:13.523746966 +0200
+++ /var/tmp/diff_new_pack.ofZ7zM/_new 2019-04-14 12:22:13.547746995 +0200
@@ -18,7 +18,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-yapf
-Version: 0.26.0
+Version: 0.27.0
Release: 0
Summary: A formatter for Python code
License: Apache-2.0
++++++ yapf-0.26.0.tar.gz -> yapf-0.27.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/CHANGELOG new/yapf-0.27.0/CHANGELOG
--- old/yapf-0.26.0/CHANGELOG 2019-02-09 08:11:25.000000000 +0100
+++ new/yapf-0.27.0/CHANGELOG 2019-04-07 12:43:54.000000000 +0200
@@ -2,6 +2,33 @@
# All notable changes to this project will be documented in this file.
# This project adheres to [Semantic Versioning](http://semver.org/).
+## [0.27.0] 2019-04-07
+### Added
+- `SPLIT_BEFORE_ARITHMETIC_OPERATOR` splits before an arithmetic operator when
+ set. `SPLIT_PENALTY_ARITHMETIC_OPERATOR` allows you to set the split penalty
+ around arithmetic operators.
+### Changed
+- Catch lib2to3's "TokenError" exception and output a nicer message.
+### Fixed
+- Parse integer lists correctly, removing quotes if the list is within a
+ string.
+- Adjust the penalties of bitwise operands for '&' and '^', similar to '|'.
+- Avoid splitting after opening parens if SPLIT_BEFORE_FIRST_ARGUMENT is set
+ to False.
+- Adjust default SPLIT_PENALTY_AFTER_OPENING_BRACKET.
+- Re-enable removal of extra lines on the boundaries of formatted regions.
+- Adjust list splitting to avoid splitting before a dictionary element, because
+ those are likely to be split anyway. If we do split, it leads to horrible
+ looking code.
+- Dictionary arguments were broken in a recent version. It resulted in
+ unreadable formatting, where the remaining arguments were indented far more
+ than the dictionary. Fixed so that if the dictionary is the first argument in
+ a function call and doesn't fit on a single line, then it forces a split.
+- Improve the connectiveness between items in a list. This prevents random
+ splitting when it's not 100% necessary.
+- Don't remove a comment attached to a previous object just because it's part
+ of the "prefix" of a function/class node.
+
## [0.26.0] 2019-02-08
### Added
- `ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNS` allows us to split before
@@ -10,7 +37,7 @@
if they have higher precedence than other operators in the same expression.
### Changed
- `SPACES_BEFORE_COMMENT` can now be assigned to a specific value (standard
- behavior) or a list of column values. When assigned to a list, trailing
+ behavior) or a list of column values. When assigned to a list, trailing
comments will be horizontally aligned to the first column value within
the list that is greater than the maximum line length in the block.
- Don't modify the vertical spacing of a line that has a comment "pylint:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/PKG-INFO new/yapf-0.27.0/PKG-INFO
--- old/yapf-0.26.0/PKG-INFO 2019-02-09 08:13:47.000000000 +0100
+++ new/yapf-0.27.0/PKG-INFO 2019-04-07 12:45:51.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: yapf
-Version: 0.26.0
+Version: 0.27.0
Summary: A formatter for Python code.
Home-page: UNKNOWN
Author: Bill Wendling
@@ -573,8 +573,11 @@
line that is too long, split such that all elements are on a single line.
``SPLIT_BEFORE_BITWISE_OPERATOR``
- Set to ``True`` to prefer splitting before ``&``, ``|`` or ``^`` rather
- than after.
+ Set to True to prefer splitting before '&', '|' or '^' rather than after.
+
+ ``SPLIT_BEFORE_ARITHMETIC_OPERATOR``
+ Set to True to prefer splitting before '+', '-', '*', '/', '//', or '@'
+ rather than after.
``SPLIT_BEFORE_CLOSING_BRACKET``
Split before the closing bracket if a list or dict literal doesn't fit on
@@ -647,6 +650,10 @@
``SPLIT_PENALTY_AFTER_UNARY_OPERATOR``
The penalty for splitting the line after a unary operator.
+ ``SPLIT_PENALTY_ARITHMETIC_OPERATOR``
+ The penalty of splitting the line around the ``+``, ``-``, ``*``, ``/``,
+ ``//``, ``%``, and ``@`` operators.
+
``SPLIT_PENALTY_BEFORE_IF_EXPR``
The penalty for splitting right before an ``if`` expression.
@@ -747,6 +754,31 @@
Please do! YAPF was designed to be used as a library as well as a command line
tool. This means that a tool or IDE plugin is free to use YAPF.
+ -----------------------------------------
+ I still get non Pep8 compliant code! Why?
+ -----------------------------------------
+
+ YAPF tries very hard to be fully PEP 8 compliant. However, it is paramount
+ to not risk altering the semantics of your code. Thus, YAPF tries to be as
+ safe as possible and does not change the token stream
+ (e.g., by adding parenthesis).
+ All these cases however, can be easily fixed manually. For instance,
+
+ .. code-block:: python
+
+ from my_package import my_function_1, my_function_2, my_function_3, my_function_4, my_function_5
+
+ FOO = my_variable_1 + my_variable_2 + my_variable_3 + my_variable_4 + my_variable_5 + my_variable_6 + my_variable_7 + my_variable_8
+
+ won't be split, but you can easily get it right by just adding parenthesis:
+
+ .. code-block:: python
+
+ from my_package import (my_function_1, my_function_2, my_function_3,
+ my_function_4, my_function_5)
+
+ FOO = (my_variable_1 + my_variable_2 + my_variable_3 + my_variable_4 +
+ my_variable_5 + my_variable_6 + my_variable_7 + my_variable_8)
Gory Details
============
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/README.rst new/yapf-0.27.0/README.rst
--- old/yapf-0.26.0/README.rst 2019-02-08 23:29:19.000000000 +0100
+++ new/yapf-0.27.0/README.rst 2019-03-24 08:56:40.000000000 +0100
@@ -565,8 +565,11 @@
line that is too long, split such that all elements are on a single line.
``SPLIT_BEFORE_BITWISE_OPERATOR``
- Set to ``True`` to prefer splitting before ``&``, ``|`` or ``^`` rather
- than after.
+ Set to True to prefer splitting before '&', '|' or '^' rather than after.
+
+``SPLIT_BEFORE_ARITHMETIC_OPERATOR``
+ Set to True to prefer splitting before '+', '-', '*', '/', '//', or '@'
+ rather than after.
``SPLIT_BEFORE_CLOSING_BRACKET``
Split before the closing bracket if a list or dict literal doesn't fit on
@@ -639,6 +642,10 @@
``SPLIT_PENALTY_AFTER_UNARY_OPERATOR``
The penalty for splitting the line after a unary operator.
+``SPLIT_PENALTY_ARITHMETIC_OPERATOR``
+ The penalty of splitting the line around the ``+``, ``-``, ``*``, ``/``,
+ ``//``, ``%``, and ``@`` operators.
+
``SPLIT_PENALTY_BEFORE_IF_EXPR``
The penalty for splitting right before an ``if`` expression.
@@ -739,6 +746,31 @@
Please do! YAPF was designed to be used as a library as well as a command line
tool. This means that a tool or IDE plugin is free to use YAPF.
+-----------------------------------------
+I still get non Pep8 compliant code! Why?
+-----------------------------------------
+
+YAPF tries very hard to be fully PEP 8 compliant. However, it is paramount
+to not risk altering the semantics of your code. Thus, YAPF tries to be as
+safe as possible and does not change the token stream
+(e.g., by adding parenthesis).
+All these cases however, can be easily fixed manually. For instance,
+
+.. code-block:: python
+
+ from my_package import my_function_1, my_function_2, my_function_3, my_function_4, my_function_5
+
+ FOO = my_variable_1 + my_variable_2 + my_variable_3 + my_variable_4 + my_variable_5 + my_variable_6 + my_variable_7 + my_variable_8
+
+won't be split, but you can easily get it right by just adding parenthesis:
+
+.. code-block:: python
+
+ from my_package import (my_function_1, my_function_2, my_function_3,
+ my_function_4, my_function_5)
+
+ FOO = (my_variable_1 + my_variable_2 + my_variable_3 + my_variable_4 +
+ my_variable_5 + my_variable_6 + my_variable_7 + my_variable_8)
Gory Details
============
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapf/__init__.py new/yapf-0.27.0/yapf/__init__.py
--- old/yapf-0.26.0/yapf/__init__.py 2019-02-09 08:11:25.000000000 +0100
+++ new/yapf-0.27.0/yapf/__init__.py 2019-04-07 12:43:41.000000000 +0200
@@ -32,13 +32,15 @@
import os
import sys
+from lib2to3.pgen2 import tokenize
+
from yapf.yapflib import errors
from yapf.yapflib import file_resources
from yapf.yapflib import py3compat
from yapf.yapflib import style
from yapf.yapflib import yapf_api
-__version__ = '0.26.0'
+__version__ = '0.27.0'
def main(argv):
@@ -182,12 +184,17 @@
source = [line.rstrip() for line in original_source]
source[0] = py3compat.removeBOM(source[0])
- reformatted_source, _ = yapf_api.FormatCode(
- py3compat.unicode('\n'.join(source) + '\n'),
- filename='<stdin>',
- style_config=style_config,
- lines=lines,
- verify=args.verify)
+
+ try:
+ reformatted_source, _ = yapf_api.FormatCode(
+ py3compat.unicode('\n'.join(source) + '\n'),
+ filename='<stdin>',
+ style_config=style_config,
+ lines=lines,
+ verify=args.verify)
+ except tokenize.TokenError as e:
+ raise errors.YapfError('%s:%s' % (e.args[1][0], e.args[0]))
+
file_resources.WriteReformattedCode('<stdout>', reformatted_source)
return 0
@@ -195,9 +202,9 @@
exclude_patterns_from_ignore_file = file_resources.GetExcludePatternsForDir(
os.getcwd())
- files = file_resources.GetCommandLineFiles(
- args.files, args.recursive,
- (args.exclude or []) + exclude_patterns_from_ignore_file)
+ files = file_resources.GetCommandLineFiles(args.files, args.recursive,
+ (args.exclude or []) +
+ exclude_patterns_from_ignore_file)
if not files:
raise errors.YapfError('Input filenames did not match any python files')
@@ -291,6 +298,8 @@
file_resources.WriteReformattedCode(filename, reformatted_code, encoding,
in_place)
return has_change
+ except tokenize.TokenError as e:
+ raise errors.YapfError('%s:%s:%s' % (filename, e.args[1][0], e.args[0]))
except SyntaxError as e:
e.filename = filename
raise
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapf/yapflib/comment_splicer.py new/yapf-0.27.0/yapf/yapflib/comment_splicer.py
--- old/yapf-0.26.0/yapf/yapflib/comment_splicer.py 2018-08-27 06:43:49.000000000 +0200
+++ new/yapf-0.27.0/yapf/yapflib/comment_splicer.py 2019-04-07 12:40:17.000000000 +0200
@@ -152,6 +152,16 @@
# parent to insert into. See comments above
# _STANDALONE_LINE_NODES for more details.
node_with_line_parent = _FindNodeWithStandaloneLineParent(child)
+
+ if pytree_utils.NodeName(
+ node_with_line_parent.parent) in {'funcdef', 'classdef'}:
+ # Keep a comment that's not attached to a function or class
+ # next to the object it is attached to.
+ comment_end = (
+ comment_lineno + comment_prefix.rstrip('\n').count('\n'))
+ if comment_end < node_with_line_parent.lineno - 1:
+ node_with_line_parent = node_with_line_parent.parent
+
pytree_utils.InsertNodesBefore(
_CreateCommentsFromPrefix(
comment_prefix, comment_lineno, 0, standalone=True),
@@ -177,8 +187,8 @@
rindex = (0 if '\n' not in comment_prefix.rstrip() else
comment_prefix.rstrip().rindex('\n') + 1)
comment_column = (
- len(comment_prefix[rindex:]) - len(
- comment_prefix[rindex:].lstrip()))
+ len(comment_prefix[rindex:]) -
+ len(comment_prefix[rindex:].lstrip()))
comments = _CreateCommentsFromPrefix(
comment_prefix,
comment_lineno,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapf/yapflib/format_decision_state.py new/yapf-0.27.0/yapf/yapflib/format_decision_state.py
--- old/yapf-0.26.0/yapf/yapflib/format_decision_state.py 2018-12-05 04:29:56.000000000 +0100
+++ new/yapf-0.27.0/yapf/yapflib/format_decision_state.py 2019-04-07 11:18:51.000000000 +0200
@@ -281,7 +281,8 @@
if not self._FitsOnLine(current, tok.matching_bracket):
return True
- if current.OpensScope() and previous.value == ',':
+ if (current.OpensScope() and previous.value == ',' and
+ format_token.Subtype.DICTIONARY_KEY not in current.next_token.subtypes):
# If we have a list of tuples, then we can get a similar look as above. If
# the full list cannot fit on the line, then we want a split.
open_bracket = unwrapped_line.IsSurroundedByBrackets(current)
@@ -359,6 +360,11 @@
# assigns.
return False
+ # Don't split if not required
+ if (not style.Get('SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN') and
+ not style.Get('SPLIT_BEFORE_FIRST_ARGUMENT')):
+ return False
+
column = self.column - self.stack[-1].last_space
return column > style.Get('CONTINUATION_INDENT_WIDTH')
@@ -410,14 +416,34 @@
return True
pprevious = previous.previous_token
+
+ # A function call with a dictionary as its first argument may result in
+ # unreadable formatting if the dictionary spans multiple lines. The
+ # dictionary itself is formatted just fine, but the remaning arguments are
+ # indented too far:
+ #
+ # function_call({
+ # KEY_1: 'value one',
+ # KEY_2: 'value two',
+ # },
+ # default=False)
+ if (current.value == '{' and previous.value == '(' and pprevious and
+ pprevious.is_name):
+ dict_end = current.matching_bracket
+ next_token = dict_end.next_token
+ if next_token.value == ',' and not self._FitsOnLine(current, dict_end):
+ return True
+
if (current.is_name and pprevious and pprevious.is_name and
previous.value == '('):
+
if (not self._FitsOnLine(previous, previous.matching_bracket) and
_IsFunctionCallWithArguments(current)):
# There is a function call, with more than 1 argument, where the first
- # argument is itself a function call with arguments. In this specific
- # case, if we split after the first argument's opening '(', then the
- # formatting will look bad for the rest of the arguments. E.g.:
+ # argument is itself a function call with arguments that does not fit
+ # into the line. In this specific case, if we split after the first
+ # argument's opening '(', then the formatting will look bad for the
+ # rest of the arguments. E.g.:
#
# outer_function_call(inner_function_call(
# inner_arg1, inner_arg2),
@@ -425,7 +451,31 @@
#
# Instead, enforce a split before that argument to keep things looking
# good.
- return True
+ if (style.Get('SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN') or
+ style.Get('SPLIT_BEFORE_FIRST_ARGUMENT')):
+ return True
+
+ opening = _GetOpeningBracket(current)
+ if (opening and opening.value == '(' and opening.previous_token and
+ (opening.previous_token.is_name or
+ opening.previous_token.value in {'*', '**'})):
+ is_func_call = False
+ opening = current
+ while opening:
+ if opening.value == '(':
+ is_func_call = True
+ break
+ if (not (opening.is_name or opening.value in {'*', '**'}) and
+ opening.value != '.'):
+ break
+ opening = opening.next_token
+
+ if is_func_call:
+ if (not self._FitsOnLine(current, opening.matching_bracket) or
+ (opening.matching_bracket.next_token and
+ opening.matching_bracket.next_token.value != ',' and
+ not opening.matching_bracket.next_token.ClosesScope())):
+ return True
if (previous.OpensScope() and not current.OpensScope() and
not current.is_comment and
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapf/yapflib/format_token.py new/yapf-0.27.0/yapf/yapflib/format_token.py
--- old/yapf-0.26.0/yapf/yapflib/format_token.py 2019-02-08 23:29:19.000000000 +0100
+++ new/yapf-0.27.0/yapf/yapflib/format_token.py 2019-03-27 05:32:40.000000000 +0100
@@ -89,6 +89,7 @@
the code.
Attributes:
+ node: The PyTree node this token represents.
next_token: The token in the unwrapped line after this token or None if this
is the last token in the unwrapped line.
previous_token: The token in the unwrapped line before this token or None if
@@ -169,8 +170,8 @@
else:
indent_before = '\t' * indent_level + ' ' * spaces
else:
- indent_before = (
- ' ' * indent_level * style.Get('INDENT_WIDTH') + ' ' * spaces)
+ indent_before = (' ' * indent_level * style.Get('INDENT_WIDTH') +
+ ' ' * spaces)
if self.is_comment:
comment_lines = [s.lstrip() for s in self.value.splitlines()]
@@ -180,15 +181,15 @@
self.value = self.node.value
if not self.whitespace_prefix:
- self.whitespace_prefix = (
- '\n' * (self.newlines or newlines_before) + indent_before)
+ self.whitespace_prefix = ('\n' * (self.newlines or newlines_before) +
+ indent_before)
else:
self.whitespace_prefix += indent_before
def AdjustNewlinesBefore(self, newlines_before):
"""Change the number of newlines before this token."""
- self.whitespace_prefix = (
- '\n' * newlines_before + self.whitespace_prefix.lstrip('\n'))
+ self.whitespace_prefix = ('\n' * newlines_before +
+ self.whitespace_prefix.lstrip('\n'))
def RetainHorizontalSpacing(self, first_column, depth):
"""Retains a token's horizontal spacing."""
@@ -342,18 +343,14 @@
@property
@py3compat.lru_cache()
def is_multiline_string(self):
- """A multiline string."""
- if py3compat.PY3:
- prefix = '('
- prefix += 'r|u|R|U|f|F|fr|Fr|fR|FR|rf|rF|Rf|RF' # strings
- prefix += '|b|B|br|Br|bR|BR|rb|rB|Rb|RB' # bytes
- prefix += ')?'
- else:
- prefix = '[uUbB]?[rR]?'
+ """Test if this string is a multiline string.
- regex = r'^{prefix}(?P<delim>"""|\'\'\').*(?P=delim)$'.format(prefix=prefix)
- return (self.is_string and
- re.match(regex, self.value, re.DOTALL) is not None)
+ Returns:
+ A multiline string always ends with triple quotes, so if it is a string
+ token, inspect the last 3 characters and return True if it is a triple
+ double or triple single quote mark.
+ """
+ return self.is_string and self.value.endswith(('"""', "'''"))
@property
@py3compat.lru_cache()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapf/yapflib/reformatter.py new/yapf-0.27.0/yapf/yapflib/reformatter.py
--- old/yapf-0.26.0/yapf/yapflib/reformatter.py 2018-12-05 07:46:02.000000000 +0100
+++ new/yapf-0.27.0/yapf/yapflib/reformatter.py 2019-04-07 11:58:21.000000000 +0200
@@ -114,12 +114,22 @@
def _RetainRequiredVerticalSpacing(cur_uwline, prev_uwline, lines):
+ """Retain all vertical spacing between lines."""
+ if cur_uwline.disable and (not prev_uwline or prev_uwline.disable):
+ # If both lines are disabled we aren't allowed to reformat anything.
+ lines = set()
+
prev_tok = None
if prev_uwline is not None:
prev_tok = prev_uwline.last
for cur_tok in cur_uwline.tokens:
_RetainRequiredVerticalSpacingBetweenTokens(cur_tok, prev_tok, lines)
+
prev_tok = cur_tok
+ if cur_uwline.disable:
+ # After the first token we are acting on a single line. So if it is
+ # disabled we must not reformat.
+ lines = set()
def _RetainRequiredVerticalSpacingBetweenTokens(cur_tok, prev_tok, lines):
@@ -151,8 +161,6 @@
pass
elif lines and (cur_lineno in lines or prev_lineno in lines):
desired_newlines = cur_tok.whitespace_prefix.count('\n')
- if desired_newlines < required_newlines:
- desired_newlines = required_newlines
whitespace_lines = range(prev_lineno + 1, cur_lineno)
deletable_lines = len(lines.intersection(whitespace_lines))
required_newlines = max(required_newlines - deletable_lines,
@@ -660,8 +668,9 @@
prev_last_token.AdjustNewlinesBefore(
1 + style.Get('BLANK_LINES_AROUND_TOP_LEVEL_DEFINITION'))
if first_token.newlines is not None:
- pytree_utils.SetNodeAnnotation(
- first_token.node, pytree_utils.Annotation.NEWLINES, None)
+ pytree_utils.SetNodeAnnotation(first_token.node,
+ pytree_utils.Annotation.NEWLINES,
+ None)
return NO_BLANK_LINES
elif _IsClassOrDef(prev_uwline):
if not style.Get('BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF'):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapf/yapflib/split_penalty.py new/yapf-0.27.0/yapf/yapflib/split_penalty.py
--- old/yapf-0.26.0/yapf/yapflib/split_penalty.py 2019-01-14 05:20:23.000000000 +0100
+++ new/yapf-0.27.0/yapf/yapflib/split_penalty.py 2019-04-07 11:46:46.000000000 +0200
@@ -31,6 +31,7 @@
VERY_STRONGLY_CONNECTED = 3500
STRONGLY_CONNECTED = 3000
CONNECTED = 500
+TOGETHER = 100
OR_TEST = 1000
AND_TEST = 1100
@@ -414,27 +415,19 @@
# expr ::= xor_expr ('|' xor_expr)*
self.DefaultNodeVisit(node)
_IncreasePenalty(node, EXPR)
- index = 1
- while index < len(node.children) - 1:
- child = node.children[index]
- if isinstance(child, pytree.Leaf) and child.value == '|':
- if style.Get('SPLIT_BEFORE_BITWISE_OPERATOR'):
- _SetSplitPenalty(child, style.Get('SPLIT_PENALTY_BITWISE_OPERATOR'))
- else:
- _SetSplitPenalty(
- pytree_utils.FirstLeafNode(node.children[index + 1]),
- style.Get('SPLIT_PENALTY_BITWISE_OPERATOR'))
- index += 1
+ _SetBitwiseOperandPenalty(node, '|')
def Visit_xor_expr(self, node): # pylint: disable=invalid-name
# xor_expr ::= and_expr ('^' and_expr)*
self.DefaultNodeVisit(node)
_IncreasePenalty(node, XOR_EXPR)
+ _SetBitwiseOperandPenalty(node, '^')
def Visit_and_expr(self, node): # pylint: disable=invalid-name
# and_expr ::= shift_expr ('&' shift_expr)*
self.DefaultNodeVisit(node)
_IncreasePenalty(node, AND_EXPR)
+ _SetBitwiseOperandPenalty(node, '&')
def Visit_shift_expr(self, node): # pylint: disable=invalid-name
# shift_expr ::= arith_expr (('<<'|'>>') arith_expr)*
@@ -447,14 +440,7 @@
# arith_expr ::= term (('+'|'-') term)*
self.DefaultNodeVisit(node)
_IncreasePenalty(node, ARITH_EXPR)
-
- index = 1
- while index < len(node.children) - 1:
- child = node.children[index]
- if pytree_utils.NodeName(child) in self._ARITH_OPS:
- next_node = pytree_utils.FirstLeafNode(node.children[index + 1])
- _SetSplitPenalty(next_node, ARITH_EXPR)
- index += 1
+ _SetExpressionOperandPenalty(node, self._ARITH_OPS)
_TERM_OPS = frozenset({'STAR', 'AT', 'SLASH', 'PERCENT', 'DOUBLESLASH'})
@@ -462,14 +448,7 @@
# term ::= factor (('*'|'@'|'/'|'%'|'//') factor)*
self.DefaultNodeVisit(node)
_IncreasePenalty(node, TERM)
-
- index = 1
- while index < len(node.children) - 1:
- child = node.children[index]
- if pytree_utils.NodeName(child) in self._TERM_OPS:
- next_node = pytree_utils.FirstLeafNode(node.children[index + 1])
- _SetSplitPenalty(next_node, TERM)
- index += 1
+ _SetExpressionOperandPenalty(node, self._TERM_OPS)
def Visit_factor(self, node): # pyline: disable=invalid-name
# factor ::= ('+'|'-'|'~') factor | power
@@ -503,7 +482,7 @@
prev_was_comma = True
else:
if prev_was_comma:
- _SetSplitPenalty(pytree_utils.FirstLeafNode(child), 0)
+ _SetSplitPenalty(pytree_utils.FirstLeafNode(child), TOGETHER)
prev_was_comma = False
############################################################################
@@ -558,6 +537,30 @@
RecExpression(node, pytree_utils.FirstLeafNode(node))
+def _SetBitwiseOperandPenalty(node, op):
+ for index in py3compat.range(1, len(node.children) - 1):
+ child = node.children[index]
+ if isinstance(child, pytree.Leaf) and child.value == op:
+ if style.Get('SPLIT_BEFORE_BITWISE_OPERATOR'):
+ _SetSplitPenalty(child, style.Get('SPLIT_PENALTY_BITWISE_OPERATOR'))
+ else:
+ _SetSplitPenalty(
+ pytree_utils.FirstLeafNode(node.children[index + 1]),
+ style.Get('SPLIT_PENALTY_BITWISE_OPERATOR'))
+
+
+def _SetExpressionOperandPenalty(node, ops):
+ for index in py3compat.range(1, len(node.children) - 1):
+ child = node.children[index]
+ if pytree_utils.NodeName(child) in ops:
+ if style.Get('SPLIT_BEFORE_ARITHMETIC_OPERATOR'):
+ _SetSplitPenalty(child, style.Get('SPLIT_PENALTY_ARITHMETIC_OPERATOR'))
+ else:
+ _SetSplitPenalty(
+ pytree_utils.FirstLeafNode(node.children[index + 1]),
+ style.Get('SPLIT_PENALTY_ARITHMETIC_OPERATOR'))
+
+
def _IncreasePenalty(node, amt):
"""Increase a penalty annotation on children nodes."""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapf/yapflib/style.py new/yapf-0.27.0/yapf/yapflib/style.py
--- old/yapf-0.26.0/yapf/yapflib/style.py 2019-02-09 08:11:18.000000000 +0100
+++ new/yapf-0.27.0/yapf/yapflib/style.py 2019-03-24 08:56:40.000000000 +0100
@@ -125,8 +125,6 @@
- FIXED: Use fixed number (CONTINUATION_INDENT_WIDTH) of columns
(ie: CONTINUATION_INDENT_WIDTH/INDENT_WIDTH tabs) for continuation
alignment.
- - LESS: Slightly left if cannot vertically align continuation lines with
- indent characters.
- VALIGN-RIGHT: Vertically align continuation lines with indent
characters. Slightly right (one more indent character) if cannot
vertically align continuation lines with indent characters.
@@ -189,7 +187,6 @@
will be formatted as follows when configured with "*,/":
1 + 2*3 - 4/5
-
"""),
SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET=textwrap.dedent("""\
Insert a space between the ending comma and closing bracket of a list,
@@ -205,7 +202,7 @@
alignment column values; trailing comments within a block will
be aligned to the first column value that is greater than the maximum
line length within the block). For example:
-
+
With spaces_before_comment=5:
1 + 1 # Adding values
@@ -242,6 +239,9 @@
comma."""),
SPLIT_ALL_COMMA_SEPARATED_VALUES=textwrap.dedent("""\
Split before arguments"""),
+ SPLIT_BEFORE_ARITHMETIC_OPERATOR=textwrap.dedent("""\
+ Set to True to prefer splitting before '+', '-', '*', '/', '//', or '@'
+ rather than after."""),
SPLIT_BEFORE_BITWISE_OPERATOR=textwrap.dedent("""\
Set to True to prefer splitting before '&', '|' or '^' rather than
after."""),
@@ -298,6 +298,9 @@
The penalty for splitting right after the opening bracket."""),
SPLIT_PENALTY_AFTER_UNARY_OPERATOR=textwrap.dedent("""\
The penalty for splitting the line after a unary operator."""),
+ SPLIT_PENALTY_ARITHMETIC_OPERATOR=textwrap.dedent("""\
+ The penalty of splitting the line around the '+', '-', '*', '/', '//',
+ ``%``, and '@' operators."""),
SPLIT_PENALTY_BEFORE_IF_EXPR=textwrap.dedent("""\
The penalty for splitting right before an if expression."""),
SPLIT_PENALTY_BITWISE_OPERATOR=textwrap.dedent("""\
@@ -364,6 +367,7 @@
SPACES_BEFORE_COMMENT=2,
SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED=False,
SPLIT_ALL_COMMA_SEPARATED_VALUES=False,
+ SPLIT_BEFORE_ARITHMETIC_OPERATOR=False,
SPLIT_BEFORE_BITWISE_OPERATOR=True,
SPLIT_BEFORE_CLOSING_BRACKET=True,
SPLIT_BEFORE_DICT_SET_GENERATOR=True,
@@ -373,8 +377,9 @@
SPLIT_BEFORE_LOGICAL_OPERATOR=True,
SPLIT_BEFORE_NAMED_ASSIGNS=True,
SPLIT_COMPLEX_COMPREHENSION=False,
- SPLIT_PENALTY_AFTER_OPENING_BRACKET=30,
+ SPLIT_PENALTY_AFTER_OPENING_BRACKET=300,
SPLIT_PENALTY_AFTER_UNARY_OPERATOR=10000,
+ SPLIT_PENALTY_ARITHMETIC_OPERATOR=300,
SPLIT_PENALTY_BEFORE_IF_EXPR=0,
SPLIT_PENALTY_BITWISE_OPERATOR=300,
SPLIT_PENALTY_COMPREHENSION=80,
@@ -494,6 +499,8 @@
def _IntOrIntListConverter(s):
"""Option value converter for an integer or list of integers."""
+ if len(s) > 2 and s[0] in '"\'':
+ s = s[1:-1]
return _IntListConverter(s) if ',' in s else int(s)
@@ -535,6 +542,7 @@
SPACES_BEFORE_COMMENT=_IntOrIntListConverter,
SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED=_BoolConverter,
SPLIT_ALL_COMMA_SEPARATED_VALUES=_BoolConverter,
+ SPLIT_BEFORE_ARITHMETIC_OPERATOR=_BoolConverter,
SPLIT_BEFORE_BITWISE_OPERATOR=_BoolConverter,
SPLIT_BEFORE_CLOSING_BRACKET=_BoolConverter,
SPLIT_BEFORE_DICT_SET_GENERATOR=_BoolConverter,
@@ -546,6 +554,7 @@
SPLIT_COMPLEX_COMPREHENSION=_BoolConverter,
SPLIT_PENALTY_AFTER_OPENING_BRACKET=int,
SPLIT_PENALTY_AFTER_UNARY_OPERATOR=int,
+ SPLIT_PENALTY_ARITHMETIC_OPERATOR=int,
SPLIT_PENALTY_BEFORE_IF_EXPR=int,
SPLIT_PENALTY_BITWISE_OPERATOR=int,
SPLIT_PENALTY_COMPREHENSION=int,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapf/yapflib/subtype_assigner.py new/yapf-0.27.0/yapf/yapflib/subtype_assigner.py
--- old/yapf-0.26.0/yapf/yapflib/subtype_assigner.py 2019-02-08 23:29:19.000000000 +0100
+++ new/yapf-0.27.0/yapf/yapflib/subtype_assigner.py 2019-02-10 12:14:20.000000000 +0100
@@ -470,4 +470,4 @@
def _IsSimpleExpression(node):
"""A node with only leafs as children."""
- return all(map(lambda c: isinstance(c, pytree.Leaf), node.children))
+ return all(isinstance(child, pytree.Leaf) for child in node.children)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapf/yapflib/unwrapped_line.py new/yapf-0.27.0/yapf/yapflib/unwrapped_line.py
--- old/yapf-0.26.0/yapf/yapflib/unwrapped_line.py 2019-02-09 08:08:24.000000000 +0100
+++ new/yapf-0.27.0/yapf/yapflib/unwrapped_line.py 2019-02-10 12:06:49.000000000 +0100
@@ -228,7 +228,7 @@
def _HasPrecedence(tok):
- """Whether a binary operation has presedence within its context."""
+ """Whether a binary operation has precedence within its context."""
node = tok.node
# We let ancestor be the statement surrounding the operation that tok is the
@@ -241,12 +241,12 @@
predecessor_type = pytree_utils.NodeName(ancestor)
if predecessor_type in ['arith_expr', 'term']:
# An ancestor "arith_expr" or "term" means we have found an operator
- # with lower presedence than our tok.
+ # with lower precedence than our tok.
return True
if predecessor_type != 'atom':
# We understand the context to look for precedence within as an
# arbitrary nesting of "arith_expr", "term", and "atom" nodes. If we
- # leave this context we have not found a lower presedence operator.
+ # leave this context we have not found a lower precedence operator.
return False
# Under normal usage we expect a complete parse tree to be available and
# we will return before we get an AttributeError from the root.
@@ -254,7 +254,7 @@
def _PriorityIndicatingNoSpace(tok):
- """Whether to remove spaces around an operator due to presedence."""
+ """Whether to remove spaces around an operator due to precedence."""
if not tok.is_arithmetic_op or not tok.is_simple_expr:
# Limit space removal to highest priority arithmetic operators
return False
@@ -519,7 +519,7 @@
_LOGICAL_OPERATORS = frozenset({'and', 'or'})
_BITWISE_OPERATORS = frozenset({'&', '|', '^'})
-_TERM_OPERATORS = frozenset({'*', '/', '%', '//', '@'})
+_ARITHMETIC_OPERATORS = frozenset({'+', '-', '*', '/', '%', '//', '@'})
def _SplitPenalty(prev_token, cur_token):
@@ -568,9 +568,6 @@
if pval == ',':
# Breaking after a comma is fine, if need be.
return 0
- if prev_token.is_binary_op:
- # We would rather not split after an equality operator.
- return split_penalty.CONNECTED
if pval == '**' or cval == '**':
return split_penalty.STRONGLY_CONNECTED
if (format_token.Subtype.VARARGS_STAR in prev_token.subtypes or
@@ -596,6 +593,4 @@
if cur_token.ClosesScope():
# Give a slight penalty for splitting before the closing scope.
return 100
- if pval in _TERM_OPERATORS or cval in _TERM_OPERATORS:
- return 50
return 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapf.egg-info/PKG-INFO new/yapf-0.27.0/yapf.egg-info/PKG-INFO
--- old/yapf-0.26.0/yapf.egg-info/PKG-INFO 2019-02-09 08:13:47.000000000 +0100
+++ new/yapf-0.27.0/yapf.egg-info/PKG-INFO 2019-04-07 12:45:51.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: yapf
-Version: 0.26.0
+Version: 0.27.0
Summary: A formatter for Python code.
Home-page: UNKNOWN
Author: Bill Wendling
@@ -573,8 +573,11 @@
line that is too long, split such that all elements are on a single line.
``SPLIT_BEFORE_BITWISE_OPERATOR``
- Set to ``True`` to prefer splitting before ``&``, ``|`` or ``^`` rather
- than after.
+ Set to True to prefer splitting before '&', '|' or '^' rather than after.
+
+ ``SPLIT_BEFORE_ARITHMETIC_OPERATOR``
+ Set to True to prefer splitting before '+', '-', '*', '/', '//', or '@'
+ rather than after.
``SPLIT_BEFORE_CLOSING_BRACKET``
Split before the closing bracket if a list or dict literal doesn't fit on
@@ -647,6 +650,10 @@
``SPLIT_PENALTY_AFTER_UNARY_OPERATOR``
The penalty for splitting the line after a unary operator.
+ ``SPLIT_PENALTY_ARITHMETIC_OPERATOR``
+ The penalty of splitting the line around the ``+``, ``-``, ``*``, ``/``,
+ ``//``, ``%``, and ``@`` operators.
+
``SPLIT_PENALTY_BEFORE_IF_EXPR``
The penalty for splitting right before an ``if`` expression.
@@ -747,6 +754,31 @@
Please do! YAPF was designed to be used as a library as well as a command line
tool. This means that a tool or IDE plugin is free to use YAPF.
+ -----------------------------------------
+ I still get non Pep8 compliant code! Why?
+ -----------------------------------------
+
+ YAPF tries very hard to be fully PEP 8 compliant. However, it is paramount
+ to not risk altering the semantics of your code. Thus, YAPF tries to be as
+ safe as possible and does not change the token stream
+ (e.g., by adding parenthesis).
+ All these cases however, can be easily fixed manually. For instance,
+
+ .. code-block:: python
+
+ from my_package import my_function_1, my_function_2, my_function_3, my_function_4, my_function_5
+
+ FOO = my_variable_1 + my_variable_2 + my_variable_3 + my_variable_4 + my_variable_5 + my_variable_6 + my_variable_7 + my_variable_8
+
+ won't be split, but you can easily get it right by just adding parenthesis:
+
+ .. code-block:: python
+
+ from my_package import (my_function_1, my_function_2, my_function_3,
+ my_function_4, my_function_5)
+
+ FOO = (my_variable_1 + my_variable_2 + my_variable_3 + my_variable_4 +
+ my_variable_5 + my_variable_6 + my_variable_7 + my_variable_8)
Gory Details
============
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapftests/blank_line_calculator_test.py new/yapf-0.27.0/yapftests/blank_line_calculator_test.py
--- old/yapf-0.26.0/yapftests/blank_line_calculator_test.py 2018-01-15 01:48:30.000000000 +0100
+++ new/yapf-0.27.0/yapftests/blank_line_calculator_test.py 2019-03-27 05:32:40.000000000 +0100
@@ -350,6 +350,73 @@
self.assertCodeEqual(expected_formatted_code, code)
self.assertFalse(changed)
+ def testLinesRangeRemove(self):
+ unformatted_code = textwrap.dedent(u"""\
+ def A():
+ pass
+
+
+
+ def B(): # 6
+ pass # 7
+
+
+
+
+ def C():
+ pass
+ """)
+ expected_formatted_code = textwrap.dedent(u"""\
+ def A():
+ pass
+
+
+ def B(): # 6
+ pass # 7
+
+
+ def C():
+ pass
+ """)
+ code, changed = yapf_api.FormatCode(unformatted_code, lines=[(5, 9)])
+ self.assertCodeEqual(expected_formatted_code, code)
+ self.assertTrue(changed)
+
+ def testLinesRangeRemoveSome(self):
+ unformatted_code = textwrap.dedent(u"""\
+ def A():
+ pass
+
+
+
+
+ def B(): # 7
+ pass # 8
+
+
+
+
+ def C():
+ pass
+ """)
+ expected_formatted_code = textwrap.dedent(u"""\
+ def A():
+ pass
+
+
+
+ def B(): # 7
+ pass # 8
+
+
+
+ def C():
+ pass
+ """)
+ code, changed = yapf_api.FormatCode(unformatted_code, lines=[(6, 9)])
+ self.assertCodeEqual(expected_formatted_code, code)
+ self.assertTrue(changed)
+
if __name__ == '__main__':
unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapftests/reformatter_basic_test.py new/yapf-0.27.0/yapftests/reformatter_basic_test.py
--- old/yapf-0.26.0/yapftests/reformatter_basic_test.py 2019-02-09 08:08:24.000000000 +0100
+++ new/yapf-0.27.0/yapftests/reformatter_basic_test.py 2019-04-07 11:45:24.000000000 +0200
@@ -1346,7 +1346,7 @@
return True
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
- self.assertEqual(expected_code, reformatter.Reformat(uwlines))
+ self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines))
def testDictSetGenerator(self):
code = textwrap.dedent("""\
@@ -1896,8 +1896,8 @@
if True:
if True:
if True:
- boxes[id_] = np.concatenate((points.min(axis=0),
- qoints.max(axis=0)))
+ boxes[id_] = np.concatenate(
+ (points.min(axis=0), qoints.max(axis=0)))
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
@@ -2202,7 +2202,7 @@
not True)
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
- self.assertEqual(expected_code, reformatter.Reformat(uwlines))
+ self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines))
def testNamedAssignNotAtEndOfLine(self):
unformatted_code = textwrap.dedent("""\
@@ -2220,7 +2220,7 @@
pass
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
- self.assertEqual(expected_code, reformatter.Reformat(uwlines))
+ self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines))
def testBlankLineBeforeClassDocstring(self):
unformatted_code = textwrap.dedent('''\
@@ -2245,7 +2245,7 @@
pass
''')
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
- self.assertEqual(expected_code, reformatter.Reformat(uwlines))
+ self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines))
try:
style.SetGlobalStyle(
@@ -2301,7 +2301,7 @@
pass
''')
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
- self.assertEqual(expected_code, reformatter.Reformat(uwlines))
+ self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines))
try:
style.SetGlobalStyle(
@@ -2346,7 +2346,7 @@
('a string that may be too long %s' % 'M15'))
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
- self.assertEqual(expected_code, reformatter.Reformat(uwlines))
+ self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines))
def testSubscriptExpression(self):
code = textwrap.dedent("""\
@@ -2380,7 +2380,7 @@
]
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
- self.assertEqual(expected_code, reformatter.Reformat(uwlines))
+ self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines))
def testEllipses(self):
unformatted_code = textwrap.dedent("""\
@@ -2392,7 +2392,7 @@
Y = X if ... else X
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
- self.assertEqual(expected_code, reformatter.Reformat(uwlines))
+ self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines))
def testPseudoParens(self):
unformatted_code = """\
@@ -2410,7 +2410,7 @@
}
"""
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
- self.assertEqual(expected_code, reformatter.Reformat(uwlines))
+ self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines))
def testSplittingBeforeFirstArgumentOnFunctionCall(self):
"""Tests split_before_first_argument on a function call."""
@@ -2598,6 +2598,59 @@
finally:
style.SetGlobalStyle(style.CreateChromiumStyle())
+ def testMultipleDictionariesInList(self):
+ unformatted_code = """\
+class A:
+ def b():
+ d = {
+ "123456": [
+ {
+ "12": "aa"
+ },
+ {
+ "12": "bb"
+ },
+ {
+ "12": "cc",
+ "1234567890": {
+ "1234567": [{
+ "12": "dd",
+ "12345": "text 1"
+ }, {
+ "12": "ee",
+ "12345": "text 2"
+ }]
+ }
+ }
+ ]
+ }
+"""
+ expected_formatted_code = """\
+class A:
+
+ def b():
+ d = {
+ "123456": [{
+ "12": "aa"
+ }, {
+ "12": "bb"
+ }, {
+ "12": "cc",
+ "1234567890": {
+ "1234567": [{
+ "12": "dd",
+ "12345": "text 1"
+ }, {
+ "12": "ee",
+ "12345": "text 2"
+ }]
+ }
+ }]
+ }
+"""
+ uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
+ self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
+
if __name__ == '__main__':
unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapftests/reformatter_buganizer_test.py new/yapf-0.27.0/yapftests/reformatter_buganizer_test.py
--- old/yapf-0.26.0/yapftests/reformatter_buganizer_test.py 2018-12-05 12:44:21.000000000 +0100
+++ new/yapf-0.27.0/yapftests/reformatter_buganizer_test.py 2019-04-07 12:30:31.000000000 +0200
@@ -28,6 +28,42 @@
def setUpClass(cls):
style.SetGlobalStyle(style.CreateChromiumStyle())
+ def testB122541552(self):
+ code = """\
+# pylint: disable=g-explicit-bool-comparison,singleton-comparison
+_QUERY = account.Account.query(account.Account.enabled == True)
+# pylint: enable=g-explicit-bool-comparison,singleton-comparison
+
+
+def _():
+ pass
+"""
+ uwlines = yapf_test_helper.ParseAndUnwrap(code)
+ self.assertCodeEqual(code, reformatter.Reformat(uwlines))
+
+ def testB124415889(self):
+ code = """\
+class _():
+
+ def run_queue_scanners():
+ return xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(
+ {
+ components.NAME.FNOR: True,
+ components.NAME.DEVO: True,
+ },
+ default=False)
+
+ def modules_to_install():
+ modules = DeepCopy(GetDef({}))
+ modules.update({
+ 'xxxxxxxxxxxxxxxxxxxx':
+ GetDef('zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', None),
+ })
+ return modules
+"""
+ uwlines = yapf_test_helper.ParseAndUnwrap(code)
+ self.assertCodeEqual(code, reformatter.Reformat(uwlines))
+
def testB73166511(self):
code = """\
def _():
@@ -840,8 +876,8 @@
expected_formatted_code = textwrap.dedent("""\
class _():
def _():
- hints.append(('hg tag -f -l -r %s %s # %s' % (short(
- ctx.node()), candidatetag, firstline))[:78])
+ hints.append(('hg tag -f -l -r %s %s # %s' %
+ (short(ctx.node()), candidatetag, firstline))[:78])
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
@@ -1149,8 +1185,8 @@
class _():
def __repr__(self):
- return '' % (self._id,
- self._stub._stub.rpc_channel().target()) # pylint:disable=protected-access
+ return '' % (
+ self._id, self._stub._stub.rpc_channel().target()) # pylint:disable=protected-access
""")
uwlines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(uwlines))
@@ -1457,8 +1493,8 @@
expected_formatted_code = textwrap.dedent("""\
def foo():
if True:
- return (
- struct.pack('aaaa', bbbbbbbbbb, ccccccccccccccc, dddddddd) + eeeeeee)
+ return (struct.pack('aaaa', bbbbbbbbbb, ccccccccccccccc, dddddddd) +
+ eeeeeee)
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
@@ -1546,7 +1582,7 @@
try:
style.SetGlobalStyle(
style.CreateStyleFromConfig(
- '{based_on_style: pep8, split_penalty_import_names: 35}'))
+ '{based_on_style: pep8, split_penalty_import_names: 350}'))
unformatted_code = textwrap.dedent("""\
from a_very_long_or_indented_module_name_yada_yada import (long_argument_1,
long_argument_2)
@@ -2193,8 +2229,8 @@
})
""")
expected_formatted_code = textwrap.dedent("""\
- shelf_renderer.expand_text = text.translate_to_unicode(
- expand_text % {'creator': creator})
+ shelf_renderer.expand_text = text.translate_to_unicode(expand_text %
+ {'creator': creator})
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapftests/reformatter_pep8_test.py new/yapf-0.27.0/yapftests/reformatter_pep8_test.py
--- old/yapf-0.26.0/yapftests/reformatter_pep8_test.py 2019-01-14 05:20:23.000000000 +0100
+++ new/yapf-0.27.0/yapftests/reformatter_pep8_test.py 2019-04-07 11:44:33.000000000 +0200
@@ -165,8 +165,8 @@
""")
expected_formatted_code = textwrap.dedent("""\
if True:
- runtime_mins = (
- program_end_time - program_start_time).total_seconds() / 60.0
+ runtime_mins = (program_end_time -
+ program_start_time).total_seconds() / 60.0
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
@@ -190,8 +190,10 @@
if (aaaaaaaaaaaaaa + bbbbbbbbbbbbbbbb == ccccccccccccccccc and xxxxxxxxxxxxx
or yyyyyyyyyyyyyyyyy):
pass
- elif (xxxxxxxxxxxxxxx(
- aaaaaaaaaaa, bbbbbbbbbbbbbb, cccccccccccc, dddddddddd=None)):
+ elif (xxxxxxxxxxxxxxx(aaaaaaaaaaa,
+ bbbbbbbbbbbbbb,
+ cccccccccccc,
+ dddddddddd=None)):
pass
@@ -431,6 +433,64 @@
finally:
style.SetGlobalStyle(style.CreatePEP8Style())
+ def testBitwiseOperandSplitting(self):
+ unformatted_code = """\
+def _():
+ include_values = np.where(
+ (cdffile['Quality_Flag'][:] >= 5) & (
+ cdffile['Day_Night_Flag'][:] == 1) & (
+ cdffile['Longitude'][:] >= select_lon - radius) & (
+ cdffile['Longitude'][:] <= select_lon + radius) & (
+ cdffile['Latitude'][:] >= select_lat - radius) & (
+ cdffile['Latitude'][:] <= select_lat + radius))
+"""
+ expected_code = """\
+def _():
+ include_values = np.where(
+ (cdffile['Quality_Flag'][:] >= 5) & (cdffile['Day_Night_Flag'][:] == 1)
+ & (cdffile['Longitude'][:] >= select_lon - radius)
+ & (cdffile['Longitude'][:] <= select_lon + radius)
+ & (cdffile['Latitude'][:] >= select_lat - radius)
+ & (cdffile['Latitude'][:] <= select_lat + radius))
+"""
+ uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
+ self.assertEqual(expected_code, reformatter.Reformat(uwlines))
+
+ def testSplitBeforeArithmeticOperators(self):
+ try:
+ style.SetGlobalStyle(
+ style.CreateStyleFromConfig(
+ '{based_on_style: pep8, split_before_arithmetic_operator: true}'))
+
+ unformatted_code = """\
+def _():
+ raise ValueError('This is a long message that ends with an argument: ' + str(42))
+"""
+ expected_formatted_code = """\
+def _():
+ raise ValueError('This is a long message that ends with an argument: '
+ + str(42))
+"""
+ uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
+ self.assertCodeEqual(expected_formatted_code,
+ reformatter.Reformat(uwlines))
+ finally:
+ style.SetGlobalStyle(style.CreatePEP8Style())
+
+ def testListSplitting(self):
+ unformatted_code = """\
+foo([(1,1), (1,1), (1,1), (1,1), (1,1), (1,1), (1,1),
+ (1,1), (1,1), (1,1), (1,1), (1,1), (1,1), (1,1),
+ (1,10), (1,11), (1, 10), (1,11), (10,11)])
+"""
+ expected_code = """\
+foo([(1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1),
+ (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 10), (1, 11), (1, 10),
+ (1, 11), (10, 11)])
+"""
+ uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
+ self.assertCodeEqual(expected_code, reformatter.Reformat(uwlines))
+
if __name__ == '__main__':
unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapftests/reformatter_style_config_test.py new/yapf-0.27.0/yapftests/reformatter_style_config_test.py
--- old/yapf-0.26.0/yapftests/reformatter_style_config_test.py 2019-02-09 08:08:24.000000000 +0100
+++ new/yapf-0.27.0/yapftests/reformatter_style_config_test.py 2019-03-24 08:56:40.000000000 +0100
@@ -121,6 +121,78 @@
style.SetGlobalStyle(style.CreatePEP8Style())
style.DEFAULT_STYLE = self.current_style
+ def testNoSplitBeforeFirstArgumentStyle1(self):
+ try:
+ pep8_no_split_before_first = style.CreatePEP8Style()
+ pep8_no_split_before_first['SPLIT_BEFORE_FIRST_ARGUMENT'] = False
+ pep8_no_split_before_first['SPLIT_BEFORE_NAMED_ASSIGNS'] = False
+ style.SetGlobalStyle(pep8_no_split_before_first)
+ formatted_code = textwrap.dedent("""\
+ # Example from in-code MustSplit comments
+ foo = outer_function_call(fitting_inner_function_call(inner_arg1, inner_arg2),
+ outer_arg1, outer_arg2)
+
+ foo = outer_function_call(
+ not_fitting_inner_function_call(inner_arg1, inner_arg2), outer_arg1,
+ outer_arg2)
+
+ # Examples Issue#424
+ a_super_long_version_of_print(argument1, argument2, argument3, argument4,
+ argument5, argument6, argument7)
+
+ CREDS_FILE = os.path.join(os.path.expanduser('~'),
+ 'apis/super-secret-admin-creds.json')
+
+ # Examples Issue#556
+ i_take_a_lot_of_params(arg1, param1=very_long_expression1(),
+ param2=very_long_expression2(),
+ param3=very_long_expression3(),
+ param4=very_long_expression4())
+
+ # Examples Issue#590
+ plt.plot(numpy.linspace(0, 1, 10), numpy.linspace(0, 1, 10), marker="x",
+ color="r")
+
+ plt.plot(veryverylongvariablename, veryverylongvariablename, marker="x",
+ color="r")
+ """)
+ uwlines = yapf_test_helper.ParseAndUnwrap(formatted_code)
+ self.assertCodeEqual(formatted_code, reformatter.Reformat(uwlines))
+ finally:
+ style.SetGlobalStyle(style.CreatePEP8Style())
+ style.DEFAULT_STYLE = self.current_style
+
+ def testNoSplitBeforeFirstArgumentStyle2(self):
+ try:
+ pep8_no_split_before_first = style.CreatePEP8Style()
+ pep8_no_split_before_first['SPLIT_BEFORE_FIRST_ARGUMENT'] = False
+ pep8_no_split_before_first['SPLIT_BEFORE_NAMED_ASSIGNS'] = True
+ style.SetGlobalStyle(pep8_no_split_before_first)
+ formatted_code = textwrap.dedent("""\
+ # Examples Issue#556
+ i_take_a_lot_of_params(arg1,
+ param1=very_long_expression1(),
+ param2=very_long_expression2(),
+ param3=very_long_expression3(),
+ param4=very_long_expression4())
+
+ # Examples Issue#590
+ plt.plot(numpy.linspace(0, 1, 10),
+ numpy.linspace(0, 1, 10),
+ marker="x",
+ color="r")
+
+ plt.plot(veryverylongvariablename,
+ veryverylongvariablename,
+ marker="x",
+ color="r")
+ """)
+ uwlines = yapf_test_helper.ParseAndUnwrap(formatted_code)
+ self.assertCodeEqual(formatted_code, reformatter.Reformat(uwlines))
+ finally:
+ style.SetGlobalStyle(style.CreatePEP8Style())
+ style.DEFAULT_STYLE = self.current_style
+
if __name__ == '__main__':
unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yapf-0.26.0/yapftests/yapf_test.py new/yapf-0.27.0/yapftests/yapf_test.py
--- old/yapf-0.26.0/yapftests/yapf_test.py 2018-12-05 07:45:00.000000000 +0100
+++ new/yapf-0.27.0/yapftests/yapf_test.py 2019-04-07 12:38:27.000000000 +0200
@@ -24,11 +24,14 @@
import textwrap
import unittest
+from lib2to3.pgen2 import tokenize
+
from yapf.yapflib import py3compat
from yapf.yapflib import style
from yapf.yapflib import yapf_api
from yapftests import utils
+from yapftests import yapf_test_helper
ROOT_DIR = os.path.dirname(os.path.abspath(os.path.dirname(__file__)))
@@ -36,12 +39,12 @@
YAPF_BINARY = [sys.executable, '-m', 'yapf', '--verify', '--no-local-style']
-class FormatCodeTest(unittest.TestCase):
+class FormatCodeTest(yapf_test_helper.YAPFTest):
def _Check(self, unformatted_code, expected_formatted_code):
formatted_code, _ = yapf_api.FormatCode(
unformatted_code, style_config='chromium')
- self.assertEqual(expected_formatted_code, formatted_code)
+ self.assertCodeEqual(expected_formatted_code, formatted_code)
def testSimple(self):
unformatted_code = textwrap.dedent("""\
@@ -512,7 +515,26 @@
style_file = textwrap.dedent(u'''\
[style]
based_on_style = chromium
- SPACES_BEFORE_COMMENT = 4
+ spaces_before_comment = 4
+ ''')
+ with utils.TempFileContents(self.test_tmpdir, style_file) as stylepath:
+ self.assertYapfReformats(
+ unformatted_code,
+ expected_formatted_code,
+ extra_options=['--style={0}'.format(stylepath)])
+
+ def testSetCustomStyleSpacesBeforeComment(self):
+ unformatted_code = textwrap.dedent("""\
+ a_very_long_statement_that_extends_way_beyond # Comment
+ short # This is a shorter statement
+ """)
+ expected_formatted_code = textwrap.dedent("""\
+ a_very_long_statement_that_extends_way_beyond # Comment
+ short # This is a shorter statement
+ """)
+ style_file = textwrap.dedent(u'''\
+ [style]
+ spaces_before_comment = 15, 20
''')
with utils.TempFileContents(self.test_tmpdir, style_file) as stylepath:
self.assertYapfReformats(
@@ -1409,6 +1431,10 @@
code = ' a = 1\n'
self.assertRaises(SyntaxError, yapf_api.FormatCode, code)
+ def testBadCode(self):
+ code = 'x = """hello\n'
+ self.assertRaises(tokenize.TokenError, yapf_api.FormatCode, code)
+
class DiffIndentTest(unittest.TestCase):
@@ -1436,12 +1462,12 @@
self._Check(unformatted_code, expected_formatted_code)
-class HorizontallyAlignedTrailingCommentsTest(unittest.TestCase):
+class HorizontallyAlignedTrailingCommentsTest(yapf_test_helper.YAPFTest):
@staticmethod
def _OwnStyle():
my_style = style.CreatePEP8Style()
- my_style["SPACES_BEFORE_COMMENT"] = [
+ my_style['SPACES_BEFORE_COMMENT'] = [
15,
25,
35,
@@ -1451,7 +1477,7 @@
def _Check(self, unformatted_code, expected_formatted_code):
formatted_code, _ = yapf_api.FormatCode(
unformatted_code, style_config=style.SetGlobalStyle(self._OwnStyle()))
- self.assertEqual(expected_formatted_code, formatted_code)
+ self.assertCodeEqual(expected_formatted_code, formatted_code)
def testSimple(self):
unformatted_code = textwrap.dedent("""\
@@ -1518,7 +1544,7 @@
func(2) # Line 2
# Line 3
func(3) # Line 4
- # Line 5 - SpliceComments makes this a new block
+ # Line 5
# Line 6
def Func():
@@ -1529,9 +1555,8 @@
func(2) # Line 2
# Line 3
func(3) # Line 4
-
- # Line 5 - SpliceComments makes this a new block
- # Line 6
+ # Line 5
+ # Line 6
def Func():