ruby 1.8.7 BC patch - Force encoding only for ruby 1.9
[ohcount] / ruby / ohcount.rb
1 # ohcount.rb written by Mitchell Foral. mitchell<att>caladbolg.net.
2 # See COPYING for license information.
3 # Ohcount module tweaked for use by Ohloh.
4
5 $: << File.expand_path(File.dirname(__FILE__))
6 $: << "#{File.expand_path(File.dirname(__FILE__))}/#{`#{File.dirname(__FILE__)}/print_arch`.strip}"
7
8 require 'ohcount.so'
9
10 module Ohcount
11   class SourceFile
12     def file_location=(value) set_diskpath(value) end
13     def file_location() diskpath() end
14     def filenames=(value) set_filenames(value) end
15     def polyglot() get_language() end
16
17     def contents
18       data = get_contents()
19       return data unless data.respond_to?(:force_encoding)
20       data.force_encoding(Encoding.default_external)
21     end
22
23     def language_breakdowns
24       list = get_parsed_language_list()
25       return array_from_list(list, :pl)
26     end
27
28     def language_breakdown(language)
29       return language_breakdowns().find { |lb| lb.name == language.to_s }
30     end
31
32     def licenses
33       list = get_license_list()
34       array = array_from_list(list, :lic)
35       return array.map! { |l| l.name }
36     end
37
38     def languages
39       return language_breakdowns().collect { |lb| lb.name }
40     end
41
42     def loc_list
43       list = get_loc_list()
44       return array_from_list(list, :loc)
45     end
46
47     def diff(to)
48       list = _diff(to)
49       ret = array_from_list(list, :delta)
50       class << ret
51         def loc_deltas() self end
52       end
53       return ret
54     end
55
56     def each
57       filenames.each { |f| yield f }
58     end
59
60     private
61
62     def array_from_list(list, method)
63       array = Array.new
64       iter = list.head
65       while (iter)
66         array << iter.send(method)
67         iter = iter.next
68       end
69       return array
70     end
71   end
72
73   class SourceFileList
74     def each_source_file
75       iter = self.head
76       while (iter)
77         yield iter.sf if iter.sf.polyglot
78         iter = iter.next
79       end
80     end
81
82                 # this should yield each filename, not an sf object
83                 def each
84       iter = self.head
85       while (iter)
86         yield iter.sf.filename if iter.sf
87         iter = iter.next
88       end
89                 end
90
91     def size
92       count = 0
93       iter = self.head
94       while (iter)
95         count += 1
96         iter = iter.next
97       end
98       return count
99     end
100   end
101
102   class Detector
103     def self.binary_filename?(filename)
104       return Ohcount.ohcount_is_binary_filename(filename) == 1
105     end
106   end
107 end