Отключить автозаполнение флагов OptionParser в Ruby - PullRequest
6 голосов
/ 03 апреля 2019
#!/usr/bin/env ruby

require 'optparse'

options = {}
OptionParser.new do |opts|
  opts.on("--language LANGUAGE", ["Ruby", "JavaScript"]) do |language|
    options[:language] = language
  end 
end.parse!

puts "Language: #{options[:language]}"

Если я запусту это с ./bin/example --language Ru, он выдаст:

Язык: Ruby

Я бы хотел отключить это поведение autocomplete/closest matchи пусть OptionParser будет поднят, когда точное имя не указано, однако я не вижу способа сделать это из их документации.

Есть идеи?

1 Ответ

1 голос
/ 22 апреля 2019

параметры поиска определены в self.regexp

метод complete, кажется, возвращает все различные флаги.

Метод self.regexp определяет используемый поисковый запрос

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

Регулярное выражение построено со следующими флагами

\A поиск изначало строки

\w* поиск любого из подходящих символов

candidate итерации с использованием объекта метода &method(:each)передается как proc с &.method object вызывается для Completion класса.

candidates = candidate(key, icase, pat, &method(:each)).sort_by {|k, v, kn| kn.size}

блока iterates внутри self.candidate

def self.candidate(key, icase = false, pat = nil, &block)
  pat ||= Completion.regexp(key, icase)
  candidates = []
  block.call do |k, *v|
    // Search and add candidates
  end
  candidates
end

Прогон iteratorследующая проверка для each записи.У меня до сих пор нет 100% понимания этой проверки, я отвечаю за поиск флагов.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...