# Change Log
# All notable changes to this project will be documented in this file.
# This project adheres to [Semantic Versioning](http://semver.org/).

## [0.40.0] 2023-06-13
### Added
- Support for Python 3.11
- Add the `--print-modified` flag to print out file names of modified files when
  running in in-place mode.
### Changes
- Replace the outdated and no-longer-supported lib2to3 with a fork of blib2to3,
  Black's version of lib2to3.
### Removed
- Support for Python versions < 3.7 are no longer supported.

## [0.33.0] 2023-04-18
### Added
- Add a new Python parser to generate logical lines.
- Added support for `# fmt: on` and `# fmt: off` pragmas.
### Changes
- Moved 'pytree' parsing tools into its own subdirectory.
- Add support for Python 3.10.
- Format generated dicts with respect to same rules as regular dicts
- Generalized the ending comma heuristic to subscripts.
- Supports "pyproject.toml" by default.
### Fixed
- Split line before all comparison operators.

## [0.32.0] 2021-12-26
### Added
- Look at the 'pyproject.toml' file to see if it contains ignore file information
  for YAPF.
- New entry point `yapf_api.FormatTree` for formatting lib2to3 concrete
  syntax trees.
- Add CI via GitHub Actions.
### Changes
- Change tests to support "pytest".
- Reformat so that "flake8" is happy.
- Use GitHub Actions instead of Travis for CI.
- Clean up the FormatToken interface to limit how much it relies upon the
  pytree node object.
- Rename "unwrapped_line" module to "logical_line."
- Rename "UnwrappedLine" class to "LogicalLine."
### Fixed
- Added pyproject extra to install toml package as an optional dependency.
- Enable `BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF` knob for "pep8" style, so
  method definitions inside a class are surrounded by a single blank line as
  prescribed by PEP8.
- Fixed the '...' token to be spaced after a colon.

## [0.31.0] 2021-03-14
### Added
- Renamed 'master' branch to 'main'.
- Add 'BLANK_LINES_BETWEEN_TOP_LEVEL_IMPORTS_AND_VARIABLES' to support setting
  a custom number of blank lines between top-level imports and variable
  definitions.
- Ignore end of line `# copybara:` directives when checking line length.
- Look at the 'pyproject.toml' file to see if it contains style information for
  YAPF.
### Changed
- Do not scan excluded directories. Prior versions would scan an excluded
  folder then exclude its contents on a file by file basis. Preventing the
  folder being scanned is faster.
### Fixed
- Exclude directories on Windows.

## [0.30.0] 2020-04-23
### Added
- Added `SPACES_AROUND_LIST_DELIMITERS`, `SPACES_AROUND_DICT_DELIMITERS`,
  and `SPACES_AROUND_TUPLE_DELIMITERS` to add spaces after the opening-
  and before the closing-delimiters for lists, dicts, and tuples.
- Adds `FORCE_MULTILINE_DICT` knob to ensure dictionaries always split,
  even when shorter than the max line length.
- New knob `SPACE_INSIDE_BRACKETS` to add spaces inside brackets, braces, and
  parentheses.
- New knob `SPACES_AROUND_SUBSCRIPT_COLON` to add spaces around the subscript /
  slice operator.
### Changed
- Renamed "chromium" style to "yapf". Chromium will now use PEP-8 directly.
- `CONTINUATION_ALIGN_STYLE` with `FIXED` or `VALIGN-RIGHT` now works with
  space indentation.
### Fixed
- Honor a disable directive at the end of a multiline comment.
- Don't require splitting before comments in a list when
  `SPLIT_ALL_TOP_LEVEL_COMMA_SEPARATED_VALUES` is set. The knob is meant for
  values, not comments, which may be associated with the current line.
- Don't over-indent a parameter list when not needed. But make sure it is
  properly indented so that it doesn't collide with the lines afterwards.
- Don't split between two-word comparison operators: "is not", "not in", etc.

