#! /usr/bin/env python # This file contains a class and a main program that perform three # related (though complimentary) formatting operations on Python # programs. When called as "pindent -c", it takes a valid Python # program as input and outputs a version augmented with block-closing # comments. When called as "pindent -d", it assumes its input is a # Python program with block-closing comments and outputs a commentless # version. When called as "pindent -r" it assumes its input is a # Python program with block-closing comments but with its indentation # messed up, and outputs a properly indented version. # A "block-closing comment" is a comment of the form '# end <keyword>' # where <keyword> is the keyword that opened the block. If the # opening keyword is 'def' or 'class', the function or class name may # be repeated in the block-closing comment as well. Here is an # example of a program fully augmented with block-closing comments: # def foobar(a, b): # if a == b: # a = a+1 # elif a < b: # b = b-1 # if b > a: a = a-1 # # end if # else: # print 'oops!' # # end if # # end def foobar # Note that only the last part of an if...elif...else... block needs a # block-closing comment; the same is true for other compound # statements (e.g. try...except). Also note that "short-form" blocks # like the second 'if' in the example must be closed as well; # otherwise the 'else' in the example would be ambiguous (remember # that indentation is not significant when interpreting block-closing # comments). # The operations are idempotent (i.e. applied to their own output # they yield an identical result). Running first "pindent -c" and # then "pindent -r" on a valid Python program produces a program that # is semantically identical to the input (though its indentation may # be different). Running "pindent -e" on that output produces a # program that only differs from the original in indentation. # Other options: # -s stepsize: set the indentation step size (default 8) # -t tabsize : set the number of spaces a tab character is worth (default 8) # -e : expand TABs into spaces # file ... : input file(s) (default standard input) # The results always go to standard output # Caveats: # - comments ending in a backslash will be mistaken for continued lines # - continuations using backslash are always left unchanged # - continuations inside parentheses are not extra indented by -r # but must be indented for -c to work correctly (this breaks # idempotency!) # - continued lines inside triple-quoted strings are totally garbled # Secret feature: # - On input, a block may also be closed with an "end statement" -- # this is a block-closing comment without the '#' sign. # Possible improvements: # - check syntax based on transitions in 'next' table # - better error reporting # - better error recovery # - check identifier after class/def # The following wishes need a more complete tokenization of the source: # - Don't get fooled by comments ending in backslash # - reindent continuation lines indicated by backslash # - handle continuation lines inside parentheses/braces/brackets # - handle triple quoted strings spanning lines # - realign comments # - optionally do much more thorough reformatting, a la C indent from __future__ import print_function # Defaults STEPSIZE = 8 TABSIZE = 8 EXPANDTABS = False import io import re import sys next = {} next['if'] = next['elif'] = 'elif', 'else', 'end' next['while'] = next['for'] = 'else', 'end' next['try'] = 'except', 'finally' next['except'] = 'except', 'else', 'finally', 'end' next['else'] = next['finally'] = next['with'] = \ next['def'] = next['class'] = 'end' next['end'] = () start = 'if', 'while', 'for', 'try', 'with', 'def', 'class' class PythonIndenter: def __init__(self, fpi = sys.stdin, fpo = sys.stdout, indentsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS): self.fpi = fpi self.fpo = fpo self.indentsize = indentsize self.tabsize = tabsize self.lineno = 0 self.expandtabs = expandtabs self._write = fpo.write self.kwprog = re.compile( r'^(?:\s|\\\n)*(?P<kw>[a-z]+)' r'((?:\s|\\\n)+(?P<id>[a-zA-Z_]\w*))?' r'[^\w]') self.endprog = re.compile( r'^(?:\s|\\\n)*#?\s*end\s+(?P<kw>[a-z]+)' r'(\s+(?P<id>[a-zA-Z_]\w*))?' r'[^\w]') self.wsprog = re.compile(r'^[ \t]*') # end def __init__ def write(self, line): if self.expandtabs: self._write(line.expandtabs(self.tabsize)) else: self._write(line) # end if # end def write def readline(self): line = self.fpi.readline() if line: self.lineno += 1 # end if return line # end def readline def error(self, fmt, *args): if args: fmt = fmt % args # end if sys.stderr.write('Error at line %d: %s\n' % (self.lineno, fmt)) self.write('### %s ###\n' % fmt) # end def error def getline(self): line = self.readline() while line[-2:] == '\\\n': line2 = self.readline() if not line2: break # end if line += line2 # end while return line # end def getline def putline(self, line, indent): tabs, spaces = divmod(indent*self.indentsize, self.tabsize) i = self.wsprog.match(line).end() line = line[i:] if line[:1] not in ('\n', '\r', ''): line = '\t'*tabs + ' '*spaces + line # end if self.write(line) # end def putline def reformat(self): stack = [] while True: line = self.getline() if not line: break # EOF # end if m = self.endprog.match(line) if m: kw = 'end' kw2 = m.group('kw') if not stack: self.error('unexpected end') elif stack.pop()[0] != kw2: self.error('unmatched end') # end if self.putline(line, len(stack)) continue # end if m = self.kwprog.match(line) if m: kw = m.group('kw') if kw in start: self.putline(line, len(stack)) stack.append((kw, kw)) continue # end if if next.has_key(kw) and stack: self.putline(line, len(stack)-1) kwa, kwb = stack[-1] stack[-1] = kwa, kw continue # end if # end if self.putline(line, len(stack)) # end while if stack: self.error('unterminated keywords') for kwa, kwb in stack: self.write('\t%s\n' % kwa) # end for # end if # end def reformat def delete(self): begin_counter = 0 end_counter = 0 while True: line = self.getline() if not line: break # EOF # end if m = self.endprog.match(line) if m: end_counter += 1 continue # end if m = self.kwprog.match(line) if m: kw = m.group('kw') if kw in start: begin_counter += 1 # end if # end if self.write(line) # end while if begin_counter - end_counter < 0: sys.stderr.write('Warning: input contained more end tags than expected\n') elif begin_counter - end_counter > 0: sys.stderr.write('Warning: input contained less end tags than expected\n') # end if # end def delete def complete(self): stack = [] todo = [] currentws = thisid = firstkw = lastkw = topid = '' while True: line = self.getline() i = self.wsprog.match(line).end() m = self.endprog.match(line) if m: thiskw = 'end' endkw = m.group('kw') thisid = m.group('id') else: m = self.kwprog.match(line) if m: thiskw = m.group('kw') if not next.has_key(thiskw): thiskw = '' # end if if thiskw in ('def', 'class'): thisid = m.group('id') else: thisid = '' # end if elif line[i:i+1] in ('\n', '#'): todo.append(line) continue else: thiskw = '' # end if # end if indentws = line[:i] indent = len(indentws.expandtabs(self.tabsize)) current = len(currentws.expandtabs(self.tabsize)) while indent < current: if firstkw: if topid: s = '# end %s %s\n' % ( firstkw, topid) else: s = '# end %s\n' % firstkw # end if self.write(currentws + s) firstkw = lastkw = '' # end if currentws, firstkw, lastkw, topid = stack.pop() current = len(currentws.expandtabs(self.tabsize)) # end while if indent == current and firstkw: if thiskw == 'end': if endkw != firstkw: self.error('mismatched end') # end if firstkw = lastkw = '' elif not thiskw or thiskw in start: if topid: s = '# end %s %s\n' % ( firstkw, topid) else: s = '# end %s\n' % firstkw # end if self.write(currentws + s) firstkw = lastkw = topid = '' # end if # end if if indent > current: stack.append((currentws, firstkw, lastkw, topid)) if thiskw and thiskw not in start: # error thiskw = '' # end if currentws, firstkw, lastkw, topid = \ indentws, thiskw, thiskw, thisid # end if if thiskw: if thiskw in start: firstkw = lastkw = thiskw topid = thisid else: lastkw = thiskw # end if # end if for l in todo: self.write(l) # end for todo = [] if not line: break # end if self.write(line) # end while # end def complete # end class PythonIndenter # Simplified user interface # - xxx_filter(input, output): read and write file objects # - xxx_string(s): take and return string object # - xxx_file(filename): process file in place, return true iff changed def complete_filter(input = sys.stdin, output = sys.stdout, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS): pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs) pi.complete() # end def complete_filter def delete_filter(input= sys.stdin, output = sys.stdout, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS): pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs) pi.delete() # end def delete_filter def reformat_filter(input = sys.stdin, output = sys.stdout, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS): pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs) pi.reformat() # end def reformat_filter def complete_string(source, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS): input = io.BytesIO(source) output = io.BytesIO() pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs) pi.complete() return output.getvalue() # end def complete_string def delete_string(source, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS): input = io.BytesIO(source) output = io.BytesIO() pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs) pi.delete() return output.getvalue() # end def delete_string def reformat_string(source, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS): input = io.BytesIO(source) output = io.BytesIO() pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs) pi.reformat() return output.getvalue() # end def reformat_string def make_backup(filename): import os, os.path backup = filename + '~' if os.path.lexists(backup): try: os.remove(backup) except os.error: print("Can't remove backup %r" % (backup,), file=sys.stderr) # end try # end if try: os.rename(filename, backup) except os.error: print("Can't rename %r to %r" % (filename, backup), file=sys.stderr) # end try # end def make_backup def complete_file(filename, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS): with open(filename, 'r') as f: source = f.read() # end with result = complete_string(source, stepsize, tabsize, expandtabs) if source == result: return 0 # end if make_backup(filename) with open(filename, 'w') as f: f.write(result) # end with return 1 # end def complete_file def delete_file(filename, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS): with open(filename, 'r') as f: source = f.read() # end with result = delete_string(source, stepsize, tabsize, expandtabs) if source == result: return 0 # end if make_backup(filename) with open(filename, 'w') as f: f.write(result) # end with return 1 # end def delete_file def reformat_file(filename, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS): with open(filename, 'r') as f: source = f.read() # end with result = reformat_string(source, stepsize, tabsize, expandtabs) if source == result: return 0 # end if make_backup(filename) with open(filename, 'w') as f: f.write(result) # end with return 1 # end def reformat_file # Test program when called as a script usage = """ usage: pindent (-c|-d|-r) [-s stepsize] [-t tabsize] [-e] [file] ... -c : complete a correctly indented program (add #end directives) -d : delete #end directives -r : reformat a completed program (use #end directives) -s stepsize: indentation step (default %(STEPSIZE)d) -t tabsize : the worth in spaces of a tab (default %(TABSIZE)d) -e : expand TABs into spaces (default OFF) [file] ... : files are changed in place, with backups in file~ If no files are specified or a single - is given, the program acts as a filter (reads stdin, writes stdout). """ % vars() def error_both(op1, op2): sys.stderr.write('Error: You can not specify both '+op1+' and -'+op2[0]+' at the same time\n') sys.stderr.write(usage) sys.exit(2) # end def error_both def test(): import getopt try: opts, args = getopt.getopt(sys.argv[1:], 'cdrs:t:e') except getopt.error, msg: sys.stderr.write('Error: %s\n' % msg) sys.stderr.write(usage) sys.exit(2) # end try action = None stepsize = STEPSIZE tabsize = TABSIZE expandtabs = EXPANDTABS for o, a in opts: if o == '-c': if action: error_both(o, action) # end if action = 'complete' elif o == '-d': if action: error_both(o, action) # end if action = 'delete' elif o == '-r': if action: error_both(o, action) # end if action = 'reformat' elif o == '-s': stepsize = int(a) elif o == '-t': tabsize = int(a) elif o == '-e': expandtabs = True # end if # end for if not action: sys.stderr.write( 'You must specify -c(omplete), -d(elete) or -r(eformat)\n') sys.stderr.write(usage) sys.exit(2) # end if if not args or args == ['-']: action = eval(action + '_filter') action(sys.stdin, sys.stdout, stepsize, tabsize, expandtabs) else: action = eval(action + '_file') for filename in args: action(filename, stepsize, tabsize, expandtabs) # end for # end if # end def test if __name__ == '__main__': test() # end if
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
.analyze_dxp.pyo.40009 | File | 4.64 KB | 0644 |
|
.byext.pyo.40009 | File | 4.42 KB | 0644 |
|
.byteyears.pyo.40009 | File | 1.37 KB | 0644 |
|
.checkappend.pyo.40009 | File | 4.77 KB | 0644 |
|
.checkpyc.pyo.40009 | File | 1.93 KB | 0644 |
|
.classfix.pyo.40009 | File | 4.09 KB | 0644 |
|
.copytime.pyo.40009 | File | 937 B | 0644 |
|
.crlf.pyo.40009 | File | 855 B | 0644 |
|
.cvsfiles.pyo.40009 | File | 2.11 KB | 0644 |
|
.db2pickle.pyo.40009 | File | 3.42 KB | 0644 |
|
.diff.pyo.40009 | File | 2.29 KB | 0644 |
|
.dutree.pyo.40009 | File | 2.18 KB | 0644 |
|
.eptags.pyo.40009 | File | 1.83 KB | 0644 |
|
.find_recursionlimit.pyo.40009 | File | 5.54 KB | 0644 |
|
.finddiv.pyo.40009 | File | 3.22 KB | 0644 |
|
.findlinksto.pyo.40009 | File | 1.39 KB | 0644 |
|
.findnocoding.pyo.40009 | File | 3.03 KB | 0644 |
|
.fixcid.pyo.40009 | File | 7.67 KB | 0644 |
|
.fixheader.pyo.40009 | File | 1.44 KB | 0644 |
|
.fixnotice.pyo.40009 | File | 3.42 KB | 0644 |
|
.fixps.pyo.40009 | File | 969 B | 0644 |
|
.ftpmirror.pyo.40009 | File | 10.81 KB | 0644 |
|
.google.pyo.40009 | File | 792 B | 0644 |
|
.gprof2html.pyo.40009 | File | 2.22 KB | 0644 |
|
.h2py.pyo.40009 | File | 4.3 KB | 0644 |
|
.hotshotmain.pyo.40009 | File | 1.82 KB | 0644 |
|
.ifdef.pyo.40009 | File | 2.21 KB | 0644 |
|
.lfcr.pyo.40009 | File | 880 B | 0644 |
|
.linktree.pyo.40009 | File | 1.98 KB | 0644 |
|
.lll.pyo.40009 | File | 947 B | 0644 |
|
.logmerge.pyo.40009 | File | 4.96 KB | 0644 |
|
.mailerdaemon.pyo.40009 | File | 7.19 KB | 0644 |
|
.md5sum.pyo.40009 | File | 2.85 KB | 0644 |
|
.methfix.pyo.40009 | File | 4.03 KB | 0644 |
|
.mkreal.pyo.40009 | File | 1.93 KB | 0644 |
|
.ndiff.pyo.40009 | File | 3.77 KB | 0644 |
|
.nm2def.pyo.40009 | File | 2.89 KB | 0644 |
|
.objgraph.pyo.40009 | File | 4.82 KB | 0644 |
|
.parseentities.pyo.40009 | File | 2.03 KB | 0644 |
|
.patchcheck.pyo.40009 | File | 7.24 KB | 0644 |
|
.pathfix.pyo.40009 | File | 3.75 KB | 0644 |
|
.pdeps.pyo.40009 | File | 3.14 KB | 0644 |
|
.pickle2db.pyo.40009 | File | 3.73 KB | 0644 |
|
.pindent.pyo.40009 | File | 11.3 KB | 0644 |
|
.ptags.pyo.40009 | File | 1.37 KB | 0644 |
|
.pysource.pyo.40009 | File | 3.92 KB | 0644 |
|
.redemo.pyo.40009 | File | 5.16 KB | 0644 |
|
.reindent-rst.pyo.40009 | File | 481 B | 0644 |
|
.rgrep.pyo.40009 | File | 1.84 KB | 0644 |
|
.serve.pyo.40009 | File | 1.56 KB | 0644 |
|
.setup.pyo.40009 | File | 548 B | 0644 |
|
.suff.pyo.40009 | File | 904 B | 0644 |
|
.texcheck.pyo.40009 | File | 8.18 KB | 0644 |
|
.texi2html.pyo.40009 | File | 81.37 KB | 0644 |
|
.treesync.pyo.40009 | File | 5.85 KB | 0644 |
|
.untabify.pyo.40009 | File | 1.55 KB | 0644 |
|
.which.pyo.40009 | File | 1.59 KB | 0644 |
|
.win_add2path.pyo.40009 | File | 2.02 KB | 0644 |
|
.xxci.pyo.40009 | File | 3.93 KB | 0644 |
|
analyze_dxp.py | File | 4.11 KB | 0755 |
|
analyze_dxp.pyc | File | 4.64 KB | 0644 |
|
analyze_dxp.pyo | File | 4.64 KB | 0644 |
|
byext.py | File | 3.85 KB | 0755 |
|
byext.pyc | File | 4.42 KB | 0644 |
|
byext.pyo | File | 4.42 KB | 0644 |
|
byteyears.py | File | 1.6 KB | 0755 |
|
byteyears.pyc | File | 1.37 KB | 0644 |
|
byteyears.pyo | File | 1.37 KB | 0644 |
|
checkappend.py | File | 4.55 KB | 0755 |
|
checkappend.pyc | File | 4.77 KB | 0644 |
|
checkappend.pyo | File | 4.77 KB | 0644 |
|
checkpyc.py | File | 1.96 KB | 0755 |
|
checkpyc.pyc | File | 1.93 KB | 0644 |
|
checkpyc.pyo | File | 1.93 KB | 0644 |
|
classfix.py | File | 5.81 KB | 0755 |
|
classfix.pyc | File | 4.09 KB | 0644 |
|
classfix.pyo | File | 4.09 KB | 0644 |
|
cleanfuture.py | File | 8.38 KB | 0755 |
|
cleanfuture.pyc | File | 7.22 KB | 0644 |
|
cleanfuture.pyo | File | 7.19 KB | 0644 |
|
combinerefs.py | File | 4.28 KB | 0755 |
|
combinerefs.pyc | File | 4.16 KB | 0644 |
|
combinerefs.pyo | File | 4.12 KB | 0644 |
|
copytime.py | File | 664 B | 0755 |
|
copytime.pyc | File | 937 B | 0644 |
|
copytime.pyo | File | 937 B | 0644 |
|
crlf.py | File | 611 B | 0755 |
|
crlf.pyc | File | 855 B | 0644 |
|
crlf.pyo | File | 855 B | 0644 |
|
cvsfiles.py | File | 1.75 KB | 0755 |
|
cvsfiles.pyc | File | 2.11 KB | 0644 |
|
cvsfiles.pyo | File | 2.11 KB | 0644 |
|
db2pickle.py | File | 3.49 KB | 0755 |
|
db2pickle.pyc | File | 3.42 KB | 0644 |
|
db2pickle.pyo | File | 3.42 KB | 0644 |
|
diff.py | File | 1.98 KB | 0755 |
|
diff.pyc | File | 2.29 KB | 0644 |
|
diff.pyo | File | 2.29 KB | 0644 |
|
dutree.py | File | 1.58 KB | 0755 |
|
dutree.pyc | File | 2.18 KB | 0644 |
|
dutree.pyo | File | 2.18 KB | 0644 |
|
eptags.py | File | 1.45 KB | 0755 |
|
eptags.pyc | File | 1.83 KB | 0644 |
|
eptags.pyo | File | 1.83 KB | 0644 |
|
find_recursionlimit.py | File | 3.39 KB | 0755 |
|
find_recursionlimit.pyc | File | 5.54 KB | 0644 |
|
find_recursionlimit.pyo | File | 5.54 KB | 0644 |
|
finddiv.py | File | 2.46 KB | 0755 |
|
finddiv.pyc | File | 3.22 KB | 0644 |
|
finddiv.pyo | File | 3.22 KB | 0644 |
|
findlinksto.py | File | 1.04 KB | 0755 |
|
findlinksto.pyc | File | 1.39 KB | 0644 |
|
findlinksto.pyo | File | 1.39 KB | 0644 |
|
findnocoding.py | File | 2.64 KB | 0755 |
|
findnocoding.pyc | File | 3.03 KB | 0644 |
|
findnocoding.pyo | File | 3.03 KB | 0644 |
|
fixcid.py | File | 9.75 KB | 0755 |
|
fixcid.pyc | File | 7.67 KB | 0644 |
|
fixcid.pyo | File | 7.67 KB | 0644 |
|
fixdiv.py | File | 13.57 KB | 0755 |
|
fixdiv.pyc | File | 13.7 KB | 0644 |
|
fixdiv.pyo | File | 13.62 KB | 0644 |
|
fixheader.py | File | 1.16 KB | 0755 |
|
fixheader.pyc | File | 1.44 KB | 0644 |
|
fixheader.pyo | File | 1.44 KB | 0644 |
|
fixnotice.py | File | 2.98 KB | 0755 |
|
fixnotice.pyc | File | 3.42 KB | 0644 |
|
fixnotice.pyo | File | 3.42 KB | 0644 |
|
fixps.py | File | 894 B | 0755 |
|
fixps.pyc | File | 969 B | 0644 |
|
fixps.pyo | File | 969 B | 0644 |
|
ftpmirror.py | File | 12.55 KB | 0755 |
|
ftpmirror.pyc | File | 10.81 KB | 0644 |
|
ftpmirror.pyo | File | 10.81 KB | 0644 |
|
google.py | File | 520 B | 0755 |
|
google.pyc | File | 792 B | 0644 |
|
google.pyo | File | 792 B | 0644 |
|
gprof2html.py | File | 2.12 KB | 0755 |
|
gprof2html.pyc | File | 2.22 KB | 0644 |
|
gprof2html.pyo | File | 2.22 KB | 0644 |
|
h2py.py | File | 5.82 KB | 0755 |
|
h2py.pyc | File | 4.3 KB | 0644 |
|
h2py.pyo | File | 4.3 KB | 0644 |
|
hotshotmain.py | File | 1.45 KB | 0755 |
|
hotshotmain.pyc | File | 1.82 KB | 0644 |
|
hotshotmain.pyo | File | 1.82 KB | 0644 |
|
ifdef.py | File | 3.63 KB | 0755 |
|
ifdef.pyc | File | 2.21 KB | 0644 |
|
ifdef.pyo | File | 2.21 KB | 0644 |
|
lfcr.py | File | 619 B | 0755 |
|
lfcr.pyc | File | 880 B | 0644 |
|
lfcr.pyo | File | 880 B | 0644 |
|
linktree.py | File | 2.37 KB | 0755 |
|
linktree.pyc | File | 1.98 KB | 0644 |
|
linktree.pyo | File | 1.98 KB | 0644 |
|
lll.py | File | 747 B | 0755 |
|
lll.pyc | File | 947 B | 0644 |
|
lll.pyo | File | 947 B | 0644 |
|
logmerge.py | File | 5.45 KB | 0755 |
|
logmerge.pyc | File | 4.96 KB | 0644 |
|
logmerge.pyo | File | 4.96 KB | 0644 |
|
mailerdaemon.py | File | 7.76 KB | 0755 |
|
mailerdaemon.pyc | File | 7.19 KB | 0644 |
|
mailerdaemon.pyo | File | 7.19 KB | 0644 |
|
md5sum.py | File | 2.33 KB | 0755 |
|
md5sum.pyc | File | 2.85 KB | 0644 |
|
md5sum.pyo | File | 2.85 KB | 0644 |
|
methfix.py | File | 5.33 KB | 0755 |
|
methfix.pyc | File | 4.03 KB | 0644 |
|
methfix.pyo | File | 4.03 KB | 0644 |
|
mkreal.py | File | 1.59 KB | 0755 |
|
mkreal.pyc | File | 1.93 KB | 0644 |
|
mkreal.pyo | File | 1.93 KB | 0644 |
|
ndiff.py | File | 3.72 KB | 0755 |
|
ndiff.pyc | File | 3.77 KB | 0644 |
|
ndiff.pyo | File | 3.77 KB | 0644 |
|
nm2def.py | File | 2.39 KB | 0755 |
|
nm2def.pyc | File | 2.89 KB | 0644 |
|
nm2def.pyo | File | 2.89 KB | 0644 |
|
objgraph.py | File | 5.88 KB | 0755 |
|
objgraph.pyc | File | 4.82 KB | 0644 |
|
objgraph.pyo | File | 4.82 KB | 0644 |
|
parseentities.py | File | 1.68 KB | 0755 |
|
parseentities.pyc | File | 2.03 KB | 0644 |
|
parseentities.pyo | File | 2.03 KB | 0644 |
|
patchcheck.py | File | 5.42 KB | 0755 |
|
patchcheck.pyc | File | 7.24 KB | 0644 |
|
patchcheck.pyo | File | 7.24 KB | 0644 |
|
pathfix.py | File | 4.23 KB | 0755 |
|
pathfix.pyc | File | 3.75 KB | 0644 |
|
pathfix.pyo | File | 3.75 KB | 0644 |
|
pdeps.py | File | 3.84 KB | 0755 |
|
pdeps.pyc | File | 3.14 KB | 0644 |
|
pdeps.pyo | File | 3.14 KB | 0644 |
|
pickle2db.py | File | 3.85 KB | 0755 |
|
pickle2db.pyc | File | 3.73 KB | 0644 |
|
pickle2db.pyo | File | 3.73 KB | 0644 |
|
pindent.py | File | 16.77 KB | 0755 |
|
pindent.pyc | File | 11.3 KB | 0644 |
|
pindent.pyo | File | 11.3 KB | 0644 |
|
ptags.py | File | 1.2 KB | 0755 |
|
ptags.pyc | File | 1.37 KB | 0644 |
|
ptags.pyo | File | 1.37 KB | 0644 |
|
pysource.py | File | 3.76 KB | 0755 |
|
pysource.pyc | File | 3.92 KB | 0644 |
|
pysource.pyo | File | 3.92 KB | 0644 |
|
redemo.py | File | 5.66 KB | 0755 |
|
redemo.pyc | File | 5.16 KB | 0644 |
|
redemo.pyo | File | 5.16 KB | 0644 |
|
reindent-rst.py | File | 278 B | 0755 |
|
reindent-rst.pyc | File | 481 B | 0644 |
|
reindent-rst.pyo | File | 481 B | 0644 |
|
reindent.py | File | 10.58 KB | 0755 |
|
reindent.pyc | File | 8.77 KB | 0644 |
|
reindent.pyo | File | 8.74 KB | 0644 |
|
rgrep.py | File | 1.46 KB | 0755 |
|
rgrep.pyc | File | 1.84 KB | 0644 |
|
rgrep.pyo | File | 1.84 KB | 0644 |
|
serve.py | File | 1.12 KB | 0755 |
|
serve.pyc | File | 1.56 KB | 0644 |
|
serve.pyo | File | 1.56 KB | 0644 |
|
setup.py | File | 421 B | 0755 |
|
setup.pyc | File | 548 B | 0644 |
|
setup.pyo | File | 548 B | 0644 |
|
suff.py | File | 622 B | 0755 |
|
suff.pyc | File | 904 B | 0644 |
|
suff.pyo | File | 904 B | 0644 |
|
svneol.py | File | 2.86 KB | 0755 |
|
svneol.pyc | File | 2.83 KB | 0644 |
|
svneol.pyo | File | 2.76 KB | 0644 |
|
texcheck.py | File | 9.04 KB | 0755 |
|
texcheck.pyc | File | 8.18 KB | 0644 |
|
texcheck.pyo | File | 8.18 KB | 0644 |
|
texi2html.py | File | 68.19 KB | 0755 |
|
texi2html.pyc | File | 81.37 KB | 0644 |
|
texi2html.pyo | File | 81.37 KB | 0644 |
|
treesync.py | File | 5.65 KB | 0755 |
|
treesync.pyc | File | 5.85 KB | 0644 |
|
treesync.pyo | File | 5.85 KB | 0644 |
|
untabify.py | File | 1.19 KB | 0755 |
|
untabify.pyc | File | 1.55 KB | 0644 |
|
untabify.pyo | File | 1.55 KB | 0644 |
|
which.py | File | 1.59 KB | 0755 |
|
which.pyc | File | 1.59 KB | 0644 |
|
which.pyo | File | 1.59 KB | 0644 |
|
win_add2path.py | File | 1.58 KB | 0755 |
|
win_add2path.pyc | File | 2.02 KB | 0644 |
|
win_add2path.pyo | File | 2.02 KB | 0644 |
|
xxci.py | File | 2.73 KB | 0755 |
|
xxci.pyc | File | 3.93 KB | 0644 |
|
xxci.pyo | File | 3.93 KB | 0644 |
|