Skip to content

Commit

Permalink
Revert "Sync did_you_mean"
Browse files Browse the repository at this point in the history
This reverts commit e22d293.
  • Loading branch information
yuki24 committed Oct 23, 2021
1 parent e22d293 commit 22249bb
Show file tree
Hide file tree
Showing 10 changed files with 134 additions and 104 deletions.
13 changes: 5 additions & 8 deletions lib/did_you_mean.rb
Expand Up @@ -7,8 +7,7 @@
require_relative 'did_you_mean/spell_checkers/key_error_checker'
require_relative 'did_you_mean/spell_checkers/null_checker'
require_relative 'did_you_mean/spell_checkers/require_path_checker'
require_relative 'did_you_mean/spell_checkers/pattern_key_name_checker'
require_relative 'did_you_mean/formatter'
require_relative 'did_you_mean/formatters/plain_formatter'
require_relative 'did_you_mean/tree_spell_checker'

# The +DidYouMean+ gem adds functionality to suggest possible method/class
Expand Down Expand Up @@ -98,18 +97,16 @@ def self.correct_error(error_class, spell_checker)
correct_error KeyError, KeyErrorChecker
correct_error NoMethodError, MethodNameChecker
correct_error LoadError, RequirePathChecker if RUBY_VERSION >= '2.8.0'
correct_error NoMatchingPatternKeyError, PatternKeyNameChecker if defined?(::NoMatchingPatternKeyError)

# Returns the currently set formatter. By default, it is set to +DidYouMean::Formatter+.
def self.formatter
@formatter
@@formatter
end

# Updates the primary formatter used to format the suggestions.
def self.formatter=(*)
warn "The custom formatter feature has been deprecated and has no effect. Please remove the usages of the " \
"`#formatter=` method."
def self.formatter=(formatter)
@@formatter = formatter
end

@formatter = Formatter.new
self.formatter = PlainFormatter.new
end
35 changes: 0 additions & 35 deletions lib/did_you_mean/formatter.rb

This file was deleted.

35 changes: 32 additions & 3 deletions lib/did_you_mean/formatters/plain_formatter.rb
@@ -1,4 +1,33 @@
require_relative '../formatter'
# frozen-string-literal: true

warn "`require 'did_you_mean/formatters/plain_formatter'` is deprecated. Please `require 'did_you_mean/formatter'` " \
"instead."
module DidYouMean
# The +DidYouMean::PlainFormatter+ is the basic, default formatter for the
# gem. The formatter responds to the +message_for+ method and it returns a
# human readable string.
class PlainFormatter

# Returns a human readable string that contains +corrections+. This
# formatter is designed to be less verbose to not take too much screen
# space while being helpful enough to the user.
#
# @example
#
# formatter = DidYouMean::PlainFormatter.new
#
# # displays suggestions in two lines with the leading empty line
# puts formatter.message_for(["methods", "method"])
#
# Did you mean? methods
# method
# # => nil
#
# # displays an empty line
# puts formatter.message_for([])
#
# # => nil
#
def message_for(corrections)
corrections.empty? ? "" : "\nDid you mean? #{corrections.join("\n ")}"
end
end
end
52 changes: 46 additions & 6 deletions lib/did_you_mean/formatters/verbose_formatter.rb
@@ -1,9 +1,49 @@
warn "`require 'did_you_mean/formatters/verbose_formatter'` is deprecated and falls back to the default formatter. "

require_relative '../formatter'

# frozen-string-literal: true

module DidYouMean
# For compatibility:
VerboseFormatter = Formatter
# The +DidYouMean::VerboseFormatter+ uses extra empty lines to make the
# suggestion stand out more in the error message.
#
# In order to activate the verbose formatter,
#
# @example
#
# OBject
# # => NameError: uninitialized constant OBject
# # Did you mean? Object
#
# require 'did_you_mean/verbose'
#
# OBject
# # => NameError: uninitialized constant OBject
# #
# # Did you mean? Object
# #
#
class VerboseFormatter

# Returns a human readable string that contains +corrections+. This
# formatter is designed to be less verbose to not take too much screen
# space while being helpful enough to the user.
#
# @example
#
# formatter = DidYouMean::PlainFormatter.new
#
# puts formatter.message_for(["methods", "method"])
#
#
# Did you mean? methods
# method
#
# # => nil
#
def message_for(corrections)
return "" if corrections.empty?

