summaryrefslogtreecommitdiff
path: root/lib/optparse.rb
diff options
context:
space:
mode:
authorYusuke Endoh <mame@ruby-lang.org>2019-10-16 16:31:41 +0900
committerYusuke Endoh <mame@ruby-lang.org>2019-10-18 12:20:58 +0900
commitc3b64a86bcd7773c081f5049115c57ec73d7a76a (patch)
treeeb4cc5141106c3da19624a1efb3f8db02dc7fd87 /lib/optparse.rb
parent5ca5529d223ee962451685badc9e928ea87dbb44 (diff)
lib/optparse.rb: Show a did_you_mean hint for unknown option
``` require 'optparse' OptionParser.new do |opts| opts.on("-f", "--foo", "foo") {|v| } opts.on("-b", "--bar", "bar") {|v| } opts.on("-c", "--baz", "baz") {|v| } end.parse! ``` ``` $ ruby test.rb --baa Traceback (most recent call last): test.rb:7:in `<main>': invalid option: --baa (OptionParser::InvalidOption) Did you mean? baz bar ```
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/2561
Diffstat (limited to 'lib/optparse.rb')
-rw-r--r--lib/optparse.rb18
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/optparse.rb b/lib/optparse.rb
index 25e262a69a..9ed7b72b27 100644
--- a/lib/optparse.rb
+++ b/lib/optparse.rb
@@ -866,6 +866,10 @@ class OptionParser
__send__(id).complete(opt, icase, *pat, &block)
end
+ def get_candidates(id)
+ yield __send__(id).keys
+ end
+
#
# Iterates over each option, passing the option to the +block+.
#
@@ -1766,7 +1770,17 @@ XXX
end
raise AmbiguousOption, catch(:ambiguous) {
visit(:complete, typ, opt, icase, *pat) {|o, *sw| return sw}
- raise InvalidOption, opt
+ if defined? DidYouMean::SpellChecker
+ all_candidates = []
+ visit(:get_candidates, typ) do |candidates|
+ all_candidates.concat(candidates)
+ end
+ all_candidates.select! {|cand| cand.is_a?(String) }
+ suggestions = DidYouMean::SpellChecker.new(dictionary: all_candidates).correct(opt)
+ raise InvalidOption.new(opt, "\nDid you mean? #{suggestions.join("\n ")}")
+ else
+ raise InvalidOption, opt
+ end
}
end
private :complete
@@ -2048,7 +2062,7 @@ XXX
# Default stringizing method to emit standard error message.
#
def message
- reason + ': ' + args.join(' ')
+ reason + ': ' + args.join(" ").gsub(/\s+$/, "")
end
alias to_s message