Я работаю над камнем 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".
В любом случае, есть ли лучший способ?
Не могли бы вы рассказать полный сценарий Тору? – acw
mmm ... Я боюсь, что он довольно долгое время, хотя это просто интерфейсная логика с вызовами других классов. Однако он не отклоняется от примеров на [thor home] (http://whatisthor.com/). – tompave