Recently I measured some code metrics of a C/C++ project at work. I used C and C++ Code Counter(CCCC) and it is pretty good. There was a similar project at work which was almost completely in Python. I wanted to compare the two and searched for a suitable tool to measure McCabe’s Cyclomatic Complexity(CC) for Python code and found pygenie.
Original pygenie, by default, prints Files(X), Classes(C), Methods(M), Functions(F) only if their CC exceeds 7. If –verbose or -v is given, it prints CC irrespective of whether it crosses the threshold of 7 or not. But I wanted overall CC. My main motivation is purely for fun or for interesting numbers. Kind of like the calories burnt counter on a treadmill or a cycle computer for a bicycle. But overall CC can be useful in estimating testing effort.
Here is a sample run of original pygenie on its own source code.
aufather@simstudio:~/Downloads/pygenie_orig$ ./pygenie.py complexity *.py
File: /home/aufather/Downloads/pygenie_orig/cc.py
This code looks all good!
File: /home/aufather/Downloads/pygenie_orig/pygenie.py
Type Name Complexity
--------------------
F main 8
File: /home/aufather/Downloads/pygenie_orig/test_cc.py
This code looks all good!
And here is a sample run of modified pygenie on its own source code.
aufather@simstudio:~/Downloads/pygenie$ ./pygenie.py * -c
File: /home/aufather/Downloads/pygenie/cc.py
This code looks all good!
File: /home/aufather/Downloads/pygenie/pygenie.py
This code looks all good!
File: /home/aufather/Downloads/pygenie/test_cc.py
This code looks all good!
Total Cumulative Statistics
----------------------------------
Type Count Complexity
----------------------------------
X 3 4
C 8 8
M 31 70
F 13 26
T 55 108
----------------------------------
I added the total cumulative statistics and a summary for each file. Total is represented by ‘T’. This gives a fair idea of how complex the overall project is. ‘F’ stands for functions, ‘M’ stands for methods, ‘C’ stands for classes and ‘X’ stands for files. Also while I was at it, added a whole bunch of command line options to pygenie.
Here is the help for original pygenie. Valid commands are “complexity” or “all”.
aufather@simstudio:~/Downloads/pygenie_orig$ ./pygenie.py all -h
Usage: ./cc.py command [options] *.py
Options:
-h, --help show this help message and exit
-v, --verbose print detailed statistics to stdout
And the new options added.
aufather@simstudio:~/Downloads/pygenie$ ./pygenie.py -h
Usage: pygenie.py [options] *.py
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-c, --complexity print complexity details for each file/module
-t THRESHOLD, --threshold=THRESHOLD
threshold of complexity to be ignored (default=7)
-a, --all print all metrics
-s, --summary print cumulative summary for each file/module
-r, --recurs process files recursively in a folder
-d, --debug print debugging info like file being processed
-o OUTFILE, --outfile=OUTFILE
output to OUTFILE (default=stdout)
You can get the full zipped source code from my dropbox here
http://dl.dropbox.com/u/10402332/pygenie.zip.
PS: I based my modification on revision 44 of pygenie. I got the original from http://svn.traceback.org/python/cyclic_complexity/.
PPS: I could not find a better way of sharing the code in wordpress. I have updated the test_cc.py too so that unit test do not fail. If any one knows a better way of sharing code, please let me know. Dropbox works well for me.
Image may be NSFW.
Clik here to view.
Clik here to view.
