aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/command
diff options
context:
space:
mode:
authorGenadi Samokovarov <gsamokovarov@gmail.com>2018-03-17 15:55:44 +0200
committerGenadi Samokovarov <gsamokovarov@gmail.com>2018-03-23 11:36:03 +0200
commitcb25f2c989588edf77f978820196b4446e01ffe8 (patch)
tree0dd189e6496b065194ec99a04b5c3e3651449031 /railties/lib/rails/command
parentef73318e29666786feb00e9e9b3b49a771bb0b73 (diff)
downloadrails-cb25f2c989588edf77f978820196b4446e01ffe8.tar.gz
rails-cb25f2c989588edf77f978820196b4446e01ffe8.tar.bz2
rails-cb25f2c989588edf77f978820196b4446e01ffe8.zip
Use `did_you_mean` spell checker for option suggestions
Now that we require Ruby over `2.3`, we can replace the current suggestion methods we have with tooling from the `did_you_mean` gem. There is a small user visible change and this is that we now offer a single suggestion for misspelled options. We are suggesting fixes during generator invocation and during a mistyped rails server rack handler. In both cases, if we don't make a proper prediction on the first match, we won't do so in the second or third one, so in my mind, this is okay.
Diffstat (limited to 'railties/lib/rails/command')
-rw-r--r--railties/lib/rails/command/spellchecker.rb46
1 files changed, 2 insertions, 44 deletions
diff --git a/railties/lib/rails/command/spellchecker.rb b/railties/lib/rails/command/spellchecker.rb
index 59ccab4ea2..154358cd45 100644
--- a/railties/lib/rails/command/spellchecker.rb
+++ b/railties/lib/rails/command/spellchecker.rb
@@ -3,50 +3,8 @@
module Rails
module Command
module Spellchecker # :nodoc:
- class << self
- def suggest(word, from:, count: 3)
- from.sort_by { |w| levenshtein_distance(word, w) }.take(count)
- end
-
- private
- # This code is based directly on the Text gem implementation.
- # Copyright (c) 2006-2013 Paul Battley, Michael Neumann, Tim Fletcher.
- #
- # Returns a value representing the "cost" of transforming str1 into str2.
- def levenshtein_distance(str1, str2) # :doc:
- s = str1
- t = str2
- n = s.length
- m = t.length
-
- return m if (0 == n)
- return n if (0 == m)
-
- d = (0..m).to_a
- x = nil
-
- # avoid duplicating an enumerable object in the loop
- str2_codepoint_enumerable = str2.each_codepoint
-
- str1.each_codepoint.with_index do |char1, i|
- e = i + 1
-
- str2_codepoint_enumerable.with_index do |char2, j|
- cost = (char1 == char2) ? 0 : 1
- x = [
- d[j + 1] + 1, # insertion
- e + 1, # deletion
- d[j] + cost # substitution
- ].min
- d[j] = e
- e = x
- end
-
- d[m] = x
- end
-
- x
- end
+ def self.suggest(word, from:)
+ DidYouMean::SpellChecker.new(dictionary: from.map(&:to_s)).correct(word).first
end
end
end