aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorYuki Nishijima <yk.nishijima@gmail.com>2021-10-22 20:56:26 -0400
committerYuki Nishijima <yk.nishijima@gmail.com>2021-10-22 20:56:26 -0400
commit22249bbb371d794c0330c1a4512f2581c1040297 (patch)
tree7d22c2dfc085e9dd3f478f9cd3ca312be345a308 /lib
parente22d293e06966733e71a7fd9725eee06c03d0177 (diff)
downloadruby-22249bbb371d794c0330c1a4512f2581c1040297.tar.gz
Revert "Sync did_you_mean"
This reverts commit e22d293e06966733e71a7fd9725eee06c03d0177.
Diffstat (limited to 'lib')
-rw-r--r--lib/did_you_mean.rb13
-rw-r--r--lib/did_you_mean/formatter.rb35
-rw-r--r--lib/did_you_mean/formatters/plain_formatter.rb35
-rw-r--r--lib/did_you_mean/formatters/verbose_formatter.rb52
-rw-r--r--lib/did_you_mean/spell_checker.rb18
-rw-r--r--lib/did_you_mean/spell_checkers/pattern_key_name_checker.rb20
-rw-r--r--lib/did_you_mean/verbose.rb6
7 files changed, 96 insertions, 83 deletions
diff --git a/lib/did_you_mean.rb b/lib/did_you_mean.rb
index b317bf5ab5..ab7e6b01a8 100644
--- a/lib/did_you_mean.rb
+++ b/lib/did_you_mean.rb
@@ -7,8 +7,7 @@ require_relative 'did_you_mean/spell_checkers/method_name_checker'
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
@@ -98,18 +97,16 @@ module DidYouMean
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
diff --git a/lib/did_you_mean/formatter.rb b/lib/did_you_mean/formatter.rb
deleted file mode 100644
index 01eb59100a..0000000000
--- a/lib/did_you_mean/formatter.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen-string-literal: true
-
-module DidYouMean
- # The +DidYouMean::Formatter+ is the basic, default formatter for the
- # gem. The formatter responds to the +message_for+ method and it returns a
- # human readable string.
- class Formatter
-
- # 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::Formatter.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
-
- PlainFormatter = Formatter
-end
diff --git a/lib/did_you_mean/formatters/plain_formatter.rb b/lib/did_you_mean/formatters/plain_formatter.rb
index d669588e0f..e2d995f587 100644
--- a/lib/did_you_mean/formatters/plain_formatter.rb
+++ b/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
diff --git a/lib/did_you_mean/formatters/verbose_formatter.rb b/lib/did_you_mean/formatters/verbose_formatter.rb
index 8ee98fa070..b8fe214d57 100644
--- a/lib/did_you_mean/formatters/verbose_formatter.rb
+++ b/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
diff --git a/lib/did_you_mean/spell_checker.rb b/lib/did_you_mean/spell_checker.rb
index 37da2fc7a6..e5106abba2 100644
--- a/lib/did_you_mean/spell_checker.rb
+++ b/lib/did_you_mean/spell_checker.rb
@@ -10,25 +10,25 @@ module DidYouMean
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
diff --git a/lib/did_you_mean/spell_checkers/pattern_key_name_checker.rb b/lib/did_you_mean/spell_checkers/pattern_key_name_checker.rb
deleted file mode 100644
index ed263c8f93..0000000000
--- a/lib/did_you_mean/spell_checkers/pattern_key_name_checker.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-require_relative "../spell_checker"
-
-module DidYouMean
- class PatternKeyNameChecker
- def initialize(no_matching_pattern_key_error)
- @key = no_matching_pattern_key_error.key
- @keys = no_matching_pattern_key_error.matchee.keys
- end
-
- def corrections
- @corrections ||= exact_matches.empty? ? SpellChecker.new(dictionary: @keys).correct(@key).map(&:inspect) : exact_matches
- end
-
- private
-
- def exact_matches
- @exact_matches ||= @keys.select { |word| @key == word.to_s }.map(&:inspect)
- end
- end
-end
diff --git a/lib/did_you_mean/verbose.rb b/lib/did_you_mean/verbose.rb
index 1ff19aef80..4e86f167ea 100644
--- a/lib/did_you_mean/verbose.rb
+++ b/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