## [0.29.0] 2019-11-28
### Added
- Add the `--quiet` flag to suppress output. The return code is 1 if there are
  changes, similarly to the `--diff` flag.
- Add the `indent_closing_brackets` option. This is the same as the
  `dedent_closing_brackets` option except the brackets are indented the same
  as the previous line.
### Changed
- Collect a parameter list into a single object. This allows us to track how a
  parameter list is formatted, keeping state along the way. This helps when
  supporting Python 3 type annotations.
- Catch and report `UnicodeDecodeError` exceptions.
- Improved description of .yapfignore syntax.
### Fixed
- Format subscript lists so that splits are essentially free after a comma.
- Don't add a space between a string and its subscript.
- Extend discovery of '.style.yapf' & 'setup.cfg' files to search the root
  directory as well.
- Make sure we have parameters before we start calculating penalties for
  splitting them.
- Indicate if a class/function is nested to ensure blank lines when needed.
- Fix extra indentation in async-for else statement.
- A parameter list with no elements shouldn't count as exceeding the column
  limit.
- When splitting all comma separated values, don't treat the ending bracket as
  special.
- The "no blank lines between nested classes or functions" knob should only
  apply to the first nested class or function, not all of them.

## [0.28.0] 2019-07-11
### Added
- New knob `SPLIT_ALL_TOP_LEVEL_COMMA_SEPARATED_VALUES` is a variation on
  `SPLIT_ALL_COMMA_SEPARATED_VALUES` in which, if a subexpression with a comma
  fits in its starting line, then the subexpression is not split (thus avoiding
  unnecessary splits).
### Changed
- Set `INDENT_DICTIONARY_VALUE` for Google style.
- Set `JOIN_MULTIPLE_LINES = False` for Google style.
### Fixed
- `BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF=False` wasn't honored because the
  number of newlines was erroneously calculated beforehand.
- Lambda expressions shouldn't have an increased split penalty applied to the
  'lambda' keyword. This prevents them from being properly formatted when they're
  arguments to functions.
- A comment with continuation markers (??) shouldn't mess with the lineno count.
- Only emit unformatted if the "disable long line" is at the end of the line.
  Otherwise we could mess up formatting for containers which have them
  interspersed with code.
- Fix a potential race condition by using the correct style for opening a file
  which may not exist.

## [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
  default / named assignments.
- `ARITHMETIC_PRECEDENCE_INDICATION` removes spacing around binary operators
  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
  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:
  disable=line-too-long". The line is expected to be too long.
- improved `CONTINUATION_ALIGN_STYLE` to accept quoted or underline-separated
  option value for passing option with command line arguments.
### Fixed
- When retrieving the opening bracket make sure that it's actually an opening
  bracket.
- Don't completely deny a lambda formatting if it goes over the column limit.
  Split only if absolutely necessary.
- Bump up penalty for splitting before a dot ('.').
- Ignore pseudo tokens when calculating split penalties.
- Increase the penalty for splitting before the first bit of a subscript.
- Improve splitting before dictionary values. Look more closely to see if the
  dictionary entry is a container. If so, then it's probably split over
  multiple lines with the opening bracket on the same line as the key.
  Therefore, we shouldn't enforce a split because of that.
- Increase split penalty around exponent operator.
- Correct spacing when using binary operators on strings with the
  `NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS` option enabled.

## [0.25.0] 2018-11-25
### Added
- Added `INDENT_BLANK_LINES` knob to select whether the blank lines are empty
  or indented consistently with the current block.
- Support additional file exclude patterns in .yapfignore file.
### Fixed
- Correctly determine if a scope is the last in line. It avoids a wrong
  computation of the line end when determining if it must split after the
  opening bracket with `DEDENT_CLOSING_BRACKETS` enabled.

## [0.24.0] 2018-09-07
### Added
- Added 'SPLIT_BEFORE_DOT' knob to support "builder style" calls. The "builder
  style" option didn't work as advertised. Lines would split after the dots,
  not before them regardless of the penalties.