output = "\n\n Did you mean? ".dup
output << corrections.join("\n ")
output << "\n "
end
end
end
18 changes: 9 additions & 9 deletions lib/did_you_mean/spell_checker.rb
Expand Up @@ -10,25 +10,25 @@ def initialize(dictionary:)
end

def correct(input)
normalized_input = normalize(input)
threshold = normalized_input.length > 3 ? 0.834 : 0.77
input = normalize(input)
threshold = input.length > 3 ? 0.834 : 0.77

words = @dictionary.select { |word| JaroWinkler.distance(normalize(word), normalized_input) >= threshold }
words.reject! { |word| input.to_s == word.to_s }
words.sort_by! { |word| JaroWinkler.distance(word.to_s, normalized_input) }
words = @dictionary.select { |word| JaroWinkler.distance(normalize(word), input) >= threshold }
words.reject! { |word| input == word.to_s }
words.sort_by! { |word| JaroWinkler.distance(word.to_s, input) }
words.reverse!

# Correct mistypes
threshold = (normalized_input.length * 0.25).ceil
corrections = words.select { |c| Levenshtein.distance(normalize(c), normalized_input) <= threshold }
threshold = (input.length * 0.25).ceil
corrections = words.select { |c| Levenshtein.distance(normalize(c), input) <= threshold }

# Correct misspells
if corrections.empty?
corrections = words.select do |word|
word = normalize(word)
length = normalized_input.length < word.length ? normalized_input.length : word.length
length = input.length < word.length ? input.length : word.length

Levenshtein.distance(word, normalized_input) < length
Levenshtein.distance(word, input) < length
end.first(1)
end

Expand Down
20 changes: 0 additions & 20 deletions lib/did_you_mean/spell_checkers/pattern_key_name_checker.rb

This file was deleted.

6 changes: 4 additions & 2 deletions lib/did_you_mean/verbose.rb
@@ -1,2 +1,4 @@
warn "The verbose formatter has been removed and now `require 'did_you_mean/verbose'` has no effect. Please " \
"remove this call."
require_relative '../did_you_mean'
require_relative 'formatters/verbose_formatter'

DidYouMean.formatter = DidYouMean::VerboseFormatter.new
20 changes: 0 additions & 20 deletions test/did_you_mean/spell_checking/test_pattern_key_name_check.rb

This file was deleted.

1 change: 0 additions & 1 deletion test/did_you_mean/test_spell_checker.rb
Expand Up @@ -10,7 +10,6 @@ def test_spell_checker_corrects_mistypes
assert_spell 'eval', input: 'veal', dictionary: ['email', 'fail', 'eval']
assert_spell 'sub!', input: 'suv!', dictionary: ['sub', 'gsub', 'sub!']
assert_spell 'sub', input: 'suv', dictionary: ['sub', 'gsub', 'sub!']
assert_spell 'Foo', input: 'FOo', dictionary: ['Foo', 'FOo']

assert_spell %w(gsub! gsub), input: 'gsuv!', dictionary: %w(sub gsub gsub!)
assert_spell %w(sub! sub gsub!), input: 'ssub!', dictionary: %w(sub sub! gsub gsub!)
Expand Down
38 changes: 38 additions & 0 deletions test/did_you_mean/test_verbose_formatter.rb
@@ -0,0 +1,38 @@
require_relative './helper'

class VerboseFormatterTest < Test::Unit::TestCase
class ErrorHighlightDummyFormatter
def message_for(spot)
""
end
end

def setup
require_relative File.join(DidYouMean::TestHelper.root, 'verbose')

DidYouMean.formatter = DidYouMean::VerboseFormatter.new

if defined?(ErrorHighlight)
@error_highlight_old_formatter = ErrorHighlight.formatter
ErrorHighlight.formatter = ErrorHighlightDummyFormatter.new
end
end

def teardown
DidYouMean.formatter = DidYouMean::PlainFormatter.new

if defined?(ErrorHighlight)
ErrorHighlight.formatter = @error_highlight_old_formatter
end
end

def test_message
@error = assert_raise(NoMethodError){ 1.zeor? }

assert_match <<~MESSAGE.strip, @error.message
undefined method `zeor?' for 1:Integer
Did you mean? zero?
MESSAGE
end
end

0 comments on commit 22249bb

Please sign in to comment.