-
Notifications
You must be signed in to change notification settings - Fork 89
LinuxCommand#verify cleaned up #530
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
LinuxCommand#verify cleaned up #530
Conversation
Hello vsingh-msys! Thanks for the pull request! Here is what will happen next:
Thank you for contributing! |
Hi @zenspider |
lib/train/extras/command_wrapper.rb
Outdated
"sudo: command not found" => | ||
msg, reason = | ||
case rawerr | ||
when /Sorry, try again/ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why are these regexps?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is no specific to match regex, I only thought of would be nice if we do exact match vs similar one
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, String#===
(what is used under a case/when
is an exact match... All of these strings went from "some string"
to /some string/
, so they went from exact match to a regexp (partial) match. As such, this is looser than before.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@zenspider I do agree with your concern so added minor updates for constructing rawerr
and have updated the exact match of string.
"sudo to allow for non-interactive usage.", :sudo_no_tty], | ||
}.each do |sudo, human| | ||
rawerr = human if rawerr.include? sudo | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure I'm sold on the benefits of switching this to a case
yet. Can you explain this?
That said, I'm REALLY not sold on the each
here... it could probably have been a hash lookup? Unless this bit answers the question about why there's regexps now... in which I case I guess I'm sold on the case
+ regexps
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey @zenspider,
Here the only reason for switching to the case
is if an exception would occur I would rather say:
I am the one instead of I am one of them
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure I understand that. Assuming my interpretation is correct, then you're doing "I am the one" via raise
, not via case
vs {...}.each
.
res | ||
elsif transport.platform.windows? | ||
res = WindowsCommand.new(transport, options) | ||
res | ||
WindowsCommand.new(transport, options) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thank you!
lib/train/extras/command_wrapper.rb
Outdated
msg, reason = verification_res | ||
raise Train::UserError.new("Sudo failed: #{msg}", reason) | ||
end | ||
res.verify |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Much better... I like that you're just calling it. Please rename it to verify!
to denote that it is a bit more angry now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@zenspider need your suggestion in order to rename verify
to verify!
.
As we have base class CommandWrapperBase
as a defined methods interface class. and the implementation in LinuxCommand & WindowsCommand classes.
We have the following options to rename verify!
:
1. Just rename all the places wherever is used e.i. in CommandWrapperBase
, WindowsCommand
and LinuxCommand
classes.
OR
2. For class LinuxCommand
define as an alias method.
alias verify! verify
OR
3. Add verify!
method as well in order to make angrier
a) verify
should return nil on success and array object when an error occurs
# (see CommandWrapperBase::verify)
def verify
res = @backend.run_command(run("echo"))
return nil if res.exit_status == 0
rawerr = res.stdout + " " + res.stderr
case rawerr
when /Sorry, try again/
["Wrong sudo password.", :bad_sudo_password]
when /sudo: no tty present and no askpass program specified/
["Sudo requires a password, please configure it.", :sudo_password_required]
when /sudo: command not found/
["Can't find sudo command. Please either install and "\
"configure it on the target or deactivate sudo.", :sudo_command_not_found]
when /sudo: sorry, you must have a tty to run sudo/
["Sudo requires a TTY. Please see the README on how to configure "\
"sudo to allow for non-interactive usage.", :sudo_no_tty]
else
[rawerr, nil]
end
end
b) Add verify!
and raise an error if occurs.
def verify!
msg, reason = verify
return nil unless msg
raise Train::UserError.new("Sudo failed: #{msg}", reason)
end
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah. Then either 3.b or 4: ignore @zenspider.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added verify!
method and updated the PR please have a look again thanks
it "custom error for bad sudo password" do | ||
backend.stubs(:run_command).returns(mock_connect_result("Sorry, try again", 1)) | ||
lc = cls.new(backend, { sudo: true }) | ||
_ { lc.verify }.must_raise Train::UserError |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
must_raise
returns the exception... please test the error message.
Might also want test cases for all of the edge cases covered.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I should add... this can all be refactored into an assertion to make these 1-liners.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay noted, thankyou so much for the feedback, will cover more test cases and update you accordingly.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm OK with the regexp and case. I would like to see a bit more testing but I think that's coming anyway.
lib/train/extras/command_wrapper.rb
Outdated
"sudo: command not found" => | ||
msg, reason = | ||
case rawerr | ||
when /Sorry, try again/ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, String#===
(what is used under a case/when
is an exact match... All of these strings went from "some string"
to /some string/
, so they went from exact match to a regexp (partial) match. As such, this is looser than before.
lib/train/extras/command_wrapper.rb
Outdated
msg, reason = verification_res | ||
raise Train::UserError.new("Sudo failed: #{msg}", reason) | ||
end | ||
res.verify |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah. Then either 3.b or 4: ignore @zenspider.
"sudo to allow for non-interactive usage.", :sudo_no_tty], | ||
}.each do |sudo, human| | ||
rawerr = human if rawerr.include? sudo | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure I understand that. Assuming my interpretation is correct, then you're doing "I am the one" via raise
, not via case
vs {...}.each
.
- Minor improvisation & refactoring. - Add unit test cases. Signed-off-by: Vivek Singh <[email protected]>
Signed-off-by: Vivek Singh <[email protected]>
Signed-off-by: Vivek Singh <[email protected]>
c6465b4
to
c029473
Compare
Code Climate has analyzed commit c029473 and detected 2 issues on this pull request. Here's the issue category breakdown:
View more on Code Climate. |
@zenspider could you please have a look again? |
backend.stubs(:run_command).returns(mock_connect_result("Other sudo related error", 1)) | ||
lc = cls.new(backend, { sudo: true }) | ||
err = _ { lc.verify }.must_raise Train::UserError | ||
_(err.message).must_match(/Other sudo related error/) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
great!
|
||
def verify! | ||
msg, reason = verify | ||
return nil unless msg |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For the future: return
and return nil
have the same effect.
Description
Related Issue
Fixes #509
Types of changes
Checklist:
Signed-off-by: Vivek Singh [email protected]