2013-04-10 7 views
2

Я работаю над камнем Ruby, который следует использовать в качестве утилиты CLI.Ruby, Thor gem ArgumentError

Я решил использовать Thor, который используется командой rails и, кажется, очень гибкая (о различиях с rake: link).

Проблема в том, что я не могу найти способ обработки ошибки ввода. Например, если я ввожу неправильный вариант, Thor автоматически возвращает хорошее предупреждение:

$ myawesomescript blabla 
Could not find command "blabla". 

Но, если я использую команду, которая не может быть решена, все становится уродливым. Например, есть команда «help» по умолчанию, и я определил команду «привет». Если я типа просто «час» это то, что я получаю:

$ myawesomescript h 
/Users/Tom/.rvm/gems/ruby-2.0.0-p0/gems/thor-0.18.1/lib/thor.rb:424:in `normalize_command_name': Ambiguous command h matches [hello, help] (ArgumentError) 
    from /Users/Tom/.rvm/gems/ruby-2.0.0-p0/gems/thor-0.18.1/lib/thor.rb:340:in `dispatch' 
    from /Users/Tom/.rvm/gems/ruby-2.0.0-p0/gems/thor-0.18.1/lib/thor/base.rb:439:in `start' 
    from /Users/Tom/Documents/ruby/myawesomescript/bin/myawesomescript:9:in `<top (required)>' 
    from /Users/Tom/.rvm/gems/ruby-2.0.0-p0/bin/myawesomescript:23:in `load' 
    from /Users/Tom/.rvm/gems/ruby-2.0.0-p0/bin/myawesomescript:23:in `<main>' 
    from /Users/Tom/.rvm/gems/ruby-2.0.0-p0/bin/ruby_noexec_wrapper:14:in `eval' 
    from /Users/Tom/.rvm/gems/ruby-2.0.0-p0/bin/ruby_noexec_wrapper:14:in `<main>' 
myawesomescript $ 

Теперь я знаю, что просто набрав «час» это глупо, и что я мог бы просто переименовать свои команды, но я не хочу, чтобы пользователи см. подобные сообщения об ошибках.

Я попытался переопределить этот метод с:

def normalize_command_name(meth) 
    super(meth) 
rescue ArgumentError => e 
    puts "print something useful" 
end 

... но она не работает


Новые подробности:

ОК, я заметил, что этот метод был объявленные в классе, а не экземпляры. Я попытался следующие, и, кажется, работает хорошо, но это не является идеальным и немного Hacky:

файл: Библиотека/myawesomescript/thor_overrides.rb

require 'thor' 

class Thor 
    class << self 

    protected 
     def normalize_command_name(meth) 
     return default_command.to_s.gsub('-', '_') unless meth 

     possibilities = find_command_possibilities(meth) 
     if possibilities.size > 1 
      raise ArgumentError, "Ambiguous command #{meth} matches [#{possibilities.join(', ')}]" 
     elsif possibilities.size < 1 
      meth = meth || default_command 
     elsif map[meth] 
      meth = map[meth] 
     else 
      meth = possibilities.first 
     end 

     meth.to_s.gsub('-','_') # treat foo-bar as foo_bar 
     rescue ArgumentError => e 
     # do nothing 
     end 
     alias normalize_task_name normalize_command_name 
    end 
end 

Там я добавил следующие строки:

rescue ArgumentError => e 
    # do nothing 

И это делает трюк, как это кажется, что где-то какой-то кусок кода ухаживает сообщения об ошибке:

$ myawesomescript h 
Could not find command "h". 

В любом случае, есть ли лучший способ?

+0

Не могли бы вы рассказать полный сценарий Тору? – acw

+0

mmm ... Я боюсь, что он довольно долгое время, хотя это просто интерфейсная логика с вызовами других классов. Однако он не отклоняется от примеров на [thor home] (http://whatisthor.com/). – tompave

ответ

1

Если вы посмотрите на сообщение об ошибке:

Ambiguous command h matches [hello, help] 

Вышеуказанные средства, для h, Thor является нахождение более одного матча. Это связано с командой help, уже определенной (встроенной).

Вместо того, чтобы пытаться обойти его вокруг, я бы предложил вам использовать встроенную команду справки, чтобы показать справку & о том, что делает ваш инструмент CLI.

Чтобы получить один ярлыки команд письма работать - вы должны назвать свою команду, чтобы не начать с буквы h, как foo или bar, yo & так далее и т.д.

Если вам нужны команды, начинающиеся с буквы h, просто уточните.

+0

Благодарим за предложение. Да, это имеет смысл, но вопрос был в большей степени о том, чтобы предотвратить появление рубиновой обратной линии в целом, а не только в этой конкретной заботе. Тем не менее, приветствует поздний ответ. – tompave

Смежные вопросы