OTWO-1213 Works around lost encoding in Ruby/C binding layer
[ohcount] / ruby / gestalt / gestalt_facts.rb
1 module Ohcount
2
3         # Represents language statistics for a collection of files
4         class GestaltFacts
5                 attr_accessor :platforms, :tools, :file_rules, :language_counts
6
7     def initialize
8                         @platforms = []
9                         @tools = []
10                         @file_rules = {}
11                         @language_counts = {}
12                 end
13
14                 def process(source_file)
15                         Gestalt::FileRule.rules_triggered_by(source_file).each do |r|
16                                 @file_rules[r] ||= 0
17                                 @file_rules[r] += 1
18                         end
19                         source_file.language_breakdowns.each do |lb|
20                                 @language_counts[lb.name.intern] ||= 0
21                                 @language_counts[lb.name.intern] += lb.code_count
22                         end
23                 end
24
25                 def post_process
26                         # since platforms can depend on other platforms,
27                         # we perform an iterative process and break when
28                         # no new platforms have been detected.
29                         while true do
30                                 prev_platforms = self.platforms.clone
31                                 uninfered_platforms.each do |p|
32                                         platforms << p if p.triggered?(self)
33                                 end
34                                 prev_tools = self.tools.clone
35                                 uninfered_tools.each do |t|
36                                         tools << t if t.triggered?(self)
37                                 end
38                                 break if prev_platforms == self.platforms && prev_tools == self.tools
39                         end
40                 end
41
42                 def uninfered_platforms #:nodoc:
43                         Gestalt::Platform.descendants - @platforms
44                 end
45
46                 def uninfered_tools #:nodoc:
47                         Gestalt::Tool.descendants - @tools
48                 end
49
50                 def includes_language?(language, min_percent = 0)
51                         return false unless language_counts[language]
52                         language_percents[language] >= min_percent
53                 end
54
55                 def language_percents
56                         @language_percents ||= begin
57                                 total = language_counts.values.inject(0) { |s,c| s+c }
58                                 l = {}
59                                 language_counts.each do |k,v|
60                                         l[k] = 100.0 * v.to_i / total
61                                 end
62                                 l
63                         end
64                 end
65
66         end
67 end
68