Created

Embed URL

HTTPS clone URL

SSH clone URL

You can clone with HTTPS or SSH.

Download Gist

Modifications to railties's code_statistics.rb to include comment counting

View code_statistics.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
class CodeStatistics #:nodoc:
 
TEST_TYPES = %w(Units Functionals Unit\ tests Functional\ tests Integration\ tests)
 
def initialize(*pairs)
@pairs = pairs
@statistics = calculate_statistics
@total = calculate_total if pairs.length > 1
end
 
def to_s
print_header
@pairs.each { |pair| print_line(pair.first, @statistics[pair.first]) }
print_splitter
 
if @total
print_line("Total", @total)
print_splitter
end
 
print_code_test_stats
end
 
private
def calculate_statistics
Hash[@pairs.map{|pair| [pair.first, calculate_directory_statistics(pair.last)]}]
end
 
def calculate_directory_statistics(directory, pattern = /.*\.(rb|haml|sass)$/)
stats = { "lines" => 0, "codelines" => 0, "classes" => 0, "methods" => 0, "comments" => 0 }
 
Dir.foreach(directory) do |file_name|
if File.stat(directory + "/" + file_name).directory? and (/^\./ !~ file_name)
newstats = calculate_directory_statistics(directory + "/" + file_name, pattern)
stats.each { |k, v| stats[k] += newstats[k] }
end
 
next unless file_name =~ pattern
 
f = File.open(directory + "/" + file_name)
 
while line = f.gets
stats["lines"] += 1
stats["classes"] += 1 if line =~ /class [A-Z]/
stats["methods"] += 1 if line =~ /def [a-z]/
stats["comments"] += 1 if line =~ /\s*# /
stats["codelines"] += 1 unless line =~ /^\s*$/ || line =~ /^\s*#/
end
end
 
stats
end
 
def calculate_total
total = { "lines" => 0, "codelines" => 0, "classes" => 0, "methods" => 0, "comments" => 0 }
@statistics.each_value { |pair| pair.each { |k, v| total[k] += v } }
total
end
 
def calculate_code
code_loc = 0
@statistics.each { |k, v| code_loc += v['codelines'] unless TEST_TYPES.include? k }
code_loc
end
 
def calculate_tests
test_loc = 0
@statistics.each { |k, v| test_loc += v['codelines'] if TEST_TYPES.include? k }
test_loc
end
 
def print_header
print_splitter
puts "| Name | Lines | LOC | Comments | Classes | Methods | M/C | LOC/M |"
print_splitter
end
 
def print_splitter
puts "+----------------------+-------+-------+----------+---------+---------+-----+-------+"
end
 
def print_line(name, statistics)
m_over_c = (statistics["methods"] / statistics["classes"]) rescue m_over_c = 0
loc_over_m = (statistics["codelines"] / statistics["methods"]) - 2 rescue loc_over_m = 0
 
start = if TEST_TYPES.include? name
"| #{name.ljust(20)} "
else
"| #{name.ljust(20)} "
end
 
puts start +
"| #{statistics["lines"].to_s.rjust(5)} " +
"| #{statistics["codelines"].to_s.rjust(5)} " +
"| #{statistics["comments"].to_s.rjust(8)} " +
"| #{statistics["classes"].to_s.rjust(7)} " +
"| #{statistics["methods"].to_s.rjust(7)} " +
"| #{m_over_c.to_s.rjust(3)} " +
"| #{loc_over_m.to_s.rjust(5)} |"
end
 
def print_code_test_stats
code = calculate_code
tests = calculate_tests
 
puts " Code LOC: #{code} Test LOC: #{tests} Code to Test Ratio: 1:#{sprintf("%.1f", tests.to_f/code)}"
puts ""
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.