From c5a939b53052e820ea9d6d8ef292a80dc6c373ab Mon Sep 17 00:00:00 2001 From: Anderson Medeiros Date: Sun, 16 Mar 2025 19:43:30 -0300 Subject: [PATCH 1/3] fix debug statement hook to catch imports using a dundle method --- pre_commit_hooks/debug_statement_hook.py | 5 +++++ tests/debug_statement_hook_test.py | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/pre_commit_hooks/debug_statement_hook.py b/pre_commit_hooks/debug_statement_hook.py index 7e6be95e..43787c58 100644 --- a/pre_commit_hooks/debug_statement_hook.py +++ b/pre_commit_hooks/debug_statement_hook.py @@ -44,6 +44,11 @@ def visit_ImportFrom(self, node: ast.ImportFrom) -> None: self.breakpoints.append(st) def visit_Call(self, node: ast.Call) -> None: + if isinstance(node, ast.Call) and len(node.args): + if isinstance(node.args[0], ast.Constant) and node.args[0].value in DEBUG_STATEMENTS: + st = Debug(node.lineno, node.col_offset, node.args[0].value, 'imported') + self.breakpoints.append(st) + """python3.7+ breakpoint()""" if isinstance(node.func, ast.Name) and node.func.id == 'breakpoint': st = Debug(node.lineno, node.col_offset, node.func.id, 'called') diff --git a/tests/debug_statement_hook_test.py b/tests/debug_statement_hook_test.py index 5a8e0bb2..56a3a032 100644 --- a/tests/debug_statement_hook_test.py +++ b/tests/debug_statement_hook_test.py @@ -26,6 +26,12 @@ def test_finds_debug_import_from_import(): assert visitor.breakpoints == [Debug(1, 0, 'pudb', 'imported')] +def test_finds_debug_import_when_using_dunder_import(): + visitor = DebugStatementParser() + visitor.visit(ast.parse('__import__("pdb").set_trace()')) + assert visitor.breakpoints == [Debug(1, 0, 'pdb', 'imported')] + + def test_finds_breakpoint(): visitor = DebugStatementParser() visitor.visit(ast.parse('breakpoint()')) From 5ed90ea4af717391de2d806598e4943a1530427f Mon Sep 17 00:00:00 2001 From: Anderson Medeiros Date: Sun, 16 Mar 2025 19:48:10 -0300 Subject: [PATCH 2/3] parametrizing test to validate for all supported debugger modules --- tests/debug_statement_hook_test.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/tests/debug_statement_hook_test.py b/tests/debug_statement_hook_test.py index 56a3a032..e9fc4834 100644 --- a/tests/debug_statement_hook_test.py +++ b/tests/debug_statement_hook_test.py @@ -2,6 +2,8 @@ import ast +import pytest + from pre_commit_hooks.debug_statement_hook import Debug from pre_commit_hooks.debug_statement_hook import DebugStatementParser from pre_commit_hooks.debug_statement_hook import main @@ -26,10 +28,24 @@ def test_finds_debug_import_from_import(): assert visitor.breakpoints == [Debug(1, 0, 'pudb', 'imported')] -def test_finds_debug_import_when_using_dunder_import(): +@pytest.mark.parametrize( + 'debugger_module', ( + 'bpdb', + 'ipdb', + 'pdb', + 'pdbr', + 'pudb', + 'pydevd_pycharm', + 'q', + 'rdb', + 'rpdb', + 'wdb' + ) +) +def test_finds_debug_import_when_using_dunder_import(debugger_module): visitor = DebugStatementParser() - visitor.visit(ast.parse('__import__("pdb").set_trace()')) - assert visitor.breakpoints == [Debug(1, 0, 'pdb', 'imported')] + visitor.visit(ast.parse(f'__import__("{debugger_module}").set_trace()')) + assert visitor.breakpoints == [Debug(1, 0, debugger_module, 'imported')] def test_finds_breakpoint(): From db3b44e4ec880e143c5900c4d87108f4ed9445dd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 16 Mar 2025 22:51:24 +0000 Subject: [PATCH 3/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pre_commit_hooks/debug_statement_hook.py | 2 +- tests/debug_statement_hook_test.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pre_commit_hooks/debug_statement_hook.py b/pre_commit_hooks/debug_statement_hook.py index 43787c58..04b149bf 100644 --- a/pre_commit_hooks/debug_statement_hook.py +++ b/pre_commit_hooks/debug_statement_hook.py @@ -48,7 +48,7 @@ def visit_Call(self, node: ast.Call) -> None: if isinstance(node.args[0], ast.Constant) and node.args[0].value in DEBUG_STATEMENTS: st = Debug(node.lineno, node.col_offset, node.args[0].value, 'imported') self.breakpoints.append(st) - + """python3.7+ breakpoint()""" if isinstance(node.func, ast.Name) and node.func.id == 'breakpoint': st = Debug(node.lineno, node.col_offset, node.func.id, 'called') diff --git a/tests/debug_statement_hook_test.py b/tests/debug_statement_hook_test.py index e9fc4834..40924ab9 100644 --- a/tests/debug_statement_hook_test.py +++ b/tests/debug_statement_hook_test.py @@ -39,8 +39,8 @@ def test_finds_debug_import_from_import(): 'q', 'rdb', 'rpdb', - 'wdb' - ) + 'wdb', + ), ) def test_finds_debug_import_when_using_dunder_import(debugger_module): visitor = DebugStatementParser()