ruby-changes:61205
From: Yuki <ko1@a...>
Date: Tue, 12 May 2020 12:25:32 +0900 (JST)
Subject: [ruby-changes:61205] 946dadd3f4 (master): Sync did_you_mean
https://git.ruby-lang.org/ruby.git/commit/?id=946dadd3f4 From 946dadd3f479198e87873a863d15c7660a8e2b56 Mon Sep 17 00:00:00 2001 From: Yuki Nishijima <yk.nishijima@g...> Date: Mon, 11 May 2020 23:24:39 -0400 Subject: Sync did_you_mean diff --git a/lib/did_you_mean.rb b/lib/did_you_mean.rb index b8f9257..2dbd2fb 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' https://github.com/ruby/ruby/blob/trunk/lib/did_you_mean.rb#L6 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 https://github.com/ruby/ruby/blob/trunk/lib/did_you_mean.rb#L96 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 3a38245..0483127 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 https://github.com/ruby/ruby/blob/trunk/lib/did_you_mean/spell_checkers/method_name_checker.rb#L43 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 0000000..1023994 --- /dev/null +++ b/lib/did_you_mean/spell_checkers/require_path_checker.rb @@ -0,0 +1,33 @@ https://github.com/ruby/ruby/blob/trunk/lib/did_you_mean/spell_checkers/require_path_checker.rb#L1 +# 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 f3a6b1c..6e14e6a 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 https://github.com/ruby/ruby/blob/trunk/test/did_you_mean/spell_checking/test_method_name_check.rb#L137 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 0000000..8c4da6e --- /dev/null +++ b/test/did_you_mean/spell_checking/test_require_path_check.rb @@ -0,0 +1,30 @@ https://github.com/ruby/ruby/blob/trunk/test/did_you_mean/spell_checking/test_require_path_check.rb#L1 +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 92ea9a1..d8f2f46 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' https://github.com/ruby/ruby/blob/trunk/test/did_you_mean/test_verbose_formatter.rb#L3 class VerboseFormatterTest < Test::Unit::TestCase def setup require_relative File.join(DidYouMean::TestHelper.root, 'verbose') + DidYouMean.formatter = DidYouMean::VerboseFormatter.new end -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/