Skip to content

Commit

Permalink
feat: add options to display how to disable an error (#24)
Browse files Browse the repository at this point in the history
Also chore: move common options to a shared function
  • Loading branch information
justinchuby authored Nov 18, 2022
1 parent f97377c commit 49eb97d
Show file tree
Hide file tree
Showing 10 changed files with 100 additions and 115 deletions.
4 changes: 4 additions & 0 deletions .lintrunner.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ command = [
'lintrunner_adapters',
'run',
'flake8_linter',
'--show-disable',
'--',
'@{{PATHSFILE}}'
]
Expand Down Expand Up @@ -46,6 +47,7 @@ command = [
'run',
'mypy_linter',
'--config=pyproject.toml',
'--show-disable',
'--',
'@{{PATHSFILE}}'
]
Expand Down Expand Up @@ -181,6 +183,8 @@ command = [
'run',
'pylint_linter',
'--rcfile=pyproject.toml',
'--jobs=0',
'--show-disable',
'--',
'@{{PATHSFILE}}'
]
Expand Down
1 change: 1 addition & 0 deletions lintrunner_adapters/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
IS_WINDOWS,
LintMessage,
LintSeverity,
add_default_options,
as_posix,
run_command,
)
Expand Down
24 changes: 24 additions & 0 deletions lintrunner_adapters/_common/lintrunner_common.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import argparse
import dataclasses
import enum
import json
Expand Down Expand Up @@ -113,3 +114,26 @@ def run_command(
err,
)
time.sleep(1)


def add_default_options(parser: argparse.ArgumentParser) -> None:
"""Add default options to a parser.
This should be called the last in the chain of add_argument calls.
"""
parser.add_argument(
"--retries",
type=int,
default=3,
help="number of times to retry if the linter times out.",
)
parser.add_argument(
"--verbose",
action="store_true",
help="verbose logging",
)
parser.add_argument(
"filenames",
nargs="+",
help="paths to lint",
)
18 changes: 2 additions & 16 deletions lintrunner_adapters/adapters/black_isort_linter.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import sys
from typing import List

import lintrunner_adapters
from lintrunner_adapters import LintMessage, LintSeverity, as_posix, run_command

LINTER_CODE = "BLACK-ISORT"
Expand Down Expand Up @@ -114,28 +115,13 @@ def main() -> None:
description=f"Format files with black-isort. Linter code: {LINTER_CODE}",
fromfile_prefix_chars="@",
)
parser.add_argument(
"--retries",
default=3,
type=int,
help="times to retry timed out black-isort",
)
parser.add_argument(
"--timeout",
default=90,
type=int,
help="seconds to wait for black-isort",
)
parser.add_argument(
"--verbose",
action="store_true",
help="verbose logging",
)
parser.add_argument(
"filenames",
nargs="+",
help="paths to lint",
)
lintrunner_adapters.add_default_options(parser)
args = parser.parse_args()

logging.basicConfig(
Expand Down
18 changes: 2 additions & 16 deletions lintrunner_adapters/adapters/black_linter.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import sys
from typing import List

import lintrunner_adapters
from lintrunner_adapters import LintMessage, LintSeverity, as_posix, run_command

LINTER_CODE = "BLACK"
Expand Down Expand Up @@ -100,28 +101,13 @@ def main() -> None:
description=f"Format files with black. Linter code: {LINTER_CODE}",
fromfile_prefix_chars="@",
)
parser.add_argument(
"--retries",
default=3,
type=int,
help="times to retry timed out black",
)
parser.add_argument(
"--timeout",
default=90,
type=int,
help="seconds to wait for black",
)
parser.add_argument(
"--verbose",
action="store_true",
help="verbose logging",
)
parser.add_argument(
"filenames",
nargs="+",
help="paths to lint",
)
lintrunner_adapters.add_default_options(parser)
args = parser.parse_args()

