From dc343f591483272929fae6339a914ddf0ac91042 Mon Sep 17 00:00:00 2001 From: rmorshea Date: Sat, 26 Sep 2020 17:43:31 -0700 Subject: [PATCH 1/2] minor fixes add in error code to messages and rename error code base to ROH (rules of hooks) instead of vague IDML (no idea what that meant). fix tests following these changes too --- flake8_idom_hooks.py | 19 +++++++++++-------- requirements.txt | 1 + requirements/lint.txt | 1 - requirements/prod.txt | 1 + setup.cfg | 1 - setup.py | 2 +- tests/hook_usage_cases.py | 26 +++++++++++++------------- 7 files changed, 27 insertions(+), 24 deletions(-) diff --git a/flake8_idom_hooks.py b/flake8_idom_hooks.py index 0a31be0..f5ede9b 100644 --- a/flake8_idom_hooks.py +++ b/flake8_idom_hooks.py @@ -4,7 +4,7 @@ get_distribution as _get_distribution, DistributionNotFound as _DistributionNotFound, ) -from typing import List, Tuple, Iterator, Union, Optional +from typing import List, Tuple, Iterator, Union, Optional, Type try: @@ -23,7 +23,7 @@ class Plugin: def __init__(self, tree: ast.Module): self._tree = tree - def run(self): + def run(self) -> List[Tuple[int, int, str, Type["Plugin"]]]: visitor = HookRulesVisitor() visitor.visit(self._tree) cls = type(self) @@ -66,8 +66,8 @@ def _visit_loop(self, node: ast.AST) -> None: def _check_if_hook_defined_in_function(self, node: ast.FunctionDef) -> None: if self._current_function is not None and _is_hook_or_element_def(node): - msg = f"Hook {node.name!r} defined inside another function." - self.errors.append((node.lineno, node.col_offset, msg)) + msg = f"hook {node.name!r} defined as closure in function {self._current_function.name!r}" + self._save_error(100, node, msg) def _check_if_propper_hook_usage(self, node: Union[ast.Name, ast.Attribute]): if isinstance(node, ast.Name): @@ -79,8 +79,8 @@ def _check_if_propper_hook_usage(self, node: Union[ast.Name, ast.Attribute]): return if not _is_hook_or_element_def(self._current_function): - msg = f"Hook {name!r} used outside element or hook definition." - self.errors.append((node.lineno, node.col_offset, msg)) + msg = f"hook {name!r} used outside element or hook definition" + self._save_error(101, node, msg) return _loop_or_conditional = self._current_conditional or self._current_loop @@ -94,10 +94,13 @@ def _check_if_propper_hook_usage(self, node: Union[ast.Name, ast.Attribute]): ast.While: "while loop", } node_name = node_type_to_name[node_type] - msg = f"Hook {name!r} used inside {node_name}." - self.errors.append((node.lineno, node.col_offset, msg)) + msg = f"hook {name!r} used inside {node_name}" + self._save_error(102, node, msg) return + def _save_error(self, error_code: int, node: ast.AST, message: str): + self.errors.append((node.lineno, node.col_offset, f"ROH{error_code} {message}")) + @contextmanager def _set_current(self, **attrs) -> Iterator[None]: old_attrs = {k: getattr(self, f"_current_{k}") for k in attrs} diff --git a/requirements.txt b/requirements.txt index b0b19a5..eaed72c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ -r requirements/dev.txt -r requirements/prod.txt -r requirements/test.txt +-r requirements/lint.txt diff --git a/requirements/lint.txt b/requirements/lint.txt index 28a28f7..7e66a17 100644 --- a/requirements/lint.txt +++ b/requirements/lint.txt @@ -1,2 +1 @@ -flake8 black diff --git a/requirements/prod.txt b/requirements/prod.txt index e69de29..e4499d5 100644 --- a/requirements/prod.txt +++ b/requirements/prod.txt @@ -0,0 +1 @@ +flake8 >=3.7 diff --git a/setup.cfg b/setup.cfg index 49335cc..46a93fd 100644 --- a/setup.cfg +++ b/setup.cfg @@ -2,7 +2,6 @@ ignore = E203, E266, E501, W503, F811, N802 max-line-length = 88 max-complexity = 18 -select = B,C,E,F,W,T4,B9,N exclude = .eggs/* .tox/* diff --git a/setup.py b/setup.py index 0e061e9..be90285 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ package = { "name": name, "py_modules": ["flake8_idom_hooks"], - "entry_points": {"flake8.extension": ["IDML = flake8_idom_hooks:Plugin"]}, + "entry_points": {"flake8.extension": ["ROH=flake8_idom_hooks:Plugin"]}, "python_requires": ">=3.6", "description": "Flake8 plugin to enforce the rules of hooks for IDOM", "author": "Ryan Morshead", diff --git a/tests/hook_usage_cases.py b/tests/hook_usage_cases.py index f17943d..0645c43 100644 --- a/tests/hook_usage_cases.py +++ b/tests/hook_usage_cases.py @@ -1,6 +1,6 @@ def HookInIf(): if True: - # error: Hook 'use_state' used inside if statement. + # error: ROH102 hook 'use_state' used inside if statement use_state @@ -8,7 +8,7 @@ def HookInElif(): if False: pass elif True: - # error: Hook 'use_state' used inside if statement. + # error: ROH102 hook 'use_state' used inside if statement use_state @@ -16,13 +16,13 @@ def HookInElse(): if False: pass else: - # error: Hook 'use_state' used inside if statement. + # error: ROH102 hook 'use_state' used inside if statement use_state def HookInIfExp(): ( - # error: Hook 'use_state' used inside inline if expression. + # error: ROH102 hook 'use_state' used inside inline if expression use_state if True else None @@ -34,14 +34,14 @@ def HookInElseOfIfExp(): None if True else - # error: Hook 'use_state' used inside inline if expression. + # error: ROH102 hook 'use_state' used inside inline if expression use_state ) def HookInTry(): try: - # error: Hook 'use_state' used inside try statement. + # error: ROH102 hook 'use_state' used inside try statement use_state except: pass @@ -51,7 +51,7 @@ def HookInExcept(): try: raise ValueError() except: - # error: Hook 'use_state' used inside try statement. + # error: ROH102 hook 'use_state' used inside try statement use_state @@ -59,30 +59,30 @@ def HookInFinally(): try: pass finally: - # error: Hook 'use_state' used inside try statement. + # error: ROH102 hook 'use_state' used inside try statement use_state def HookInForLoop(): for i in range(3): - # error: Hook 'use_state' used inside for loop. + # error: ROH102 hook 'use_state' used inside for loop use_state def HookInWhileLoop(): while True: - # error: Hook 'use_state' used inside while loop. + # error: ROH102 hook 'use_state' used inside while loop use_state def outer_function(): - # error: Hook 'use_state' defined inside another function. + # error: ROH100 hook 'use_state' defined as closure in function 'outer_function' def use_state(): ... def generic_function(): - # error: Hook 'use_state' used outside element or hook definition. + # error: ROH101 hook 'use_state' used outside element or hook definition use_state @@ -97,5 +97,5 @@ def Element(): # ok since 'use_state' is not the last attribute module.use_state.other -# error: Hook 'use_state' used outside element or hook definition. +# error: ROH101 hook 'use_state' used outside element or hook definition module.use_state From 2b47a8af5066b6c7cdd8db2c0806c45f0f2b90fb Mon Sep 17 00:00:00 2001 From: rmorshea Date: Sat, 26 Sep 2020 17:47:38 -0700 Subject: [PATCH 2/2] fix CI --- requirements/lint.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements/lint.txt b/requirements/lint.txt index 7e66a17..3edba2e 100644 --- a/requirements/lint.txt +++ b/requirements/lint.txt @@ -1 +1,2 @@ +flake8 >=3.7 black