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:
2021-02-12 08:20:45 +01:00
" zerver/lib/topic.py " ,
2018-11-10 17:52:28 +01:00
# This is for backward compatibility.
2021-02-12 08:20:45 +01:00
" zerver/tests/test_legacy_subject.py " ,
2018-11-10 17:52:28 +01:00
# Other migration-related changes require extreme care.
2021-02-12 08:20:45 +01:00
" zerver/lib/fix_unreads.py " ,
" 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:
2021-02-12 08:20:45 +01:00
" zerver/lib/email_mirror.py " ,
" zerver/lib/send_email.py " ,
" zerver/tests/test_new_users.py " ,
" zerver/tests/test_email_mirror.py " ,
" 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.
2021-02-12 08:20:45 +01:00
" zerver/openapi/python_examples.py " ,
" zerver/tests/test_openapi.py " ,
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".
2021-02-12 08:20:45 +01: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 " ] = [
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " ^#! " ,
" description " : " zerver library code shouldn ' t have a shebang line. " ,
" include_only " : { " zerver/ " } ,
2021-02-12 08:19:30 +01:00
} ,
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).
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " ^#!(?! *(?:/usr/bin/env|/bin/sh)(?: |$)) " ,
" description " : " Use `#!/usr/bin/env foo` instead of `#!/path/foo` "
2021-02-12 08:19:30 +01:00
" for interpreters other than sh. " ,
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " ^#!/usr/bin/env python$ " ,
" description " : " Use `#!/usr/bin/env python3` instead of `#!/usr/bin/env python`. " ,
2021-02-12 08:19:30 +01:00
} ,
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 " = {
2021-02-12 08:20:45 +01:00
" pattern " : r " \ s+$ " ,
" strip " : " \n " ,
" 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 ,
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " http://zulip.readthedocs.io " ,
" description " : " Use HTTPS when linking to ReadTheDocs " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " \t " ,
" strip " : " \n " ,
2021-03-25 08:37:45 +01:00
" exclude " : {
" tools/ci/success-http-headers.template.txt " ,
" tools/ci/success-http-headers.template.debian.txt " ,
} ,
2021-02-12 08:20:45 +01:00
" description " : " Fix tab-based whitespace " ,
2021-02-12 08:19:30 +01:00
} ,
2020-04-22 01:09:50 +02:00
]
comma_whitespace_rule : List [ " Rule " ] = [
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " , { 2,}[^#/ ] " ,
" exclude " : { " zerver/tests " , " frontend_tests/node_tests " , " corporate/tests " } ,
" 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) " ] ,
2021-02-12 08:19:30 +01:00
} ,
2020-04-22 01:09:50 +02:00
]
2020-09-02 06:59:07 +02:00
markdown_whitespace_rules : List [ " Rule " ] = [
2021-02-12 08:20:45 +01:00
* ( 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.
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : r " ((?<! \ s) \ s$)|( \ s \ s \ s+$)|(^ \ s+$) " ,
" strip " : " \n " ,
" description " : " Fix trailing whitespace " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" 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 " ] ,
2021-02-12 08:19:30 +01:00
} ,
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 (
2021-02-12 08:20:45 +01:00
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 = [
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " subject|SUBJECT " ,
" exclude " : { " static/js/util.js " , " frontend_tests/ " } ,
" exclude_pattern " : " emails " ,
" description " : " avoid subject in JS code " ,
" good_lines " : [ " topic_name " ] ,
" bad_lines " : [ ' subject= " foo " ' , " MAX_SUBJECT_LEN " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " msgid|MSGID " ,
" description " : ' Avoid using " msgid " as a variable name; use " message_id " instead. ' ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-04-10 10:05:08 +02:00
" pattern " : r " \ $t \ (.+ \ ).* \ + " ,
2021-02-12 08:20:45 +01:00
" description " : " Do not concatenate i18n strings " ,
2021-02-12 08:19:30 +01:00
} ,
2021-04-10 10:05:08 +02:00
{ " pattern " : r " \ +.* \ $t \ (.+ \ ) " , " description " : " Do not concatenate i18n strings " } ,
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " [.]html[(] " ,
2021-04-10 10:05:08 +02:00
" exclude_pattern " : r """ \ .html \ (( " | ' |render_|html|message \ .content|util \ .clean_user_content_links|rendered_|$| \ )|error_html|widget_elem| \ $error| \ $ \ ( " <p> " \ )) """ ,
2021-02-12 08:20:45 +01:00
" exclude " : {
" static/js/portico " ,
" static/js/lightbox.js " ,
" static/js/ui_report.js " ,
" static/js/confirm_dialog.js " ,
" frontend_tests/ " ,
2021-02-12 08:19:30 +01:00
} ,
2021-02-12 08:20:45 +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. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " [ \" ' ]json/ " ,
" description " : " Relative URL for JSON route not supported by i18n " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r """ [.]text \ ([ " ' ][a-zA-Z] """ ,
2021-04-10 10:05:08 +02:00
" description " : " Strings passed to $().text should be wrapped in $t() for internationalization " ,
2021-02-12 08:20:45 +01:00
" exclude " : { " frontend_tests/node_tests/ " } ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r """ compose_error \ ([ " ' ] """ ,
2021-04-10 10:05:08 +02:00
" description " : " Argument to compose_error should be a literal string translated "
" by $t_html() " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " ui.report_success \ ( " ,
" description " : " Deprecated function, use ui_report.success. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r """ report.success \ ([ " ' ] """ ,
2021-04-10 10:05:08 +02:00
" description " : " Argument to ui_report.success should be a literal string translated "
" by $t_html() " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " ui.report_error \ ( " ,
" description " : " Deprecated function, use ui_report.error. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r """ report.error \ ([ " ' ][^ ' " ] """ ,
2021-04-10 10:05:08 +02:00
" description " : " Argument to ui_report.error should be a literal string translated "
" by $t_html() " ,
2021-02-12 08:20:45 +01:00
" good_lines " : [ ' ui_report.error( " " ) ' , ' ui_report.error(_( " text " )) ' ] ,
" bad_lines " : [ ' ui_report.error( " test " ) ' ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r """ report.client_error \ ([ " ' ][^ ' " ] """ ,
2021-04-10 10:05:08 +02:00
" description " : " Argument to ui_report.client_error should be a literal string translated "
" by $t_html() " ,
2021-02-12 08:20:45 +01:00
" good_lines " : [ ' ui_report.client_error( " " ) ' , ' ui_report.client_error(_( " text " )) ' ] ,
" bad_lines " : [ ' ui_report.client_error( " test " ) ' ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " \ $ \ (document \ ) \ .ready \ ( " ,
" description " : " `Use $(f) rather than `$(document).ready(f)` " ,
" good_lines " : [ " $(function () { foo();} " ] ,
" bad_lines " : [ " $(document).ready(function () { foo();} " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " [$][.](get|post|patch|delete|ajax)[(] " ,
" description " : " Use channel module for AJAX calls " ,
" exclude " : {
2021-02-12 08:19:30 +01:00
# Internal modules can do direct network calls
2021-02-12 08:20:45 +01:00
" static/js/blueslip.js " ,
" static/js/channel.js " ,
2021-02-12 08:19:30 +01:00
# External modules that don't include channel.js
2021-02-12 08:20:45 +01:00
" static/js/stats/ " ,
" static/js/portico/ " ,
" static/js/billing/ " ,
2021-02-12 08:19:30 +01:00
} ,
2021-02-12 08:20:45 +01:00
" good_lines " : [ " channel.get(...) " ] ,
" bad_lines " : [ " $.get() " , " $.post() " , " $.ajax() " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " style ?= " ,
" description " : " Avoid using the `style=` attribute; we prefer styling in CSS files " ,
" exclude " : {
" frontend_tests/node_tests/copy_and_paste.js " ,
" frontend_tests/node_tests/upload.js " ,
" static/js/upload.js " ,
" static/js/stream_color.js " ,
2021-02-12 08:19:30 +01:00
} ,
2021-02-12 08:20:45 +01:00
" good_lines " : [ " #my-style { color: blue;} " ] ,
" bad_lines " : [ ' <p style= " color: blue; " >Foo</p> ' , ' style = " color: blue; " ' ] ,
2021-02-12 08:19:30 +01:00
} ,
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 (
2021-02-12 08:20:45 +01:00
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 = [
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " subject|SUBJECT " ,
" exclude_pattern " : " subject to the|email|outbox " ,
" description " : " avoid subject as a var " ,
" good_lines " : [ " topic_name " ] ,
" bad_lines " : [ ' subject= " foo " ' , " MAX_SUBJECT_LEN " ] ,
" exclude " : FILES_WITH_LEGACY_SUBJECT ,
" include_only " : {
" zerver/data_import/ " ,
" zerver/lib/ " ,
" zerver/tests/ " ,
" zerver/views/ " ,
2021-02-12 08:19:30 +01:00
} ,
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " msgid|MSGID " ,
" exclude " : { " tools/check-capitalization " } ,
" description " : ' Avoid using " msgid " as a variable name; use " message_id " instead. ' ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " ^(?!#)@login_required " ,
" description " : " @login_required is unsupported; use @zulip_login_required " ,
" good_lines " : [ " @zulip_login_required " , " # foo @login_required " ] ,
" bad_lines " : [ " @login_required " , " @login_required " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " ^user_profile[.]save[(][)] " ,
" description " : " Always pass update_fields when saving user_profile objects " ,
" exclude_line " : {
2021-02-12 08:19:30 +01:00
(
2021-02-12 08:20:45 +01:00
" zerver/lib/actions.py " ,
2021-02-12 08:19:30 +01:00
" user_profile.save() # Can ' t use update_fields because of how the foreign key works. " ,
) ,
} ,
2021-02-12 08:20:45 +01:00
" exclude " : { " zerver/tests " , " zerver/lib/create_user.py " } ,
" good_lines " : [ ' user_profile.save(update_fields=[ " pointer " ]) ' ] ,
" bad_lines " : [ " user_profile.save() " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " self: Any " ,
" description " : " you can omit Any annotation for self " ,
" good_lines " : [ " def foo (self): " ] ,
" bad_lines " : [ " def foo(self: Any): " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " assertEquals[(] " ,
" description " : " Use assertEqual, not assertEquals (which is deprecated). " ,
" good_lines " : [ " assertEqual(1, 2) " ] ,
" bad_lines " : [ " assertEquals(1, 2) " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " # \ s*type: \ s*ignore(?! \ [[^][]+ \ ] +# + \ S) " ,
" exclude " : { " tools/tests " , " zerver/lib/test_runner.py " , " zerver/tests " } ,
" 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 " ,
2021-02-12 08:19:30 +01:00
] ,
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " \ bsudo \ b " ,
" include_only " : { " scripts/ " } ,
" exclude " : { " scripts/lib/setup_venv.py " } ,
" exclude_line " : {
( " scripts/lib/zulip_tools.py " , ' args = [ " sudo " , *sudo_args, " -- " , *args] ' ) ,
2021-02-12 08:19:30 +01:00
} ,
2021-02-12 08:20:45 +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 " ]) ' ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " django.utils.translation " ,
" include_only " : { " test/ " , " zerver/views/development/ " } ,
2021-04-21 22:07:08 +02:00
" exclude " : { " zerver/views/development/dev_login.py " } ,
2021-02-12 08:20:45 +01:00
" description " : " Test strings should not be tagged for translation " ,
" good_lines " : [ " " ] ,
" bad_lines " : [ " django.utils.translation " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " userid " ,
" description " : " We prefer user_id over userid. " ,
" good_lines " : [ " id = alice.user_id " ] ,
" bad_lines " : [ " id = alice.userid " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " json_success \ ( {} \ ) " ,
" description " : " Use json_success() to return nothing " ,
" good_lines " : [ " return json_success() " ] ,
" bad_lines " : [ " return json_success( {} ) " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " \ Wjson_error \ (_ \ (? \ w+ \ ) " ,
" exclude " : { " zerver/tests " , " zerver/views/development/ " } ,
" 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)) " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r """ \ Wjson_error \ ([ ' " ].+[),]$ """ ,
" exclude " : { " zerver/tests " } ,
" description " : " Argument to json_error should a literal string enclosed by _() " ,
2021-02-12 08:19:30 +01:00
} ,
2017-06-05 16:29:04 +02:00
# To avoid JsonableError(_variable) and JsonableError(_(variable))
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : r " \ WJsonableError \ (_ \ (? \ w.+ \ ) " ,
" exclude " : { " zerver/tests " , " zerver/views/development/ " } ,
" description " : " Argument to JsonableError should be a literal string enclosed by _() " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r """ \ WJsonableError \ ([ " ' ].+ \ ) """ ,
" exclude " : { " zerver/tests " , " zerver/views/development/ " } ,
" description " : " Argument to JsonableError should be a literal string enclosed by _() " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r """ ([a-zA-Z0-9_]+)=REQ \ ([ ' " ] \ 1[ ' " ] """ ,
" description " : " REQ ' s first argument already defaults to parameter name " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " self \ .client \ .(get|post|patch|put|delete) " ,
" description " : """ Do not call self.client directly for put/patch/post/get.
2017-06-05 16:29:04 +02:00
See WRAPPER_COMMENT in test_helpers . py for details .
2021-02-12 08:20:45 +01:00
""" ,
2021-02-12 08:19:30 +01:00
} ,
2017-06-05 16:29:04 +02:00
# Directly fetching Message objects in e.g. views code is often a security bug.
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " [^r]Message.objects.get " ,
" exclude " : {
2021-02-12 08:19:30 +01:00
" 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 " ,
} ,
2021-02-12 08:20:45 +01:00
" description " : " Please use access_message() to fetch Message objects " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " Stream.objects.get " ,
" include_only " : { " zerver/views/ " } ,
" description " : " Please use access_stream_by_*() to fetch Stream objects " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " get_stream[(] " ,
" include_only " : { " zerver/views/ " , " zerver/lib/actions.py " } ,
" exclude_line " : {
2021-02-12 08:19:30 +01:00
# This one in check_message is kinda terrible, since it's
# how most instances are written, but better to exclude something than nothing
2021-02-12 08:20:45 +01:00
( " zerver/lib/actions.py " , " stream = get_stream(stream_name, realm) " ) ,
( " zerver/lib/actions.py " , ' return get_stream( " signups " , realm) ' ) ,
2021-02-12 08:19:30 +01:00
} ,
2021-02-12 08:20:45 +01:00
" description " : " Please use access_stream_by_*() to fetch Stream objects " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " datetime[.](now|utcnow) " ,
" include_only " : { " zerver/ " , " analytics/ " } ,
" description " : " Don ' t use datetime in backend code. \n "
2021-02-12 08:19:30 +01:00
" See https://zulip.readthedocs.io/en/latest/contributing/code-style.html#naive-datetime-objects " ,
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " from os.path " ,
" description " : " Don ' t use from when importing from the standard library " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " import os.path " ,
" description " : " Use import os instead of import os.path " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " (logging|logger) \ .warn \ W " ,
" 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 ' ) " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " \ .pk " ,
" exclude_pattern " : " [.]_meta[.]pk " ,
" description " : " Use `id` instead of `pk`. " ,
" good_lines " : [ " if my_django_model.id == 42 " , " self.user_profile._meta.pk " ] ,
" bad_lines " : [ " if my_django_model.pk == 42 " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " ^ \ s*# \ s*type: " ,
" description " : " Comment-style function type annotation. Use Python3 style annotations instead. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01: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 " ,
" tools/lib/provision.py " ,
2021-02-12 08:19:30 +01:00
} ,
2021-02-12 08:20:45 +01: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] " ] ,
} ,
{
" pattern " : r " : *(?!Optional)[^ ].*= models[.].*null=True " ,
" include_only " : { " zerver/models.py " } ,
" description " : " Model variable with null=true not annotated as Optional. " ,
" 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) " ,
2021-02-12 08:19:30 +01:00
] ,
2021-02-12 08:20:45 +01:00
" bad_lines " : [
" desc: Text = models.CharField(null=True) " ,
" stream: Stream = models.ForeignKey(Stream, null=True, on_delete=CASCADE) " ,
2021-02-12 08:19:30 +01:00
] ,
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " : *Optional.*= models[.].* \ ) " ,
" exclude_pattern " : " null=True " ,
" include_only " : { " zerver/models.py " } ,
" description " : " Model variable annotated with Optional but variable does not have null=true. " ,
" 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) " ,
2021-02-12 08:19:30 +01:00
] ,
2021-02-12 08:20:45 +01:00
" bad_lines " : [
" desc: Optional[Text] = models.TextField() " ,
" stream: Optional[Stream] = models.ForeignKey(Stream, on_delete=CASCADE) " ,
2021-02-12 08:19:30 +01:00
] ,
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " exit[(]1[)] " ,
" include_only " : { " /management/commands/ " } ,
" description " : " Raise CommandError to exit with failure in management commands " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " .is_realm_admin = " ,
" description " : " Use do_change_user_role function rather than setting UserProfile ' s is_realm_admin attribute directly. " ,
" exclude " : {
" zerver/migrations/0248_userprofile_role_start.py " ,
" zerver/tests/test_users.py " ,
2021-02-12 08:19:30 +01:00
} ,
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " .is_guest = " ,
" description " : " Use do_change_user_role function rather than setting UserProfile ' s is_guest attribute directly. " ,
" exclude " : {
" zerver/migrations/0248_userprofile_role_start.py " ,
" zerver/tests/test_users.py " ,
2021-02-12 08:19:30 +01:00
} ,
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " \\ .(called(_once|_with|_once_with)?|not_called|has_calls|not_called)[(] " ,
" description " : ' A mock function is missing a leading " assert_ " ' ,
2021-02-12 08:19:30 +01:00
} ,
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
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 (
2021-02-12 08:20:45 +01:00
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 = [
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01: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 " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " sudo " ,
" description " : " Most scripts are intended to work on systems without sudo " ,
" include_only " : { " scripts/ " } ,
" exclude " : {
" scripts/lib/install " ,
" scripts/setup/configure-rabbitmq " ,
2021-02-12 08:19:30 +01:00
} ,
} ,
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 (
2021-02-12 08:20:45 +01: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 " ] = [
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : r ' ^[^ { ].*?[^ \ / \ # \ - " ]([jJ]avascript) ' , # exclude usage in hrefs/divs/custom-markdown
" exclude " : { " docs/documentation/api.md " } ,
" description " : " javascript should be spelled JavaScript " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r """ [^ \ / \ - \ . " ' \ _ \ = \ >]([gG]ithub)[^ \ . \ - \ _ " \ <] """ , # exclude usage in hrefs/divs
" description " : " github should be spelled GitHub " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " [oO]rganisation " , # exclude usage in hrefs/divs
" description " : " Organization is spelled with a z " ,
" exclude_line " : { ( " docs/translating/french.md " , " * organization - **organisation** " ) } ,
2021-02-12 08:19:30 +01:00
} ,
2021-02-12 08:20:45 +01:00
{ " pattern " : " !!! warning " , " description " : " !!! warning is invalid; it ' s spelled ' !!! warn ' " } ,
{ " pattern " : " Terms of service " , " description " : " The S in Terms of Service is capitalized " } ,
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " [^-_p]botserver(?!rc)|bot server " ,
" description " : " Use Botserver instead of botserver or bot server. " ,
2021-02-12 08:19:30 +01:00
} ,
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 ,
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " subject|SUBJECT " ,
" exclude " : { " templates/zerver/email.html " } ,
" exclude_pattern " : " email subject " ,
" description " : " avoid subject in templates " ,
" good_lines " : [ " topic_name " ] ,
" bad_lines " : [ ' subject= " foo " ' , " MAX_SUBJECT_LEN " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r ' placeholder= " [^ { #](?:(?! \ .com).)+$ ' ,
" description " : " `placeholder` value should be translatable. " ,
" exclude_line " : {
( " templates/zerver/register.html " , ' placeholder= " acme " ' ) ,
( " templates/zerver/register.html " , ' placeholder= " Acme or Ακμή " ' ) ,
} ,
" exclude " : { " templates/analytics/support.html " } ,
" good_lines " : [
2021-04-15 21:01:42 +02:00
' <input class= " stream-list-filter " type= " text " placeholder= " {{ _( \' Filter streams \' ) }} " /> '
2021-02-12 08:19:30 +01:00
] ,
2021-02-12 08:20:45 +01:00
" bad_lines " : [ ' <input placeholder= " foo " > ' ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " = { " ,
" description " : " Likely missing quoting in HTML attribute " ,
" good_lines " : [ ' <a href= " {{ variable}} " > ' ] ,
" bad_lines " : [ " <a href= {{ variable}}> " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " ' }} " ,
" description " : " Likely misplaced quoting in translation tags " ,
" good_lines " : [ " {{ t ' translateable string ' }} " ] ,
" bad_lines " : [ " {{ t ' translateable string ' }} " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " placeholder= ' [^ { ] " ,
" description " : " `placeholder` value should be translatable. " ,
" good_lines " : [
2021-04-15 21:01:42 +02:00
' <input class= " stream-list-filter " type= " text " placeholder= " {{ _( \' Filter streams \' ) }} " /> '
2021-02-12 08:19:30 +01:00
] ,
2021-02-12 08:20:45 +01:00
" bad_lines " : [ " <input placeholder= ' foo ' > " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " aria-label= ' [^ { ] " ,
" description " : " `aria-label` value should be translatable. " ,
" good_lines " : [
2021-02-12 08:19:30 +01:00
' <button type= " button " class= " close close-alert-word-status " aria-label= " {{ t \' Close \' }} " > '
] ,
2021-02-12 08:20:45 +01:00
" bad_lines " : [ " <button aria-label= ' foo ' ></button> " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : ' aria-label= " [^ { ] ' ,
" description " : " `aria-label` value should be translatable. " ,
" good_lines " : [
2021-02-12 08:19:30 +01:00
' <button type= " button " class= " close close-alert-word-status " aria-label= " {{ t \' Close \' }} " > '
] ,
2021-02-12 08:20:45 +01:00
" bad_lines " : [ ' <button aria-label= " foo " ></button> ' ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : ' script src= " http ' ,
" description " : " Don ' t directly load dependencies from CDNs. See docs/subsystems/html-css.md " ,
" exclude " : {
2021-02-12 08:19:30 +01:00
" templates/corporate/billing.html " ,
" templates/zerver/hello.html " ,
" templates/corporate/upgrade.html " ,
} ,
2021-02-12 08:20:45 +01:00
" bad_lines " : [
2021-02-12 08:19:30 +01:00
' <script src= " https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js " ></script> '
] ,
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " title= ' [^ { ] " ,
" description " : " `title` value should be translatable. " ,
" good_lines " : [ ' <link rel= " author " title= " {{ _( \' About these documents \' ) }} " /> ' ] ,
" bad_lines " : [ " <p title= ' foo ' ></p> " ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r ' title= " [^ { \ :] ' ,
" exclude " : {
2021-02-12 08:19:30 +01:00
" templates/zerver/emails " ,
" templates/analytics/realm_details.html " ,
" templates/analytics/support.html " ,
} ,
2021-02-12 08:20:45 +01:00
" description " : " `title` value should be translatable. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r """ \ Walt=[ " ' ][^ { " ' ] """ ,
" description " : " alt argument should be enclosed by _() or it should be an empty string. " ,
" exclude " : {
" static/templates/settings/display_settings.hbs " ,
" templates/zerver/app/keyboard_shortcuts.html " ,
} ,
" good_lines " : [ ' <img src= " {{ source_url}} " alt= " {{ _(name) }} " /> ' , ' <img alg= " " /> ' ] ,
" bad_lines " : [ ' <img alt= " Foo Image " /> ' ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r """ \ Walt=[ " ' ] {{ ?[ " ' ] """ ,
" description " : " alt argument should be enclosed by _(). " ,
" good_lines " : [ ' <img src= " {{ source_url}} " alt= " {{ _(name) }} " /> ' ] ,
" bad_lines " : [ ' <img alt= " {{ " /> ' ] ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " \ bon \ w+ ?= " ,
" description " : " Don ' t use inline event handlers (onclick=, etc. attributes) in HTML. Instead, "
2021-02-12 08:19:30 +01:00
" attach a jQuery event handler ($( ' #foo ' ).on( ' click ' , function () { ...})) when "
" the DOM is ready (inside a $(function () { ...}) block). " ,
2021-04-16 17:37:13 +02:00
" exclude " : {
" templates/zerver/development/dev_login.html " ,
" templates/corporate/upgrade.html " ,
} ,
2021-02-12 08:20:45 +01:00
" good_lines " : [ " ($( ' #foo ' ).on( ' click ' , function () {} " ] ,
" bad_lines " : [
2021-02-12 08:19:30 +01:00
" <button id= ' foo ' onclick= ' myFunction() ' >Foo</button> " ,
" <input onchange= ' myFunction() ' > " ,
] ,
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " style ?= " ,
" description " : " Avoid using the `style=` attribute; we prefer styling in CSS files " ,
" exclude_pattern " : r ' .*style ?=[ " '
2021-02-12 08:19:30 +01:00
+ " ' "
2021-02-12 08:20:45 +01:00
+ " ](display: ?none|background: {{ |color: {{ |background-color: {{ ).* " ,
" exclude " : {
2021-02-12 08:19:30 +01:00
# 5xx page doesn't have external CSS
2021-02-12 08:20:45 +01:00
" static/html/5xx.html " ,
2021-02-12 08:19:30 +01:00
# exclude_pattern above handles color, but have other issues:
2021-02-12 08:20:45 +01:00
" static/templates/draft.hbs " ,
" static/templates/subscription.hbs " ,
" static/templates/single_message.hbs " ,
2021-02-12 08:19:30 +01: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.
2021-02-12 08:20:45 +01:00
" templates/zerver/emails/email_base_messages.html " ,
2021-02-12 08:19:30 +01:00
# Email log templates; should clean up.
2021-02-12 08:20:45 +01:00
" templates/zerver/email.html " ,
2021-04-16 17:37:13 +02:00
" templates/zerver/development/email_log.html " ,
2021-02-12 08:19:30 +01:00
# Social backend logos are dynamically loaded
2021-02-12 08:20:45 +01:00
" templates/zerver/accounts_home.html " ,
" templates/zerver/login.html " ,
2021-02-12 08:19:30 +01:00
# Probably just needs to be changed to display: none so the exclude works
2021-02-12 08:20:45 +01:00
" templates/zerver/app/navbar.html " ,
2021-02-12 08:19:30 +01:00
# Needs the width cleaned up; display: none is fine
2021-02-12 08:20:45 +01:00
" static/templates/settings/account_settings.hbs " ,
2021-02-12 08:19:30 +01:00
# background image property is dynamically generated
2021-02-12 08:20:45 +01:00
" static/templates/user_profile_modal.hbs " ,
" static/templates/pm_list_item.hbs " ,
2021-02-12 08:19:30 +01:00
# Inline styling for an svg; could be moved to CSS files?
2021-02-12 08:20:45 +01:00
" 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 " ,
2021-02-12 08:19:30 +01:00
# Miscellaneous violations to be cleaned up
2021-02-12 08:20:45 +01:00
" static/templates/user_info_popover_title.hbs " ,
" static/templates/subscription_invites_warning_modal.hbs " ,
" 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 " ,
} ,
" good_lines " : [ " #my-style { color: blue;} " , ' style= " display: none " ' , " style= ' display: none " ] ,
" bad_lines " : [ ' <p style= " color: blue; " >Foo</p> ' , ' style = " color: blue; " ' ] ,
2021-02-12 08:19:30 +01:00
} ,
2020-04-22 01:09:50 +02:00
]
2019-05-30 17:41:23 +02:00
handlebars_rules = RuleList (
2021-02-12 08:20:45 +01:00
langs = [ " hbs " ] ,
2020-09-02 06:59:07 +02:00
rules = [
* html_rules ,
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " [<]script " ,
" description " : " Do not use inline <script> tags here; put JavaScript in static/js instead. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " {{ t ( \" | ' ) " ,
" description " : ' There should be no spaces before the " t " in a translation tag. ' ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " {{ t ' .* ' }}[ \ . \ ?!] " ,
" description " : " Period should be part of the translatable string. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r ' {{ t " .* " }}[ \ . \ ?!] ' ,
" description " : " Period should be part of the translatable string. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " {{ /tr}}[ \ . \ ?!] " ,
" description " : " Period should be part of the translatable string. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " {{ t ( \" | ' ) " ,
" description " : " Translatable strings should not have leading spaces. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " {{ t ' [^ ' ]+ ' }} " ,
" description " : " Translatable strings should not have trailing spaces. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : ' {{ t " [^ " ]+ " }} ' ,
" description " : " Translatable strings should not have trailing spaces. " ,
2021-02-12 08:19:30 +01:00
} ,
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 (
2021-02-12 08:20:45 +01:00
langs = [ " html " ] ,
2020-09-02 06:59:07 +02:00
rules = [
* html_rules ,
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : r " { % e ndtrans % }[ \ . \ ?!] " ,
" description " : " Period should be part of the translatable string. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " {{ _(.+) }}[ \ . \ ?!] " ,
" description " : " Period should be part of the translatable string. " ,
2021-02-12 08:19:30 +01:00
} ,
2021-04-16 17:48:20 +02:00
{
" pattern " : r ' { % s et entrypoint = " dev- ' ,
" exclude " : { " templates/zerver/development/ " } ,
" description " : " Development entrypoints (dev-) must not be imported in production. " ,
} ,
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 (
2021-02-12 08:20:45 +01:00
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 ,
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " \t " ,
" strip " : " \n " ,
" exclude " : { " zerver/webhooks/ " } ,
" description " : " Fix tab-based whitespace " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r ' " :[ " \ [ \ { ] ' ,
" exclude " : { " zerver/webhooks/ " , " zerver/tests/fixtures/ " } ,
" description " : " Require space after : in JSON " ,
2021-02-12 08:19:30 +01:00
} ,
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 (
2021-02-12 08:20:45 +01:00
langs = [ " md " ] ,
2020-09-02 06:59:07 +02:00
rules = [
* markdown_whitespace_rules ,
* prose_style_rules ,
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : r " \ [(?P<url>[^ \ ]]+) \ ] \ ((?P=url) \ ) " ,
" description " : " Linkified Markdown URLs should use cleaner <http://example.com> syntax. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " https://zulip.readthedocs.io/en/latest/[a-zA-Z0-9] " ,
" exclude " : {
" docs/overview/contributing.md " ,
" docs/overview/readme.md " ,
" docs/README.md " ,
" docs/subsystems/email.md " ,
2021-02-12 08:19:30 +01:00
} ,
2021-02-12 08:20:45 +01:00
" include_only " : { " docs/ " } ,
" description " : " Use relative links (../foo/bar.html) to other documents in docs/ " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : " su zulip -c [^ ' ] " ,
" include_only " : { " docs/ " } ,
" description " : " Always quote arguments using `su zulip -c ' ` to avoid confusion about how su works. " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " \ ][(][^#h] " ,
" include_only " : { " README.md " , " CONTRIBUTING.md " } ,
" description " : " Use absolute links from docs served by GitHub " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " \ .(py|js)#L \ d+ " ,
" include_only " : { " docs/ " } ,
" description " : " Don ' t link directly to line numbers " ,
2021-02-12 08:19:30 +01:00
} ,
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 ,
2021-02-12 08:20:45 +01:00
exclude_files_in = " templates/zerver/help/ " ,
2019-05-30 17:41:23 +02:00
)
help_markdown_rules = RuleList (
2021-02-12 08:20:45 +01:00
langs = [ " md " ] ,
2020-07-01 21:10:02 +02:00
rules = [
* markdown_rules . rules ,
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : " [a-z][.][A-Z] " ,
" description " : " Likely missing space after end of sentence " ,
" include_only " : { " templates/zerver/help/ " } ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " \ b[rR]ealm[s]? \ b " ,
" include_only " : { " templates/zerver/help/ " } ,
" exclude " : { " templates/zerver/help/change-organization-url.md " } ,
" good_lines " : [ " Organization " , " deactivate_realm " , " realm_filter " ] ,
" bad_lines " : [ " Users are in a realm " , " Realm is the best model " ] ,
" description " : " Realms are referred to as Organizations in user-facing docs. " ,
2021-02-12 08:19:30 +01:00
} ,
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 (
2021-02-12 08:20:45 +01:00
langs = [ " pp " ] ,
2020-10-26 23:44:49 +01:00
rules = [
2021-02-12 08:19:30 +01:00
{
2021-02-12 08:20:45 +01:00
" pattern " : r " (include \ s+| \ $)zulip::(profile|base) \ b " ,
" exclude " : {
" puppet/zulip/manifests/profile/ " ,
" puppet/zulip_ops/manifests/ " ,
" puppet/zulip/manifests/dockervoyager.pp " ,
2021-02-12 08:19:30 +01:00
} ,
2021-02-12 08:20:45 +01:00
" description " : " Abstraction layering violation; only profiles should reference profiles or zulip::base " ,
2021-02-12 08:19:30 +01:00
} ,
{
2021-02-12 08:20:45 +01:00
" pattern " : r " (include \ s+| \ $)zulip_ops::(profile|base) \ b " ,
" exclude " : {
" puppet/zulip/manifests/ " ,
" puppet/zulip_ops/manifests/profile/ " ,
2021-02-12 08:19:30 +01:00
} ,
2021-02-12 08:20:45 +01:00
" description " : " Abstraction layering violation; only profiles should reference profiles or zulip_ops::base " ,
2021-02-12 08:19:30 +01:00
} ,
2020-10-26 23:44:49 +01:00
] ,
)
2019-05-30 17:41:23 +02:00
txt_rules = RuleList (
2021-02-12 08:20:45 +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
]