logging.basicConfig(
Expand Down
18 changes: 2 additions & 16 deletions lintrunner_adapters/adapters/clangformat_linter.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from pathlib import Path
from typing import List

import lintrunner_adapters
from lintrunner_adapters import (
IS_WINDOWS,
LintMessage,
Expand Down Expand Up @@ -123,28 +124,13 @@ def main() -> None:
default="file",
help="clang-format style",
)
parser.add_argument(
"--retries",
default=3,
type=int,
help="times to retry timed out clang-format",
)
parser.add_argument(
"--timeout",
default=90,
type=int,
help="seconds to wait for clang-format",
)
parser.add_argument(
"--verbose",
action="store_true",
help="verbose logging",
)
parser.add_argument(
"filenames",
nargs="+",
help="paths to lint",
)
lintrunner_adapters.add_default_options(parser)
args = parser.parse_args()

logging.basicConfig(
Expand Down
38 changes: 20 additions & 18 deletions lintrunner_adapters/adapters/flake8_linter.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import sys
from typing import Dict, List, Optional, Pattern, Set

import lintrunner_adapters
from lintrunner_adapters import LintMessage, LintSeverity, as_posix, run_command

LINTER_CODE = "FLAKE8"
Expand Down Expand Up @@ -176,11 +177,20 @@ def get_issue_documentation_url(code: str) -> str:
return ""


def format_lint_message(message: str, code: str, show_disable: bool) -> str:
formatted = f"{message}\nSee {get_issue_documentation_url(code)}."
if show_disable:
formatted += f"\n\nTo disable, use ` # noqa: {code}`"
return formatted


def check_files(
filenames: List[str],
severities: Dict[str, LintSeverity],
*,
retries: int,
docstring_convention: Optional[str],
show_disable: bool,
) -> List[LintMessage]:
try:
proc = run_command(
Expand Down Expand Up @@ -226,9 +236,10 @@ def check_files(
LintMessage(
path=match["file"],
name=match["code"],
description="{}\nSee {}".format(
description=format_lint_message(
match["message"],
get_issue_documentation_url(match["code"]),
match["code"],
show_disable,
),
line=int(match["line"]),
char=int(match["column"])
Expand All @@ -253,28 +264,18 @@ def main() -> None:
action="append",
help="map code to severity (e.g. `B950:advice`)",
)
parser.add_argument(
"--retries",
default=3,
type=int,
help="times to retry timed out flake8",
)
parser.add_argument(
"--verbose",
action="store_true",
help="verbose logging",
)
parser.add_argument(
"--docstring-convention",
default=None,
type=str,
help="docstring convention to use. E.g. 'google', 'numpy'",
)
parser.add_argument(
"filenames",
nargs="+",
help="paths to lint",
"--show-disable",
action="store_true",
help="show how to disable a lint message",
)
lintrunner_adapters.add_default_options(parser)
args = parser.parse_args()

logging.basicConfig(
Expand All @@ -297,8 +298,9 @@ def main() -> None:
lint_messages = check_files(
args.filenames,
severities,
args.retries,
args.docstring_convention,
retries=args.retries,
docstring_convention=args.docstring_convention,
show_disable=args.show_disable,
)
for lint_message in lint_messages:
lint_message.display()
Expand Down
18 changes: 2 additions & 16 deletions lintrunner_adapters/adapters/isort_linter.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import sys
from typing import List

import lintrunner_adapters
from lintrunner_adapters import LintMessage, LintSeverity, as_posix, run_command

LINTER_CODE = "ISORT"
Expand Down Expand Up @@ -100,28 +101,13 @@ def main() -> None:
description=f"Format files with isort. Linter code: {LINTER_CODE}",
fromfile_prefix_chars="@",
)
parser.add_argument(
"--retries",
default=3,
type=int,
help="times to retry timed out isort",
)
parser.add_argument(
"--timeout",
default=90,
type=int,
help="seconds to wait for isort",
)
parser.add_argument(
"--verbose",
action="store_true",
help="verbose logging",
)
parser.add_argument(
"filenames",
nargs="+",
help="paths to lint",
)
lintrunner_adapters.add_default_options(parser)
args = parser.parse_args()

logging.basicConfig(
Expand Down
35 changes: 19 additions & 16 deletions lintrunner_adapters/adapters/mypy_linter.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from pathlib import Path
from typing import Dict, List, Pattern

import lintrunner_adapters
from lintrunner_adapters import LintMessage, LintSeverity, run_command

LINTER_CODE = "MYPY"
Expand All @@ -33,10 +34,16 @@
}


def disable_message(code: str) -> str:
return f"\n\nTo disable, use ` # type: ignore{code}`"


def check_files(
filenames: List[str],
*,
config: str,
retries: int,
show_disable: bool,
) -> List[LintMessage]:
try:
proc = run_command(
Expand All @@ -62,7 +69,8 @@ def check_files(
LintMessage(
path=match["file"],
name=match["code"],
description=match["message"],
description=match["message"]
+ (disable_message(match["code"]) if show_disable else ""),
line=int(match["line"]),
char=int(match["column"])
if match["column"] is not None and not match["column"].startswith("-")
Expand All @@ -76,32 +84,22 @@ def check_files(
]


def main() -> None:
def main():
parser = argparse.ArgumentParser(
description=f"mypy wrapper linter. Linter code: {LINTER_CODE}",
fromfile_prefix_chars="@",
)
parser.add_argument(
"--retries",
default=3,
type=int,
help="times to retry timed out mypy",
)
parser.add_argument(
"--config",
required=True,
help="path to an mypy .ini config file",
)
parser.add_argument(
"--verbose",
"--show-disable",
action="store_true",
help="verbose logging",
)
parser.add_argument(
"filenames",
nargs="+",
help="paths to lint",
help="show how to disable a lint message",
)
lintrunner_adapters.add_default_options(parser)
args = parser.parse_args()

logging.basicConfig(
Expand Down Expand Up @@ -131,7 +129,12 @@ def main() -> None:
else:
filenames[filename] = True

lint_messages = check_files(list(filenames), args.config, args.retries)
lint_messages = check_files(
list(filenames),
config=args.config,
retries=args.retries,
show_disable=args.show_disable,
)
for lint_message in lint_messages:
lint_message.display()

Expand Down
Loading

0 comments on commit 49eb97d

Please sign in to comment.