summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Pittman <daniel@puppetlabs.com>2011-04-20 14:12:59 -0700
committerDaniel Pittman <daniel@puppetlabs.com>2011-04-20 14:12:59 -0700
commit06d5af8dcced82d4611783d1c5fa03995d84d19c (patch)
treecefc2b0b6e5dc40db8fcfd2d6363c0db7f8a30b7
parent8172060684e532eaba234eb992ed739511abbe59 (diff)
parent379b46d4b9e2a57f954ff178956ca6850c3c56f7 (diff)
downloadpuppet-06d5af8dcced82d4611783d1c5fa03995d84d19c.tar.gz
puppet-06d5af8dcced82d4611783d1c5fa03995d84d19c.tar.xz
puppet-06d5af8dcced82d4611783d1c5fa03995d84d19c.zip
Merge branch 'bug/2.7.x/7116-cannot-use-faces-with---debug' into 2.7.x
-rw-r--r--lib/puppet/application/face_base.rb21
-rwxr-xr-xspec/unit/application/face_base_spec.rb209
2 files changed, 126 insertions, 104 deletions
diff --git a/lib/puppet/application/face_base.rb b/lib/puppet/application/face_base.rb
index 9da48af55..7bebd18bb 100644
--- a/lib/puppet/application/face_base.rb
+++ b/lib/puppet/application/face_base.rb
@@ -92,8 +92,8 @@ class Puppet::Application::FaceBase < Puppet::Application
# REVISIT: These should be configurable versions, through a global
# '--version' option, but we don't implement that yet... --daniel 2011-03-29
- @type = self.class.name.to_s.sub(/.+:/, '').downcase.to_sym
- @face = Puppet::Face[@type, :current]
+ @type = self.class.name.to_s.sub(/.+:/, '').downcase.to_sym
+ @face = Puppet::Face[@type, :current]
# Now, walk the command line and identify the action. We skip over
# arguments based on introspecting the action and all, and find the first
@@ -122,6 +122,8 @@ class Puppet::Application::FaceBase < Puppet::Application
# a mandatory argument. --daniel 2011-04-05
index += 1 # ...so skip the argument.
end
+ elsif option = find_application_argument(item) then
+ index += 1 if (option[:argument] and option[:optional])
else
raise OptionParser::InvalidOption.new(item.sub(/=.*$/, ''))
end
@@ -158,6 +160,21 @@ class Puppet::Application::FaceBase < Puppet::Application
return nil # nothing found.
end
+ def find_application_argument(item)
+ self.class.option_parser_commands.each do |options, function|
+ options.each do |option|
+ next unless option =~ /^-/
+ pattern = /^#{option.sub('[no-]', '').sub(/[ =].*$/, '')}(?:[ =].*)?$/
+ next unless pattern.match(item)
+ return {
+ :argument => option =~ /[ =]/,
+ :optional => option =~ /[ =]\[/
+ }
+ end
+ end
+ return nil # not found
+ end
+
def setup
Puppet::Util::Log.newdestination :console
diff --git a/spec/unit/application/face_base_spec.rb b/spec/unit/application/face_base_spec.rb
index 5403608cf..f7c55c556 100755
--- a/spec/unit/application/face_base_spec.rb
+++ b/spec/unit/application/face_base_spec.rb
@@ -40,127 +40,132 @@ describe Puppet::Application::FaceBase do
app.command_line.stubs(:args).returns %w{}
end
- describe "parsing the command line" do
- context "with just an action" do
- before :all do
- # We have to stub Signal.trap to avoid a crazy mess where we take
- # over signal handling and make it impossible to cancel the test
- # suite run.
- #
- # It would be nice to fix this elsewhere, but it is actually hard to
- # capture this in rspec 2.5 and all. :( --daniel 2011-04-08
- Signal.stubs(:trap)
- app.command_line.stubs(:args).returns %w{foo}
- app.preinit
- app.parse_options
- end
-
- it "should set the face based on the type" do
- app.face.name.should == :basetest
- end
-
- it "should find the action" do
- app.action.should be
- app.action.name.should == :foo
- end
+ describe "with just an action" do
+ before :all do
+ # We have to stub Signal.trap to avoid a crazy mess where we take
+ # over signal handling and make it impossible to cancel the test
+ # suite run.
+ #
+ # It would be nice to fix this elsewhere, but it is actually hard to
+ # capture this in rspec 2.5 and all. :( --daniel 2011-04-08
+ Signal.stubs(:trap)
+ app.command_line.stubs(:args).returns %w{foo}
+ app.preinit
+ app.parse_options
end
- it "should use the default action if not given any arguments" do
- app.command_line.stubs(:args).returns []
- action = stub(:options => [])
- Puppet::Face[:basetest, '0.0.1'].expects(:get_default_action).returns(action)
- app.stubs(:main)
- app.run
- app.action.should == action
- app.arguments.should == [ { } ]
+ it "should set the face based on the type" do
+ app.face.name.should == :basetest
end
- it "should use the default action if not given a valid one" do
- app.command_line.stubs(:args).returns %w{bar}
- action = stub(:options => [])
- Puppet::Face[:basetest, '0.0.1'].expects(:get_default_action).returns(action)
- app.stubs(:main)
- app.run
- app.action.should == action
- app.arguments.should == [ 'bar', { } ]
+ it "should find the action" do
+ app.action.should be
+ app.action.name.should == :foo
end
+ end
- it "should have no action if not given a valid one and there is no default action" do
- app.command_line.stubs(:args).returns %w{bar}
- Puppet::Face[:basetest, '0.0.1'].expects(:get_default_action).returns(nil)
- app.stubs(:main)
- app.run
- app.action.should be_nil
- app.arguments.should == [ 'bar', { } ]
- end
+ it "should use the default action if not given any arguments" do
+ app.command_line.stubs(:args).returns []
+ action = stub(:options => [])
+ Puppet::Face[:basetest, '0.0.1'].expects(:get_default_action).returns(action)
+ app.stubs(:main)
+ app.run
+ app.action.should == action
+ app.arguments.should == [ { } ]
+ end
- it "should report a sensible error when options with = fail" do
- app.command_line.stubs(:args).returns %w{--action=bar foo}
- expect { app.preinit; app.parse_options }.
- to raise_error OptionParser::InvalidOption, /invalid option: --action/
- end
+ it "should use the default action if not given a valid one" do
+ app.command_line.stubs(:args).returns %w{bar}
+ action = stub(:options => [])
+ Puppet::Face[:basetest, '0.0.1'].expects(:get_default_action).returns(action)
+ app.stubs(:main)
+ app.run
+ app.action.should == action
+ app.arguments.should == [ 'bar', { } ]
+ end
- it "should fail if an action option is before the action" do
- app.command_line.stubs(:args).returns %w{--action foo}
- expect { app.preinit; app.parse_options }.
- to raise_error OptionParser::InvalidOption, /invalid option: --action/
- end
+ it "should have no action if not given a valid one and there is no default action" do
+ app.command_line.stubs(:args).returns %w{bar}
+ Puppet::Face[:basetest, '0.0.1'].expects(:get_default_action).returns(nil)
+ app.stubs(:main)
+ app.run
+ app.action.should be_nil
+ app.arguments.should == [ 'bar', { } ]
+ end
- it "should fail if an unknown option is before the action" do
- app.command_line.stubs(:args).returns %w{--bar foo}
- expect { app.preinit; app.parse_options }.
- to raise_error OptionParser::InvalidOption, /invalid option: --bar/
- end
+ it "should report a sensible error when options with = fail" do
+ app.command_line.stubs(:args).returns %w{--action=bar foo}
+ expect { app.preinit; app.parse_options }.
+ to raise_error OptionParser::InvalidOption, /invalid option: --action/
+ end
- it "should fail if an unknown option is after the action" do
- app.command_line.stubs(:args).returns %w{foo --bar}
- expect { app.preinit; app.parse_options }.
- to raise_error OptionParser::InvalidOption, /invalid option: --bar/
- end
+ it "should fail if an action option is before the action" do
+ app.command_line.stubs(:args).returns %w{--action foo}
+ expect { app.preinit; app.parse_options }.
+ to raise_error OptionParser::InvalidOption, /invalid option: --action/
+ end
+
+ it "should fail if an unknown option is before the action" do
+ app.command_line.stubs(:args).returns %w{--bar foo}
+ expect { app.preinit; app.parse_options }.
+ to raise_error OptionParser::InvalidOption, /invalid option: --bar/
+ end
+
+ it "should fail if an unknown option is after the action" do
+ app.command_line.stubs(:args).returns %w{foo --bar}
+ expect { app.preinit; app.parse_options }.
+ to raise_error OptionParser::InvalidOption, /invalid option: --bar/
+ end
+
+ it "should accept --bar as an argument to a mandatory option after action" do
+ app.command_line.stubs(:args).returns %w{foo --mandatory --bar}
+ app.preinit
+ app.parse_options
+ app.action.name.should == :foo
+ app.options.should == { :mandatory => "--bar" }
+ end
+
+ it "should accept --bar as an argument to a mandatory option before action" do
+ app.command_line.stubs(:args).returns %w{--mandatory --bar foo}
+ app.preinit
+ app.parse_options
+ app.action.name.should == :foo
+ app.options.should == { :mandatory => "--bar" }
+ end
- it "should accept --bar as an argument to a mandatory option after action" do
- app.command_line.stubs(:args).returns %w{foo --mandatory --bar}
+ it "should not skip when --foo=bar is given" do
+ app.command_line.stubs(:args).returns %w{--mandatory=bar --bar foo}
+ expect { app.preinit; app.parse_options }.
+ to raise_error OptionParser::InvalidOption, /invalid option: --bar/
+ end
+
+ { "boolean options before" => %w{--trace foo},
+ "boolean options after" => %w{foo --trace}
+ }.each do |name, args|
+ it "should accept global boolean settings #{name} the action" do
+ app.command_line.stubs(:args).returns args
app.preinit
app.parse_options
- app.action.name.should == :foo
- app.options.should == { :mandatory => "--bar" }
+ Puppet[:trace].should be_true
end
+ end
- it "should accept --bar as an argument to a mandatory option before action" do
- app.command_line.stubs(:args).returns %w{--mandatory --bar foo}
+ { "before" => %w{--syslogfacility user1 foo},
+ " after" => %w{foo --syslogfacility user1}
+ }.each do |name, args|
+ it "should accept global settings with arguments #{name} the action" do
+ app.command_line.stubs(:args).returns args
app.preinit
app.parse_options
- app.action.name.should == :foo
- app.options.should == { :mandatory => "--bar" }
- end
-
- it "should not skip when --foo=bar is given" do
- app.command_line.stubs(:args).returns %w{--mandatory=bar --bar foo}
- expect { app.preinit; app.parse_options }.
- to raise_error OptionParser::InvalidOption, /invalid option: --bar/
- end
-
- { "boolean options before" => %w{--trace foo},
- "boolean options after" => %w{foo --trace}
- }.each do |name, args|
- it "should accept global boolean settings #{name} the action" do
- app.command_line.stubs(:args).returns args
- app.preinit
- app.parse_options
- Puppet[:trace].should be_true
- end
+ Puppet[:syslogfacility].should == "user1"
end
+ end
- { "before" => %w{--syslogfacility user1 foo},
- " after" => %w{foo --syslogfacility user1}
- }.each do |name, args|
- it "should accept global settings with arguments #{name} the action" do
- app.command_line.stubs(:args).returns args
- app.preinit
- app.parse_options
- Puppet[:syslogfacility].should == "user1"
- end
- end
+ it "should handle application-level options" do
+ app.command_line.stubs(:args).returns %w{help --verbose help}
+ app.preinit
+ app.parse_options
+ app.face.name.should == :basetest
end
end