### Changed
- Support Python 3.7 in the tests. The old "comp_for" and "comp_if" nodes are
  now "old_comp_for" and "old_comp_if" in lib2to3.
### Fixed
- Don't count inner function calls when marking arguments as named assignments.
- Make sure that tuples and the like are formatted nicely if they all can't fit
  on a single line. This is similar to how we format function calls within an
  argument list.
- Allow splitting in a subscript if it goes over the line limit.
- Increase the split penalty for an if-expression.
- Increase penalty for splitting in a subscript so that it's more likely to
  split in a function call or other data literal.
- Cloning a pytree node doesn't transfer its a annotations. Make sure we do
  that so that we don't lose information.
- Revert change that broke the "no_spaces_around_binary_operators" option.
- The "--style-help" option would output string lists and sets in Python types.
  If the output was used as a style, then it wouldn't parse those values
  correctly.

## [0.23.0] 2018-08-27
### Added
- `DISABLE_ENDING_COMMA_HEURISTIC` is a new knob to disable the heuristic which
  splits a list onto separate lines if the list is comma-terminated.
### Fixed
- There's no need to increase N_TOKENS. In fact, it causes other things which
  use lib2to3 to fail if called from YAPF.
- Change the exception message instead of creating a new one that's just a
  clone.
- Make sure not to reformat when a line is disabled even if the --lines option
  is specified.
- The "no spaces around operators" flag wasn't correctly converting strings to
  sets. Changed the regexp to handle it better.

## [0.22.0] 2018-05-15
### Added
- The `BLANK_LINE_BEFORE_MODULE_DOCSTRING` knob adds a blank line before a
  module's docstring.
- The `SPLIT_ALL_COMMA_SEPARATED_VALUES` knob causes all lists, tuples, dicts
  function defs, etc... to split on all values, instead of maximizing the
  number of elements on each line, when not able to fit on a single line.
### Changed
- Improve the heuristic we use to determine when to split at the start of a
  function call. First check whether or not all elements can fit in the space
  without wrapping. If not, then we split.
- Check all of the elements of a tuple. Similarly to how arguments are
  analyzed. This allows tuples to be split more rationally.
- Adjust splitting penalties around arithmetic operators so that the code can
  flow more freely. The code must flow!
- Try to meld an argument list's closing parenthesis to the last argument.
### Fixed
- Attempt to determine if long lambdas are allowed. This can be done on a
  case-by-case basis with a "pylint" disable comment.
- A comment before a decorator isn't part of the decorator's line.
- Only force a new wrapped line after a comment in a decorator when it's the
  first token in the decorator.

## [0.21.0] 2018-03-18
### Added
- Introduce a new option of formatting multiline literals. Add
  `SPLIT_BEFORE_CLOSING_BRACKET` knob to control whether closing bracket should
  get their own line.
- Added `CONTINUATION_ALIGN_STYLE` knob to choose continuation alignment style
  when `USE_TABS` is enabled.
- Add 'BLANK_LINES_AROUND_TOP_LEVEL_DEFINITION' knob to control the number
  of blank lines between top-level function and class definitions.
### Fixed
- Don't split ellipses.

## [0.20.2] 2018-02-12
### Changed
- Improve the speed at which files are excluded by ignoring them earlier.
- Allow dictionaries to stay on a single line if they only have one entry
### Fixed
- Use tabs when constructing a continuation line when `USE_TABS` is enabled.
- A dictionary entry may not end in a colon, but may be an "unpacking"
  operation: `**foo`. Take that into account and don't split after the
  unpacking operator.

## [0.20.1] 2018-01-13
### Fixed
- Don't treat 'None' as a keyword if calling a function on it, like '__ne__()'.
- use_tabs=True always uses a single tab per indentation level; spaces are
  used for aligning vertically after that.
