[NEW] Gestalts for silverlight + popular JS libs
[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/gestalt_engine"
16 require "gestalt/gestalt_facts"
17
18
19 module Ohcount
20   class SourceFile
21     def gestalts
22       gestalt_engine = Gestalt::GestaltEngine.new
23       gestalt_engine.process(self)
24       gestalt_engine.calc_gestalts
25       gestalt_engine.gestalts
26     end
27   end
28
29   class SourceFileList
30     def analyze_gestalt
31       @gestalt_engine = Gestalt::GestaltEngine.new
32       iter = self.head
33       while (iter)
34         @gestalt_engine.process(iter.sf)
35         iter = iter.next
36       end
37       @gestalt_engine.calc_gestalts
38     end
39
40     def gestalts
41       @gestalt_engine.gestalts if @gestalt_engine
42     end
43
44                 # call analyze to generate facts from a collection of files (typically a
45                 # project directory). Because deducing different facts often requires doing
46                 # similar work, this function allows multiple facts to be extracted in one
47                 # single pass
48                 #
49                 # *Fact* *Types*
50                 #
51                 # :gestalt:: platform dependencies and tools usage
52                 # :languages:: detailed programming languages facts
53                 # :java:: java-related dependencies (jars & imports)
54                 #
55                 # Examples
56                 #
57                 #  sfl = SourceFileList.new(:dir => '/foo/bar')
58                 #  sfl.analyze(:languages)
59                 #  puts sfl.ruby.code.count
60                 #
61                 def analyze(what = [:*])
62                         what = [what] unless what.is_a?(Array)
63
64                         do_gestalt   = what.include?(:gestalt)   || what.include?(:*)
65                         do_languages = what.include?(:language)  || what.include?(:*)
66
67                         analyze_languages() if do_languages
68                         analyze_gestalt() if do_gestalt
69                 end
70   end
71 end
72
73 if __FILE__ == $0
74   sourcefile_list = Ohcount::SourceFileList.new()
75   sourcefile_list.add_directory('.') if ARGV.size == 0
76   ARGV.each do |file_or_path|
77     if File.directory?(file_or_path)
78       sourcefile_list.add_directory(file_or_path)
79     else
80       sourcefile_list.add_file(file_or_path)
81     end
82   end
83         STDOUT.puts "Examining #{sourcefile_list.size} file(s) for gestalts."
84   sourcefile_list.analyze_gestalt()
85   sourcefile_list.gestalts.sort.each do |gestalt|
86     puts "#{gestalt.type}\t#{gestalt.count.to_s.rjust(8)}\t#{gestalt.name}"
87   end
88 end