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
|