- Relax the split of a paren at the end of an if statement. With
  `dedent_closing_brackets` option requires that it be able to split there.

## [0.20.0] 2017-11-14
### Added
- Improve splitting of comprehensions and generators. Add
  `SPLIT_PENALTY_COMPREHENSION` knob to control preference for keeping
  comprehensions on a single line and `SPLIT_COMPLEX_COMPREHENSION` to enable
  splitting each clause of complex comprehensions onto its own line.
### Changed
- Take into account a named function argument when determining if we should
  split before the first argument in a function call.
- Split before the first argument in a function call if the arguments contain a
  dictionary that doesn't fit on a single line.
- Improve splitting of elements in a tuple. We want to split if there's a
  function call in the tuple that doesn't fit on the line.
### Fixed
- Enforce spaces between ellipses and keywords.
- When calculating the split penalty for a "trailer", process the child nodes
  afterwards because their penalties may change. For example if a list
  comprehension is an argument.
- Don't enforce a split before a comment after the opening of a container if it
  doesn't it on the current line. We try hard not to move such comments around.
- Use a TextIOWrapper when reading from stdin in Python3. This is necessary for
  some encodings, like cp936, used on Windows.
- Remove the penalty for a split before the first argument in a function call
  where the only argument is a generator expression.

## [0.19.0] 2017-10-14
### Added
- Added `SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN` that enforces a split
  after the opening paren of an expression that's surrounded by parens.
### Changed
- Split before the ending bracket of a comma-terminated tuple / argument list
  if it's not a single element tuple / arg list.
### Fixed
- Prefer to split after a comma in an argument list rather than in the middle
  of an argument.
- A non-multiline string may have newlines if it contains continuation markers
  itself. Don't add a newline after the string when retaining the vertical
  space.
- Take into account the "async" keyword when determining if we must split
  before the first argument.
- Increase affinity for "atom" arguments in function calls. This helps prevent
  lists from being separated when they don't need to be.
- Don't place a dictionary argument on its own line if it's the last argument
  in the function call where that function is part of a builder-style call.
- Append the "var arg" type to a star in a star_expr.

## [0.18.0] 2017-09-18
### Added
- Option `ALLOW_SPLIT_BEFORE_DICT_VALUE` allows a split before a value. If
  False, then it won't be split even if it goes over the column limit.
### Changed
- Use spaces around the '=' in a typed name argument to align with 3.6 syntax.
### Fixed
- Allow semicolons if the line is disabled.
- Fix issue where subsequent comments at decreasing levels of indentation
  were improperly aligned and/or caused output with invalid syntax.
- Fix issue where specifying a line range removed a needed line before a
  comment.
- Fix spacing between unary operators if one is 'not'.
- Indent the dictionary value correctly if there's a multi-line key.
- Don't remove needed spacing before a comment in a dict when in "chromium"
  style.
- Increase indent for continuation line with same indent as next logical line
  with 'async with' statement.

## [0.17.0] 2017-08-20
### Added
- Option `NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS` prevents adding spaces
  around selected binary operators, in accordance with the current style guide.
### Changed
- Adjust blank lines on formatting boundaries when using the `--lines` option.
- Return 1 if a diff changed the code. This is in line with how GNU diff acts.
- Add `-vv` flag to print out file names as they are processed
### Fixed
- Corrected how `DEDENT_CLOSING_BRACKETS` and `COALESCE_BRACKETS` interacted.
- Fix return value to return a boolean.
- Correct vim plugin not to clobber edited code if yapf returns an error.
- Ensured comma-terminated tuples with multiple elements are split onto separate lines.

## [0.16.3] 2017-07-13
### Changed
- Add filename information to a ParseError exception.
### Fixed
- A token that ends in a continuation marker may have more than one newline in
  it, thus changing its "lineno" value. This can happen if multiple
  continuation markers are used with no intervening tokens. Adjust the line
  number to account for the lines covered by those markers.
- Make sure to split after a comment even for "pseudo" parentheses.

## [0.16.2] 2017-05-19
### Fixed
- Treat expansion operators ('*', '**') in a similar way to function calls to
  avoid splitting directly after the opening parenthesis.
- Increase the penalty for splitting after the start of a tuple.
- Increase penalty for excess characters.
- Check that we have enough children before trying to access them all.
- Remove trailing whitespaces from comments.
- Split before a function call in a list if the full list isn't able to fit on
  a single line.
- Trying not to split around the '=' of a named assign.
- Changed split before the first argument behavior to ignore compound
  statements like if and while, but not function declarations.
- Changed coalesce brackets not to line split before closing bracket.

## [0.16.1] 2017-03-22
### Changed
- Improved performance of cloning the format decision state object. This
  improved the time in one *large* case from 273.485s to 234.652s.
- Relax the requirement that a named argument needs to be on one line. Going
  over the column limit is more of an issue to pylint than putting named args
  on multiple lines.
- Don't make splitting penalty decisions based on the original formatting. This
  can and does lead to non-stable formatting, where yapf will reformat the same
  code in different ways.
### Fixed
- Ensure splitting of arguments if there's a named assign present.
- Prefer to coalesce opening brackets if it's not at the beginning of a
  function call.
- Prefer not to squish all of the elements in a function call over to the
  right-hand side. Split the arguments instead.
- We need to split a dictionary value if the first element is a comment anyway,
  so don't force the split here. It's forced elsewhere.
- Ensure tabs are used for continued indentation when USE_TABS is True.

## [0.16.0] 2017-02-05
### Added
- The `EACH_DICT_ENTRY_ON_SEPARATE_LINE` knob indicates that each dictionary
  entry should be in separate lines if the full dictionary isn't able to fit on
  a single line.
- The `SPLIT_BEFORE_DICT_SET_GENERATOR` knob splits before the `for` part of a
  dictionary/set generator.
- The `BLANK_LINE_BEFORE_CLASS_DOCSTRING` knob adds a blank line before a
  class's docstring.
- The `ALLOW_MULTILINE_DICTIONARY_KEYS` knob allows dictionary keys to span
  more than one line.
### Fixed
- Split before all entries in a dict/set or list maker when comma-terminated,
  even if there's only one entry.
- Will now try to set O_BINARY mode on stdout under Windows and Python 2.
- Avoid unneeded newline transformation when writing formatted code to
  output on (affects only Python 2)

## [0.15.2] 2017-01-29
### Fixed
- Don't perform a global split when a named assign is part of a function call
  which itself is an argument to a function call. I.e., don't cause 'a' to
  split here:

      func(a, b, c, d(x, y, z=42))
- Allow splitting inside a subscript if it's a logical or bitwise operating.
  This should keep the subscript mostly contiguous otherwise.

## [0.15.1] 2017-01-21
### Fixed
- Don't insert a space between a type hint and the '=' sign.
- The '@' operator can be used in Python 3 for matrix multiplication. Give the
  '@' in the decorator a DECORATOR subtype to distinguish it.
- Encourage the formatter to split at the beginning of an argument list instead
  of in the middle. Especially if the middle is an empty parameter list. This
  adjusts the affinity of binary and comparison operators. In particular, the
  "not in" and other such operators don't want to have a split after it (or
  before it) if at all possible.

## [0.15.0] 2017-01-12
### Added
- Keep type annotations intact as much as possible. Don't try to split the over
  multiple lines.
### Fixed
- When determining if each element in a dictionary can fit on a single line, we
  are skipping dictionary entries. However, we need to ignore comments in our
  calculations and implicitly concatenated strings, which are already placed on
  separate lines.
- Allow text before a "pylint" comment.
- Also allow text before a "yapf: (disable|enable)" comment.

