Module: DidYouMean

Defined in:
lib/did_you_mean.rb,
lib/did_you_mean/version.rb,
lib/did_you_mean/formatter.rb,
lib/did_you_mean/levenshtein.rb,
lib/did_you_mean/jaro_winkler.rb,
lib/did_you_mean/spell_checker.rb,
lib/did_you_mean/tree_spell_checker.rb,
lib/did_you_mean/core_ext/name_error.rb,
lib/did_you_mean/spell_checkers/null_checker.rb,
lib/did_you_mean/formatters/verbose_formatter.rb,
lib/did_you_mean/spell_checkers/key_error_checker.rb,
lib/did_you_mean/spell_checkers/method_name_checker.rb,
lib/did_you_mean/spell_checkers/name_error_checkers.rb,
lib/did_you_mean/spell_checkers/require_path_checker.rb,
lib/did_you_mean/spell_checkers/pattern_key_name_checker.rb,
lib/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rb,
lib/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rb

Overview

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.

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)

Examples:


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

Defined Under Namespace

Modules: Correctable, Jaro, JaroWinkler, Levenshtein Classes: ClassNameChecker, Formatter, KeyErrorChecker, MethodNameChecker, NullChecker, PatternKeyNameChecker, RequirePathChecker, SpellChecker, TreeSpellChecker, VariableNameChecker

Constant Summary collapse

VERSION =
"2.0.0".freeze
PlainFormatter =
Formatter
VerboseFormatter =

For compatibility:

Formatter

Class Method Summary collapse

Class Method Details

.correct_error(error_class, spell_checker) ⇒ Object

Adds DidYouMean functionality to an error using a given spell checker



97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/did_you_mean.rb', line 97

def self.correct_error(error_class, spell_checker)
  if defined?(Ractor)
    new_mapping = { **@spell_checkers, error_class.to_s => spell_checker }
    new_mapping.default = NullChecker

    @spell_checkers = Ractor.make_shareable(new_mapping)
  else
    spell_checkers[error_class.to_s] = spell_checker
  end

  error_class.prepend(Correctable) if error_class.is_a?(Class) && !(error_class < Correctable)
end

.formatterObject

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



117
118
119
120
121
122
123
# File 'lib/did_you_mean.rb', line 117

def self.formatter
  if defined?(Ractor)
    Ractor.current[:__did_you_mean_formatter__] || Formatter
  else
    Formatter
  end
end

.formatter=(formatter) ⇒ Object

Updates the primary formatter used to format the suggestions.



126
127
128
129
130
# File 'lib/did_you_mean.rb', line 126

def self.formatter=(formatter)
  if defined?(Ractor)
    Ractor.current[:__did_you_mean_formatter__] = formatter
  end
end

.spell_checkersObject

Returns a sharable hash map of error types and spell checker objects.



92
93
94
# File 'lib/did_you_mean.rb', line 92

def self.spell_checkers
  @spell_checkers
end