diff --git a/lib/rake/task_manager.rb b/lib/rake/task_manager.rb index f928309ed..37340fd25 100644 --- a/lib/rake/task_manager.rb +++ b/lib/rake/task_manager.rb @@ -56,7 +56,21 @@ def [](task_name, scopes=nil) self.lookup(task_name, scopes) or enhance_with_matching_rule(task_name) or synthesize_file_task(task_name) or - fail "Don't know how to build task '#{task_name}' (see --tasks)" + fail generate_message_for_undefined_task(task_name) + end + + def generate_message_for_undefined_task(task_name) + message = "Don't know how to build task '#{task_name}' (see --tasks)" + + suggestion_message = \ + if defined?(::DidYouMean::SpellChecker) && defined?(::DidYouMean::Formatter) + suggestions = ::DidYouMean::SpellChecker.new(dictionary: @tasks.keys).correct(task_name.to_s) + suggestion_message = ::DidYouMean::Formatter.new(suggestions).to_s + else + "" + end + + message + suggestion_message end def synthesize_file_task(task_name) # :nodoc: diff --git a/test/test_rake_task.rb b/test/test_rake_task.rb index b2bbb6d95..bbf3b5444 100644 --- a/test/test_rake_task.rb +++ b/test/test_rake_task.rb @@ -453,4 +453,15 @@ def test_source_is_first_prerequisite t = task t: ["preqA", "preqB"] assert_equal "preqA", t.source end -end + + def test_suggests_valid_rake_task_names + task :test + error = assert_raises(RuntimeError) { Task[:testt] } + + assert_match /Don\'t know how to build task \'testt\'/, error.message + + if defined?(::DidYouMean::SpellChecker) && defined?(::DidYouMean::Formatter) + assert_match /Did you mean\? test/, error.message + end + end +end \ No newline at end of file