88
99
1010DEBUG_STATEMENTS = {'pdb' , 'ipdb' , 'pudb' , 'q' , 'rdb' }
11+ Debug = collections .namedtuple ('Debug' , ('line' , 'col' , 'name' , 'reason' ))
1112
1213
13- DebugStatement = collections .namedtuple (
14- 'DebugStatement' , ['name' , 'line' , 'col' ],
15- )
16-
17-
18- class ImportStatementParser (ast .NodeVisitor ):
14+ class DebugStatementParser (ast .NodeVisitor ):
1915 def __init__ (self ):
20- self .debug_import_statements = []
16+ self .breakpoints = []
2117
2218 def visit_Import (self , node ):
23- for node_name in node .names :
24- if node_name .name in DEBUG_STATEMENTS :
25- self .debug_import_statements .append (
26- DebugStatement (node_name .name , node .lineno , node .col_offset ),
27- )
19+ for name in node .names :
20+ if name .name in DEBUG_STATEMENTS :
21+ st = Debug (node .lineno , node .col_offset , name .name , 'imported' )
22+ self .breakpoints .append (st )
2823
2924 def visit_ImportFrom (self , node ):
3025 if node .module in DEBUG_STATEMENTS :
31- self .debug_import_statements .append (
32- DebugStatement (node .module , node .lineno , node .col_offset ),
33- )
26+ st = Debug (node .lineno , node .col_offset , node .module , 'imported' )
27+ self .breakpoints .append (st )
3428
29+ def visit_Call (self , node ):
30+ """python3.7+ breakpoint()"""
31+ if isinstance (node .func , ast .Name ) and node .func .id == 'breakpoint' :
32+ st = Debug (node .lineno , node .col_offset , node .func .id , 'called' )
33+ self .breakpoints .append (st )
34+ self .generic_visit (node )
3535
36- def check_file_for_debug_statements (filename ):
36+
37+ def check_file (filename ):
3738 try :
3839 ast_obj = ast .parse (open (filename , 'rb' ).read (), filename = filename )
3940 except SyntaxError :
@@ -42,34 +43,30 @@ def check_file_for_debug_statements(filename):
4243 print ('\t ' + traceback .format_exc ().replace ('\n ' , '\n \t ' ))
4344 print ()
4445 return 1
45- visitor = ImportStatementParser ()
46+
47+ visitor = DebugStatementParser ()
4648 visitor .visit (ast_obj )
47- if visitor .debug_import_statements :
48- for debug_statement in visitor .debug_import_statements :
49- print (
50- '{}:{}:{} - {} imported' .format (
51- filename ,
52- debug_statement .line ,
53- debug_statement .col ,
54- debug_statement .name ,
55- ),
56- )
57- return 1
58- else :
59- return 0
6049
50+ for bp in visitor .breakpoints :
51+ print (
52+ '{}:{}:{} - {} {}' .format (
53+ filename , bp .line , bp .col , bp .name , bp .reason ,
54+ ),
55+ )
56+
57+ return int (bool (visitor .breakpoints ))
6158
62- def debug_statement_hook (argv = None ):
59+
60+ def main (argv = None ):
6361 parser = argparse .ArgumentParser ()
6462 parser .add_argument ('filenames' , nargs = '*' , help = 'Filenames to run' )
6563 args = parser .parse_args (argv )
6664
6765 retv = 0
6866 for filename in args .filenames :
69- retv |= check_file_for_debug_statements (filename )
70-
67+ retv |= check_file (filename )
7168 return retv
7269
7370
7471if __name__ == '__main__' :
75- exit (debug_statement_hook ())
72+ exit (main ())
0 commit comments