You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ansible/test/sanity/code-smell/required-and-default-attrib...

26 lines
768 B
Python

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()