## [0.14.0] 2016-11-21
### Added
- formatting can be run in parallel using the "-p" / "--parallel" flags.
### Fixed
- "not in" and "is not" should be subtyped as binary operators.
- A non-Node dictionary value may have a comment before it. In those cases, we
  want to avoid encompassing only the comment in pseudo parens. So we include
  the actual value as well.
- Adjust calculation so that pseudo-parentheses don't count towards the total
  line length.
- Don't count a dictionary entry as not fitting on a single line in a
  dictionary.
- Don't count pseudo-parentheses in the length of the line.

## [0.13.2] 2016-10-22
### Fixed
- REGRESSION: A comment may have a prefix with newlines in it. When calculating
  the prefix indent, we cannot take the newlines into account. Otherwise, the
  comment will be misplaced causing the code to fail.

## [0.13.1] 2016-10-17
### Fixed
- Correct emitting a diff that was accidentally removed.

## [0.13.0] 2016-10-16
### Added
- Added support to retain the original line endings of the source code.

### Fixed
- Functions or classes with comments before them were reformatting the comments
  even if the code was supposed to be ignored by the formatter. We now don't
  adjust the whitespace before a function's comment if the comment is a
  "disabled" line. We also don't count "# yapf: {disable|enable}" as a disabled
  line, which seems logical.
- It's not really more readable to split before a dictionary value if it's part
  of a dictionary comprehension.
- Enforce two blank lines after a function or class definition, even before a
  comment. (But not between a decorator and a comment.) This is related to PEP8
  error E305.
- Remove O(n^2) algorithm from the line disabling logic.

## [0.12.2] 2016-10-09
### Fixed
- If `style.SetGlobalStyle(<create pre-defined style>)` was called and then
  `yapf_api.FormatCode` was called, the style set by the first call would be
  lost, because it would return the style created by `DEFAULT_STYLE_FACTORY`,
  which is set to PEP8 by default. Fix this by making the first call set which
  factory we call as the "default" style.
- Don't force a split before non-function call arguments.
- A dictionary being used as an argument to a function call and which can exist
  on a single line shouldn't be split.
- Don't rely upon the original line break to determine if we should split
  before the elements in a container. Especially split if there's a comment in
  the container.
- Don't add spaces between star and args in a lambda expression.
- If a nested data structure terminates in a comma, then split before the first
  element, but only if there's more than one element in the list.

## [0.12.1] 2016-10-02
### Changed
- Dictionary values will be placed on the same line as the key if *all* of the
  elements in the dictionary can be placed on one line. Otherwise, the
  dictionary values will be placed on the next line.

### Fixed
- Prefer to split before a terminating r-paren in an argument list if the line
  would otherwise go over the column limit.
- Split before the first key in a dictionary if the dictionary cannot fit on a
  single line.
- Don't count "pylint" comments when determining if the line goes over the
  column limit.
- Don't count the argument list of a lambda as a named assign in a function
  call.

## [0.12.0] 2016-09-25
### Added
- Support formatting of typed names. Typed names are formatted a similar way to
  how named arguments are formatted, except that there's a space after the
  colon.
- Add a knob, 'SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN', to allow adding spaces
  around the assign operator on default or named assigns.

## Changed
- Turn "verification" off by default for external APIs.
- If a function call in an argument list won't fit on the current line but will
  fit on a line by itself, then split before the call so that it won't be split
  up unnecessarily.

## Fixed
- Don't add space after power operator if the next operator's a unary operator.

## [0.11.1] 2016-08-17
### Changed
- Issue #228: Return exit code 0 on success, regardless of whether files were
  changed.  (Previously, 0 meant success with no files
  modified, and 2 meant success with at least one file modified.)

### Fixed
- Enforce splitting each element in a dictionary if comma terminated.
- It's okay to split in the middle of a dotted name if the whole expression is
  going to go over the column limit.
- Asynchronous functions were going missing if they were preceded by a comment
  (a what? exactly). The asynchronous function processing wasn't taking the
  comment into account and thus skipping the whole function.
