From 367a75d2c8f2e27d9ef284c1e52bd4f17b83e750 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 28 Jun 2017 10:15:51 +0200 Subject: [PATCH] Proper handling of E251 / E252. --- parso/python/normalizer.py | 22 +++++++----- test/normalizer_issue_files/E25.py | 56 ++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 test/normalizer_issue_files/E25.py diff --git a/parso/python/normalizer.py b/parso/python/normalizer.py index 55b3a23..938669f 100644 --- a/parso/python/normalizer.py +++ b/parso/python/normalizer.py @@ -15,9 +15,10 @@ _CLOSING_BRACKETS = ')', ']', '}' _FACTOR = '+', '-', '~' _ALLOW_SPACE = '*', '+', '-', '**', '/', '//', '@' _BITWISE_OPERATOR = '<<', '>>', '|', '&', '^' -_NEEDS_SPACE = '=', '<', '>', '==', '>=', '<=', '<>', '!=', '%', \ - '+=', '-=', '*=', '@=', '/=', '%=', '&=', '|=', '^=', '<<=', \ - '>>=', '**=', '//=' +_NEEDS_SPACE = ('=', '%', '->', + '<', '>', '==', '>=', '<=', '<>', '!=', + '+=', '-=', '*=', '@=', '/=', '%=', '&=', '|=', '^=', '<<=', + '>>=', '**=', '//=') _NEEDS_SPACE += _BITWISE_OPERATOR _IMPLICIT_INDENTATION_TYPES = ('dictorsetmaker', 'argument') @@ -476,10 +477,6 @@ class PEP8Normalizer(Normalizer): elif leaf == ':': # Is a subscript # TODO pass - elif prev.type == 'keyword': - add_not_spaces(275, 'Missing whitespace around keyword', info.indentation_part) - elif leaf.type == 'keyword': - add_not_spaces(275, 'Missing whitespace around keyword', info.indentation_part) elif prev in (',', ';', ':'): # TODO pass @@ -493,7 +490,14 @@ class PEP8Normalizer(Normalizer): elif leaf in _NEEDS_SPACE or prev in _NEEDS_SPACE: if leaf == '=' and leaf.parent.type in ('argument', 'param') \ or prev == '=' and prev.parent.type in ('argument', 'param'): - add_if_spaces(251, 'Unexpected spaces around keyword / parameter equals', info.indentation_part) + if leaf == '=': + param = leaf.parent + else: + param = prev.parent + if param.type == 'param' and param.annotation: + add_not_spaces(252, 'Expected spaces around annotation equals', info.indentation_part) + else: + add_if_spaces(251, 'Unexpected spaces around keyword / parameter equals', info.indentation_part) elif leaf in _BITWISE_OPERATOR or prev in _BITWISE_OPERATOR: add_not_spaces(227, 'Missing whitespace around bitwise or shift operator', info.indentation_part) elif leaf == '%' or prev == '%': @@ -502,6 +506,8 @@ class PEP8Normalizer(Normalizer): message_225 = 'Missing whitespace between tokens' add_not_spaces(225, message_225, info.indentation_part) #print('x', leaf.start_pos, leaf, prev) + elif leaf.type =='keyword' or prev.type == 'keyword': + add_not_spaces(275, 'Missing whitespace around keyword', info.indentation_part) else: prev_info = self._previous_whitespace_info message_225 = 'Missing whitespace between tokens' diff --git a/test/normalizer_issue_files/E25.py b/test/normalizer_issue_files/E25.py new file mode 100644 index 0000000..baf34b3 --- /dev/null +++ b/test/normalizer_issue_files/E25.py @@ -0,0 +1,56 @@ +#: E251:11 E251:13 +def foo(bar = False): + '''Test function with an error in declaration''' + pass +#: E251:8 +foo(bar= True) +#: E251:7 +foo(bar =True) +#: E251:7 E251:9 +foo(bar = True) +#: E251:13 +y = bar(root= "sdasd") +parser.add_argument('--long-option', + #: E135+1:20 + default= + "/rather/long/filesystem/path/here/blah/blah/blah") +parser.add_argument('--long-option', + default= + "/rather/long/filesystem") +#: E999+1:44 +parser.add_argument('--long-option', default + ="/rather/long/filesystem/path/here/blah/blah/blah") +#: E251+2:7 E251+2:9 +foo(True, + baz=(1, 2), + biz = 'foo' + ) +# Okay +foo(bar=(1 == 1)) +foo(bar=(1 != 1)) +foo(bar=(1 >= 1)) +foo(bar=(1 <= 1)) +(options, args) = parser.parse_args() +d[type(None)] = _deepcopy_atomic + +# Annotated Function Definitions +# Okay +def munge(input: AnyStr, sep: AnyStr = None, limit=1000, + extra: Union[str, dict] = None) -> AnyStr: + pass +# Okay +async def add(a: int = 0, b: int = 0) -> int: + return a + b + +# Previously E251 four times +#: E221:5 +async def add(a: int = 0, b: int = 0) -> int: + return a + b + +#: E225:24 E225:26 +def x(b: tuple = (1, 2))->int: + return a + b + +#: E252:11 E252:12 +def b(a:int=1): + pass