aboutsummaryrefslogtreecommitdiffstats
path: root/lib/optparse/version.rb
blob: 35152181b0c4058dca8b07a1fc929a487a2db319 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# OptionParser internal utility

class << OptionParser
  def show_version(*pkg)
    progname = ARGV.options.program_name
    show = proc do |klass, version|
      version = version.join(".") if Array === version
      str = "#{progname}: #{klass} version #{version}"
      if klass.const_defined?(:Release)
        str << " (#{klass.const_get(:Release)})"
      end
      puts str
    end
    if pkg.size == 1 and pkg[0] == "all"
      self.search_const(::Object, "Version", &show)
    else
      pkg.each do |pkg|
        /\A[A-Z]\w*((::|\/)[A-Z]\w*)*\z/ni =~ pkg or next
        begin
          pkg = eval(pkg)
          show.call(pkg, pkg.const_defined?(:Version) ? pkg.const_get(:Version) : "unknown")
        rescue NameError
          puts "#{progname}: #$!"
        end
      end
    end
    exit
  end

  def search_const(klass, name)
    klasses = [klass]
    while klass = klasses.shift
      klass.constants.each do |cname|
        klass.const_defined?(cname) or next
        const = klass.const_get(cname)
        yield klass, const if cname == name
        klasses << const if Module === const and const != ::Object
      end
    end
  end
end