[Python-checkins] r83886 - in python/branches/py3k/Tools/scripts: byext.py patchcheck.py reindent.py rgrep.py suff.py svneol.py untabify.py

florent.xicluna python-checkins at python.org
Mon Aug 9 14:24:20 CEST 2010


Author: florent.xicluna
Date: Mon Aug  9 14:24:20 2010
New Revision: 83886

Log:
Clean up syntax for some scripts.


Modified:
   python/branches/py3k/Tools/scripts/byext.py
   python/branches/py3k/Tools/scripts/patchcheck.py
   python/branches/py3k/Tools/scripts/reindent.py
   python/branches/py3k/Tools/scripts/rgrep.py
   python/branches/py3k/Tools/scripts/suff.py
   python/branches/py3k/Tools/scripts/svneol.py
   python/branches/py3k/Tools/scripts/untabify.py

Modified: python/branches/py3k/Tools/scripts/byext.py
==============================================================================
--- python/branches/py3k/Tools/scripts/byext.py	(original)
+++ python/branches/py3k/Tools/scripts/byext.py	Mon Aug  9 14:24:20 2010
@@ -5,6 +5,7 @@
 import os
 import sys
 
+
 class Stats:
 
     def __init__(self):
@@ -28,12 +29,11 @@
             sys.stderr.write("Can't list %s: %s\n" % (dir, err))
             self.addstats("<dir>", "unlistable", 1)
             return
-        names.sort()
-        for name in names:
+        for name in sorted(names):
             if name.startswith(".#"):
-                continue # Skip CVS temp files
+                continue  # Skip CVS temp files
             if name.endswith("~"):
-                continue# Skip Emacs backup files
+                continue  # Skip Emacs backup files
             full = os.path.join(dir, name)
             if os.path.islink(full):
                 self.addstats("<lnk>", "links", 1)
@@ -46,26 +46,25 @@
         head, ext = os.path.splitext(filename)
         head, base = os.path.split(filename)
         if ext == base:
-            ext = "" # E.g. .cvsignore is deemed not to have an extension
+            ext = ""  # E.g. .cvsignore is deemed not to have an extension
         ext = os.path.normcase(ext)
         if not ext:
             ext = "<none>"
         self.addstats(ext, "files", 1)
         try:
-            f = open(filename, "rb")
+            with open(filename, "rb") as f:
+                data = f.read()
         except IOError as err:
             sys.stderr.write("Can't open %s: %s\n" % (filename, err))
             self.addstats(ext, "unopenable", 1)
             return
-        data = f.read()
-        f.close()
         self.addstats(ext, "bytes", len(data))
         if b'\0' in data:
             self.addstats(ext, "binary", 1)
             return
         if not data:
             self.addstats(ext, "empty", 1)
-        #self.addstats(ext, "chars", len(data))
+        # self.addstats(ext, "chars", len(data))
         lines = str(data, "latin-1").splitlines()
         self.addstats(ext, "lines", len(lines))
         del lines
@@ -105,17 +104,20 @@
         for ext in exts:
             self.stats[ext]["ext"] = ext
         cols.insert(0, "ext")
+
         def printheader():
             for col in cols:
                 print("%*s" % (colwidth[col], col), end=' ')
             print()
+
         printheader()
         for ext in exts:
             for col in cols:
                 value = self.stats[ext].get(col, "")
                 print("%*s" % (colwidth[col], value), end=' ')
             print()
-        printheader() # Another header at the bottom
+        printheader()  # Another header at the bottom
+
 
 def main():
     args = sys.argv[1:]
@@ -125,5 +127,6 @@
     s.statargs(args)
     s.report()
 
+
 if __name__ == "__main__":
     main()

Modified: python/branches/py3k/Tools/scripts/patchcheck.py
==============================================================================
--- python/branches/py3k/Tools/scripts/patchcheck.py	(original)
+++ python/branches/py3k/Tools/scripts/patchcheck.py	Mon Aug  9 14:24:20 2010
@@ -9,6 +9,7 @@
     """Return 'N file(s)' with the proper plurality on 'file'."""
     return "{} file{}".format(count, "s" if count != 1 else "")
 
+
 def status(message, modal=False, info=None):
     """Decorator to output status info to stdout."""
     def decorated_fxn(fxn):
@@ -21,32 +22,25 @@
             elif info:
                 print(info(result))
             else:
-                if result:
-                    print("yes")
-                else:
-                    print("NO")
+                print("yes" if result else "NO")
             return result
         return call_fxn
     return decorated_fxn
 
+
 @status("Getting the list of files that have been added/changed",
             info=lambda x: n_files_str(len(x)))
 def changed_files():
     """Run ``svn status`` and return a set of files that have been
-    changed/added."""
+    changed/added.
+    """
     cmd = 'svn status --quiet --non-interactive --ignore-externals'
     svn_st = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
     svn_st.wait()
-    output = [x.decode().rstrip() for x in svn_st.stdout.readlines()]
-    files = set()
-    for line in output:
-        if not line[0] in ('A', 'M'):
-            continue
-        line_parts = line.split()
-        path = line_parts[-1]
-        if os.path.isfile(path):
-            files.add(path)
-    return files
+    output = (x.decode().rstrip().rsplit(None, 1)[-1]
+              for x in svn_st.stdout if x[0] in b'AM')
+    return set(path for path in output if os.path.isfile(path))
+
 
 def report_modified_files(file_paths):
     count = len(file_paths)
@@ -58,6 +52,7 @@
             lines.append("  {}".format(path))
         return "\n".join(lines)
 
+
 @status("Fixing whitespace", info=report_modified_files)
 def normalize_whitespace(file_paths):
     """Make sure that the whitespace for .py files have been normalized."""
@@ -68,16 +63,19 @@
             fixed.append(path)
     return fixed
 
+
 @status("Docs modified", modal=True)
 def docs_modified(file_paths):
     """Report if any file in the Doc directory has been changed."""
     return bool(file_paths)
 
+
 @status("Misc/ACKS updated", modal=True)
 def credit_given(file_paths):
     """Check if Misc/ACKS has been changed."""
     return 'Misc/ACKS' in file_paths
 
+
 @status("Misc/NEWS updated", modal=True)
 def reported_news(file_paths):
     """Check if Misc/NEWS has been changed."""

Modified: python/branches/py3k/Tools/scripts/reindent.py
==============================================================================
--- python/branches/py3k/Tools/scripts/reindent.py	(original)
+++ python/branches/py3k/Tools/scripts/reindent.py	Mon Aug  9 14:24:20 2010
@@ -42,26 +42,27 @@
 __version__ = "1"
 
 import tokenize
-import os, shutil
+import os
+import shutil
 import sys
 
-verbose    = 0
-recurse    = 0
-dryrun     = 0
+verbose = False
+recurse = False
+dryrun = False
 makebackup = True
 
+
 def usage(msg=None):
-    if msg is not None:
-        print(msg, file=sys.stderr)
-    print(__doc__, file=sys.stderr)
+    if msg is None:
+        msg = __doc__
+    print(msg, file=sys.stderr)
+
 
 def errprint(*args):
-    sep = ""
-    for arg in args:
-        sys.stderr.write(sep + str(arg))
-        sep = " "
+    sys.stderr.write(" ".join(str(arg) for arg in args))
     sys.stderr.write("\n")
 
+
 def main():
     import getopt
     global verbose, recurse, dryrun, makebackup
@@ -73,13 +74,13 @@
         return
     for o, a in opts:
         if o in ('-d', '--dryrun'):
-            dryrun += 1
+            dryrun = True
         elif o in ('-r', '--recurse'):
-            recurse += 1
+            recurse = True
         elif o in ('-n', '--nobackup'):
             makebackup = False
         elif o in ('-v', '--verbose'):
-            verbose += 1
+            verbose = True
         elif o in ('-h', '--help'):
             usage()
             return
@@ -91,6 +92,7 @@
     for arg in args:
         check(arg)
 
+
 def check(file):
     if os.path.isdir(file) and not os.path.islink(file):
         if verbose:
@@ -108,13 +110,12 @@
     if verbose:
         print("checking", file, "...", end=' ')
     try:
-        f = open(file)
+        with open(file) as f:
+            r = Reindenter(f)
     except IOError as msg:
         errprint("%s: I/O Error: %s" % (file, str(msg)))
         return
 
-    r = Reindenter(f)
-    f.close()
     if r.run():
         if verbose:
             print("changed.")
@@ -126,9 +127,8 @@
                 shutil.copyfile(file, bak)
                 if verbose:
                     print("backed up", file, "to", bak)
-            f = open(file, "w")
-            r.write(f)
-            f.close()
+            with open(file, "w") as f:
+                r.write(f)
             if verbose:
                 print("wrote new", file)
         return True
@@ -137,6 +137,7 @@
             print("unchanged.")
         return False
 
+
 def _rstrip(line, JUNK='\n \t'):
     """Return line stripped of trailing spaces, tabs, newlines.
 
@@ -146,10 +147,11 @@
     """
 
     i = len(line)
-    while i > 0 and line[i-1] in JUNK:
+    while i > 0 and line[i - 1] in JUNK:
         i -= 1
     return line[:i]
 
+
 class Reindenter:
 
     def __init__(self, f):
@@ -192,9 +194,9 @@
         # we see a line with *something* on it.
         i = stats[0][0]
         after.extend(lines[1:i])
-        for i in range(len(stats)-1):
+        for i in range(len(stats) - 1):
             thisstmt, thislevel = stats[i]
-            nextstmt = stats[i+1][0]
+            nextstmt = stats[i + 1][0]
             have = getlspace(lines[thisstmt])
             want = thislevel * 4
             if want < 0:
@@ -206,7 +208,7 @@
                     want = have2want.get(have, -1)
                     if want < 0:
                         # Then it probably belongs to the next real stmt.
-                        for j in range(i+1, len(stats)-1):
+                        for j in range(i + 1, len(stats) - 1):
                             jline, jlevel = stats[j]
                             if jlevel >= 0:
                                 if have == getlspace(lines[jline]):
@@ -216,11 +218,11 @@
                                            # comment like this one,
                         # in which case we should shift it like its base
                         # line got shifted.
-                        for j in range(i-1, -1, -1):
+                        for j in range(i - 1, -1, -1):
                             jline, jlevel = stats[j]
                             if jlevel >= 0:
-                                want = have + getlspace(after[jline-1]) - \
-                                       getlspace(lines[jline])
+                                want = have + (getlspace(after[jline - 1]) -
+                                               getlspace(lines[jline]))
                                 break
                     if want < 0:
                         # Still no luck -- leave it alone.
@@ -295,6 +297,7 @@
             if line:   # not endmarker
                 self.stats.append((slinecol[0], self.level))
 
+
 # Count number of leading blanks.
 def getlspace(line):
     i, n = 0, len(line)
@@ -302,5 +305,6 @@
         i += 1
     return i
 
+
 if __name__ == '__main__':
     main()

Modified: python/branches/py3k/Tools/scripts/rgrep.py
==============================================================================
--- python/branches/py3k/Tools/scripts/rgrep.py	(original)
+++ python/branches/py3k/Tools/scripts/rgrep.py	Mon Aug  9 14:24:20 2010
@@ -9,8 +9,9 @@
 import re
 import getopt
 
+
 def main():
-    bufsize = 64*1024
+    bufsize = 64 * 1024
     reflags = 0
     opts, args = getopt.getopt(sys.argv[1:], "i")
     for o, a in opts:
@@ -24,11 +25,11 @@
     try:
         prog = re.compile(pattern, reflags)
     except re.error as msg:
-        usage("error in regular expression: %s" % str(msg))
+        usage("error in regular expression: %s" % msg)
     try:
         f = open(filename)
     except IOError as msg:
-        usage("can't open %s: %s" % (repr(filename), str(msg)), 1)
+        usage("can't open %r: %s" % (filename, msg), 1)
     f.seek(0, 2)
     pos = f.tell()
     leftover = None
@@ -49,16 +50,17 @@
             del lines[0]
         else:
             leftover = None
-        lines.reverse()
-        for line in lines:
+        for line in reversed(lines):
             if prog.search(line):
                 print(line)
 
+
 def usage(msg, code=2):
     sys.stdout = sys.stderr
     print(msg)
     print(__doc__)
     sys.exit(code)
 
+
 if __name__ == '__main__':
     main()

Modified: python/branches/py3k/Tools/scripts/suff.py
==============================================================================
--- python/branches/py3k/Tools/scripts/suff.py	(original)
+++ python/branches/py3k/Tools/scripts/suff.py	Mon Aug  9 14:24:20 2010
@@ -6,24 +6,21 @@
 
 import sys
 
+
 def main():
     files = sys.argv[1:]
     suffixes = {}
     for filename in files:
         suff = getsuffix(filename)
-        if suff not in suffixes:
-            suffixes[suff] = []
-        suffixes[suff].append(filename)
-    keys = sorted(suffixes.keys())
-    for suff in keys:
-        print(repr(suff), len(suffixes[suff]))
+        suffixes.setdefault(suff, []).append(filename)
+    for suff, filenames in sorted(suffixes.items()):
+        print(repr(suff), len(filenames))
+
 
 def getsuffix(filename):
-    suff = ''
-    for i in range(len(filename)):
-        if filename[i] == '.':
-            suff = filename[i:]
-    return suff
+    name, sep, suff = filename.rpartition('.')
+    return sep + suff if sep else ''
+
 
 if __name__ == '__main__':
     main()

Modified: python/branches/py3k/Tools/scripts/svneol.py
==============================================================================
--- python/branches/py3k/Tools/scripts/svneol.py	(original)
+++ python/branches/py3k/Tools/scripts/svneol.py	Mon Aug  9 14:24:20 2010
@@ -32,9 +32,12 @@
 
 import re
 import os
+import sys
+import subprocess
+
 
 def propfiles(root, fn):
-    default = os.path.join(root, ".svn", "props", fn+".svn-work")
+    default = os.path.join(root, ".svn", "props", fn + ".svn-work")
     try:
         format = int(open(os.path.join(root, ".svn", "format")).read().strip())
     except IOError:
@@ -42,12 +45,13 @@
     if format in (8, 9):
         # In version 8 and 9, committed props are stored in prop-base, local
         # modifications in props
-        return [os.path.join(root, ".svn", "prop-base", fn+".svn-base"),
-                os.path.join(root, ".svn", "props", fn+".svn-work")]
-    raise ValueError, "Unknown repository format"
+        return [os.path.join(root, ".svn", "prop-base", fn + ".svn-base"),
+                os.path.join(root, ".svn", "props", fn + ".svn-work")]
+    raise ValueError("Unknown repository format")
+
 
 def proplist(root, fn):
-    "Return a list of property names for file fn in directory root"
+    """Return a list of property names for file fn in directory root."""
     result = []
     for path in propfiles(root, fn):
         try:
@@ -56,7 +60,7 @@
             # no properties file: not under version control,
             # or no properties set
             continue
-        while 1:
+        while True:
             # key-value pairs, of the form
             # K <length>
             # <keyname>NL
@@ -79,13 +83,32 @@
         f.close()
     return result
 
+
+def set_eol_native(path):
+    cmd = 'svn propset svn:eol-style native "{}"'.format(path)
+    propset = subprocess.Popen(cmd, shell=True)
+    propset.wait()
+
+
 possible_text_file = re.compile(r"\.([hc]|py|txt|sln|vcproj)$").search
 
-for root, dirs, files in os.walk('.'):
-    if '.svn' in dirs:
-        dirs.remove('.svn')
-    for fn in files:
-        if possible_text_file(fn):
+
+def main():
+    for arg in sys.argv[1:] or [os.curdir]:
+        if os.path.isfile(arg):
+            root, fn = os.path.split(arg)
             if 'svn:eol-style' not in proplist(root, fn):
-                path = os.path.join(root, fn)
-                os.system('svn propset svn:eol-style native "%s"' % path)
+                set_eol_native(arg)
+        elif os.path.isdir(arg):
+            for root, dirs, files in os.walk(arg):
+                if '.svn' in dirs:
+                    dirs.remove('.svn')
+                for fn in files:
+                    if possible_text_file(fn):
+                        if 'svn:eol-style' not in proplist(root, fn):
+                            path = os.path.join(root, fn)
+                            set_eol_native(path)
+
+
+if __name__ == '__main__':
+    main()

Modified: python/branches/py3k/Tools/scripts/untabify.py
==============================================================================
--- python/branches/py3k/Tools/scripts/untabify.py	(original)
+++ python/branches/py3k/Tools/scripts/untabify.py	Mon Aug  9 14:24:20 2010
@@ -6,6 +6,7 @@
 import sys
 import getopt
 
+
 def main():
     tabsize = 8
     try:
@@ -23,11 +24,11 @@
     for filename in args:
         process(filename, tabsize)
 
+
 def process(filename, tabsize):
     try:
-        f = open(filename)
-        text = f.read()
-        f.close()
+        with open(filename) as f:
+            text = f.read()
     except IOError as msg:
         print("%r: I/O error: %s" % (filename, msg))
         return
@@ -43,10 +44,10 @@
         os.rename(filename, backup)
     except os.error:
         pass
-    f = open(filename, "w")
-    f.write(newtext)
-    f.close()
+    with open(filename, "w") as f:
+        f.write(newtext)
     print(filename)
 
+
 if __name__ == '__main__':
     main()


More information about the Python-checkins mailing list