Skip to content
This repository was archived by the owner on Jan 15, 2025. It is now read-only.

Commit 0e3a949

Browse files
committed
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
1 parent c66a23c commit 0e3a949

File tree

7 files changed

+27
-24
lines changed

7 files changed

+27
-24
lines changed

flake8_idom_hooks.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
get_distribution as _get_distribution,
55
DistributionNotFound as _DistributionNotFound,
66
)
7-
from typing import List, Tuple, Iterator, Union, Optional
7+
from typing import List, Tuple, Iterator, Union, Optional, Type
88

99

1010
try:
@@ -23,7 +23,7 @@ class Plugin:
2323
def __init__(self, tree: ast.Module):
2424
self._tree = tree
2525

26-
def run(self):
26+
def run(self) -> List[Tuple[int, int, str, Type["Plugin"]]]:
2727
visitor = HookRulesVisitor()
2828
visitor.visit(self._tree)
2929
cls = type(self)
@@ -66,8 +66,8 @@ def _visit_loop(self, node: ast.AST) -> None:
6666

6767
def _check_if_hook_defined_in_function(self, node: ast.FunctionDef) -> None:
6868
if self._current_function is not None and _is_hook_or_element_def(node):
69-
msg = f"Hook {node.name!r} defined inside another function."
70-
self.errors.append((node.lineno, node.col_offset, msg))
69+
msg = f"hook {node.name!r} defined as closure in function {self._current_function.name!r}"
70+
self._save_error(100, node, msg)
7171

7272
def _check_if_propper_hook_usage(self, node: Union[ast.Name, ast.Attribute]):
7373
if isinstance(node, ast.Name):
@@ -79,8 +79,8 @@ def _check_if_propper_hook_usage(self, node: Union[ast.Name, ast.Attribute]):
7979
return
8080

8181
if not _is_hook_or_element_def(self._current_function):
82-
msg = f"Hook {name!r} used outside element or hook definition."
83-
self.errors.append((node.lineno, node.col_offset, msg))
82+
msg = f"hook {name!r} used outside element or hook definition"
83+
self._save_error(101, node, msg)
8484
return
8585

8686
_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]):
9494
ast.While: "while loop",
9595
}
9696
node_name = node_type_to_name[node_type]
97-
msg = f"Hook {name!r} used inside {node_name}."
98-
self.errors.append((node.lineno, node.col_offset, msg))
97+
msg = f"hook {name!r} used inside {node_name}"
98+
self._save_error(102, node, msg)
9999
return
100100

101+
def _save_error(self, error_code: int, node: ast.AST, message: str):
102+
self.errors.append((node.lineno, node.col_offset, f"ROH{error_code} {message}"))
103+
101104
@contextmanager
102105
def _set_current(self, **attrs) -> Iterator[None]:
103106
old_attrs = {k: getattr(self, f"_current_{k}") for k in attrs}

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
-r requirements/dev.txt
22
-r requirements/prod.txt
33
-r requirements/test.txt
4+
-r requirements/lint.txt

requirements/lint.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
flake8
21
black

requirements/prod.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
flake8 >=3.7

setup.cfg

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
ignore = E203, E266, E501, W503, F811, N802
33
max-line-length = 88
44
max-complexity = 18
5-
select = B,C,E,F,W,T4,B9,N
65
exclude =
76
.eggs/*
87
.tox/*

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package = {
1818
"name": name,
1919
"py_modules": ["flake8_idom_hooks"],
20-
"entry_points": {"flake8.extension": ["IDML = flake8_idom_hooks:Plugin"]},
20+
"entry_points": {"flake8.extension": ["ROH=flake8_idom_hooks:Plugin"]},
2121
"python_requires": ">=3.6",
2222
"description": "Flake8 plugin to enforce the rules of hooks for IDOM",
2323
"author": "Ryan Morshead",

tests/hook_usage_cases.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
def HookInIf():
22
if True:
3-
# error: Hook 'use_state' used inside if statement.
3+
# error: ROH102 hook 'use_state' used inside if statement
44
use_state
55

66

77
def HookInElif():
88
if False:
99
pass
1010
elif True:
11-
# error: Hook 'use_state' used inside if statement.
11+
# error: ROH102 hook 'use_state' used inside if statement
1212
use_state
1313

1414

1515
def HookInElse():
1616
if False:
1717
pass
1818
else:
19-
# error: Hook 'use_state' used inside if statement.
19+
# error: ROH102 hook 'use_state' used inside if statement
2020
use_state
2121

2222

2323
def HookInIfExp():
2424
(
25-
# error: Hook 'use_state' used inside inline if expression.
25+
# error: ROH102 hook 'use_state' used inside inline if expression
2626
use_state
2727
if True
2828
else None
@@ -34,14 +34,14 @@ def HookInElseOfIfExp():
3434
None
3535
if True
3636
else
37-
# error: Hook 'use_state' used inside inline if expression.
37+
# error: ROH102 hook 'use_state' used inside inline if expression
3838
use_state
3939
)
4040

4141

4242
def HookInTry():
4343
try:
44-
# error: Hook 'use_state' used inside try statement.
44+
# error: ROH102 hook 'use_state' used inside try statement
4545
use_state
4646
except:
4747
pass
@@ -51,38 +51,38 @@ def HookInExcept():
5151
try:
5252
raise ValueError()
5353
except:
54-
# error: Hook 'use_state' used inside try statement.
54+
# error: ROH102 hook 'use_state' used inside try statement
5555
use_state
5656

5757

5858
def HookInFinally():
5959
try:
6060
pass
6161
finally:
62-
# error: Hook 'use_state' used inside try statement.
62+
# error: ROH102 hook 'use_state' used inside try statement
6363
use_state
6464

6565

6666
def HookInForLoop():
6767
for i in range(3):
68-
# error: Hook 'use_state' used inside for loop.
68+
# error: ROH102 hook 'use_state' used inside for loop
6969
use_state
7070

7171

7272
def HookInWhileLoop():
7373
while True:
74-
# error: Hook 'use_state' used inside while loop.
74+
# error: ROH102 hook 'use_state' used inside while loop
7575
use_state
7676

7777

7878
def outer_function():
79-
# error: Hook 'use_state' defined inside another function.
79+
# error: ROH100 hook 'use_state' defined as closure in function 'outer_function'
8080
def use_state():
8181
...
8282

8383

8484
def generic_function():
85-
# error: Hook 'use_state' used outside element or hook definition.
85+
# error: ROH101 hook 'use_state' used outside element or hook definition
8686
use_state
8787

8888

@@ -97,5 +97,5 @@ def Element():
9797
# ok since 'use_state' is not the last attribute
9898
module.use_state.other
9999

100-
# error: Hook 'use_state' used outside element or hook definition.
100+
# error: ROH101 hook 'use_state' used outside element or hook definition
101101
module.use_state

0 commit comments

Comments
 (0)