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

## [0.28.1] UNRELEASED
### 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.
### Fixed
- Format subscript lists so that splits are essentially free after a comma.

## [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.
### 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 accound 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 "dictonary 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
  techincally 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.
