3 """List all those Python files that require a coding directive
5 Usage: nocoding.py dir1 [dir2...]
8 __author__
= "Oleg Broytmann, Georg Brandl"
10 import sys
, os
, re
, getopt
12 # our pysource module finds Python source files
16 # emulate the module with a simple os.walk
18 has_python_ext
= looks_like_python
= can_be_compiled
= None
19 def walk_python_files(self
, paths
, *args
, **kwargs
):
21 if os
.path
.isfile(path
):
22 yield path
.endswith(".py")
23 elif os
.path
.isdir(path
):
24 for root
, dirs
, files
in os
.walk(path
):
25 for filename
in files
:
26 if filename
.endswith(".py"):
27 yield os
.path
.join(root
, filename
)
31 print >>sys
.stderr
, ("The pysource module is not available; "
32 "no sophisticated Python source file search will be done.")
35 decl_re
= re
.compile(r
"coding[=:]\s*([-\w.]+)")
37 def get_declaration(line
):
38 match
= decl_re
.search(line
)
43 def has_correct_encoding(text
, codec
):
46 except UnicodeDecodeError:
51 def needs_declaration(fullpath
):
53 infile
= open(fullpath
, 'rU')
54 except IOError: # Oops, the file was removed - ignore it
57 line1
= infile
.readline()
58 line2
= infile
.readline()
60 if get_declaration(line1
) or get_declaration(line2
):
61 # the file does have an encoding declaration, so trust it
65 # check the whole file for non-ASCII characters
69 if has_correct_encoding(line1
+line2
+rest
, "ascii"):
75 usage
= """Usage: %s [-cd] paths...
76 -c: recognize Python source files trying to compile them
77 -d: debug output""" % sys
.argv
[0]
80 opts
, args
= getopt
.getopt(sys
.argv
[1:], 'cd')
81 except getopt
.error
, msg
:
82 print >>sys
.stderr
, msg
83 print >>sys
.stderr
, usage
86 is_python
= pysource
.looks_like_python
91 is_python
= pysource
.can_be_compiled
96 print >>sys
.stderr
, usage
99 for fullpath
in pysource
.walk_python_files(args
, is_python
):
101 print "Testing for coding: %s" % fullpath
102 result
= needs_declaration(fullpath
)