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
|