annotate vendor/gems/coderay-1.0.0/lib/coderay/encoders/statistic.rb @ 1171:b4558bc5837f bug_505

Close obsolete branch bug_505
author Chris Cannam
date Fri, 03 Aug 2012 19:40:23 +0100
parents cbb26bc654de
children
rev   line source
Chris@909 1 module CodeRay
Chris@909 2 module Encoders
Chris@909 3
Chris@909 4 # Makes a statistic for the given tokens.
Chris@909 5 #
Chris@909 6 # Alias: +stats+
Chris@909 7 class Statistic < Encoder
Chris@909 8
Chris@909 9 register_for :statistic
Chris@909 10
Chris@909 11 attr_reader :type_stats, :real_token_count # :nodoc:
Chris@909 12
Chris@909 13 TypeStats = Struct.new :count, :size # :nodoc:
Chris@909 14
Chris@909 15 protected
Chris@909 16
Chris@909 17 def setup options
Chris@909 18 super
Chris@909 19
Chris@909 20 @type_stats = Hash.new { |h, k| h[k] = TypeStats.new 0, 0 }
Chris@909 21 @real_token_count = 0
Chris@909 22 end
Chris@909 23
Chris@909 24 STATS = <<-STATS # :nodoc:
Chris@909 25
Chris@909 26 Code Statistics
Chris@909 27
Chris@909 28 Tokens %8d
Chris@909 29 Non-Whitespace %8d
Chris@909 30 Bytes Total %8d
Chris@909 31
Chris@909 32 Token Types (%d):
Chris@909 33 type count ratio size (average)
Chris@909 34 -------------------------------------------------------------
Chris@909 35 %s
Chris@909 36 STATS
Chris@909 37
Chris@909 38 TOKEN_TYPES_ROW = <<-TKR # :nodoc:
Chris@909 39 %-20s %8d %6.2f %% %5.1f
Chris@909 40 TKR
Chris@909 41
Chris@909 42 def finish options
Chris@909 43 all = @type_stats['TOTAL']
Chris@909 44 all_count, all_size = all.count, all.size
Chris@909 45 @type_stats.each do |type, stat|
Chris@909 46 stat.size /= stat.count.to_f
Chris@909 47 end
Chris@909 48 types_stats = @type_stats.sort_by { |k, v| [-v.count, k.to_s] }.map do |k, v|
Chris@909 49 TOKEN_TYPES_ROW % [k, v.count, 100.0 * v.count / all_count, v.size]
Chris@909 50 end.join
Chris@909 51 @out << STATS % [
Chris@909 52 all_count, @real_token_count, all_size,
Chris@909 53 @type_stats.delete_if { |k, v| k.is_a? String }.size,
Chris@909 54 types_stats
Chris@909 55 ]
Chris@909 56
Chris@909 57 super
Chris@909 58 end
Chris@909 59
Chris@909 60 public
Chris@909 61
Chris@909 62 def text_token text, kind
Chris@909 63 @real_token_count += 1 unless kind == :space
Chris@909 64 @type_stats[kind].count += 1
Chris@909 65 @type_stats[kind].size += text.size
Chris@909 66 @type_stats['TOTAL'].size += text.size
Chris@909 67 @type_stats['TOTAL'].count += 1
Chris@909 68 end
Chris@909 69
Chris@909 70 # TODO Hierarchy handling
Chris@909 71 def begin_group kind
Chris@909 72 block_token ':begin_group', kind
Chris@909 73 end
Chris@909 74
Chris@909 75 def end_group kind
Chris@909 76 block_token ':end_group', kind
Chris@909 77 end
Chris@909 78
Chris@909 79 def begin_line kind
Chris@909 80 block_token ':begin_line', kind
Chris@909 81 end
Chris@909 82
Chris@909 83 def end_line kind
Chris@909 84 block_token ':end_line', kind
Chris@909 85 end
Chris@909 86
Chris@909 87 def block_token action, kind
Chris@909 88 @type_stats['TOTAL'].count += 1
Chris@909 89 @type_stats[action].count += 1
Chris@909 90 @type_stats[kind].count += 1
Chris@909 91 end
Chris@909 92
Chris@909 93 end
Chris@909 94
Chris@909 95 end
Chris@909 96 end