From ba4428a140246c6bd0ab4eb8b547853223b88a28 Mon Sep 17 00:00:00 2001 From: Mateo Kuruk Miccino Date: Wed, 22 Nov 2023 14:58:16 -0300 Subject: [PATCH] feat: add async requirement --- gdtoolkit/formatter/__main__.py | 2 +- gdtoolkit/gd2py/__main__.py | 2 +- gdtoolkit/gdradon/__main__.py | 2 +- gdtoolkit/linter/__init__.py | 3 ++ gdtoolkit/linter/__main__.py | 2 +- gdtoolkit/linter/name_checks.py | 46 ++++++++++++++++++++++++++++++- gdtoolkit/parser/__main__.py | 2 +- tests/linter/test_basic_checks.py | 3 +- tests/linter/test_name_checks.py | 29 +++++++++++++++++++ tox.ini | 2 +- 10 files changed, 84 insertions(+), 9 deletions(-) diff --git a/gdtoolkit/formatter/__main__.py b/gdtoolkit/formatter/__main__.py index 0239a6cd..2f5500bd 100644 --- a/gdtoolkit/formatter/__main__.py +++ b/gdtoolkit/formatter/__main__.py @@ -48,7 +48,7 @@ def main(): sys.stdout.reconfigure(encoding="utf-8") arguments = docopt( __doc__, - version="gdformat {}".format( + version="gdformat {} (kuruk-mm fork)".format( pkg_resources.get_distribution("gdtoolkit").version ), ) diff --git a/gdtoolkit/gd2py/__main__.py b/gdtoolkit/gd2py/__main__.py index 45e3ea45..adbb74b8 100644 --- a/gdtoolkit/gd2py/__main__.py +++ b/gdtoolkit/gd2py/__main__.py @@ -28,7 +28,7 @@ def main(): sys.stdout.reconfigure(encoding="utf-8") arguments = docopt( __doc__, - version="gd2py {}".format(pkg_resources.get_distribution("gdtoolkit").version), + version="gd2py {} (kuruk-mm fork)".format(pkg_resources.get_distribution("gdtoolkit").version), ) with open(arguments[""], "r", encoding="utf-8") as handle: print(convert_code(handle.read())) diff --git a/gdtoolkit/gdradon/__main__.py b/gdtoolkit/gdradon/__main__.py index 5e9dfc03..82cbab09 100644 --- a/gdtoolkit/gdradon/__main__.py +++ b/gdtoolkit/gdradon/__main__.py @@ -31,7 +31,7 @@ def main(): sys.stdout.reconfigure(encoding="utf-8") arguments = docopt( __doc__, - version="gdradon {}".format( + version="gdradon {} (kuruk-mm fork)".format( pkg_resources.get_distribution("gdtoolkit").version ), ) diff --git a/gdtoolkit/linter/__init__.py b/gdtoolkit/linter/__init__.py index c5e8beeb..13b63b3a 100644 --- a/gdtoolkit/linter/__init__.py +++ b/gdtoolkit/linter/__init__.py @@ -29,6 +29,9 @@ "function-name": r"(_on_{}(_[a-z0-9]+)*|{})".format( PASCAL_CASE, PRIVATE_SNAKE_CASE ), + "async-function-name": r"(_async_{}|async_{})".format( + SNAKE_CASE, SNAKE_CASE + ), "class-name": PASCAL_CASE, "sub-class-name": r"_?{}".format(PASCAL_CASE), "signal-name": SNAKE_CASE, diff --git a/gdtoolkit/linter/__main__.py b/gdtoolkit/linter/__main__.py index 956bf6ab..e88ead64 100644 --- a/gdtoolkit/linter/__main__.py +++ b/gdtoolkit/linter/__main__.py @@ -43,7 +43,7 @@ def main(): arguments = docopt( __doc__, - version="gdlint {}".format(pkg_resources.get_distribution("gdtoolkit").version), + version="gdlint {} (kuruk-mm fork)".format(pkg_resources.get_distribution("gdtoolkit").version), ) if arguments["--verbose"]: diff --git a/gdtoolkit/linter/name_checks.py b/gdtoolkit/linter/name_checks.py index 0d501559..093e4efb 100644 --- a/gdtoolkit/linter/name_checks.py +++ b/gdtoolkit/linter/name_checks.py @@ -12,6 +12,7 @@ def lint(parse_tree: Tree, config: MappingProxyType) -> List[Problem]: disable = config["disable"] + rule_name_tokens = _gather_rule_name_tokens( parse_tree, [ @@ -34,11 +35,29 @@ def lint(parse_tree: Tree, config: MappingProxyType) -> List[Problem]: partial( _generic_name_check, config["function-name"], - rule_name_tokens["func_def"], + _get_functions( + parse_tree, + False, + ["func_def"], + )["func_def"], "function-name", 'Function name "{}" is not valid', ), ), + ( + "async-function-name", + partial( + _generic_name_check, + config["async-function-name"], + _get_functions( + parse_tree, + True, + ["func_def"], + )["func_def"], + "async-function-name", + 'Async Function name "{}" is not valid', + ), + ), ( "sub-class-name", partial( @@ -264,3 +283,28 @@ def _has_call_expr_name_in(tree: Tree, legal_names: List[str]) -> bool: name = name_token.value return name in legal_names return False + +def _has_await(parse_tree: Tree) -> bool: + for _ in parse_tree.find_data("await_expr"): + return True + return False + +def _get_functions( + parse_tree: Tree, only_async_funcs: bool, rules +) -> Dict[str, List[str]]: + name_tokens_per_rule = {rule: [] for rule in rules} # type: Dict[str, List[str]] + for node in parse_tree.iter_subtrees(): + if isinstance(node, Tree) and node.data in rules: + is_async = _has_await(node) + + if only_async_funcs != is_async: + continue + + rule_name = node.data + name_token = find_name_token_among_children(node) + if name_token is None: + name_token = find_name_token_among_children(node.children[0]) + assert name_token is not None + + name_tokens_per_rule[rule_name].append(name_token) + return name_tokens_per_rule \ No newline at end of file diff --git a/gdtoolkit/parser/__main__.py b/gdtoolkit/parser/__main__.py index 95a4b0cf..05ec262f 100644 --- a/gdtoolkit/parser/__main__.py +++ b/gdtoolkit/parser/__main__.py @@ -29,7 +29,7 @@ def main(): arguments = docopt( __doc__, - version="gdparse {}".format( + version="gdparse {} (kuruk-mm fork)".format( pkg_resources.get_distribution("gdtoolkit").version ), ) diff --git a/tests/linter/test_basic_checks.py b/tests/linter/test_basic_checks.py index 5d681db0..6006f82a 100644 --- a/tests/linter/test_basic_checks.py +++ b/tests/linter/test_basic_checks.py @@ -2,7 +2,6 @@ from .common import simple_ok_check, simple_nok_check - # fmt: off @pytest.mark.parametrize('code', [ """ @@ -31,7 +30,7 @@ '''docstr''' """, """ -func foo(): +func async_foo(): await get_tree().create_timer(2.0).timeout """, """ diff --git a/tests/linter/test_name_checks.py b/tests/linter/test_name_checks.py index 404c7435..91393b4c 100644 --- a/tests/linter/test_name_checks.py +++ b/tests/linter/test_name_checks.py @@ -43,6 +43,35 @@ def test_function_name_ok(code): def test_function_name_nok(code): simple_nok_check(code, 'function-name') +@pytest.mark.parametrize('code', [ +""" +func async_some_button(): + await 0 +""", +""" +func _async_a_name(): + await 0 + +func test_simple_func(): + pass +""", +]) +def test_async_function_name_ok(code): + simple_ok_check(code) + +@pytest.mark.parametrize('code', [ +""" +func _some_button(): + await 0 +""", +""" +func asynca_name(): + await 0 +""", +]) +def test_function_name_nok(code): + simple_nok_check(code, 'async-function-name') + @pytest.mark.parametrize('code', [ """ diff --git a/tox.ini b/tox.ini index 00a14f18..e868b9d3 100644 --- a/tox.ini +++ b/tox.ini @@ -6,7 +6,7 @@ deps = pytest > 5 hypothesis == 6.15.0 commands = - pytest -m "not generated" {posargs} + pytest -s -m "not generated" {posargs} [testenv:lint] deps =