ControlC ControlC.com

LOC and Comment totals

Views: 79Total Chars: 2,274
Created: 8/25/12 11:34:52PM ET
Self Destructs: Never
import BeautifulSoup
import os.path as op

#path of the csproj file
filepath = "absolute\path o\csproj"
#the directory of the files
directory = op.split(filepath)[0]

num_of_comments = 0
num_of_LOC = 0
raw_num_of_lines = 0

with open(filepath) as f:

soup = BeautifulSoup.BeautifulStoneSoup(f.read())

#find all the files in the projet (that get compiled)
compileTags = soup.findAll('compile')


#a list to store all the file names
csNames = []

#loop over all the tags
for elem in compileTags:
#find the ones with include in in
for attr in elem.attrs:
if attr[0] == 'include':
csPath = attr[1]
#print csPath
csNames.append(csPath)

## now we've got all the relative positions, now to use the read the files
#since we've got the filepath of the csproj, and we assume the other files are
#in the same folder or lower, we can split filepath up and use it as a
# root directory

#make sure each file exists. Race condition though, should use something
# else isntead. see: http://stackoverflow.com/a/85237/541208
# hard crashes if the files don't exist.
for name in csNames:
#could format the strings to speed things up a bit instead of conct'ing
fullpath = r"{}\{}".format(directory, name)
assert op.exists(fullpath)
print fullpath + ' exists'

#now, just have to check if a line in the cs files starts with a '\' or not.
# you can make changes to allow it to search to '\* *' comment blocks. I don't
# use them at all.

for name in csNames:
with open(fullpath) as f:
for line in f.readlines():
#raw lines
raw_num_of_lines += 1
#lines with any code in it
if line.strip():
num_of_LOC += 1
if line.strip().startswith(r"//"):
#save the comment to a list. Only saving one total file.
# can easily customize it to keep stats for each file
#print 'a comment!'
num_of_comments += 1


print "Found {} comments, where a comment was a line starting with //.".format(num_of_comments)
print "Found {} lines total, with {} lines with text in them.".format(raw_num_of_lines, num_of_LOC)
2,274 chars, 318 words, 67 lines·Create new version