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

only check hook usage inside calls #18

Merged
merged 1 commit into from
Sep 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion flake8_idom_hooks/rules_of_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,13 @@ def visit_FunctionDef(self, node: ast.FunctionDef) -> None:
with set_current(self, function=node):
self.generic_visit(node)

def visit_Call(self, node: ast.Call) -> None:
with set_current(self, call=node):
self.generic_visit(node)

def _visit_hook_usage(self, node: ast.Name | ast.Attribute) -> None:
self._check_if_propper_hook_usage(node)
if self._current_call:
self._check_if_propper_hook_usage(node)

visit_Attribute = _visit_hook_usage
visit_Name = _visit_hook_usage
Expand Down
4 changes: 2 additions & 2 deletions tests/cases/custom_component_decorator_pattern.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
def check_normal_pattern():
if True:
# error: ROH102 hook 'use_state' used inside if statement
use_state
use_state()


@custom_component
def check_custom_pattern():
if True:
# error: ROH102 hook 'use_state' used inside if statement
use_state
use_state()
4 changes: 2 additions & 2 deletions tests/cases/custom_hook_function_pattern.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
def check():
if True:
# this get's ignored because of custom pattern
use_ignore_this
use_ignore_this()
# error: ROH102 hook 'use_state' used inside if statement
use_state
use_state()
59 changes: 40 additions & 19 deletions tests/cases/hook_usage.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,29 @@
from idom import component


@component
def HookInIfNoCall():
if True:
# Ok, hook was not called
use_state


@component
def HookInIf():
if True:
# error: ROH102 hook 'use_state' used inside if statement
use_state
use_state()


@component
def HookInIfInExpression():
if True:
(
None
or
# error: ROH102 hook 'use_state' used inside if statement
use_state
)()


@component
Expand All @@ -15,7 +33,7 @@ def HookInElif():
pass
elif True:
# error: ROH102 hook 'use_state' used inside if statement
use_state
use_state()


@component
Expand All @@ -24,14 +42,14 @@ def HookInElse():
pass
else:
# error: ROH102 hook 'use_state' used inside if statement
use_state
use_state()


@component
def HookInIfExp():
(
# error: ROH102 hook 'use_state' used inside inline if expression
use_state
use_state()
if True
else None
)
Expand All @@ -44,15 +62,15 @@ def HookInElseOfIfExp():
if True
else
# error: ROH102 hook 'use_state' used inside inline if expression
use_state
use_state()
)


@component
def HookInTry():
try:
# error: ROH102 hook 'use_state' used inside try statement
use_state
use_state()
except:
pass

Expand All @@ -63,7 +81,7 @@ def HookInExcept():
raise ValueError()
except:
# error: ROH102 hook 'use_state' used inside try statement
use_state
use_state()


@component
Expand All @@ -72,21 +90,21 @@ def HookInFinally():
pass
finally:
# error: ROH102 hook 'use_state' used inside try statement
use_state
use_state()


@component
def HookInForLoop():
for i in range(3):
# error: ROH102 hook 'use_state' used inside for loop
use_state
use_state()


@component
def HookInWhileLoop():
while True:
# error: ROH102 hook 'use_state' used inside while loop
use_state
use_state()


def outer_function():
Expand All @@ -97,47 +115,50 @@ def use_state():

def generic_function():
# error: ROH101 hook 'use_state' used outside component or hook definition
use_state
use_state()


@component
def use_state():
use_other
use_other()


@component
def Component():
use_state
use_state()


@idom.component
def IdomLongImportComponent():
use_state
use_state()


@component
def use_custom_hook():
use_state
use_state()


# ok since 'use_state' is not the last attribute
module.use_state.other

# ok since use state is not called
module.use_effect

# error: ROH101 hook 'use_effect' used outside component or hook definition
module.use_effect()


def not_hook_or_component():
# error: ROH101 hook 'use_state' used outside component or hook definition
use_state
use_state()


@component
def make_component():
# nested component definitions are ok.
@component
def NestedComponent():
use_state
use_state()


some_global_variable
Expand All @@ -154,11 +175,11 @@ def Component():
@component
def Component():
# this is ok since the conditional is outside the component
use_state
use_state()

@component
def use_other():
use_state
use_state()


@component
Expand Down
2 changes: 1 addition & 1 deletion tests/cases/no_exhaustive_deps.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# confirm that we're still checking for other errors
def generic_function():
# error: ROH101 hook 'use_state' used outside component or hook definition
use_state
use_state()


@component
Expand Down