This repository was archived by the owner on Nov 30, 2024. It is now read-only.
File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -139,6 +139,7 @@ def self.world
139139 module Core
140140 autoload :ExampleStatusPersister , "rspec/core/example_status_persister"
141141 autoload :Profiler , "rspec/core/profiler"
142+ autoload :DidYouMean , "rspec/core/did_you_mean"
142143
143144 # @private
144145 # This avoids issues with reporting time caused by examples that
Original file line number Diff line number Diff line change @@ -2032,6 +2032,11 @@ def bisect_runner_class
20322032
20332033 def load_file_handling_errors ( method , file )
20342034 __send__ ( method , file )
2035+ rescue LoadError => ex
2036+ relative_file = Metadata . relative_path ( file )
2037+ suggestions = DidYouMean . new ( relative_file ) . call
2038+ reporter . notify_non_example_exception ( ex , "An error occurred while loading #{ relative_file } .#{ suggestions } " )
2039+ RSpec . world . wants_to_quit = true
20352040 rescue Support ::AllExceptionsExceptOnesWeMustNotRescue => ex
20362041 relative_file = Metadata . relative_path ( file )
20372042 reporter . notify_non_example_exception ( ex , "An error occurred while loading #{ relative_file } ." )
Original file line number Diff line number Diff line change 1+ module RSpec
2+ module Core
3+ # @private
4+ # Wrapper around Ruby's `DidYouMean::SpellChecker` when available to provide file name suggestions.
5+ class DidYouMean
6+ attr_reader :relative_file_name
7+
8+ def initialize ( relative_file_name )
9+ @relative_file_name = relative_file_name
10+ end
11+
12+ if defined? ( ::DidYouMean ::SpellChecker )
13+ # provide probable suggestions
14+ def call
15+ checker = ::DidYouMean ::SpellChecker . new ( :dictionary => Dir [ "spec/**/*.rb" ] )
16+ probables = checker . correct ( relative_file_name . sub ( './' , '' ) ) [ 0 ..2 ]
17+ return '' unless probables . any?
18+
19+ formats probables
20+ end
21+ else
22+ # return a hint if API for ::DidYouMean::SpellChecker not supported
23+ def call
24+ "\n Hint: Install the `did_you_mean` gem in order to provide suggestions for similarly named files."
25+ end
26+ end
27+
28+ private
29+
30+ def formats ( probables )
31+ rspec_format = probables . map { |s , _ | "rspec ./#{ s } " }
32+ red_font ( top_and_tail rspec_format )
33+ end
34+
35+ def top_and_tail ( rspec_format )
36+ spaces = ' ' * 20
37+ rspec_format . insert ( 0 , ' - Did you mean?' ) . join ( "\n #{ spaces } " ) + "\n "
38+ end
39+
40+ def red_font ( mytext )
41+ colorizer = ::RSpec ::Core ::Formatters ::ConsoleCodes
42+ colorizer . wrap mytext , :failure
43+ end
44+ end
45+ end
46+ end
Original file line number Diff line number Diff line change 1+ module RSpec
2+ module Core
3+ RSpec . describe DidYouMean do
4+ describe '#call' do
5+ context "when `DidYouMean::SpellChecker` is available" , :skip => !defined? ( ::DidYouMean ::SpellChecker ) do
6+ context 'Success' do
7+ let ( :name ) { './spec/rspec/core/did_you_mean_spec.rb' }
8+ it 'returns a useful suggestion' do
9+ expect ( DidYouMean . new ( name [ 0 ..-2 ] ) . call ) . to include name
10+ end
11+ context 'numerous possibilities' do
12+ it 'returns a small number of suggestions' do
13+ name = './spec/rspec/core/drb_spec.r'
14+ suggestions = DidYouMean . new ( name ) . call
15+ expect ( suggestions . split ( "\n " ) . size ) . to eq 4
16+ end
17+ end
18+ end
19+ context 'No suitable suggestions' do
20+ it 'returns empty string' do
21+ name = './' + 'x' * 50
22+ expect ( DidYouMean . new ( name ) . call ) . to eq ''
23+ end
24+ end
25+ end
26+ context "when `DidYouMean::SpellChecker` is not available" , :unless => defined? ( ::DidYouMean ::SpellChecker ) do
27+ describe 'Success' do
28+ let ( :name ) { './spec/rspec/core/did_you_mean_spec.rb' }
29+ it 'returns a hint' do
30+ expect ( DidYouMean . new ( name [ 0 ..-2 ] ) . call ) . to include 'Hint:'
31+ end
32+ end
33+ end
34+ end
35+ end
36+ end
37+ end
You can’t perform that action at this time.
0 commit comments