Module: OptionParser::Completion

Included in:
CompletingHash, OptionMap
Defined in:
lib/optparse.rb

Overview

Keyword completion module. This allows partial arguments to be specified and resolved against a list of acceptable values.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.candidate(key, icase = false, pat = nil, &block) ⇒ Object



447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
# File 'lib/optparse.rb', line 447

def self.candidate(key, icase = false, pat = nil, &block)
  pat ||= Completion.regexp(key, icase)
  candidates = []
  block.call do |k, *v|
    (if Regexp === k
       kn = ""
       k === key
     else
       kn = defined?(k.id2name) ? k.id2name : k
       pat === kn
     end) or next
    v << k if v.empty?
    candidates << [k, v, kn]
  end
  candidates
end

.regexp(key, icase) ⇒ Object

:nodoc:



443
444
445
# File 'lib/optparse.rb', line 443

def self.regexp(key, icase)
  Regexp.new('\A' + Regexp.quote(key).gsub(/\w+\b/, '\&\w*'), icase)
end

Instance Method Details

#candidate(key, icase = false, pat = nil, &_) ⇒ Object



464
465
466
# File 'lib/optparse.rb', line 464

def candidate(key, icase = false, pat = nil, &_)
  Completion.candidate(key, icase, pat, &method(:each))
end

#complete(key, icase = false, pat = nil) ⇒ Object



469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
# File 'lib/optparse.rb', line 469

def complete(key, icase = false, pat = nil)
  candidates = candidate(key, icase, pat, &method(:each)).sort_by {|k, v, kn| kn.size}
  if candidates.size == 1
    canon, sw, * = candidates[0]
  elsif candidates.size > 1
    canon, sw, cn = candidates.shift
    candidates.each do |k, v, kn|
      next if sw == v
      if String === cn and String === kn
        if cn.rindex(kn, 0)
          canon, sw, cn = k, v, kn
          next
        elsif kn.rindex(cn, 0)
          next
        end
      end
      throw :ambiguous, key
    end
  end
  if canon
    block_given? or return key, *sw
    yield(key, *sw)
  end
end

#convert(opt = nil, val = nil) ⇒ Object



494
495
496
# File 'lib/optparse.rb', line 494

def convert(opt = nil, val = nil, *)
  val
end