mirror of https://github.com/zulip/zulip.git
lint: Run mypy as part of main linter.
To support this, we add a pass_targets option to the main linter library, because with current mypy, it's generally counterproductive to pass the list of files in (can produce spurious errors; isn't faster).
This commit is contained in:
parent
3003517430
commit
6b69cc0b39
|
@ -99,12 +99,9 @@ following checks:
|
||||||
- Check HTML templates for matching tags and indentations.
|
- Check HTML templates for matching tags and indentations.
|
||||||
- Check CSS for parsability and formatting.
|
- Check CSS for parsability and formatting.
|
||||||
- Check JavaScript code for addClass calls.
|
- Check JavaScript code for addClass calls.
|
||||||
|
- Running `mypy` to check static types in Python code. Our
|
||||||
The remaining lint checks occur in `./tools/run-mypy`. It is probably somewhat
|
[documentation on using mypy](../testing/mypy.html) covers mypy in
|
||||||
of an understatement to call "mypy" a "linter," as it performs static
|
more detail.
|
||||||
code analysis of Python type annotations throughout our Python codebase.
|
|
||||||
|
|
||||||
Our [documentation on using mypy](../testing/mypy.html) covers mypy in more detail.
|
|
||||||
|
|
||||||
The rest of this document pertains to the checks that occur in `./tools/lint`.
|
The rest of this document pertains to the checks that occur in `./tools/lint`.
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ echo "Test suite is running under $(python --version)."
|
||||||
set -e
|
set -e
|
||||||
set -x
|
set -x
|
||||||
|
|
||||||
./tools/lint --backend --no-gitlint # gitlint disabled because flaky
|
./tools/lint --backend --no-gitlint --no-mypy # gitlint disabled because flaky
|
||||||
./tools/test-tools
|
./tools/test-tools
|
||||||
./tools/test-backend --coverage
|
./tools/test-backend --coverage
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,9 @@ def run():
|
||||||
parser.add_argument('--no-gitlint',
|
parser.add_argument('--no-gitlint',
|
||||||
action='store_true',
|
action='store_true',
|
||||||
help='Disable gitlint')
|
help='Disable gitlint')
|
||||||
|
parser.add_argument('--no-mypy',
|
||||||
|
action='store_true',
|
||||||
|
help='Disable mypy')
|
||||||
limited_tests_group = parser.add_mutually_exclusive_group()
|
limited_tests_group = parser.add_mutually_exclusive_group()
|
||||||
limited_tests_group.add_argument('--frontend',
|
limited_tests_group.add_argument('--frontend',
|
||||||
action='store_true',
|
action='store_true',
|
||||||
|
@ -98,6 +101,8 @@ def run():
|
||||||
linter_config.external_linter('urls', ['tools/check-urls'], ['py'])
|
linter_config.external_linter('urls', ['tools/check-urls'], ['py'])
|
||||||
linter_config.external_linter('swagger', ['node', 'tools/check-swagger'], ['yaml'])
|
linter_config.external_linter('swagger', ['node', 'tools/check-swagger'], ['yaml'])
|
||||||
linter_config.external_linter('shellcheck', ['shellcheck', '-x'], ['sh'])
|
linter_config.external_linter('shellcheck', ['shellcheck', '-x'], ['sh'])
|
||||||
|
if not args.no_mypy:
|
||||||
|
linter_config.external_linter('mypy', ['tools/run-mypy'], ['py'], pass_targets=False)
|
||||||
|
|
||||||
# Disabled check for imperative mood until it is stabilized
|
# Disabled check for imperative mood until it is stabilized
|
||||||
if not args.no_gitlint:
|
if not args.no_gitlint:
|
||||||
|
|
|
@ -42,7 +42,6 @@ run ./tools/clean-repo
|
||||||
run ./tools/lint --backend $FORCEARG
|
run ./tools/lint --backend $FORCEARG
|
||||||
run ./tools/test-tools
|
run ./tools/test-tools
|
||||||
run ./tools/test-backend $FORCEARG
|
run ./tools/test-backend $FORCEARG
|
||||||
run ./tools/run-mypy $FORCEARG
|
|
||||||
run ./tools/test-migrations
|
run ./tools/test-migrations
|
||||||
# Not running SVG optimizing since it's low-churn
|
# Not running SVG optimizing since it's low-churn
|
||||||
# run ./tools/setup/optimize-svg
|
# run ./tools/setup/optimize-svg
|
||||||
|
|
|
@ -57,8 +57,8 @@ class LinterConfig:
|
||||||
self.lint_functions[func.__name__] = func
|
self.lint_functions[func.__name__] = func
|
||||||
return func
|
return func
|
||||||
|
|
||||||
def external_linter(self, name, command, target_langs=[]):
|
def external_linter(self, name, command, target_langs=[], pass_targets=True):
|
||||||
# type: (str, List[str], List[str]) -> None
|
# type: (str, List[str], List[str], bool) -> None
|
||||||
"""Registers an external linter program to be run as part of the
|
"""Registers an external linter program to be run as part of the
|
||||||
linter. This program will be passed the subset of files being
|
linter. This program will be passed the subset of files being
|
||||||
linted that have extensions in target_langs. If there are no
|
linted that have extensions in target_langs. If there are no
|
||||||
|
@ -80,7 +80,11 @@ class LinterConfig:
|
||||||
# invoking the external linter.
|
# invoking the external linter.
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
p = subprocess.Popen(command + targets,
|
if pass_targets:
|
||||||
|
full_command = command + targets
|
||||||
|
else:
|
||||||
|
full_command = command
|
||||||
|
p = subprocess.Popen(full_command,
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
stderr=subprocess.STDOUT)
|
stderr=subprocess.STDOUT)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue