diff options
Diffstat (limited to 'jni/ruby/lib/optparse')
| -rw-r--r-- | jni/ruby/lib/optparse/ac.rb | 50 | ||||
| -rw-r--r-- | jni/ruby/lib/optparse/date.rb | 17 | ||||
| -rw-r--r-- | jni/ruby/lib/optparse/shellwords.rb | 6 | ||||
| -rw-r--r-- | jni/ruby/lib/optparse/time.rb | 10 | ||||
| -rw-r--r-- | jni/ruby/lib/optparse/uri.rb | 6 | ||||
| -rw-r--r-- | jni/ruby/lib/optparse/version.rb | 70 | 
6 files changed, 159 insertions, 0 deletions
| diff --git a/jni/ruby/lib/optparse/ac.rb b/jni/ruby/lib/optparse/ac.rb new file mode 100644 index 0000000..6a86260 --- /dev/null +++ b/jni/ruby/lib/optparse/ac.rb @@ -0,0 +1,50 @@ +require 'optparse' + +class OptionParser::AC < OptionParser +  private + +  def _check_ac_args(name, block) +    unless /\A\w[-\w]*\z/ =~ name +      raise ArgumentError, name +    end +    unless block +      raise ArgumentError, "no block given", ParseError.filter_backtrace(caller) +    end +  end + +  def _ac_arg_enable(prefix, name, help_string, block) +    _check_ac_args(name, block) + +    sdesc = [] +    ldesc = ["--#{prefix}-#{name}"] +    desc = [help_string] +    q = name.downcase +    enable = Switch::NoArgument.new(nil, proc {true}, sdesc, ldesc, nil, desc, block) +    disable = Switch::NoArgument.new(nil, proc {false}, sdesc, ldesc, nil, desc, block) +    top.append(enable, [], ["enable-" + q], disable, ['disable-' + q]) +    enable +  end + +  public + +  def ac_arg_enable(name, help_string, &block) +    _ac_arg_enable("enable", name, help_string, block) +  end + +  def ac_arg_disable(name, help_string, &block) +    _ac_arg_enable("disable", name, help_string, block) +  end + +  def ac_arg_with(name, help_string, &block) +    _check_ac_args(name, block) + +    sdesc = [] +    ldesc = ["--with-#{name}"] +    desc = [help_string] +    q = name.downcase +    with = Switch::PlacedArgument.new(*search(:atype, String), sdesc, ldesc, nil, desc, block) +    without = Switch::NoArgument.new(nil, proc {}, sdesc, ldesc, nil, desc, block) +    top.append(with, [], ["with-" + q], without, ['without-' + q]) +    with +  end +end diff --git a/jni/ruby/lib/optparse/date.rb b/jni/ruby/lib/optparse/date.rb new file mode 100644 index 0000000..d680559 --- /dev/null +++ b/jni/ruby/lib/optparse/date.rb @@ -0,0 +1,17 @@ +require 'optparse' +require 'date' + +OptionParser.accept(DateTime) do |s,| +  begin +    DateTime.parse(s) if s +  rescue ArgumentError +    raise OptionParser::InvalidArgument, s +  end +end +OptionParser.accept(Date) do |s,| +  begin +    Date.parse(s) if s +  rescue ArgumentError +    raise OptionParser::InvalidArgument, s +  end +end diff --git a/jni/ruby/lib/optparse/shellwords.rb b/jni/ruby/lib/optparse/shellwords.rb new file mode 100644 index 0000000..0422d7c --- /dev/null +++ b/jni/ruby/lib/optparse/shellwords.rb @@ -0,0 +1,6 @@ +# -*- ruby -*- + +require 'shellwords' +require 'optparse' + +OptionParser.accept(Shellwords) {|s,| Shellwords.shellwords(s)} diff --git a/jni/ruby/lib/optparse/time.rb b/jni/ruby/lib/optparse/time.rb new file mode 100644 index 0000000..402cadc --- /dev/null +++ b/jni/ruby/lib/optparse/time.rb @@ -0,0 +1,10 @@ +require 'optparse' +require 'time' + +OptionParser.accept(Time) do |s,| +  begin +    (Time.httpdate(s) rescue Time.parse(s)) if s +  rescue +    raise OptionParser::InvalidArgument, s +  end +end diff --git a/jni/ruby/lib/optparse/uri.rb b/jni/ruby/lib/optparse/uri.rb new file mode 100644 index 0000000..024dc69 --- /dev/null +++ b/jni/ruby/lib/optparse/uri.rb @@ -0,0 +1,6 @@ +# -*- ruby -*- + +require 'optparse' +require 'uri' + +OptionParser.accept(URI) {|s,| URI.parse(s) if s} diff --git a/jni/ruby/lib/optparse/version.rb b/jni/ruby/lib/optparse/version.rb new file mode 100644 index 0000000..8525677 --- /dev/null +++ b/jni/ruby/lib/optparse/version.rb @@ -0,0 +1,70 @@ +# OptionParser internal utility + +class << OptionParser +  def show_version(*pkgs) +    progname = ARGV.options.program_name +    result = false +    show = proc do |klass, cname, version| +      str = "#{progname}" +      unless klass == ::Object and cname == :VERSION +        version = version.join(".") if Array === version +        str << ": #{klass}" unless klass == Object +        str << " version #{version}" +      end +      [:Release, :RELEASE].find do |rel| +        if klass.const_defined?(rel) +          str << " (#{klass.const_get(rel)})" +        end +      end +      puts str +      result = true +    end +    if pkgs.size == 1 and pkgs[0] == "all" +      self.search_const(::Object, /\AV(?:ERSION|ersion)\z/) do |klass, cname, version| +        unless cname[1] == ?e and klass.const_defined?(:Version) +          show.call(klass, cname.intern, version) +        end +      end +    else +      pkgs.each do |pkg| +        begin +          pkg = pkg.split(/::|\//).inject(::Object) {|m, c| m.const_get(c)} +          v = case +              when pkg.const_defined?(:Version) +                pkg.const_get(n = :Version) +              when pkg.const_defined?(:VERSION) +                pkg.const_get(n = :VERSION) +              else +                n = nil +                "unknown" +              end +          show.call(pkg, n, v) +        rescue NameError +        end +      end +    end +    result +  end + +  def each_const(path, base = ::Object) +    path.split(/::|\//).inject(base) do |klass, name| +      raise NameError, path unless Module === klass +      klass.constants.grep(/#{name}/i) do |c| +        klass.const_defined?(c) or next +        klass.const_get(c) +      end +    end +  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, cname, const if name === cname +        klasses << const if Module === const and const != ::Object +      end +    end +  end +end | 
