Fix up Rubinius specific library specs.
[rbx.git] / lib / optparse / version.rb
blob558d9d710bf33722045977438777d595bbd3bff1
1 # OptionParser internal utility
3 class << OptionParser
4   def show_version(*pkg)
5     progname = ARGV.options.program_name
6     result = false
7     show = proc do |klass, cname, version|
8       str = "#{progname}"
9       unless klass == ::Object and cname == :VERSION
10         version = version.join(".") if Array === version
11         str << ": #{klass}" unless klass == Object
12         str << " version #{version}"
13       end
14       [:Release, :RELEASE].find do |rel|
15         if klass.const_defined?(rel)
16           str << " (#{klass.const_get(rel)})"
17         end
18       end
19       puts str
20       result = true
21     end
22     if pkg.size == 1 and pkg[0] == "all"
23       self.search_const(::Object, /\AV(?:ERSION|ersion)\z/) do |klass, cname, version|
24         unless cname[1] == ?e and klass.const_defined?(:Version)
25           show.call(klass, cname.intern, version)
26         end
27       end
28     else
29       pkg.each do |pkg|
30         begin
31           pkg = pkg.split(/::|\//).inject(::Object) {|m, c| m.const_get(c)}
32           v = case
33               when pkg.const_defined?(:Version)
34                 pkg.const_get(n = :Version)
35               when pkg.const_defined?(:VERSION)
36                 pkg.const_get(n = :VERSION)
37               else
38                 n = nil
39                 "unknown"
40               end
41           show.call(pkg, n, v)
42         rescue NameError
43         end
44       end
45     end
46     result
47   end
49   def each_const(path, klass = ::Object)
50     path.split(/::|\//).inject(klass) do |klass, name|
51       raise NameError, path unless Module === klass
52       klass.constants.grep(/#{name}/i) do |c|
53         klass.const_defined?(c) or next
54         c = klass.const_get(c)
55       end
56     end
57   end
59   def search_const(klass, name)
60     klasses = [klass]
61     while klass = klasses.shift
62       klass.constants.each do |cname|
63         klass.const_defined?(cname) or next
64         const = klass.const_get(cname)
65         yield klass, cname, const if name === cname
66         klasses << const if Module === const and const != ::Object
67       end
68     end
69   end
70 end