diff --git a/tools/linter_lib/custom_check.py b/tools/linter_lib/custom_check.py index 52f3da6384..58fd746b6a 100644 --- a/tools/linter_lib/custom_check.py +++ b/tools/linter_lib/custom_check.py @@ -190,9 +190,13 @@ def build_custom_checkers(by_lang): ]) + whitespace_rules python_rules = cast(RuleList, [ {'pattern': '^(?!#)@login_required', - 'description': '@login_required is unsupported; use @zulip_login_required'}, + 'description': '@login_required is unsupported; use @zulip_login_required', + 'good_lines': ['@zulip_login_required', '# foo @login_required'], + 'bad_lines': ['@login_required', ' @login_required']}, {'pattern': '".*"%\(.*\)?$', - 'description': 'Missing space around "%"'}, + 'description': 'Missing space around "%"', + 'good_lines': ['"%s" % ("foo")', '"%s" % (foo)'], + 'bad_lines': ['"%s"%("foo")', '"%s"%(foo)']}, {'pattern': "'.*'%\(.*\)?$", 'exclude': set(['analytics/lib/counts.py', 'analytics/tests/test_counts.py', @@ -205,23 +209,39 @@ def build_custom_checkers(by_lang): ('static/templates/settings/bot-settings.handlebars', "'https://hostname.example.com/bots/followup'"), ]), - 'description': 'Missing space around "%"'}, + 'description': 'Missing space around "%"', + 'good_lines': ["'%s' % ('foo')", "'%s' % (foo)"], + 'bad_lines': ["'%s'%('foo')", "'%s'%(foo)"]}, # This rule is constructed with + to avoid triggering on itself {'pattern': " =" + '[^ =>~"]', - 'description': 'Missing whitespace after "="'}, + 'description': 'Missing whitespace after "="', + 'good_lines': ['a = b', '5 == 6'], + 'bad_lines': ['a =b', 'asdf =42']}, {'pattern': '":\w[^"]*$', - 'description': 'Missing whitespace after ":"'}, + 'description': 'Missing whitespace after ":"', + 'good_lines': ['"foo": bar', '"some:string:with:colons"'], + 'bad_lines': ['"foo":bar', '"foo":1']}, {'pattern': "':\w[^']*$", - 'description': 'Missing whitespace after ":"'}, + 'description': 'Missing whitespace after ":"', + 'good_lines': ["'foo': bar", "'some:string:with:colons'"], + 'bad_lines': ["'foo':bar", "'foo':1"]}, {'pattern': "^\s+#\w", 'strip': '\n', - 'description': 'Missing whitespace after "#"'}, + 'description': 'Missing whitespace after "#"', + 'good_lines': ['a = b # some operation', '1+2 # 3 is the result'], + 'bad_lines': [' #some operation', ' #not valid!!!']}, {'pattern': "assertEquals[(]", - 'description': 'Use assertEqual, not assertEquals (which is deprecated).'}, + 'description': 'Use assertEqual, not assertEquals (which is deprecated).', + 'good_lines': ['assertEqual(1, 2)'], + 'bad_lines': ['assertEquals(1, 2)']}, {'pattern': "== None", - 'description': 'Use `is None` to check whether something is None'}, + 'description': 'Use `is None` to check whether something is None', + 'good_lines': ['if foo is None'], + 'bad_lines': ['foo == None']}, {'pattern': "type:[(]", - 'description': 'Missing whitespace after ":" in type annotation'}, + 'description': 'Missing whitespace after ":" in type annotation', + 'good_lines': ['# type: (Any, Any)', 'colon:separated:string:containing:type:as:keyword'], + 'bad_lines': ['# type:(Any, Any)']}, {'pattern': "type: ignore$", 'exclude': set(['tools/tests', 'zerver/lib/test_runner.py',