module DidYouMean

The DidYouMean gem adds functionality to suggest possible method/class names upon errors such as NameError and NoMethodError. In Ruby 2.3 or later, it is automatically activated during startup.

@example

methosd
# => NameError: undefined local variable or method `methosd' for main:Object
#   Did you mean?  methods
#                  method

OBject
# => NameError: uninitialized constant OBject
#    Did you mean?  Object

@full_name = "Yuki Nishijima"
first_name, last_name = full_name.split(" ")
# => NameError: undefined local variable or method `full_name' for main:Object
#    Did you mean?  @full_name

@@full_name = "Yuki Nishijima"
@@full_anme
# => NameError: uninitialized class variable @@full_anme in Object
#    Did you mean?  @@full_name

full_name = "Yuki Nishijima"
full_name.starts_with?("Y")
# => NoMethodError: undefined method `starts_with?' for "Yuki Nishijima":String
#    Did you mean?  start_with?

hash = {foo: 1, bar: 2, baz: 3}
hash.fetch(:fooo)
# => KeyError: key not found: :fooo
#    Did you mean?  :foo

Disabling did_you_mean ↑

Occasionally, you may want to disable the did_you_mean gem for e.g. debugging issues in the error object itself. You can disable it entirely by specifying --disable-did_you_mean option to the ruby command:

$ ruby --disable-did_you_mean -e "1.zeor?"
-e:1:in `<main>': undefined method `zeor?' for 1:Integer (NameError)

When you do not have direct access to the ruby command (e.g. +rails console+, irb), you could applyoptions using the RUBYOPT environment variable:

$ RUBYOPT='--disable-did_you_mean' irb
irb:0> 1.zeor?
# => NoMethodError (undefined method `zeor?' for 1:Integer)

Getting the original error message ↑

Sometimes, you do not want to disable the gem entirely, but need to get the original error message without suggestions (e.g. testing). In this case, you could use the #original_message method on the error object:

no_method_error = begin
                    1.zeor?
                  rescue NoMethodError => error
                    error
                  end

no_method_error.message
# => NoMethodError (undefined method `zeor?' for 1:Integer)
#    Did you mean?  zero?

no_method_error.original_message
# => NoMethodError (undefined method `zeor?' for 1:Integer)

Constants

SPELL_CHECKERS

Map of error types and spell checker objects.

Public Class Methods

correct_error(error_class, spell_checker) click to toggle source

Adds DidYouMean functionality to an error using a given spell checker

# File lib/did_you_mean.rb, line 90
def self.correct_error(error_class, spell_checker)
  SPELL_CHECKERS[error_class.name] = spell_checker
  error_class.prepend(Correctable) unless error_class < Correctable
end
formatter() click to toggle source

Returns the currenctly set formatter. By default, it is set to DidYouMean::Formatter.

# File lib/did_you_mean.rb, line 100
def self.formatter
  @@formatter
end
formatter=(formatter) click to toggle source

Updates the primary formatter used to format the suggestions.

# File lib/did_you_mean.rb, line 105
def self.formatter=(formatter)
  @@formatter = formatter
end