annotate vendor/plugins/coderay-0.9.2/lib/coderay/encoders/statistic.rb @ 861:b8105f717bf7 bug_182

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