- The splitting of arguments when comma terminated had a conflict. The split
  penalty of the closing bracket was set to the maximum, but it shouldn't be if
  the closing bracket is preceded by a comma.

## [0.11.0] 2016-07-17
### Added
- The COALESCE_BRACKETS knob prevents splitting consecutive brackets when
  DEDENT_CLOSING_BRACKETS is set.
- Don't count "pylint" directives as exceeding the column limit.

### Changed
- We split all of the arguments to a function call if there's a named argument.
  In this case, we want to split after the opening bracket too. This makes
  things look a bit better.

### Fixed
- When retaining format of a multiline string with Chromium style, make sure
  that the multiline string doesn't mess up where the following comma ends up.
- Correct for when 'lib2to3' smooshes comments together into the same DEDENT
  node.

## [0.10.0] 2016-06-14
### Added
- Add a knob, 'USE_TABS', to allow using tabs for indentation.

### Changed
- Performance enhancements.

### Fixed
- Don't split an import list if it's not surrounded by parentheses.

## [0.9.0] 2016-05-29
### Added
- Added a knob (SPLIT_PENALTY_BEFORE_IF_EXPR) to adjust the split penalty
  before an if expression. This allows the user to place a list comprehension
  all on one line.
- Added a knob (SPLIT_BEFORE_FIRST_ARGUMENT) that encourages splitting before
  the first element of a list of arguments or parameters if they are going to
  be split anyway.
- Added a knob (SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED) splits arguments to a
  function if the list is terminated by a comma.

### Fixed
- Don't split before a first element list argument as we would before a first
  element function call.
- Don't penalize when we must split a line.
- Allow splitting before the single argument in a function call.

## [0.8.2] 2016-05-21
### Fixed
- Prefer not to split after the opening of a subscript.
- Don't add space before the 'await' keyword if it's preceded by an opening
  paren.
- When we're setting the split penalty for a continuous list, we don't want to
  mistake a comment at the end of that list as part of the list.
- When calculating blank lines, don't assume the last seen object was a class
  or function when we're in a class or function.
- Don't count the closing scope when determining if the current scope is the
  last scope on the line.

## [0.8.1] 2016-05-18
### Fixed
- 'SPLIT_BEFORE_LOGICAL_OPERATOR' wasn't working correctly. The penalty was
  being set incorrectly when it was part of a larger construct.
- Don't separate a keyword, like "await", from a left paren.
- Don't rely upon the original tokens' line number to determine if we should
  perform splitting in Facebook mode. The line number isn't the line number of
  the reformatted token, but the line number where it was in the original code.
  Instead, we need to carefully determine if the line is liabel to be split and
  act accordingly.

## [0.8.0] 2016-05-10
### Added
- Add a knob, 'SPACES_AROUND_POWER_OPERATOR', to allow adding spaces around the
  power operator.

### Fixed
- There shouldn't be a space between a decorator and an intervening comment.
- If we split before a bitwise operator, then we assume that the programmer
  knows what they're doing, more or less, and so we enforce a split before said
  operator if one exists in the original program.
- Strengthen the bond between a keyword and value argument.
- Don't add a blank line after a multiline string.
- If the "for" part of a list comprehension can exist on the starting line
  without going over the column limit, then let it remain there.

## [0.7.1] 2016-04-21
### Fixed
- Don't rewrite the file if there are no changes.
- Ensure the proper number of blank lines before an async function.
- Split after a bitwise operator when in PEP 8 mode.
- Retain the splitting within a dictionary data literal between the key and
  value.
- Try to keep short function calls all on one line even if they're part of a
  larger series of tokens. This stops us from splitting too much.

## [0.7.0] 2016-04-09
### Added
- Support for Python 3.5.
- Add 'ALLOW_MULTILINE_LAMBDAS' which allows lambdas to be formatted onto
  multiple lines.

### Fixed
- Lessen penalty for splitting before a dictionary keyword.
- Formatting of trailing comments on disabled formatting lines.
- Disable / enable formatting at end of multi-line comment.

