1from __future__ import annotations 2 3import json 4import subprocess 5import sys 6from enum import Enum 7from typing import NamedTuple 8 9 10LINTER_CODE = "LINTRUNNER_VERSION" 11 12 13class LintSeverity(str, Enum): 14 ERROR = "error" 15 WARNING = "warning" 16 ADVICE = "advice" 17 DISABLED = "disabled" 18 19 20class LintMessage(NamedTuple): 21 path: str | None 22 line: int | None 23 char: int | None 24 code: str 25 severity: LintSeverity 26 name: str 27 original: str | None 28 replacement: str | None 29 description: str | None 30 31 32def toVersionString(version_tuple: tuple[int, int, int]) -> str: 33 return ".".join(str(x) for x in version_tuple) 34 35 36if __name__ == "__main__": 37 version_str = ( 38 subprocess.run(["lintrunner", "-V"], stdout=subprocess.PIPE) 39 .stdout.decode("utf-8") 40 .strip() 41 ) 42 43 import re 44 45 version_match = re.compile(r"lintrunner (\d+)\.(\d+)\.(\d+)").match(version_str) 46 47 if not version_match: 48 err_msg = LintMessage( 49 path="<none>", 50 line=None, 51 char=None, 52 code=LINTER_CODE, 53 severity=LintSeverity.ERROR, 54 name="command-failed", 55 original=None, 56 replacement=None, 57 description="Lintrunner is not installed, did you forget to run `make setup-lint && make lint`?", 58 ) 59 sys.exit(0) 60 61 curr_version = int(version_match[1]), int(version_match[2]), int(version_match[3]) 62 min_version = (0, 10, 7) 63 64 if curr_version < min_version: 65 err_msg = LintMessage( 66 path="<none>", 67 line=None, 68 char=None, 69 code=LINTER_CODE, 70 severity=LintSeverity.ADVICE, 71 name="command-failed", 72 original=None, 73 replacement=None, 74 description="".join( 75 ( 76 f"Lintrunner is out of date (you have v{toVersionString(curr_version)} ", 77 f"instead of v{toVersionString(min_version)}). ", 78 "Please run `pip install lintrunner -U` to update it", 79 ) 80 ), 81 ) 82 print(json.dumps(err_msg._asdict()), flush=True) 83