4 # smells is a general class that aggregates facts required to deduce
10 @language_facts = LanguageFacts.new
12 @source_file_rules = []
13 @definitions = Definition.all_definitions.map do |d|
14 new_definition = d.clone
15 new_definition.top_level_or.each_rule do |r|
16 @source_file_rules << r if r.is_a?(FileRule)
22 def process_source_file(source_file)
23 @source_file_rules.each do |r|
24 r.process_source_file(source_file)
26 @language_facts.process_source_file(source_file)
29 def process_source_files(source_file_list)
30 source_file_list.each_source_file do |source_file|
31 process_source_file source_file
37 if what.is_a?(SourceFile)
38 process_source_file(what)
39 elsif what.is_a?(SourceFileList)
40 process_source_file_list(what)
42 raise ArgumentError.new
46 def calc_gestalts(definitions = nil)
47 # since gestalts can depend on other gestalts, we perform an
48 # iterative process and break when no new gestalts have been
56 @definitions.each do |d|
58 new_gestalts = d.gestalts(self)
61 @gestalts += new_gestalts
64 @definitions -= yank_definitions
66 # did we make any progress?
67 break if gestalt_count == @gestalts.size
70 gestalt_count = @gestalts.size
76 def has_gestalt?(type,name)
78 g.type.to_s == type.to_s &&
83 def includes_language?(language, min_percent)
84 @language_facts.includes_language?(language,min_percent)
89 # keeps track of languages seen
93 @language_counts ||= {}
96 def process_source_file(source_file)
97 source_file.language_breakdowns.each do |lb|
98 @language_counts[lb.name.intern] ||= 0
99 @language_counts[lb.name.intern] += lb.code_count
103 def includes_language?(language, min_percent = 0)
104 return false unless @language_counts[language]
105 language_percents[language] >= min_percent
108 # ignores markup languages (xml/html)
109 def language_percents
110 @language_percents ||= begin
112 @language_counts.each_pair do |name,code_count|
113 language = Ohcount.ohcount_hash_language_from_name(name.to_s)
114 STDOUT.puts "Warning: Couldn't find #{name} in ohcount_hash_language_from_name" if language.nil?
115 next if language.nil? || language.category == 1
120 @language_counts.each do |k,v|
121 l[k] = 100.0 * v.to_i / total