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))
 | |
| 
 |