2020-06-03 06:13:40 +02:00
from typing import List
2019-05-30 17:41:23 +02:00
2020-06-03 06:13:40 +02:00
from zulint . custom_rules import Rule , RuleList
2019-05-30 17:41:23 +02:00
# Rule help:
# By default, a rule applies to all files within the extension for which it is specified (e.g. all .py files)
# There are three operators we can use to manually include or exclude files from linting for a rule:
# 'exclude': 'set([<path>, ...])' - if <path> is a filename, excludes that file.
# if <path> is a directory, excludes all files directly below the directory <path>.
# 'exclude_line': 'set([(<path>, <line>), ...])' - excludes all lines matching <line> in the file <path> from linting.
# 'include_only': 'set([<path>, ...])' - includes only those files where <path> is a substring of the filepath.
2017-08-04 02:23:09 +02:00
2018-11-08 16:33:36 +01:00
FILES_WITH_LEGACY_SUBJECT = {
# This basically requires a big DB migration:
' zerver/lib/topic.py ' ,
2018-11-10 17:52:28 +01:00
# This is for backward compatibility.
' zerver/tests/test_legacy_subject.py ' ,
# Other migration-related changes require extreme care.
2018-11-08 16:33:36 +01:00
' zerver/lib/fix_unreads.py ' ,
2018-11-10 17:52:28 +01:00
' zerver/tests/test_migrations.py ' ,
2018-11-08 16:33:36 +01:00
# These use subject in the email sense, and will
# probably always be exempt:
' zerver/lib/email_mirror.py ' ,
2020-04-09 13:25:22 +02:00
' zerver/lib/send_email.py ' ,
2018-11-10 17:52:28 +01:00
' zerver/tests/test_new_users.py ' ,
2019-01-04 08:34:59 +01:00
' zerver/tests/test_email_mirror.py ' ,
2020-04-09 13:39:16 +02:00
' zerver/tests/test_email_notifications.py ' ,
2018-11-08 16:33:36 +01:00
# These are tied more to our API than our DB model.
2019-08-04 18:14:48 +02:00
' zerver/openapi/python_examples.py ' ,
2019-07-15 22:33:16 +02:00
' zerver/tests/test_openapi.py ' ,
2018-11-08 16:33:36 +01:00
2018-11-10 18:28:56 +01:00
# This has lots of query data embedded, so it's hard
# to fix everything until we migrate the DB to "topic".
2020-07-07 23:19:13 +02:00
' zerver/tests/test_message_fetch.py ' ,
2018-11-08 16:33:36 +01:00
}
2020-04-22 01:09:50 +02:00
shebang_rules : List [ " Rule " ] = [
2019-06-12 18:37:03 +02:00
{ ' pattern ' : ' ^#! ' ,
' description ' : " zerver library code shouldn ' t have a shebang line. " ,
2020-04-09 21:51:58 +02:00
' include_only ' : { ' zerver/ ' } } ,
2019-06-12 18:37:03 +02:00
# /bin/sh and /usr/bin/env are the only two binaries
# that NixOS provides at a fixed path (outside a
# buildFHSUserEnv sandbox).
{ ' pattern ' : ' ^#!(?! *(?:/usr/bin/env|/bin/sh)(?: |$)) ' ,
' description ' : " Use `#!/usr/bin/env foo` instead of `#!/path/foo` "
" for interpreters other than sh. " } ,
{ ' pattern ' : ' ^#!/usr/bin/env python$ ' ,
python: Use trailing commas consistently.
Automatically generated by the following script, based on the output
of lint with flake8-comma:
import re
import sys
last_filename = None
last_row = None
lines = []
for msg in sys.stdin:
m = re.match(
r"\x1b\[35mflake8 \|\x1b\[0m \x1b\[1;31m(.+):(\d+):(\d+): (\w+)", msg
)
if m:
filename, row_str, col_str, err = m.groups()
row, col = int(row_str), int(col_str)
if filename == last_filename:
assert last_row != row
else:
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
with open(filename) as f:
lines = f.readlines()
last_filename = filename
last_row = row
line = lines[row - 1]
if err in ["C812", "C815"]:
lines[row - 1] = line[: col - 1] + "," + line[col - 1 :]
elif err in ["C819"]:
assert line[col - 2] == ","
lines[row - 1] = line[: col - 2] + line[col - 1 :].lstrip(" ")
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2020-04-10 05:23:40 +02:00
' description ' : " Use `#!/usr/bin/env python3` instead of `#!/usr/bin/env python`. " } ,
2020-04-22 01:09:50 +02:00
]
2019-06-12 18:37:03 +02:00
2020-04-22 01:09:50 +02:00
trailing_whitespace_rule : " Rule " = {
2019-05-30 17:41:23 +02:00
' pattern ' : r ' \ s+$ ' ,
' strip ' : ' \n ' ,
python: Use trailing commas consistently.
Automatically generated by the following script, based on the output
of lint with flake8-comma:
import re
import sys
last_filename = None
last_row = None
lines = []
for msg in sys.stdin:
m = re.match(
r"\x1b\[35mflake8 \|\x1b\[0m \x1b\[1;31m(.+):(\d+):(\d+): (\w+)", msg
)
if m:
filename, row_str, col_str, err = m.groups()
row, col = int(row_str), int(col_str)
if filename == last_filename:
assert last_row != row
else:
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
with open(filename) as f:
lines = f.readlines()
last_filename = filename
last_row = row
line = lines[row - 1]
if err in ["C812", "C815"]:
lines[row - 1] = line[: col - 1] + "," + line[col - 1 :]
elif err in ["C819"]:
assert line[col - 2] == ","
lines[row - 1] = line[: col - 2] + line[col - 1 :].lstrip(" ")
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2020-04-10 05:23:40 +02:00
' description ' : ' Fix trailing whitespace ' ,
2020-04-22 01:09:50 +02:00
}
whitespace_rules : List [ " Rule " ] = [
2019-05-30 17:41:23 +02:00
# This linter should be first since bash_rules depends on it.
trailing_whitespace_rule ,
{ ' pattern ' : ' http://zulip.readthedocs.io ' ,
' description ' : ' Use HTTPS when linking to ReadTheDocs ' ,
} ,
{ ' pattern ' : ' \t ' ,
' strip ' : ' \n ' ,
2020-07-04 13:17:27 +02:00
' exclude ' : { ' tools/ci/success-http-headers.template.txt ' } ,
2019-05-30 17:41:23 +02:00
' description ' : ' Fix tab-based whitespace ' } ,
2020-04-22 01:09:50 +02:00
]
comma_whitespace_rule : List [ " Rule " ] = [
2019-05-30 17:41:23 +02:00
{ ' pattern ' : ' , { 2,}[^#/ ] ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' zerver/tests ' , ' frontend_tests/node_tests ' , ' corporate/tests ' } ,
2019-05-30 17:41:23 +02:00
' description ' : " Remove multiple whitespaces after ' , ' " ,
' good_lines ' : [ ' foo(1, 2, 3) ' , ' foo = bar # some inline comment ' ] ,
' bad_lines ' : [ ' foo(1, 2, 3) ' , ' foo(1, 2, 3) ' ] } ,
2020-04-22 01:09:50 +02:00
]
2020-09-02 06:59:07 +02:00
markdown_whitespace_rules : List [ " Rule " ] = [
* ( rule for rule in whitespace_rules if rule [ ' pattern ' ] != r ' \ s+$ ' ) ,
2020-08-11 01:47:49 +02:00
# Two spaces trailing a line with other content is okay--it's a Markdown line break.
2019-05-30 17:41:23 +02:00
# This rule finds one space trailing a non-space, three or more trailing spaces, and
# spaces on an empty line.
{ ' pattern ' : r ' ((?<! \ s) \ s$)|( \ s \ s \ s+$)|(^ \ s+$) ' ,
' strip ' : ' \n ' ,
' description ' : ' Fix trailing whitespace ' } ,
{ ' pattern ' : ' ^#+[A-Za-z0-9] ' ,
' strip ' : ' \n ' ,
' description ' : ' Missing space after # in heading ' ,
' good_lines ' : [ ' ### some heading ' , ' # another heading ' ] ,
' bad_lines ' : [ ' ###some heading ' , ' #another heading ' ] } ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
]
2019-05-30 17:41:23 +02:00
js_rules = RuleList (
langs = [ ' js ' ] ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
rules = [
2018-12-23 17:58:31 +01:00
{ ' pattern ' : ' subject|SUBJECT ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' static/js/util.js ' ,
' frontend_tests/ ' } ,
2018-12-23 17:58:31 +01:00
' exclude_pattern ' : ' emails ' ,
' description ' : ' avoid subject in JS code ' ,
' good_lines ' : [ ' topic_name ' ] ,
' bad_lines ' : [ ' subject= " foo " ' , ' MAX_SUBJECT_LEN ' ] } ,
2019-08-28 17:46:10 +02:00
{ ' pattern ' : ' msgid|MSGID ' ,
' description ' : ' Avoid using " msgid " as a variable name; use " message_id " instead. ' } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' .*blueslip.warning \ (.* ' ,
2017-06-05 16:29:04 +02:00
' description ' : ' The module blueslip has no function warning, try using blueslip.warn ' } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' i18n \ .t \ ([^)]+[^, \ { \ )]$ ' ,
2017-09-05 08:37:25 +02:00
' description ' : ' i18n string should not be a multiline string ' } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ''' i18n \ .t \ ([ ' " ].+?[ ' " ] \ s* \ + ''' ,
2017-09-08 09:35:11 +02:00
' description ' : ' Do not concatenate arguments within i18n.t() ' } ,
2020-05-27 23:03:16 +02:00
{ ' pattern ' : r ''' i18n \ .t \ ([a-zA-Z] ''' ,
' exclude ' : { ' static/js/templates.js ' } ,
' description ' : ' Do not pass a variable into i18n.t; it will not be exported to Transifex for translation. ' } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' i18n \ .t \ (.+ \ ).* \ + ' ,
2020-07-15 00:39:50 +02:00
' description ' : ' Do not concatenate i18n strings ' ,
' exclude_line ' : {
( ' static/js/narrow.js ' , ' i18n.t( " Some common words were excluded from your search. " ) + ' ) ,
} } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' \ +.*i18n \ .t \ (.+ \ ) ' ,
2017-09-05 08:37:25 +02:00
' description ' : ' Do not concatenate i18n strings ' } ,
2018-03-22 22:04:24 +01:00
{ ' pattern ' : ' [.]html[(] ' ,
2020-02-28 23:59:07 +01:00
' exclude_pattern ' : r ''' \ .html \ (( " | ' |render_|html|message \ .content|util \ .clean_user_content_links|i18n \ .t|rendered_|$| \ )|error_text|widget_elem| \ $error| \ $ \ ( " <p> " \ )) ''' ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
' exclude ' : { ' static/js/portico ' , ' static/js/lightbox.js ' , ' static/js/ui_report.js ' ,
2018-09-12 17:43:38 +02:00
' static/js/confirm_dialog.js ' ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
' frontend_tests/ ' } ,
2018-03-22 22:04:24 +01:00
' description ' : ' Setting HTML content with jQuery .html() can lead to XSS security bugs. Consider .text() or using rendered_foo as a variable name if content comes from handlebars and thus is already sanitized. ' } ,
2017-06-05 16:29:04 +02:00
{ ' pattern ' : ' [ " \' ]json/ ' ,
' description ' : ' Relative URL for JSON route not supported by i18n ' } ,
# This rule is constructed with + to avoid triggering on itself
{ ' pattern ' : ' ^[ ]*//[A-Za-z0-9] ' ,
' description ' : ' Missing space after // in comment ' } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ''' [.]text \ ([ " ' ][a-zA-Z] ''' ,
2018-07-20 20:23:02 +02:00
' description ' : ' Strings passed to $().text should be wrapped in i18n.t() for internationalization ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' frontend_tests/node_tests/ ' } } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ''' compose_error \ ([ " ' ] ''' ,
2017-06-05 16:29:04 +02:00
' description ' : ' Argument to compose_error should be a literal string enclosed '
' by i18n.t() ' } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' ui.report_success \ ( ' ,
2017-06-05 16:29:04 +02:00
' description ' : ' Deprecated function, use ui_report.success. ' } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ''' report.success \ ([ " ' ] ''' ,
2017-06-05 16:29:04 +02:00
' description ' : ' Argument to report_success should be a literal string enclosed '
' by i18n.t() ' } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' ui.report_error \ ( ' ,
2017-06-05 16:29:04 +02:00
' description ' : ' Deprecated function, use ui_report.error. ' } ,
2018-12-18 21:32:54 +01:00
{ ' pattern ' : r ''' report.error \ ([ " ' ][^ ' " ] ''' ,
' description ' : ' Argument to ui_report.error should be a literal string enclosed '
' by i18n.t() ' ,
' good_lines ' : [ ' ui_report.error( " " ) ' , ' ui_report.error(_( " text " )) ' ] ,
' bad_lines ' : [ ' ui_report.error( " test " ) ' ] } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' \ $ \ (document \ ) \ .ready \ ( ' ,
2017-10-05 16:03:58 +02:00
' description ' : " `Use $(f) rather than `$(document).ready(f)` " ,
' good_lines ' : [ ' $(function () { foo();} ' ] ,
' bad_lines ' : [ ' $(document).ready(function () { foo();} ' ] } ,
2018-02-14 01:47:09 +01:00
{ ' pattern ' : ' [$][.](get|post|patch|delete|ajax)[(] ' ,
' description ' : " Use channel module for AJAX calls " ,
2020-04-09 21:51:58 +02:00
' exclude ' : {
2018-02-14 01:47:09 +01:00
# Internal modules can do direct network calls
' static/js/blueslip.js ' ,
' static/js/channel.js ' ,
# External modules that don't include channel.js
' static/js/stats/ ' ,
' static/js/portico/ ' ,
2018-09-06 15:14:54 +02:00
' static/js/billing/ ' ,
2020-04-09 21:51:58 +02:00
} ,
2018-02-14 01:47:09 +01:00
' good_lines ' : [ ' channel.get(...) ' ] ,
' bad_lines ' : [ ' $.get() ' , ' $.post() ' , ' $.ajax() ' ] } ,
2017-10-06 10:12:47 +02:00
{ ' pattern ' : ' style ?= ' ,
' description ' : " Avoid using the `style=` attribute; we prefer styling in CSS files " ,
2020-04-09 21:51:58 +02:00
' exclude ' : {
2017-11-23 21:17:08 +01:00
' frontend_tests/node_tests/copy_and_paste.js ' ,
2017-11-25 22:22:36 +01:00
' frontend_tests/node_tests/upload.js ' ,
2017-11-23 15:00:05 +01:00
' static/js/upload.js ' ,
2017-10-06 10:12:47 +02:00
' static/js/stream_color.js ' ,
2020-04-09 21:51:58 +02:00
} ,
2017-10-06 10:12:47 +02:00
' good_lines ' : [ ' #my-style { color: blue;} ' ] ,
' bad_lines ' : [ ' <p style= " color: blue; " >Foo</p> ' , ' style = " color: blue; " ' ] } ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
* whitespace_rules ,
] ,
2019-05-30 17:41:23 +02:00
)
python_rules = RuleList (
langs = [ ' py ' ] ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
rules = [
2018-11-01 21:21:01 +01:00
{ ' pattern ' : ' subject|SUBJECT ' ,
2018-11-27 20:05:25 +01:00
' exclude_pattern ' : ' subject to the|email|outbox ' ,
2018-11-01 21:21:01 +01:00
' description ' : ' avoid subject as a var ' ,
' good_lines ' : [ ' topic_name ' ] ,
' bad_lines ' : [ ' subject= " foo " ' , ' MAX_SUBJECT_LEN ' ] ,
2018-11-08 16:33:36 +01:00
' exclude ' : FILES_WITH_LEGACY_SUBJECT ,
2020-04-09 21:51:58 +02:00
' include_only ' : {
2018-11-10 17:10:45 +01:00
' zerver/data_import/ ' ,
2018-11-09 20:23:55 +01:00
' zerver/lib/ ' ,
2018-11-10 17:52:28 +01:00
' zerver/tests/ ' ,
2020-04-09 21:51:58 +02:00
' zerver/views/ ' } } ,
2019-08-15 08:05:44 +02:00
{ ' pattern ' : ' msgid|MSGID ' ,
2020-09-03 04:11:56 +02:00
' exclude ' : { ' tools/check-capitalization ' } ,
2019-08-15 08:05:44 +02:00
' description ' : ' Avoid using " msgid " as a variable name; use " message_id " instead. ' } ,
2017-06-05 16:29:04 +02:00
{ ' pattern ' : ' ^(?!#)@login_required ' ,
2017-09-26 15:54:14 +02:00
' description ' : ' @login_required is unsupported; use @zulip_login_required ' ,
' good_lines ' : [ ' @zulip_login_required ' , ' # foo @login_required ' ] ,
' bad_lines ' : [ ' @login_required ' , ' @login_required ' ] } ,
2017-11-20 19:52:10 +01:00
{ ' pattern ' : ' ^user_profile[.]save[(][)] ' ,
' description ' : ' Always pass update_fields when saving user_profile objects ' ,
2020-04-09 21:51:58 +02:00
' exclude_line ' : {
2017-11-20 19:52:10 +01:00
( ' zerver/lib/actions.py ' , " user_profile.save() # Can ' t use update_fields because of how the foreign key works. " ) ,
2020-04-09 21:51:58 +02:00
} ,
' exclude ' : { ' zerver/tests ' , ' zerver/lib/create_user.py ' } ,
2017-11-20 19:52:10 +01:00
' good_lines ' : [ ' user_profile.save(update_fields=[ " pointer " ]) ' ] ,
' bad_lines ' : [ ' user_profile.save() ' ] } ,
2017-12-08 17:03:58 +01:00
{ ' pattern ' : ' self: Any ' ,
' description ' : ' you can omit Any annotation for self ' ,
' good_lines ' : [ ' def foo (self): ' ] ,
' bad_lines ' : [ ' def foo(self: Any): ' ] } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r " ^ \ s+# \ w " ,
2017-06-05 16:29:04 +02:00
' strip ' : ' \n ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' tools/droplets/create.py ' } ,
2017-09-26 15:54:14 +02:00
' description ' : ' Missing whitespace after " # " ' ,
' good_lines ' : [ ' a = b # some operation ' , ' 1+2 # 3 is the result ' ] ,
' bad_lines ' : [ ' #some operation ' , ' #not valid!!! ' ] } ,
2017-06-05 16:29:04 +02:00
{ ' pattern ' : " assertEquals[(] " ,
2017-09-26 15:54:14 +02:00
' description ' : ' Use assertEqual, not assertEquals (which is deprecated). ' ,
' good_lines ' : [ ' assertEqual(1, 2) ' ] ,
' bad_lines ' : [ ' assertEquals(1, 2) ' ] } ,
2020-05-09 00:29:45 +02:00
{ ' pattern ' : r " # \ s*type: \ s*ignore(?! \ [[^][]+ \ ] +# + \ S) " ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' tools/tests ' ,
' zerver/lib/test_runner.py ' ,
' zerver/tests ' } ,
2020-04-22 04:13:37 +02:00
' description ' : ' " type: ignore " should always end with " # type: ignore[code] # explanation for why " ' ,
' good_lines ' : [ ' foo = bar # type: ignore[code] # explanation ' ] ,
' bad_lines ' : [ ' foo = bar # type: ignore ' ,
' foo = bar # type: ignore[code] ' ,
' foo = bar # type: ignore # explanation ' ] } ,
2017-10-05 15:09:46 +02:00
{ ' pattern ' : r ' \ b(if|else|while)[(] ' ,
' description ' : ' Put a space between statements like if, else, etc. and (. ' ,
' good_lines ' : [ ' if (1 == 2): ' , ' while (foo == bar): ' ] ,
' bad_lines ' : [ ' if(1 == 2): ' , ' while(foo == bar): ' ] } ,
2017-06-05 16:29:04 +02:00
{ ' pattern ' : " , [)] " ,
2017-11-08 19:35:35 +01:00
' description ' : ' Unnecessary whitespace between " , " and " ) " ' ,
' good_lines ' : [ ' foo = (1, 2, 3,) ' , ' foo(bar, 42) ' ] ,
' bad_lines ' : [ ' foo = (1, 2, 3, ) ' ] } ,
2018-03-02 01:27:08 +01:00
{ ' pattern ' : ' sudo ' ,
2020-04-09 21:51:58 +02:00
' include_only ' : { ' scripts/ ' } ,
' exclude ' : { ' scripts/lib/setup_venv.py ' } ,
' exclude_line ' : {
2019-02-26 20:20:46 +01:00
( ' scripts/lib/zulip_tools.py ' , ' sudo_args = kwargs.pop( \' sudo_args \' , []) ' ) ,
2020-09-02 06:59:07 +02:00
( ' scripts/lib/zulip_tools.py ' , ' args = [ \' sudo \' , *sudo_args, \' -- \' , *args] ' ) ,
2020-04-09 21:51:58 +02:00
} ,
2018-03-02 01:27:08 +01:00
' description ' : ' Most scripts are intended to run on systems without sudo. ' ,
' good_lines ' : [ ' subprocess.check_call([ " ls " ]) ' ] ,
' bad_lines ' : [ ' subprocess.check_call([ " sudo " , " ls " ]) ' ] } ,
2017-06-05 16:29:04 +02:00
{ ' pattern ' : ' django.utils.translation ' ,
2020-04-09 21:51:58 +02:00
' include_only ' : { ' test/ ' , ' zerver/views/development/ ' } ,
2017-11-08 19:35:35 +01:00
' description ' : ' Test strings should not be tagged for translation ' ,
' good_lines ' : [ ' ' ] ,
' bad_lines ' : [ ' django.utils.translation ' ] } ,
2017-10-07 17:55:36 +02:00
{ ' pattern ' : ' userid ' ,
2017-11-08 19:35:35 +01:00
' description ' : ' We prefer user_id over userid. ' ,
' good_lines ' : [ ' id = alice.user_id ' ] ,
' bad_lines ' : [ ' id = alice.userid ' ] } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' json_success \ ( {} \ ) ' ,
2017-11-08 19:35:35 +01:00
' description ' : ' Use json_success() to return nothing ' ,
' good_lines ' : [ ' return json_success() ' ] ,
' bad_lines ' : [ ' return json_success( {} ) ' ] } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' \ Wjson_error \ (_ \ (? \ w+ \ ) ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' zerver/tests ' , ' zerver/views/development/ ' } ,
2017-11-08 19:35:35 +01:00
' description ' : ' Argument to json_error should be a literal string enclosed by _() ' ,
' good_lines ' : [ ' return json_error(_( " string " )) ' ] ,
' bad_lines ' : [ ' return json_error(_variable) ' , ' return json_error(_(variable)) ' ] } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ''' \ Wjson_error \ ([ ' " ].+[),]$ ''' ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' zerver/tests ' } ,
2017-06-05 16:29:04 +02:00
' description ' : ' Argument to json_error should a literal string enclosed by _() ' } ,
# To avoid JsonableError(_variable) and JsonableError(_(variable))
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' \ WJsonableError \ (_ \ (? \ w.+ \ ) ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' zerver/tests ' , ' zerver/views/development/ ' } ,
2017-06-05 16:29:04 +02:00
' description ' : ' Argument to JsonableError should be a literal string enclosed by _() ' } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ''' \ WJsonableError \ ([ " ' ].+ \ ) ''' ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' zerver/tests ' , ' zerver/views/development/ ' } ,
2017-06-05 16:29:04 +02:00
' description ' : ' Argument to JsonableError should be a literal string enclosed by _() ' } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ''' ([a-zA-Z0-9_]+)=REQ \ ([ ' " ] \ 1[ ' " ] ''' ,
2017-06-05 16:29:04 +02:00
' description ' : ' REQ \' s first argument already defaults to parameter name ' } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' self \ .client \ .(get|post|patch|put|delete) ' ,
2017-06-05 16:29:04 +02:00
' description ' : \
''' Do not call self.client directly for put/patch/post/get.
See WRAPPER_COMMENT in test_helpers . py for details .
''' },
# Directly fetching Message objects in e.g. views code is often a security bug.
2017-09-27 09:47:46 +02:00
{ ' pattern ' : ' [^r]Message.objects.get ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : { " zerver/tests " ,
" zerver/lib/onboarding.py " ,
" zilencer/management/commands/add_mock_conversation.py " ,
" zerver/worker/queue_processors.py " ,
" zerver/management/commands/export.py " ,
" zerver/lib/export.py " } ,
2017-06-05 16:29:04 +02:00
' description ' : ' Please use access_message() to fetch Message objects ' ,
} ,
2017-09-27 09:47:46 +02:00
{ ' pattern ' : ' Stream.objects.get ' ,
2020-04-09 21:51:58 +02:00
' include_only ' : { " zerver/views/ " } ,
2017-06-05 16:29:04 +02:00
' description ' : ' Please use access_stream_by_*() to fetch Stream objects ' ,
} ,
{ ' pattern ' : ' get_stream[(] ' ,
2020-04-09 21:51:58 +02:00
' include_only ' : { " zerver/views/ " , " zerver/lib/actions.py " } ,
' exclude_line ' : {
2017-06-05 16:29:04 +02:00
# This one in check_message is kinda terrible, since it's
# how most instances are written, but better to exclude something than nothing
( ' zerver/lib/actions.py ' , ' stream = get_stream(stream_name, realm) ' ) ,
2020-02-10 16:29:25 +01:00
( ' zerver/lib/actions.py ' , ' return get_stream( " signups " , realm) ' ) ,
2020-04-09 21:51:58 +02:00
} ,
2017-06-05 16:29:04 +02:00
' description ' : ' Please use access_stream_by_*() to fetch Stream objects ' ,
} ,
{ ' pattern ' : ' datetime[.](now|utcnow) ' ,
2020-04-09 21:51:58 +02:00
' include_only ' : { " zerver/ " , " analytics/ " } ,
2017-06-05 16:29:04 +02:00
' description ' : " Don ' t use datetime in backend code. \n "
2017-11-08 17:55:36 +01:00
" See https://zulip.readthedocs.io/en/latest/contributing/code-style.html#naive-datetime-objects " ,
2017-06-05 16:29:04 +02:00
} ,
2017-09-22 08:15:01 +02:00
{ ' pattern ' : ' from os.path ' ,
' description ' : " Don ' t use from when importing from the standard library " ,
} ,
2017-09-22 18:30:18 +02:00
{ ' pattern ' : ' import os.path ' ,
' description ' : " Use import os instead of import os.path " ,
} ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' (logging|logger) \ .warn \ W ' ,
2017-10-02 11:12:52 +02:00
' description ' : " Logger.warn is a deprecated alias for Logger.warning; Use ' warning ' instead of ' warn ' . " ,
' good_lines ' : [ " logging.warning( ' I am a warning. ' ) " , " logger.warning( ' warning ' ) " ] ,
' bad_lines ' : [ " logging.warn( ' I am a warning. ' ) " , " logger.warn( ' warning ' ) " ] } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' \ .pk ' ,
2017-10-06 13:17:23 +02:00
' exclude_pattern ' : ' [.]_meta[.]pk ' ,
' description ' : " Use `id` instead of `pk`. " ,
' good_lines ' : [ ' if my_django_model.id == 42 ' , ' self.user_profile._meta.pk ' ] ,
2017-10-18 11:12:55 +02:00
' bad_lines ' : [ ' if my_django_model.pk == 42 ' ] } ,
2020-05-09 00:29:45 +02:00
{ ' pattern ' : r ' ^ \ s*# \ s*type: ' ,
2018-03-12 00:09:33 +01:00
' description ' : ' Comment-style function type annotation. Use Python3 style annotations instead. ' ,
} ,
2020-05-09 00:29:45 +02:00
{ ' pattern ' : r " \ S \ s*# \ s*type:(?! \ s*ignore) " ,
' exclude ' : { ' scripts/lib/hash_reqs.py ' ,
' scripts/lib/setup_venv.py ' ,
' scripts/lib/zulip_tools.py ' ,
2020-07-07 02:05:02 +02:00
' tools/lib/provision.py ' } ,
2020-05-09 00:29:45 +02:00
' description ' : ' Comment-style variable type annotation. Use Python 3.6 style annotations instead. ' ,
' good_lines ' : [ ' a: List[int] = [] ' ] ,
' bad_lines ' : [ ' a = [] # type: List[int] ' ] } ,
2020-05-09 00:10:17 +02:00
{ ' pattern ' : r ' : *(?!Optional)[^ ].*= models[.].*null=True ' ,
2018-03-25 03:32:04 +02:00
' include_only ' : { " zerver/models.py " } ,
' description ' : ' Model variable with null=true not annotated as Optional. ' ,
2020-05-09 00:10:17 +02:00
' good_lines ' : [ ' desc: Optional[Text] = models.TextField(null=True) ' ,
' stream: Optional[Stream] = models.ForeignKey(Stream, null=True, on_delete=CASCADE) ' ,
' desc: Text = models.TextField() ' ,
' stream: Stream = models.ForeignKey(Stream, on_delete=CASCADE) ' ] ,
' bad_lines ' : [ ' desc: Text = models.CharField(null=True) ' ,
' stream: Stream = models.ForeignKey(Stream, null=True, on_delete=CASCADE) ' ] ,
2018-03-25 03:32:04 +02:00
} ,
2020-05-09 00:10:17 +02:00
{ ' pattern ' : r ' : *Optional.*= models[.].* \ ) ' ,
2018-03-26 00:00:44 +02:00
' exclude_pattern ' : ' null=True ' ,
' include_only ' : { " zerver/models.py " } ,
' description ' : ' Model variable annotated with Optional but variable does not have null=true. ' ,
2020-05-09 00:10:17 +02:00
' good_lines ' : [ ' desc: Optional[Text] = models.TextField(null=True) ' ,
' stream: Optional[Stream] = models.ForeignKey(Stream, null=True, on_delete=CASCADE) ' ,
' desc: Text = models.TextField() ' ,
' stream: Stream = models.ForeignKey(Stream, on_delete=CASCADE) ' ] ,
' bad_lines ' : [ ' desc: Optional[Text] = models.TextField() ' ,
' stream: Optional[Stream] = models.ForeignKey(Stream, on_delete=CASCADE) ' ] ,
2018-03-26 00:00:44 +02:00
} ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' [ \ s([]Text([^ \ s \ w]|$) ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : {
2018-05-14 01:46:08 +02:00
# We are likely to want to keep these dirs Python 2+3 compatible,
# since the plan includes extracting them to a separate project eventually.
' tools/lib ' ,
# TODO: Update our migrations from Text->str.
' zerver/migrations/ ' ,
2020-04-09 21:51:58 +02:00
} ,
2018-05-14 01:46:08 +02:00
' description ' : " Now that we ' re a Python 3 only codebase, we don ' t need to use typing.Text. Please use str instead. " ,
} ,
2019-05-16 14:20:36 +02:00
{ ' pattern ' : ' exit[(]1[)] ' ,
2020-04-09 21:51:58 +02:00
' include_only ' : { " /management/commands/ " } ,
2019-05-16 14:20:36 +02:00
' description ' : ' Raise CommandError to exit with failure in management commands ' ,
} ,
2019-12-08 20:08:25 +01:00
{ ' pattern ' : ' .is_realm_admin = ' ,
2020-05-27 23:13:05 +02:00
' description ' : ' Use do_change_user_role function rather than setting UserProfile \' s is_realm_admin attribute directly. ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : {
2019-12-08 20:08:25 +01:00
' zerver/migrations/0248_userprofile_role_start.py ' ,
' zerver/tests/test_users.py ' ,
2020-04-09 21:51:58 +02:00
} ,
2019-12-08 20:08:25 +01:00
} ,
{ ' pattern ' : ' .is_guest = ' ,
2020-05-27 23:13:05 +02:00
' description ' : ' Use do_change_user_role function rather than setting UserProfile \' s is_guest attribute directly. ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : {
2019-12-08 20:08:25 +01:00
' zerver/migrations/0248_userprofile_role_start.py ' ,
' zerver/tests/test_users.py ' ,
2020-04-09 21:51:58 +02:00
} ,
2019-12-08 20:08:25 +01:00
} ,
2020-08-29 00:54:27 +02:00
{ ' pattern ' : ' \\ .(called(_once|_with|_once_with)?|not_called|has_calls|not_called)[(] ' ,
' description ' : ' A mock function is missing a leading " assert_ " ' ,
} ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
* whitespace_rules ,
* comma_whitespace_rule ,
] ,
2019-05-30 17:41:23 +02:00
max_length = 110 ,
2019-06-12 18:37:03 +02:00
shebang_rules = shebang_rules ,
2019-05-30 17:41:23 +02:00
)
bash_rules = RuleList (
langs = [ ' bash ' ] ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
rules = [
2017-06-05 16:29:04 +02:00
{ ' pattern ' : ' #!.*sh [-xe] ' ,
' description ' : ' Fix shebang line with proper call to /usr/bin/env for Bash path, change -x|-e switches '
' to set -x|set -e ' } ,
2018-03-02 01:27:08 +01:00
{ ' pattern ' : ' sudo ' ,
' description ' : ' Most scripts are intended to work on systems without sudo ' ,
2020-04-09 21:51:58 +02:00
' include_only ' : { ' scripts/ ' } ,
' exclude ' : {
2018-03-02 01:27:08 +01:00
' scripts/lib/install ' ,
python: Use trailing commas consistently.
Automatically generated by the following script, based on the output
of lint with flake8-comma:
import re
import sys
last_filename = None
last_row = None
lines = []
for msg in sys.stdin:
m = re.match(
r"\x1b\[35mflake8 \|\x1b\[0m \x1b\[1;31m(.+):(\d+):(\d+): (\w+)", msg
)
if m:
filename, row_str, col_str, err = m.groups()
row, col = int(row_str), int(col_str)
if filename == last_filename:
assert last_row != row
else:
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
with open(filename) as f:
lines = f.readlines()
last_filename = filename
last_row = row
line = lines[row - 1]
if err in ["C812", "C815"]:
lines[row - 1] = line[: col - 1] + "," + line[col - 1 :]
elif err in ["C819"]:
assert line[col - 2] == ","
lines[row - 1] = line[: col - 2] + line[col - 1 :].lstrip(" ")
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2020-04-10 05:23:40 +02:00
' scripts/setup/configure-rabbitmq ' ,
} } ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
* whitespace_rules [ 0 : 1 ] ,
] ,
2019-06-12 18:37:03 +02:00
shebang_rules = shebang_rules ,
2019-05-30 17:41:23 +02:00
)
css_rules = RuleList (
2020-09-15 22:23:01 +02:00
langs = [ ' css ' ] ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
rules = [
* whitespace_rules ,
] ,
2019-05-30 17:41:23 +02:00
)
2020-04-22 01:09:50 +02:00
prose_style_rules : List [ " Rule " ] = [
2020-05-17 12:23:39 +02:00
{ ' pattern ' : r ' ^[^ { ].*?[^ \ / \ # \ - " ]([jJ]avascript) ' , # exclude usage in hrefs/divs/custom-markdown
2020-04-09 21:51:58 +02:00
' exclude ' : { " docs/documentation/api.md " } ,
2019-05-30 17:41:23 +02:00
' description ' : " javascript should be spelled JavaScript " } ,
{ ' pattern ' : r ''' [^ \ / \ - \ . " ' \ _ \ = \ >]([gG]ithub)[^ \ . \ - \ _ " \ <] ''' , # exclude usage in hrefs/divs
' description ' : " github should be spelled GitHub " } ,
{ ' pattern ' : ' [oO]rganisation ' , # exclude usage in hrefs/divs
' description ' : " Organization is spelled with a z " ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
' exclude_line ' : { ( ' docs/translating/french.md ' , ' * organization - **organisation** ' ) } } ,
2019-05-30 17:41:23 +02:00
{ ' pattern ' : ' !!! warning ' ,
' description ' : " !!! warning is invalid; it ' s spelled ' !!! warn ' " } ,
{ ' pattern ' : ' Terms of service ' ,
' description ' : " The S in Terms of Service is capitalized " } ,
2019-08-29 01:17:31 +02:00
{ ' pattern ' : ' [^-_p]botserver(?!rc)|bot server ' ,
2019-05-30 17:41:23 +02:00
' description ' : " Use Botserver instead of botserver or bot server. " } ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
* comma_whitespace_rule ,
2020-04-22 01:09:50 +02:00
]
2020-09-02 06:59:07 +02:00
html_rules : List [ " Rule " ] = [
* whitespace_rules ,
* prose_style_rules ,
2019-05-30 17:41:23 +02:00
{ ' pattern ' : ' subject|SUBJECT ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' templates/zerver/email.html ' } ,
2019-05-30 17:41:23 +02:00
' exclude_pattern ' : ' email subject ' ,
' description ' : ' avoid subject in templates ' ,
' good_lines ' : [ ' topic_name ' ] ,
' bad_lines ' : [ ' subject= " foo " ' , ' MAX_SUBJECT_LEN ' ] } ,
{ ' pattern ' : r ' placeholder= " [^ { #](?:(?! \ .com).)+$ ' ,
' description ' : " `placeholder` value should be translatable. " ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
' exclude_line ' : { ( ' templates/zerver/register.html ' , ' placeholder= " acme " ' ) ,
2020-02-19 02:19:26 +01:00
( ' templates/zerver/register.html ' , ' placeholder= " Acme or Ακμή " ' ) } ,
2020-04-09 21:51:58 +02:00
' exclude ' : { " templates/analytics/support.html " } ,
2019-05-30 17:41:23 +02:00
' good_lines ' : [ ' <input class= " stream-list-filter " type= " text " placeholder= " {{ _( \' Search streams \' ) }} " /> ' ] ,
' bad_lines ' : [ ' <input placeholder= " foo " > ' ] } ,
2020-05-13 07:26:30 +02:00
{ ' pattern ' : ' = { ' ,
' description ' : " Likely missing quoting in HTML attribute " ,
' good_lines ' : [ ' <a href= " {{ variable}} " > ' ] ,
' bad_lines ' : [ ' <a href= {{ variable}}> ' ] } ,
2020-08-27 20:46:09 +02:00
{ ' pattern ' : " ' }} " ,
' description ' : " Likely misplaced quoting in translation tags " ,
' good_lines ' : [ " {{ t ' translateable string ' }} " ] ,
' bad_lines ' : [ " {{ t ' translateable string ' }} " ] } ,
2019-05-30 17:41:23 +02:00
{ ' pattern ' : " placeholder= ' [^ { ] " ,
' description ' : " `placeholder` value should be translatable. " ,
' good_lines ' : [ ' <input class= " stream-list-filter " type= " text " placeholder= " {{ _( \' Search streams \' ) }} " /> ' ] ,
' bad_lines ' : [ " <input placeholder= ' foo ' > " ] } ,
{ ' pattern ' : " aria-label= ' [^ { ] " ,
' description ' : " `aria-label` value should be translatable. " ,
' good_lines ' : [ ' <button type= " button " class= " close close-alert-word-status " aria-label= " {{ t \' Close \' }} " > ' ] ,
' bad_lines ' : [ " <button aria-label= ' foo ' ></button> " ] } ,
{ ' pattern ' : ' aria-label= " [^ { ] ' ,
' description ' : " `aria-label` value should be translatable. " ,
' good_lines ' : [ ' <button type= " button " class= " close close-alert-word-status " aria-label= " {{ t \' Close \' }} " > ' ] ,
' bad_lines ' : [ ' <button aria-label= " foo " ></button> ' ] } ,
{ ' pattern ' : ' script src= " http ' ,
2019-10-23 18:23:25 +02:00
' description ' : " Don ' t directly load dependencies from CDNs. See docs/subsystems/html-css.md " ,
2020-04-09 21:51:58 +02:00
' exclude ' : { " templates/corporate/billing.html " , " templates/zerver/hello.html " ,
" templates/corporate/upgrade.html " } ,
2019-10-22 02:14:28 +02:00
' good_lines ' : [ " {{ render_entrypoint( ' landing-page ' ) }} " ] ,
2019-05-30 17:41:23 +02:00
' bad_lines ' : [ ' <script src= " https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js " ></script> ' ] } ,
{ ' pattern ' : " title= ' [^ { ] " ,
' description ' : " `title` value should be translatable. " ,
' good_lines ' : [ ' <link rel= " author " title= " {{ _( \' About these documents \' ) }} " /> ' ] ,
' bad_lines ' : [ " <p title= ' foo ' ></p> " ] } ,
{ ' pattern ' : r ' title= " [^ { \ :] ' ,
2020-04-09 21:51:58 +02:00
' exclude_line ' : {
2019-05-30 17:41:23 +02:00
( ' templates/zerver/app/markdown_help.html ' ,
python: Use trailing commas consistently.
Automatically generated by the following script, based on the output
of lint with flake8-comma:
import re
import sys
last_filename = None
last_row = None
lines = []
for msg in sys.stdin:
m = re.match(
r"\x1b\[35mflake8 \|\x1b\[0m \x1b\[1;31m(.+):(\d+):(\d+): (\w+)", msg
)
if m:
filename, row_str, col_str, err = m.groups()
row, col = int(row_str), int(col_str)
if filename == last_filename:
assert last_row != row
else:
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
with open(filename) as f:
lines = f.readlines()
last_filename = filename
last_row = row
line = lines[row - 1]
if err in ["C812", "C815"]:
lines[row - 1] = line[: col - 1] + "," + line[col - 1 :]
elif err in ["C819"]:
assert line[col - 2] == ","
lines[row - 1] = line[: col - 2] + line[col - 1 :].lstrip(" ")
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2020-04-10 05:23:40 +02:00
' <td class= " rendered_markdown " ><img alt= " :heart: " class= " emoji " src= " /static/generated/emoji/images/emoji/heart.png " title= " :heart: " /></td> ' ) ,
2020-04-09 21:51:58 +02:00
} ,
' exclude ' : { " templates/zerver/emails " , " templates/analytics/realm_details.html " , " templates/analytics/support.html " } ,
2019-05-30 17:41:23 +02:00
' description ' : " `title` value should be translatable. " } ,
{ ' pattern ' : r ''' \ Walt=[ " ' ][^ { " ' ] ''' ,
' description ' : " alt argument should be enclosed by _() or it should be an empty string. " ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' static/templates/settings/display_settings.hbs ' ,
' templates/zerver/app/keyboard_shortcuts.html ' ,
' templates/zerver/app/markdown_help.html ' } ,
2019-05-30 17:41:23 +02:00
' good_lines ' : [ ' <img src= " {{ source_url}} " alt= " {{ _(name) }} " /> ' , ' <img alg= " " /> ' ] ,
' bad_lines ' : [ ' <img alt= " Foo Image " /> ' ] } ,
{ ' pattern ' : r ''' \ Walt=[ " ' ] {{ ?[ " ' ] ''' ,
' description ' : " alt argument should be enclosed by _(). " ,
' good_lines ' : [ ' <img src= " {{ source_url}} " alt= " {{ _(name) }} " /> ' ] ,
' bad_lines ' : [ ' <img alt= " {{ " /> ' ] } ,
{ ' pattern ' : r ' \ bon \ w+ ?= ' ,
' description ' : " Don ' t use inline event handlers (onclick=, etc. attributes) in HTML. Instead, "
" attach a jQuery event handler ($( ' #foo ' ).on( ' click ' , function () { ...})) when "
" the DOM is ready (inside a $(function () { ...}) block). " ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' templates/zerver/dev_login.html ' , ' templates/corporate/upgrade.html ' } ,
2019-05-30 17:41:23 +02:00
' good_lines ' : [ " ($( ' #foo ' ).on( ' click ' , function () {} " ] ,
' bad_lines ' : [ " <button id= ' foo ' onclick= ' myFunction() ' >Foo</button> " , " <input onchange= ' myFunction() ' > " ] } ,
{ ' pattern ' : ' style ?= ' ,
' description ' : " Avoid using the `style=` attribute; we prefer styling in CSS files " ,
' exclude_pattern ' : r ' .*style ?=[ " ' + " ' " + ' ](display: ?none|background: {{ |color: {{ |background-color: {{ ).* ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : {
2019-05-30 17:41:23 +02:00
# KaTeX output uses style attribute
' templates/zerver/app/markdown_help.html ' ,
# 5xx page doesn't have external CSS
' static/html/5xx.html ' ,
# exclude_pattern above handles color, but have other issues:
2019-07-12 00:52:56 +02:00
' static/templates/draft.hbs ' ,
' static/templates/subscription.hbs ' ,
' static/templates/single_message.hbs ' ,
2019-05-30 17:41:23 +02:00
# Old-style email templates need to use inline style
# attributes; it should be possible to clean these up
# when we convert these templates to use premailer.
' templates/zerver/emails/email_base_messages.html ' ,
# Email log templates; should clean up.
' templates/zerver/email.html ' ,
' templates/zerver/email_log.html ' ,
2019-10-22 18:11:28 +02:00
# Social backend logos are dynamically loaded
' templates/zerver/accounts_home.html ' ,
' templates/zerver/login.html ' ,
2019-05-30 17:41:23 +02:00
# Probably just needs to be changed to display: none so the exclude works
' templates/zerver/app/navbar.html ' ,
# Needs the width cleaned up; display: none is fine
2019-07-12 00:52:56 +02:00
' static/templates/settings/account_settings.hbs ' ,
2019-05-30 17:41:23 +02:00
# background image property is dynamically generated
2019-07-12 00:52:56 +02:00
' static/templates/user_profile_modal.hbs ' ,
pm_list: Simplify redraws for Private Messages.
We now use vdom-ish techniques to track the
list items for the pm list. When we go to update
the list, we only re-render nodes whose data
has changed, with two exceptions:
- Obviously, the first time we do a full render.
- If the keys for the items have changed (i.e.
a new node has come in or the order has changed),
we just re-render the whole list.
If the keys are the same since the last re-render, we
only re-render individual items if their data has
changed.
Most of the new code is in these two modules:
- pm_list_dom.js
- vdom.js
We remove all of the code in pm_list.js that is
related to updating DOM with unread counts.
For presence updates, we are now *never*
re-rendering the whole list, since presence
updates only change individual line items and
don't affect the keys. Instead, we just update
any changed elements in place.
The main thing that makes this all work is the
`update` method in `vdom`, which is totally generic
and essentially does a few simple jobs:
- detect if keys are different
- just render the whole ul as needed
- for items that change, do the appropriate
jQuery to update the item in place
Note that this code seems to play nice with simplebar.
Also, this code continues to use templates to render
the individual list items.
FWIW this code isn't radically different than list_render,
but it's got some key differences:
- There are fewer bells and whistles in this code.
Some of the stuff that list_render does is overkill
for the PM list.
- This code detects data changes.
Note that the vdom scheme is agnostic about templates;
it simply requires the child nodes to provide a render
method. (This is similar to list_render, which is also
technically agnostic about rendering, but which also
does use templates in most cases.)
These fixes are somewhat related to #13605, but we
haven't gotten a solid repro on that issue, and
the scrolling issues there may be orthogonal to the
redraws. But having fewer moving parts here should
help, and we won't get the rug pulled out from under
us on every presence update.
There are two possible extensions to this that are
somewhat overlapping in nature, but can be done
one a time.
* We can do a deeper vdom approach here that
gets us away from templates, and just have
nodes write to an AST. I have this on another
branch, but it might be overkill.
* We can avoid some redraws by detecting where
keys are moving up and down. I'm not completely
sure we need it for the PM list.
If this gets merged, we may want to try similar
things for the stream list, which also does a fairly
complicated mixture of big-hammer re-renders and
surgical updates-in-place (with custom code).
BTW we have 100% line coverage for vdom.js.
2020-01-04 17:17:44 +01:00
' static/templates/pm_list_item.hbs ' ,
2019-05-30 17:41:23 +02:00
# Inline styling for an svg; could be moved to CSS files?
' templates/zerver/landing_nav.html ' ,
' templates/zerver/billing_nav.html ' ,
' templates/zerver/app/home.html ' ,
' templates/zerver/features.html ' ,
' templates/zerver/portico-header.html ' ,
' templates/corporate/billing.html ' ,
' templates/corporate/upgrade.html ' ,
# Miscellaneous violations to be cleaned up
2019-07-12 00:52:56 +02:00
' static/templates/user_info_popover_title.hbs ' ,
' static/templates/subscription_invites_warning_modal.hbs ' ,
2019-05-30 17:41:23 +02:00
' templates/zerver/reset_confirm.html ' ,
' templates/zerver/config_error.html ' ,
' templates/zerver/dev_env_email_access_details.html ' ,
' templates/zerver/confirm_continue_registration.html ' ,
' templates/zerver/register.html ' ,
' templates/zerver/accounts_send_confirm.html ' ,
' templates/zerver/integrations/index.html ' ,
' templates/zerver/documentation_main.html ' ,
' templates/analytics/realm_summary_table.html ' ,
' templates/corporate/zephyr.html ' ,
' templates/corporate/zephyr-mirror.html ' ,
2020-04-09 21:51:58 +02:00
} ,
2019-05-30 17:41:23 +02:00
' good_lines ' : [ ' #my-style { color: blue;} ' , ' style= " display: none " ' , " style= ' display: none " ] ,
' bad_lines ' : [ ' <p style= " color: blue; " >Foo</p> ' , ' style = " color: blue; " ' ] } ,
2020-04-22 01:09:50 +02:00
]
2019-05-30 17:41:23 +02:00
handlebars_rules = RuleList (
2019-07-12 00:52:56 +02:00
langs = [ ' hbs ' ] ,
2020-09-02 06:59:07 +02:00
rules = [
* html_rules ,
2017-06-05 16:29:04 +02:00
{ ' pattern ' : " [<]script " ,
' description ' : " Do not use inline <script> tags here; put JavaScript in static/js instead. " } ,
2017-06-10 12:32:06 +02:00
{ ' pattern ' : ' {{ t ( " | \' ) ' ,
' description ' : ' There should be no spaces before the " t " in a translation tag. ' } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r " {{ t ' .* ' }}[ \ . \ ?!] " ,
2017-06-05 16:29:04 +02:00
' description ' : " Period should be part of the translatable string. " } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' {{ t " .* " }}[ \ . \ ?!] ' ,
2017-06-05 16:29:04 +02:00
' description ' : " Period should be part of the translatable string. " } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r " {{ /tr}}[ \ . \ ?!] " ,
2017-06-05 16:29:04 +02:00
' description ' : " Period should be part of the translatable string. " } ,
2017-06-10 11:56:36 +02:00
{ ' pattern ' : ' {{ t ( " | \' ) ' ,
' description ' : ' Translatable strings should not have leading spaces. ' } ,
2017-06-10 12:11:33 +02:00
{ ' pattern ' : " {{ t ' [^ ' ]+ ' }} " ,
' description ' : ' Translatable strings should not have trailing spaces. ' } ,
{ ' pattern ' : ' {{ t " [^ " ]+ " }} ' ,
' description ' : ' Translatable strings should not have trailing spaces. ' } ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
] ,
2019-05-30 17:41:23 +02:00
)
jinja2_rules = RuleList (
langs = [ ' html ' ] ,
2020-09-02 06:59:07 +02:00
rules = [
* html_rules ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r " { % e ndtrans % }[ \ . \ ?!] " ,
2017-06-05 16:29:04 +02:00
' description ' : " Period should be part of the translatable string. " } ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r " {{ _(.+) }}[ \ . \ ?!] " ,
2017-06-05 16:29:04 +02:00
' description ' : " Period should be part of the translatable string. " } ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
] ,
2019-05-30 17:41:23 +02:00
)
json_rules = RuleList (
langs = [ ' json ' ] ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
rules = [
2017-11-23 20:56:05 +01:00
# Here, we don't use `whitespace_rules`, because the tab-based
# whitespace rule flags a lot of third-party JSON fixtures
# under zerver/webhooks that we want preserved verbatim. So
# we just include the trailing whitespace rule and a modified
# version of the tab-based whitespace rule (we can't just use
# exclude in whitespace_rules, since we only want to ignore
# JSON files with tab-based whitespace, not webhook code).
2017-08-15 17:54:29 +02:00
trailing_whitespace_rule ,
2017-11-23 19:39:58 +01:00
{ ' pattern ' : ' \t ' ,
' strip ' : ' \n ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' zerver/webhooks/ ' } ,
2017-11-23 19:39:58 +01:00
' description ' : ' Fix tab-based whitespace ' } ,
2018-07-23 21:02:07 +02:00
{ ' pattern ' : r ' " :[ " \ [ \ { ] ' ,
2020-04-09 21:51:58 +02:00
' exclude ' : { ' zerver/webhooks/ ' , ' zerver/tests/fixtures/ ' } ,
2018-03-02 22:06:21 +01:00
' description ' : ' Require space after : in JSON ' } ,
python: Use trailing commas consistently.
Automatically generated by the following script, based on the output
of lint with flake8-comma:
import re
import sys
last_filename = None
last_row = None
lines = []
for msg in sys.stdin:
m = re.match(
r"\x1b\[35mflake8 \|\x1b\[0m \x1b\[1;31m(.+):(\d+):(\d+): (\w+)", msg
)
if m:
filename, row_str, col_str, err = m.groups()
row, col = int(row_str), int(col_str)
if filename == last_filename:
assert last_row != row
else:
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
with open(filename) as f:
lines = f.readlines()
last_filename = filename
last_row = row
line = lines[row - 1]
if err in ["C812", "C815"]:
lines[row - 1] = line[: col - 1] + "," + line[col - 1 :]
elif err in ["C819"]:
assert line[col - 2] == ","
lines[row - 1] = line[: col - 2] + line[col - 1 :].lstrip(" ")
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2020-04-10 05:23:40 +02:00
] ,
2019-05-30 17:41:23 +02:00
)
markdown_docs_length_exclude = {
# Has some example Vagrant output that's very long
" docs/development/setup-vagrant.md " ,
# Have wide output in code blocks
" docs/subsystems/logging.md " ,
2019-11-07 18:29:05 +01:00
" docs/subsystems/schema-migrations.md " ,
2019-05-30 17:41:23 +02:00
# Have curl commands with JSON that would be messy to wrap
" zerver/webhooks/helloworld/doc.md " ,
" zerver/webhooks/trello/doc.md " ,
# Has a very long configuration line
" templates/zerver/integrations/perforce.md " ,
# Has some example code that could perhaps be wrapped
" templates/zerver/api/incoming-webhooks-walkthrough.md " ,
2020-01-29 02:58:17 +01:00
" templates/zerver/api/get-messages.md " ,
2019-05-30 17:41:23 +02:00
# This macro has a long indented URL
" templates/zerver/help/include/git-webhook-url-with-branches-indented.md " ,
2019-10-18 09:00:43 +02:00
" templates/zerver/api/update-notification-settings.md " ,
2019-05-30 17:41:23 +02:00
# These two are the same file and have some too-long lines for GitHub badges
" README.md " ,
" docs/overview/readme.md " ,
}
markdown_rules = RuleList (
langs = [ ' md ' ] ,
2020-09-02 06:59:07 +02:00
rules = [
* markdown_whitespace_rules ,
* prose_style_rules ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' \ [(?P<url>[^ \ ]]+) \ ] \ ((?P=url) \ ) ' ,
2020-08-11 01:47:49 +02:00
' description ' : ' Linkified Markdown URLs should use cleaner <http://example.com> syntax. ' } ,
2017-11-16 21:44:16 +01:00
{ ' pattern ' : ' https://zulip.readthedocs.io/en/latest/[a-zA-Z0-9] ' ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
' exclude ' : { ' docs/overview/contributing.md ' , ' docs/overview/readme.md ' , ' docs/README.md ' } ,
2020-04-09 21:51:58 +02:00
' include_only ' : { ' docs/ ' } ,
2018-04-24 02:28:14 +02:00
' description ' : " Use relative links (../foo/bar.html) to other documents in docs/ " ,
2017-11-16 21:44:16 +01:00
} ,
2018-11-30 21:08:25 +01:00
{ ' pattern ' : " su zulip -c [^ ' ] " ,
2020-04-09 21:51:58 +02:00
' include_only ' : { ' docs/ ' } ,
2018-11-30 21:08:25 +01:00
' description ' : " Always quote arguments using `su zulip -c ' ` to avoid confusion about how su works. " ,
} ,
2018-07-02 00:05:24 +02:00
{ ' pattern ' : r ' \ ][(][^#h] ' ,
2020-04-09 21:51:58 +02:00
' include_only ' : { ' README.md ' , ' CONTRIBUTING.md ' } ,
2017-11-16 21:44:16 +01:00
' description ' : " Use absolute links from docs served by GitHub " ,
} ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
] ,
2019-05-30 17:41:23 +02:00
max_length = 120 ,
length_exclude = markdown_docs_length_exclude ,
python: Use trailing commas consistently.
Automatically generated by the following script, based on the output
of lint with flake8-comma:
import re
import sys
last_filename = None
last_row = None
lines = []
for msg in sys.stdin:
m = re.match(
r"\x1b\[35mflake8 \|\x1b\[0m \x1b\[1;31m(.+):(\d+):(\d+): (\w+)", msg
)
if m:
filename, row_str, col_str, err = m.groups()
row, col = int(row_str), int(col_str)
if filename == last_filename:
assert last_row != row
else:
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
with open(filename) as f:
lines = f.readlines()
last_filename = filename
last_row = row
line = lines[row - 1]
if err in ["C812", "C815"]:
lines[row - 1] = line[: col - 1] + "," + line[col - 1 :]
elif err in ["C819"]:
assert line[col - 2] == ","
lines[row - 1] = line[: col - 2] + line[col - 1 :].lstrip(" ")
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2020-04-10 05:23:40 +02:00
exclude_files_in = ' templates/zerver/help/ ' ,
2019-05-30 17:41:23 +02:00
)
help_markdown_rules = RuleList (
langs = [ ' md ' ] ,
2020-07-01 21:10:02 +02:00
rules = [
* markdown_rules . rules ,
2017-06-05 16:29:04 +02:00
{ ' pattern ' : ' [a-z][.][A-Z] ' ,
2019-05-30 17:41:23 +02:00
' description ' : " Likely missing space after end of sentence " ,
2020-04-09 21:51:58 +02:00
' include_only ' : { ' templates/zerver/help/ ' } ,
2019-05-30 17:41:23 +02:00
} ,
2018-05-25 21:00:58 +02:00
{ ' pattern ' : r ' \ b[rR]ealm[s]? \ b ' ,
2020-04-09 21:51:58 +02:00
' include_only ' : { ' templates/zerver/help/ ' } ,
2020-07-25 01:07:53 +02:00
' exclude ' : { ' templates/zerver/help/change-organization-url.md ' } ,
2018-05-25 21:00:58 +02:00
' good_lines ' : [ ' Organization ' , ' deactivate_realm ' , ' realm_filter ' ] ,
' bad_lines ' : [ ' Users are in a realm ' , ' Realm is the best model ' ] ,
2017-06-05 16:29:04 +02:00
' description ' : " Realms are referred to as Organizations in user-facing docs. " } ,
linter_lib: Fix mypy errors.
tools/linter_lib/pyflakes.py:35: error: Argument 3 to "run_pyflakes" has incompatible type "List[Tuple[bytes, bytes]]"; expected "List[Tuple[str, str]]"
tools/linter_lib/custom_check.py:110: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:214: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:502: error: Argument "shebang_rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:519: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:706: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:728: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:738: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
tools/linter_lib/custom_check.py:779: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:803: error: Argument "length_exclude" to "RuleList" has incompatible type "Set[str]"; expected "List[str]"
tools/linter_lib/custom_check.py:805: error: Unsupported operand types for + ("List[Rule]" and "List[Dict[str, Any]]")
tools/linter_lib/custom_check.py:819: error: Argument "rules" to "RuleList" has incompatible type "List[Dict[str, Any]]"; expected "List[Rule]"
These were missed the `zulint` package was missing PEP 561 type
annotation markers, and if it’d had them, mypy daemon mode would’ve
required us to set `follow_imports = skip` for it.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2019-08-07 03:29:33 +02:00
] ,
2019-05-30 17:41:23 +02:00
length_exclude = markdown_docs_length_exclude ,
)
2020-10-26 23:44:49 +01:00
puppet_rules = RuleList (
langs = [ ' pp ' ] ,
rules = [
{ ' pattern ' : r ' (include \ s+| \ $)zulip::(profile|base) \ b ' ,
' exclude ' : {
' puppet/zulip/manifests/profile/ ' ,
' puppet/zulip_ops/manifests/ ' ,
' puppet/zulip/manifests/dockervoyager.pp ' ,
} ,
' description ' : ' Abstraction layering violation; only profiles should reference profiles or zulip::base ' ,
} ,
{ ' pattern ' : r ' (include \ s+| \ $)zulip_ops::(profile|base) \ b ' ,
' exclude ' : {
' puppet/zulip/manifests/ ' ,
' puppet/zulip_ops/manifests/profile/ ' ,
} ,
' description ' : ' Abstraction layering violation; only profiles should reference profiles or zulip_ops::base ' ,
} ,
] ,
)
2019-05-30 17:41:23 +02:00
txt_rules = RuleList (
2020-03-24 19:06:24 +01:00
langs = [ ' txt ' , ' text ' , ' yaml ' , ' rst ' , ' yml ' ] ,
2019-05-30 17:41:23 +02:00
rules = whitespace_rules ,
)
non_py_rules = [
handlebars_rules ,
jinja2_rules ,
css_rules ,
js_rules ,
json_rules ,
markdown_rules ,
help_markdown_rules ,
bash_rules ,
txt_rules ,
2020-10-26 23:44:49 +01:00
puppet_rules ,
2019-05-30 17:41:23 +02:00
]