Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

extend CONTINUATION_ALIGN_STYLE=FIXED for space indentation #774

Closed
wants to merge 1 commit into from

Conversation

yinyin
Copy link
Contributor

@yinyin yinyin commented Oct 24, 2019

This PR make CONTINUATION_ALIGN_STYLE=FIXED option available for indenting with space.

Ref: #769

@andreasvc
Copy link

andreasvc commented Oct 24, 2019

Great!

It adds an unexpected linebreak before the return type annotation though:

def _as_prolog_str_full(
        value: Union[PlainOldData, List[Any], bool, str, int, Dict[Any, Any],
        None, Exception]
) -> str:
    """Recursively turn an object into a Prolog term."""

I expected the ) -> str: to go at the end of the previous line; if a line break needs to be inserted (which here it doesn't), I expect it to have the same amount of continuation indentation, because the line is still being continued.

@kamahen
Copy link
Contributor

kamahen commented Oct 24, 2019

This doesn't give the extra 4 spaces of indent on a continuation that I was hoping for. :(

(I also saw the extra indent before ") -> str", which wasn't there before)

@andreasvc
Copy link

@kamahen For me the extra continuation indent works; what's the example you run it on, and what are your settings?
@kamahen I'm confused, you saw an extra indent before ) -> str? I'm seeing the lack of any indentation on that line as shown in my example...

@kamahen
Copy link
Contributor

kamahen commented Oct 25, 2019

Here is my excerpted input:

def cvt_power(node: pytree.Base, ctx: Ctx) -> ast_cooked.Base:
    """power: [AWAIT] atom trailer* ['**' factor]"""
    # Can appear on left of assignment

    if (node.children[0].type == token.AWAIT or
            (node.children[0].type == token.NAME and xcast(Leaf, node.children[0]).value == 'await')):
        atom_child, *trailer_factor_children = node.children[1:]
    else:
        atom_child, *trailer_factor_children = node.children



def _convert(grammar: pgen2_grammar.Grammar,
             raw_node: Tuple[int, str, Tuple[str, int, int],
                             Sequence[Union[Node, Leaf]]]) -> Union[Node, Leaf]:
    """Convert raw node information to a Node or Leaf instance.
    """


def _as_prolog_str_full(value: Union[PlainOldData, List[Any], bool, str, int,
                                     Dict[Any, Any], None, Exception]) -> str:
    """Recursively turn an object into a Prolog term."""

and here is the output of yapf for both SPACE and VALIGN-RIGHT:

def cvt_power(node: pytree.Base, ctx: Ctx) -> ast_cooked.Base:
    """power: [AWAIT] atom trailer* ['**' factor]"""
    # Can appear on left of assignment

    if (node.children[0].type == token.AWAIT or
        (node.children[0].type == token.NAME and xcast(Leaf, node.children[0]).value == 'await')):
        atom_child, *trailer_factor_children = node.children[1:]
    else:
        atom_child, *trailer_factor_children = node.children


def _convert(
    grammar: pgen2_grammar.Grammar, raw_node: Tuple[int, str, Tuple[str, int, int],
                                                    Sequence[Union[Node, Leaf]]]
) -> Union[Node, Leaf]:
    """Convert raw node information to a Node or Leaf instance.
    """


def _as_prolog_str_full(
    value: Union[PlainOldData, List[Any], bool, str, int, Dict[Any, Any], None, Exception]
) -> str:
    """Recursively turn an object into a Prolog term."""

and for FIXED, I got:

def cvt_power(node: pytree.Base, ctx: Ctx) -> ast_cooked.Base:
    """power: [AWAIT] atom trailer* ['**' factor]"""
    # Can appear on left of assignment

    if (node.children[0].type == token.AWAIT or
        (node.children[0].type == token.NAME and xcast(Leaf, node.children[0]).value == 'await')):
        atom_child, *trailer_factor_children = node.children[1:]
    else:
        atom_child, *trailer_factor_children = node.children


def _convert(
    grammar: pgen2_grammar.Grammar, raw_node: Tuple[int, str, Tuple[str, int, int],
    Sequence[Union[Node, Leaf]]]
) -> Union[Node, Leaf]:
    """Convert raw node information to a Node or Leaf instance.
    """


def _as_prolog_str_full(
    value: Union[PlainOldData, List[Any], bool, str, int, Dict[Any, Any], None, Exception]
) -> str:
    """Recursively turn an object into a Prolog term."""

And here is my style:

$ yapf --style-help
[style]
# Align closing bracket with visual indentation.
align_closing_bracket_with_visual_indent=False

# Allow dictionary keys to exist on multiple lines. For example:
#
#   x = {
#       ('this is the first element of a tuple',
#        'this is the second element of a tuple'):
#            value,
#   }
allow_multiline_dictionary_keys=False

# Allow lambdas to be formatted on more than one line.
allow_multiline_lambdas=False

# Allow splitting before a default / named assignment in an argument list.
allow_split_before_default_or_named_assigns=True

# Allow splits before the dictionary value.
allow_split_before_dict_value=True

#   Let spacing indicate operator precedence. For example:
#
#     a = 1 * 2 + 3 / 4
#     b = 1 / 2 - 3 * 4
#     c = (1 + 2) * (3 - 4)
#     d = (1 - 2) / (3 + 4)
#     e = 1 * 2 - 3
#     f = 1 + 2 + 3 + 4
#
# will be formatted as follows to indicate precedence:
#
#     a = 1*2 + 3/4
#     b = 1/2 - 3*4
#     c = (1+2) * (3-4)
#     d = (1-2) / (3+4)
#     e = 1*2 - 3
#     f = 1 + 2 + 3 + 4
#
arithmetic_precedence_indication=False

# Number of blank lines surrounding top-level function and class
# definitions.
blank_lines_around_top_level_definition=2

# Insert a blank line before a class-level docstring.
blank_line_before_class_docstring=False

# Insert a blank line before a module docstring.
blank_line_before_module_docstring=False

# Insert a blank line before a 'def' or 'class' immediately nested
# within another 'def' or 'class'. For example:
#
#   class Foo:
#                      # <------ this blank line
#     def method():
#       ...
blank_line_before_nested_class_or_def=True

# Do not split consecutive brackets. Only relevant when
# dedent_closing_brackets is set. For example:
#
#    call_func_that_takes_a_dict(
#        {
#            'key1': 'value1',
#            'key2': 'value2',
#        }
#    )
#
# would reformat to:
#
#    call_func_that_takes_a_dict({
#        'key1': 'value1',
#        'key2': 'value2',
#    })
coalesce_brackets=True

# The column limit.
column_limit=99

# The style for continuation alignment. Possible values are:
#
# - SPACE: Use spaces for continuation alignment. This is default behavior.
# - FIXED: Use fixed number (CONTINUATION_INDENT_WIDTH) of columns
#   (ie: CONTINUATION_INDENT_WIDTH/INDENT_WIDTH tabs) for continuation
#   alignment.
# - VALIGN-RIGHT: Vertically align continuation lines with indent
#   characters. Slightly right (one more indent character) if cannot
#   vertically align continuation lines with indent characters.
#
# For options FIXED, and VALIGN-RIGHT are only available when USE_TABS is
# enabled.
continuation_align_style=SPACE

# Indent width used for line continuations.
continuation_indent_width=4

# Put closing brackets on a separate line, dedented, if the bracketed
# expression can't fit in a single line. Applies to all kinds of brackets,
# including function definitions and calls. For example:
#
#   config = {
#       'key1': 'value1',
#       'key2': 'value2',
#   }        # <--- this bracket is dedented and on a separate line
#
#   time_series = self.remote_client.query_entity_counters(
#       entity='dev3246.region1',
#       key='dns.query_latency_tcp',
#       transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
#       start_ts=now()-timedelta(days=3),
#       end_ts=now(),
#   )        # <--- this bracket is dedented and on a separate line
dedent_closing_brackets=False

# Disable the heuristic which places each list element on a separate line
# if the list is comma-terminated.
disable_ending_comma_heuristic=False

# Place each dictionary entry onto its own line.
each_dict_entry_on_separate_line=True

# The regex for an i18n comment. The presence of this comment stops
# reformatting of that line, because the comments are required to be
# next to the string they translate.
i18n_comment=

# The i18n function call names. The presence of this function stops
# reformattting on that line, because the string it has cannot be moved
# away from the i18n comment.
i18n_function_call=

# Indent blank lines.
indent_blank_lines=False

# Indent the dictionary value if it cannot fit on the same line as the
# dictionary key. For example:
#
#   config = {
#       'key1':
#           'value1',
#       'key2': value1 +
#               value2,
#   }
indent_dictionary_value=True

# The number of columns to use for indentation.
indent_width=4

# Join short lines into one line. E.g., single line 'if' statements.
join_multiple_lines=False

# Do not include spaces around selected binary operators. For example:
#
#   1 + 2 * 3 - 4 / 5
#
# will be formatted as follows when configured with "*,/":
#
#   1 + 2*3 - 4/5
no_spaces_around_selected_binary_operators=set()

# Use spaces around default or named assigns.
spaces_around_default_or_named_assign=False

# Use spaces around the power operator.
spaces_around_power_operator=False

# The number of spaces required before a trailing comment.
# This can be a single value (representing the number of spaces
# before each trailing comment) or list of values (representing
# 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
#
# will be formatted as:
#
#   1 + 1     # Adding values <-- 5 spaces between the end of the statement and comment
#
# With spaces_before_comment=15, 20:
#
#   1 + 1 # Adding values
#   two + two # More adding
#
#   longer_statement # This is a longer statement
#   short # This is a shorter statement
#
#   a_very_long_statement_that_extends_beyond_the_final_column # Comment
#   short # This is a shorter statement
#
# will be formatted as:
#
#   1 + 1          # Adding values <-- end of line comments in block aligned to col 15
#   two + two      # More adding
#
#   longer_statement    # This is a longer statement <-- end of line comments in block aligned to col 20
#   short               # This is a shorter statement
#
#   a_very_long_statement_that_extends_beyond_the_final_column  # Comment <-- the end of line comments are aligned based on the line length
#   short                                                       # This is a shorter statement
#
spaces_before_comment=2

# Insert a space between the ending comma and closing bracket of a list,
# etc.
space_between_ending_comma_and_closing_bracket=True

# Split before arguments
split_all_comma_separated_values=False

# Split before arguments, but do not split all subexpressions recursively
# (unless needed).
split_all_top_level_comma_separated_values=False

# Split before arguments if the argument list is terminated by a
# comma.
split_arguments_when_comma_terminated=True

# Set to True to prefer splitting before '+', '-', '*', '/', '//', or '@'
# rather than after.
split_before_arithmetic_operator=False

# Set to True to prefer splitting before '&', '|' or '^' rather than
# after.
split_before_bitwise_operator=False

# Split before the closing bracket if a list or dict literal doesn't fit on
# a single line.
split_before_closing_bracket=False

# Split before a dictionary or set generator (comp_for). For example, note
# the split before the 'for':
#
#   foo = {
#       variable: 'Hello world, have a nice day!'
#       for variable in bar if variable != 42
#   }
split_before_dict_set_generator=True

# Split before the '.' if we need to split a longer expression:
#
#   foo = ('This is a really long string: {}, {}, {}, {}'.format(a, b, c, d))
#
# would reformat to something like:
#
#   foo = ('This is a really long string: {}, {}, {}, {}'
#          .format(a, b, c, d))
split_before_dot=False

# Split after the opening paren which surrounds an expression if it doesn't
# fit on a single line.
split_before_expression_after_opening_paren=False

# If an argument / parameter list is going to be split, then split before
# the first argument.
split_before_first_argument=False

# Set to True to prefer splitting before 'and' or 'or' rather than
# after.
split_before_logical_operator=False

# Split named assignments onto individual lines.
split_before_named_assigns=True

# Set to True to split list comprehensions and generators that have
# non-trivial expressions and multiple clauses before each of these
# clauses. For example:
#
#   result = [
#       a_long_var + 100 for a_long_var in xrange(1000)
#       if a_long_var % 10]
#
# would reformat to something like:
#
#   result = [
#       a_long_var + 100
#       for a_long_var in xrange(1000)
#       if a_long_var % 10]
split_complex_comprehension=True

# The penalty for splitting right after the opening bracket.
split_penalty_after_opening_bracket=-100

# The penalty for splitting the line after a unary operator.
split_penalty_after_unary_operator=10000

# The penalty of splitting the line around the '+', '-', '*', '/', '//',
# ``%``, and '@' operators.
split_penalty_arithmetic_operator=300

# The penalty for splitting right before an if expression.
split_penalty_before_if_expr=100

# The penalty of splitting the line around the '&', '|', and '^'
# operators.
split_penalty_bitwise_operator=300

# The penalty for splitting a list comprehension or generator
# expression.
split_penalty_comprehension=80

# The penalty for characters over the column limit.
split_penalty_excess_character=4500

# The penalty incurred by adding a line split to the unwrapped line. The
# more line splits added the higher the penalty.
split_penalty_for_added_line_split=300

# The penalty of splitting a list of "import as" names. For example:
#
#   from a_very_long_or_indented_module_name_yada_yad import (long_argument_1,
#                                                             long_argument_2,
#                                                             long_argument_3)
#
# would reformat to something like:
#
#   from a_very_long_or_indented_module_name_yada_yad import (
#       long_argument_1, long_argument_2, long_argument_3)
split_penalty_import_names=0

# The penalty of splitting the line around the 'and' and 'or'
# operators.
split_penalty_logical_operator=300

# Use the Tab character for indentation.
use_tabs=False

@andreasvc
Copy link

andreasvc commented Oct 25, 2019 via email

@kamahen
Copy link
Contributor

kamahen commented Oct 25, 2019

Hmmm ... continuation_indent_width=8 didn't do what I wanted some time in the past, but now it does. Thank-you!

(With my .style.yapf, I don't see any difference with or without this patch; it doesn't add the extra line break for ") -> str" that @andreasvc noted.)

@yinyin
Copy link
Contributor Author

yinyin commented Oct 25, 2019

I will rework this PR to solve the extra line break issue.

Thank you for helping me test this PR.

@yinyin yinyin closed this Oct 25, 2019
@andreasvc
Copy link

FYI: I'm not sure your PR was to blame; I compared against the latest release.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants