Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ end

group :test do
gem "childlabor"
gem "coveralls", ">= 0.8.19"
gem 'coveralls_reborn', '~> 0.23.1', require: false if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.6.0")
gem "rspec", ">= 3.2"
gem "rspec-mocks", ">= 3"
gem "rubocop", "~> 0.50.0"
Expand Down
14 changes: 8 additions & 6 deletions spec/helper.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
$TESTING = true

require "simplecov"
require "coveralls"
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.6.0")
require "simplecov"
require "coveralls"

SimpleCov.formatters = [SimpleCov::Formatter::HTMLFormatter, Coveralls::SimpleCov::Formatter]
SimpleCov.formatters = [SimpleCov::Formatter::HTMLFormatter, Coveralls::SimpleCov::Formatter]

SimpleCov.start do
add_filter "/spec"
minimum_coverage(90)
SimpleCov.start do
add_filter "/spec"
minimum_coverage(90)
end
end

$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
Expand Down
4 changes: 2 additions & 2 deletions spec/line_editor_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
describe ".readline" do
it "uses the Readline line editor" do
editor = double("Readline")
expect(Thor::LineEditor::Readline).to receive(:new).with("Enter your name ", :default => "Brian").and_return(editor)
expect(Thor::LineEditor::Readline).to receive(:new).with("Enter your name ", {:default => "Brian"}).and_return(editor)
expect(editor).to receive(:readline).and_return("George")
expect(Thor::LineEditor.readline("Enter your name ", :default => "Brian")).to eq("George")
end
Expand All @@ -35,7 +35,7 @@
describe ".readline" do
it "uses the Basic line editor" do
editor = double("Basic")
expect(Thor::LineEditor::Basic).to receive(:new).with("Enter your name ", :default => "Brian").and_return(editor)
expect(Thor::LineEditor::Basic).to receive(:new).with("Enter your name ", {:default => "Brian"}).and_return(editor)
expect(editor).to receive(:readline).and_return("George")
expect(Thor::LineEditor.readline("Enter your name ", :default => "Brian")).to eq("George")
end
Expand Down
4 changes: 3 additions & 1 deletion spec/parser/options_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,9 @@ def remaining
expected = "Unknown switches \"--baz\""
expected << "\nDid you mean? \"--bar\"" if Thor::Correctable

expect { check_unknown! }.to raise_error(Thor::UnknownArgumentError, expected)
expect { check_unknown! }.to raise_error(Thor::UnknownArgumentError) do |error|
expect(error.to_s).to eq(expected)
end
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@voxik pointed out elsewhere:

I wonder, shouldn't rather be the Thor::Correctable line above dropped instead? But that would probably not be backward compatible with older rspec-mock 🤔

I can validate that removing that line instead does fix it for ruby 3.0.

This is caused by rspec/rspec-expectations#1339 just for the context.

But I don't think this is the same issue addressed by that PR, because rspec/rspec-expectations#1339 was included in rspec-expectations v3.11.0, and using that version, you still get an error in main.

I'm neutral on which way to fix it (just want the CI to be green 😀 )

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that the rspec-expectations PR now tries to preserve the original exception message, which is not modified by error_higlight or did you mean. And that is the reason why the test case fails.

Actually, thinking about it once again, the error failure reported by RSpec might be still misleading, because it says something different then it does. This is the message:

       expected Thor::UnknownArgumentError with "Unknown switches \"--baz\"\nDid you mean?  \"--bar\"", got #<Thor::UnknownArgumentError: Unknown switches "--baz"
       Did you mean?  "--bar"> with backtrace:

... snip ...

But because it internally compares the expected message with the original message, is should actually report:

       expected Thor::UnknownArgumentError with "Unknown switches \"--baz\"\nDid you mean?  \"--bar\"", got #<Thor::UnknownArgumentError: Unknown switches "--baz"> with backtrace:

Because that is what is actually happening on background.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@voxik can you clarify for me - is there any action needed on this PR or is it good to go in your opinion?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is really not up to me. I just randomly hit the similar issue and tried to understand the code and provide some feedback. It is ultimately up to Thor folks to decide what this test should actually test. If the DidYouMean / Thor::Correctable should be covered by this test case or not. I think that it should be extracted into independent test case, but I'll be also fine if the test suite is green 🟢

end

it "skips leading non-switches" do
Expand Down
34 changes: 17 additions & 17 deletions spec/shell/basic_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -70,80 +70,80 @@ def shell

it "prints a message to the user with the available options, expects case-sensitive matching, and determines the correctness of the answer" do
flavors = %w(strawberry chocolate vanilla)
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] ', :limited_to => flavors).and_return("chocolate")
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] ', {:limited_to => flavors}).and_return("chocolate")
expect(shell.ask('What\'s your favorite Neopolitan flavor?', :limited_to => flavors)).to eq("chocolate")
end

it "prints a message to the user with the available options, expects case-sensitive matching, and reasks the question after an incorrect response" do
flavors = %w(strawberry chocolate vanilla)
expect($stdout).to receive(:print).with("Your response must be one of: [strawberry, chocolate, vanilla]. Please try again.\n")
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] ', :limited_to => flavors).and_return("moose tracks", "chocolate")
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] ', {:limited_to => flavors}).and_return("moose tracks", "chocolate")
expect(shell.ask('What\'s your favorite Neopolitan flavor?', :limited_to => flavors)).to eq("chocolate")
end

it "prints a message to the user with the available options, expects case-sensitive matching, and reasks the question after a case-insensitive match" do
flavors = %w(strawberry chocolate vanilla)
expect($stdout).to receive(:print).with("Your response must be one of: [strawberry, chocolate, vanilla]. Please try again.\n")
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] ', :limited_to => flavors).and_return("cHoCoLaTe", "chocolate")
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] ', {:limited_to => flavors}).and_return("cHoCoLaTe", "chocolate")
expect(shell.ask('What\'s your favorite Neopolitan flavor?', :limited_to => flavors)).to eq("chocolate")
end

it "prints a message to the user with the available options, expects case-insensitive matching, and determines the correctness of the answer" do
flavors = %w(strawberry chocolate vanilla)
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] ', :limited_to => flavors, :case_insensitive => true).and_return("CHOCOLATE")
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] ', {:limited_to => flavors, :case_insensitive => true}).and_return("CHOCOLATE")
expect(shell.ask('What\'s your favorite Neopolitan flavor?', :limited_to => flavors, :case_insensitive => true)).to eq("chocolate")
end

it "prints a message to the user with the available options, expects case-insensitive matching, and reasks the question after an incorrect response" do
flavors = %w(strawberry chocolate vanilla)
expect($stdout).to receive(:print).with("Your response must be one of: [strawberry, chocolate, vanilla]. Please try again.\n")
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] ', :limited_to => flavors, :case_insensitive => true).and_return("moose tracks", "chocolate")
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] ', {:limited_to => flavors, :case_insensitive => true}).and_return("moose tracks", "chocolate")
expect(shell.ask('What\'s your favorite Neopolitan flavor?', :limited_to => flavors, :case_insensitive => true)).to eq("chocolate")
end

it "prints a message to the user containing a default and sets the default if only enter is pressed" do
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? (vanilla) ', :default => "vanilla").and_return("")
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? (vanilla) ', {:default => "vanilla"}).and_return("")
expect(shell.ask('What\'s your favorite Neopolitan flavor?', :default => "vanilla")).to eq("vanilla")
end

it "prints a message to the user with the available options and reasks the question after an incorrect response and then returns the default" do
flavors = %w(strawberry chocolate vanilla)
expect($stdout).to receive(:print).with("Your response must be one of: [strawberry, chocolate, vanilla]. Please try again.\n")
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] (vanilla) ', :default => "vanilla", :limited_to => flavors).and_return("moose tracks", "")
expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] (vanilla) ', {:default => "vanilla", :limited_to => flavors}).and_return("moose tracks", "")
expect(shell.ask("What's your favorite Neopolitan flavor?", :default => "vanilla", :limited_to => flavors)).to eq("vanilla")
end
end

describe "#yes?" do
it "asks the user and returns true if the user replies yes" do
expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", :add_to_history => false).and_return("y")
expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", {:add_to_history => false}).and_return("y")
expect(shell.yes?("Should I overwrite it?")).to be true
end

it "asks the user and returns false if the user replies no" do
expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", :add_to_history => false).and_return("n")
expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", {:add_to_history => false}).and_return("n")
expect(shell.yes?("Should I overwrite it?")).not_to be true
end

it "asks the user and returns false if the user replies with an answer other than yes or no" do
expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", :add_to_history => false).and_return("foobar")
expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", {:add_to_history => false}).and_return("foobar")
expect(shell.yes?("Should I overwrite it?")).to be false
end
end

describe "#no?" do
it "asks the user and returns true if the user replies no" do
expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", :add_to_history => false).and_return("n")
expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", {:add_to_history => false}).and_return("n")
expect(shell.no?("Should I overwrite it?")).to be true
end

it "asks the user and returns false if the user replies yes" do
expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", :add_to_history => false).and_return("Yes")
expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", {:add_to_history => false}).and_return("Yes")
expect(shell.no?("Should I overwrite it?")).to be false
end

it "asks the user and returns false if the user replies with an answer other than yes or no" do
expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", :add_to_history => false).and_return("foobar")
expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", {:add_to_history => false}).and_return("foobar")
expect(shell.no?("Should I overwrite it?")).to be false
end
end
Expand Down Expand Up @@ -431,13 +431,13 @@ def #456 Lanç...
expect(content).to eq(<<-TABLE)
Name Number Color
Erik 1234567890123 green
TABLE
TABLE
end
end

describe "#file_collision" do
it "shows a menu with options" do
expect(Thor::LineEditor).to receive(:readline).with('Overwrite foo? (enter "h" for help) [Ynaqh] ', :add_to_history => false).and_return("n")
expect(Thor::LineEditor).to receive(:readline).with('Overwrite foo? (enter "h" for help) [Ynaqh] ', {:add_to_history => false}).and_return("n")
shell.file_collision("foo")
end

Expand Down Expand Up @@ -478,7 +478,7 @@ def #456 Lanç...
end

it "always returns true if the user chooses always" do
expect(Thor::LineEditor).to receive(:readline).with('Overwrite foo? (enter "h" for help) [Ynaqh] ', :add_to_history => false).and_return("a")
expect(Thor::LineEditor).to receive(:readline).with('Overwrite foo? (enter "h" for help) [Ynaqh] ', {:add_to_history => false}).and_return("a")

expect(shell.file_collision("foo")).to be true

Expand All @@ -488,7 +488,7 @@ def #456 Lanç...

describe "when a block is given" do
it "displays diff and merge options to the user" do
expect(Thor::LineEditor).to receive(:readline).with('Overwrite foo? (enter "h" for help) [Ynaqdhm] ', :add_to_history => false).and_return("s")
expect(Thor::LineEditor).to receive(:readline).with('Overwrite foo? (enter "h" for help) [Ynaqdhm] ', {:add_to_history => false}).and_return("s")
shell.file_collision("foo") {}
end

Expand Down