95 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env python
 | 
						|
 | 
						|
# hands on script to compute the non-empty Lines of Code
 | 
						|
# for tests and non-test code
 | 
						|
 | 
						|
"""\
 | 
						|
py.countloc [PATHS]
 | 
						|
 | 
						|
Count (non-empty) lines of python code and number of python files recursively
 | 
						|
starting from a list of paths given on the command line (starting from the
 | 
						|
current working directory). Distinguish between test files and normal ones and
 | 
						|
report them separately.
 | 
						|
"""
 | 
						|
import py
 | 
						|
 | 
						|
def main():
 | 
						|
    parser = py.std.optparse.OptionParser(usage=__doc__)
 | 
						|
    (options, args) = parser.parse_args()
 | 
						|
    countloc(args)
 | 
						|
 | 
						|
def nodot(p):
 | 
						|
    return p.check(dotfile=0)
 | 
						|
 | 
						|
class FileCounter(object):
 | 
						|
    def __init__(self):
 | 
						|
        self.file2numlines = {}
 | 
						|
        self.numlines = 0
 | 
						|
        self.numfiles = 0
 | 
						|
 | 
						|
    def addrecursive(self, directory, fil="*.py", rec=nodot):
 | 
						|
        for x in directory.visit(fil, rec):
 | 
						|
            self.addfile(x)
 | 
						|
 | 
						|
    def addfile(self, fn, emptylines=False):
 | 
						|
        if emptylines:
 | 
						|
            s = len(p.readlines())
 | 
						|
        else:
 | 
						|
            s = 0
 | 
						|
            for i in fn.readlines():
 | 
						|
                if i.strip():
 | 
						|
                    s += 1
 | 
						|
        self.file2numlines[fn] = s
 | 
						|
        self.numfiles += 1
 | 
						|
        self.numlines += s
 | 
						|
 | 
						|
    def getnumlines(self, fil):
 | 
						|
        numlines = 0
 | 
						|
        for path, value in self.file2numlines.items():
 | 
						|
            if fil(path):
 | 
						|
                numlines += value
 | 
						|
        return numlines
 | 
						|
 | 
						|
    def getnumfiles(self, fil):
 | 
						|
        numfiles = 0
 | 
						|
        for path in self.file2numlines:
 | 
						|
            if fil(path):
 | 
						|
                numfiles += 1
 | 
						|
        return numfiles
 | 
						|
 | 
						|
def get_loccount(locations=None):
 | 
						|
    if locations is None:
 | 
						|
        localtions = [py.path.local()]
 | 
						|
    counter = FileCounter()
 | 
						|
    for loc in locations:
 | 
						|
        counter.addrecursive(loc, '*.py', rec=nodot)
 | 
						|
 | 
						|
    def istestfile(p):
 | 
						|
        return p.check(fnmatch='test_*.py')
 | 
						|
    isnottestfile = lambda x: not istestfile(x)
 | 
						|
 | 
						|
    numfiles = counter.getnumfiles(isnottestfile)
 | 
						|
    numlines = counter.getnumlines(isnottestfile)
 | 
						|
    numtestfiles = counter.getnumfiles(istestfile)
 | 
						|
    numtestlines = counter.getnumlines(istestfile)
 | 
						|
 | 
						|
    return counter, numfiles, numlines, numtestfiles, numtestlines
 | 
						|
 | 
						|
def countloc(paths=None):
 | 
						|
    if not paths:
 | 
						|
        paths = ['.']
 | 
						|
    locations = [py.path.local(x) for x in paths]
 | 
						|
    (counter, numfiles, numlines, numtestfiles,
 | 
						|
     numtestlines) = get_loccount(locations)
 | 
						|
 | 
						|
    items = counter.file2numlines.items()
 | 
						|
    items.sort(lambda x,y: cmp(x[1], y[1]))
 | 
						|
    for x, y in items:
 | 
						|
        print("%3d %30s" % (y,x))
 | 
						|
 | 
						|
    print("%30s %3d" %("number of testfiles", numtestfiles))
 | 
						|
    print("%30s %3d" %("number of non-empty testlines", numtestlines))
 | 
						|
    print("%30s %3d" %("number of files", numfiles))
 | 
						|
    print("%30s %3d" %("number of non-empty lines", numlines))
 | 
						|
 |