summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/did_you_mean.rb4
-rw-r--r--lib/did_you_mean/spell_checkers/method_name_checker.rb7
-rw-r--r--lib/did_you_mean/spell_checkers/require_path_checker.rb33
-rw-r--r--test/did_you_mean/spell_checking/test_method_name_check.rb7
-rw-r--r--test/did_you_mean/spell_checking/test_require_path_check.rb30
-rw-r--r--test/did_you_mean/test_verbose_formatter.rb1
6 files changed, 80 insertions, 2 deletions
diff --git a/lib/did_you_mean.rb b/lib/did_you_mean.rb
index b8f92579ca..2dbd2fb9f6 100644
--- a/lib/did_you_mean.rb
+++ b/lib/did_you_mean.rb
@@ -6,6 +6,7 @@ require_relative 'did_you_mean/spell_checkers/name_error_checkers'
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/formatters/plain_formatter'
require_relative 'did_you_mean/tree_spell_checker'
@@ -95,8 +96,9 @@ module DidYouMean
correct_error NameError, NameErrorCheckers
correct_error KeyError, KeyErrorChecker
correct_error NoMethodError, MethodNameChecker
+ correct_error LoadError, RequirePathChecker
- # Returns the currenctly set formatter. By default, it is set to +DidYouMean::Formatter+.
+ # Returns the currently set formatter. By default, it is set to +DidYouMean::Formatter+.
def self.formatter
@@formatter
end
diff --git a/lib/did_you_mean/spell_checkers/method_name_checker.rb b/lib/did_you_mean/spell_checkers/method_name_checker.rb
index 3a38245f0c..0483127d6f 100644
--- a/lib/did_you_mean/spell_checkers/method_name_checker.rb
+++ b/lib/did_you_mean/spell_checkers/method_name_checker.rb
@@ -43,7 +43,12 @@ module DidYouMean
end
def corrections
- @corrections ||= SpellChecker.new(dictionary: RB_RESERVED_WORDS + method_names).correct(method_name) - names_to_exclude
+ @corrections ||= begin
+ dictionary = method_names
+ dictionary = RB_RESERVED_WORDS + dictionary if @private_call
+
+ SpellChecker.new(dictionary: dictionary).correct(method_name) - names_to_exclude
+ end
end
def method_names
diff --git a/lib/did_you_mean/spell_checkers/require_path_checker.rb b/lib/did_you_mean/spell_checkers/require_path_checker.rb
new file mode 100644
index 0000000000..10239947dd
--- /dev/null
+++ b/lib/did_you_mean/spell_checkers/require_path_checker.rb
@@ -0,0 +1,33 @@
+# frozen-string-literal: true
+
+require_relative "../spell_checker"
+require_relative "../tree_spell_checker"
+
+module DidYouMean
+ class RequirePathChecker
+ attr_reader :path
+
+ INITIAL_LOAD_PATH = $LOAD_PATH.dup.freeze
+ ENV_SPECIFIC_EXT = ".#{RbConfig::CONFIG["DLEXT"]}"
+
+ private_constant :INITIAL_LOAD_PATH, :ENV_SPECIFIC_EXT
+
+ def self.requireables
+ @requireables ||= INITIAL_LOAD_PATH
+ .flat_map {|path| Dir.glob("**/???*{.rb,#{ENV_SPECIFIC_EXT}}", base: path) }
+ .map {|path| path.chomp!(".rb") || path.chomp!(ENV_SPECIFIC_EXT) }
+ end
+
+ def initialize(exception)
+ @path = exception.path
+ end
+
+ def corrections
+ threshold = path.size * 2
+ dictionary = self.class.requireables.reject {|str| str.size >= threshold }
+ spell_checker = path.include?("/") ? TreeSpellChecker : SpellChecker
+
+ spell_checker.new(dictionary: dictionary).correct(path)
+ end
+ end
+end
diff --git a/test/did_you_mean/spell_checking/test_method_name_check.rb b/test/did_you_mean/spell_checking/test_method_name_check.rb
index f3a6b1c7c7..6e14e6acc4 100644
--- a/test/did_you_mean/spell_checking/test_method_name_check.rb
+++ b/test/did_you_mean/spell_checking/test_method_name_check.rb
@@ -137,4 +137,11 @@ class MethodNameCheckTest < Test::Unit::TestCase
assert_correction :yield, error.corrections
assert_match "Did you mean? yield", error.to_s
end
+
+ def test_does_not_suggest_yield
+ error = assert_raise(NoMethodError) { 1.yeild }
+
+ assert_correction [], error.corrections
+ assert_not_match(/Did you mean\? +yield/, error.to_s)
+ end if RUBY_ENGINE != "jruby"
end
diff --git a/test/did_you_mean/spell_checking/test_require_path_check.rb b/test/did_you_mean/spell_checking/test_require_path_check.rb
new file mode 100644
index 0000000000..8c4da6efbe
--- /dev/null
+++ b/test/did_you_mean/spell_checking/test_require_path_check.rb
@@ -0,0 +1,30 @@
+require_relative '../helper'
+
+class RequirePathCheckTest < Test::Unit::TestCase
+ include DidYouMean::TestHelper
+
+ def test_load_error_from_require_has_suggestions
+ error = assert_raise LoadError do
+ require 'open_struct'
+ end
+
+ assert_correction 'ostruct', error.corrections
+ assert_match "Did you mean? ostruct", error.to_s
+ end
+
+ def test_load_error_from_require_for_nested_files_has_suggestions
+ error = assert_raise LoadError do
+ require 'net/htt'
+ end
+
+ assert_correction 'net/http', error.corrections
+ assert_match "Did you mean? net/http", error.to_s
+
+ error = assert_raise LoadError do
+ require 'net-http'
+ end
+
+ assert_correction ['net/http', 'net/https'], error.corrections
+ assert_match "Did you mean? net/http", error.to_s
+ end
+end
diff --git a/test/did_you_mean/test_verbose_formatter.rb b/test/did_you_mean/test_verbose_formatter.rb
index 92ea9a1c16..d8f2f46273 100644
--- a/test/did_you_mean/test_verbose_formatter.rb
+++ b/test/did_you_mean/test_verbose_formatter.rb
@@ -3,6 +3,7 @@ require_relative './helper'
class VerboseFormatterTest < Test::Unit::TestCase
def setup
require_relative File.join(DidYouMean::TestHelper.root, 'verbose')
+
DidYouMean.formatter = DidYouMean::VerboseFormatter.new
end