errors/did_you_mean_suggestions.rb

tests/_examples/errors/did_you_mean_suggestions.rb in the metorex repository.

# Ruby appends what a misspelled name may have meant to the report of a
# NameError, NoMethodError, KeyError, LoadError or NoMatchingPatternKeyError.
require("rbconfig")
require("tmpdir")

def suggested
  yield
rescue NameError, KeyError, LoadError, NoMatchingPatternKeyError => error
  p([error.class, error.corrections])
  p(error.detailed_message(highlight: false, error_highlight: false))
end

class Shelf
  def capacity = 12
  def label = "pantry"
end

first_name = "Ann"
suggested { firts_name }
suggested { [1].each { firts_name } }
suggested { Strng }
suggested { Shelf.new.capcity }
suggested { Shelf.new.lable }
suggested { {name: 1}.fetch(:nme) }
suggested { {"alpha" => 1}.fetch("alpah") }
suggested { {name: 1}.fetch("name") }
suggested { require("fileutil") }
suggested { case {name: 1}; in {nmae:}; end }
suggested { Shelf.new.nothing_close }

error = (Shelf.new.capcity rescue $!)
p(error.detailed_message(highlight: false, error_highlight: false, did_you_mean: false))
p(error.detailed_message(highlight: true, error_highlight: false))
p(error.message)

checker = DidYouMean::SpellChecker.new(dictionary: %w[apple banana cherry])
p(checker.correct("appel"))
p(checker.correct("bananna"))
p(checker.correct("grape"))
paths = DidYouMean::TreeSpellChecker.new(dictionary: %w[net/http net/ftp open3])
p(paths.correct("net/htp"))
p(DidYouMean::Formatter.message_for(["first", "second"]))
p(DidYouMean::Formatter.message_for([]))
p(DidYouMean::JaroWinkler.distance("martha", "marhta").round(4))
p(DidYouMean::Levenshtein.distance("kitten", "sitting"))

Dir.mktmpdir do |directory|
  script = File.join(directory, "missing_key.rb")
  File.write(script, "raise KeyError.new(\"missing\", receiver: {name: 1}, key: :nme)\n")
  report = IO.popen([RbConfig.ruby, "missing_key.rb", err: [:child, :out], chdir: directory], &:read)
  puts(report.sub(/\A.*in '<main>': /, ""))
  quiet = IO.popen([RbConfig.ruby, "--disable=did_you_mean", "missing_key.rb", err: [:child, :out], chdir: directory], &:read)
  puts(quiet.sub(/\A.*in '<main>': /, ""))
end

Output:

[NameError, [:first_name]]
"undefined local variable or method 'firts_name' for main (NameError)\nDid you mean?  first_name"
[NameError, [:first_name]]
"undefined local variable or method 'firts_name' for main (NameError)\nDid you mean?  first_name"
[NameError, ["String"]]
"uninitialized constant Strng (NameError)\nDid you mean?  String"
[NoMethodError, [:capacity]]
"undefined method 'capcity' for an instance of Shelf (NoMethodError)\nDid you mean?  capacity"
[NoMethodError, [:label]]
"undefined method 'lable' for an instance of Shelf (NoMethodError)\nDid you mean?  label"
[KeyError, [":name"]]
"key not found: :nme (KeyError)\nDid you mean?  :name"
[KeyError, ["\"alpha\""]]
"key not found: \"alpah\" (KeyError)\nDid you mean?  \"alpha\""
[KeyError, [":name"]]
"key not found: \"name\" (KeyError)\nDid you mean?  :name"
[LoadError, ["fileutils"]]
"cannot load such file -- fileutil (LoadError)\nDid you mean?  fileutils"
[NoMatchingPatternKeyError, [":name"]]
"{name: 1}: key not found: :nmae (NoMatchingPatternKeyError)\nDid you mean?  :name"
[NoMethodError, []]
"undefined method 'nothing_close' for an instance of Shelf (NoMethodError)"
"undefined method 'capcity' for an instance of Shelf (NoMethodError)"
"\e[1mundefined method 'capcity' for an instance of Shelf (\e[1;4mNoMethodError\e[m\e[1m)\e[m\n\e[1mDid you mean?  capacity\e[m"
"undefined method 'capcity' for an instance of Shelf"
["apple"]
["banana"]
[]
["net/http", "net/ftp"]
"\nDid you mean?  first\n               second"
""
0.9611
3
missing (KeyError)
Did you mean?  :name
missing (KeyError)