File: required-and-default-attributes.py

package info (click to toggle)
ansible-core 2.19.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 32,752 kB
  • sloc: python: 181,000; cs: 4,929; sh: 4,611; xml: 34; makefile: 21
file content (25 lines) | stat: -rw-r--r-- 768 bytes parent folder | download | duplicates (3)
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()