1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
from __future__ import annotations
import ast
import pathlib
import sys
class CallVisitor(ast.NodeVisitor):
def __init__(self, path: str) -> None:
self.path = path
def visit_Call(self, node: ast.Call) -> None:
if isinstance(node.func, ast.Name) and node.func.id.endswith("FieldAttribute"):
if len([kw for kw in node.keywords if kw.arg in ("default", "required")]) > 1:
print(f"{self.path}:{node.lineno}:{node.col_offset}: use only one of `default` or `required` with `{node.func.id}`")
def main() -> None:
for path in sys.argv[1:] or sys.stdin.read().splitlines():
tree = ast.parse(pathlib.Path(path).read_text(), path)
CallVisitor(path).visit(tree)
if __name__ == "__main__":
main()
|