diff --git a/changelogs/fragments/required-and-default.yml b/changelogs/fragments/required-and-default.yml deleted file mode 100644 index 86f9d02bf6a..00000000000 --- a/changelogs/fragments/required-and-default.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -bugfixes: - - tests - update regex for detecting default and required values in FieldAttributes (https://github.com/ansible/ansible/issues/61460). diff --git a/test/sanity/code-smell/required-and-default-attributes.py b/test/sanity/code-smell/required-and-default-attributes.py index b2635f674d2..7b1c89f9b8b 100644 --- a/test/sanity/code-smell/required-and-default-attributes.py +++ b/test/sanity/code-smell/required-and-default-attributes.py @@ -1,30 +1,24 @@ from __future__ import annotations -import sys import ast +import pathlib +import sys class CallVisitor(ast.NodeVisitor): - def __init__(self, path): + def __init__(self, path: str) -> None: self.path = path - def visit_Call(self, node): - if getattr(node.func, "id", "").endswith("FieldAttribute"): - count = 0 - for kw in node.keywords: - if kw.arg in ("default", "required"): - count += 1 - if count > 1: - print( - f"{self.path}:{node.lineno}:{node.col_offset}: use only one of `default` or `required` with `{node.func.id}`" - ) + 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(): +def main() -> None: for path in sys.argv[1:] or sys.stdin.read().splitlines(): - with open(path, "r") as path_fd: - tree = ast.parse(path_fd.read()) - CallVisitor(path).visit(tree) + tree = ast.parse(pathlib.Path(path).read_text(), path) + CallVisitor(path).visit(tree) if __name__ == "__main__":