diff options
| author | Daniel Pittman <daniel@puppetlabs.com> | 2011-04-20 14:12:59 -0700 |
|---|---|---|
| committer | Daniel Pittman <daniel@puppetlabs.com> | 2011-04-20 14:12:59 -0700 |
| commit | 06d5af8dcced82d4611783d1c5fa03995d84d19c (patch) | |
| tree | cefc2b0b6e5dc40db8fcfd2d6363c0db7f8a30b7 | |
| parent | 8172060684e532eaba234eb992ed739511abbe59 (diff) | |
| parent | 379b46d4b9e2a57f954ff178956ca6850c3c56f7 (diff) | |
| download | puppet-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.rb | 21 | ||||
| -rwxr-xr-x | spec/unit/application/face_base_spec.rb | 209 |
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 |