## [0.6.3] 2016-03-06
### Changed
- Documentation updated.

### Fixed
- Fix spacing of multiline comments when formatting is disabled.

## [0.6.2] 2015-11-01
### Changed
- Look at the 'setup.cfg' file to see if it contains style information for
  YAPF.
- Look at the '~/.config/yapf/style' file to see if it contains global style
  information for YAPF.

### Fixed
- Make lists that can fit on one line more likely to stay together.
- Correct formatting of '*args' and '**kwargs' when there are default values in
  the argument list.

## [0.6.1] 2015-10-24
### Fixed
- Make sure to align comments in data literals correctly. Also make sure we
  don't count a "#." in a string as an i18n comment.
- Retain proper vertical spacing before comments in a data literal.
- Make sure that continuations from a compound statement are distinguished from
  the succeeding line.
- Ignore preceding comments when calculating what is a "dictionary maker".
- Add a small penalty for splitting before a closing bracket.
- Ensure that a space is enforced after we remove a pseudo-paren that's between
  two names, keywords, numbers, etc.
- Increase the penalty for splitting after a pseudo-paren. This could lead to
  less readable code in some circumstances.

## [0.6.0] 2015-10-18
### Added
- Add knob to indent the dictionary value if there is a split before it.

### Changed
- No longer check that a file is a "Python" file unless the '--recursive' flag
  is specified.
- No longer allow the user to specify a directory unless the '--recursive' flag
  is specified.

### Fixed
- When determining if we should split a dictionary's value to a new line, use
  the longest entry instead of the total dictionary's length. This allows the
  formatter to reformat the dictionary in a more consistent manner.
- Improve how list comprehensions are formatted. Make splitting dependent upon
  whether the "comp_for" or "comp_if" goes over the column limit.
- Don't over indent if expression hanging indents if we expect to dedent the
  closing bracket.
- Improve splitting heuristic when the first argument to a function call is
  itself a function call with arguments. In cases like this, the remaining
  arguments to the function call would look badly aligned, even though they are
  technically correct (the best kind of correct!).
- Improve splitting heuristic more so that if the first argument to a function
  call is a data literal that will go over the column limit, then we want to
  split before it.
- Remove spaces around '**' operator.
- Retain formatting of comments in the middle of an expression.
- Don't add a newline to an empty file.
- Over indent a function's parameter list if it's not distinguished from the
  body of the function.

## [0.5.0] 2015-10-11
### Added
- Add option to exclude files/directories from formatting.
- Add a knob to control whether import names are split after the first '('.

### Fixed
- Indent the continuation of an if-then statement when it's not distinguished
  from the body of the if-then.
- Allow for sensible splitting of array indices where appropriate.
- Prefer to not split before the ending bracket of an atom. This produces
  better code in most cases.
- Corrected how horizontal spaces were presevered in a disabled region.

## [0.4.0] 2015-10-07
### Added
- Support for dedenting closing brackets, "facebook" style.

### Fixed
- Formatting of tokens after a multiline string didn't retain their horizontal
  spacing.

## [0.3.1] 2015-09-30
### Fixed
- Format closing scope bracket correctly when indentation size changes.

## [0.3.0] 2015-09-20
### Added
- Return a 2 if the source changed, 1 on error, and 0 for no change.

### Fixed
- Make sure we format if the "lines" specified are in the middle of a
  statement.

## [0.2.9] - 2015-09-13
### Fixed
- Formatting of multiple files. It was halting after formatting the first file.

## [0.2.8] - 2015-09-12
### Added
- Return a non-zero exit code if the source was changed.
- Add bitwise operator splitting penalty and prefer to split before bitwise
  operators.

### Fixed
- Retain vertical spacing between disabled and enabled lines.
- Split only at start of named assign.
- Retain comment position when formatting is disabled.
- Honor splitting before or after logical ops.
