OTWO-1213 Works around lost encoding in Ruby/C binding layer
[ohcount] / ruby / gestalt.rb
1 # gestalt.rb written by Mitchell Foral. mitchell<att>caladbolg.net.
2 # See COPYING for license information.
3 # Ohcount module tweaked for use by Gestalts.
4
5 $: << File.expand_path(File.dirname(__FILE__))
6 require "ohcount"
7
8 # gestalt
9 require "gestalt/trigger"
10 require "gestalt/definition"
11 require "gestalt/base"
12 require "gestalt/definitions"
13 require "gestalt/dot_net_definitions"
14 require "gestalt/java_definitions"
15 require "gestalt/jasper_definitions"
16 require "gestalt/gestalt_engine"
17 require "gestalt/gestalt_facts"
18
19
20 module Ohcount
21   class SourceFile
22     def gestalts
23       gestalt_engine = Gestalt::GestaltEngine.new
24       gestalt_engine.process(self)
25       gestalt_engine.calc_gestalts
26       gestalt_engine.gestalts
27     end
28   end
29
30   class SourceFileList
31     def analyze_gestalt
32       @gestalt_engine = Gestalt::GestaltEngine.new
33       iter = self.head
34       while (iter)
35         @gestalt_engine.process(iter.sf)
36         iter = iter.next
37       end
38       @gestalt_engine.calc_gestalts
39     end
40
41     def gestalts
42       @gestalt_engine.gestalts if @gestalt_engine
43     end
44
45                 # call analyze to generate facts from a collection of files (typically a
46                 # project directory). Because deducing different facts often requires doing
47                 # similar work, this function allows multiple facts to be extracted in one
48                 # single pass
49                 #
50                 # *Fact* *Types*
51                 #
52                 # :gestalt:: platform dependencies and tools usage
53                 # :languages:: detailed programming languages facts
54                 # :java:: java-related dependencies (jars & imports)
55                 #
56                 # Examples
57                 #
58                 #  sfl = SourceFileList.new(:dir => '/foo/bar')
59                 #  sfl.analyze(:languages)
60                 #  puts sfl.ruby.code.count
61                 #
62                 def analyze(what = [:*])
63                         what = [what] unless what.is_a?(Array)
64
65                         do_gestalt   = what.include?(:gestalt)   || what.include?(:*)
66                         do_languages = what.include?(:language)  || what.include?(:*)
67
68                         analyze_languages() if do_languages
69                         analyze_gestalt() if do_gestalt
70                 end
71   end
72 end
73
74 if __FILE__ == $0
75   sourcefile_list = Ohcount::SourceFileList.new()
76   sourcefile_list.add_directory('.') if ARGV.size == 0
77   ARGV.each do |file_or_path|
78     if File.directory?(file_or_path)
79       sourcefile_list.add_directory(file_or_path)
80     else
81       sourcefile_list.add_file(file_or_path)
82     end
83   end
84         STDOUT.puts "Examining #{sourcefile_list.size} file(s) for gestalts."
85   sourcefile_list.analyze_gestalt()
86   sourcefile_list.gestalts.sort.each do |gestalt|
87     puts "#{gestalt.type}\t#{gestalt.count.to_s.rjust(8)}\t#{gestalt.name}"
88   end
89 end