+1 as a pair-er.

On Wed, Sep 22, 2010 at 2:35 PM, Paul Berry <[email protected]> wrote:

> The global "-o" option ("--onetime") was overriding the
> application-specific option "-o" because global options were being
> sent to the OptionParser after application-specific options.
>
> Modified the order in which options are sent to the OptionParser to
> have the correct behavior.  Also merged together the two methods that
> were applying options so that the order is more explicit.
>
> Signed-off-by: Paul Berry <[email protected]>
> ---
> This patch must be applied on top of "[#4798] Puppet doc manifests
> documentation mode broken", which I sent to the list yesterday.
>
> Available at http://github.com/stereotype441/puppet/tree/ticket/2.6.x/4822
>
>  lib/puppet/application.rb                |   38
> ++++++++++++---------------
>  spec/integration/application/doc_spec.rb |    7 +++++
>  spec/unit/application_spec.rb            |   41
> +++++++++++------------------
>  3 files changed, 40 insertions(+), 46 deletions(-)
>
> diff --git a/lib/puppet/application.rb b/lib/puppet/application.rb
> index 2fec38b..f0159a6 100644
> --- a/lib/puppet/application.rb
> +++ b/lib/puppet/application.rb
> @@ -254,19 +254,6 @@ class Application
>   def preinit
>   end
>
> -  def option_parser
> -    return @option_parser if defined?(@option_parser)
> -
> -    @option_parser = OptionParser.new(self.class.banner)
> -
> -    self.class.option_parser_commands.each do |options, fname|
> -      @option_parser.on(*options) do |value|
> -        self.send(fname, value)
> -      end
> -    end
> -    @option_parser
> -  end
> -
>   def initialize(command_line = nil)
>     require 'puppet/util/command_line'
>     @command_line = command_line || Puppet::Util::CommandLine.new
> @@ -323,20 +310,29 @@ class Application
>   end
>
>   def parse_options
> -    # get all puppet options
> -    optparse_opt = []
> -    optparse_opt = Puppet.settings.optparse_addargs(optparse_opt)
> +    # Create an option parser
> +    option_parser = OptionParser.new(self.class.banner)
>
> -    # convert them to OptionParser format
> -    optparse_opt.each do |option|
> -      self.option_parser.on(*option) do |arg|
> +    # Add all global options to it.
> +    Puppet.settings.optparse_addargs([]).each do |option|
> +      option_parser.on(*option) do |arg|
>         handlearg(option[0], arg)
>       end
>     end
>
> -    # scan command line argument
> +    # Add options that are local to this application, which were
> +    # created using the "option()" metaprogramming method.  If there
> +    # are any conflicts, this application's options will be favored.
> +    self.class.option_parser_commands.each do |options, fname|
> +      option_parser.on(*options) do |value|
> +        # Call the method that "option()" created.
> +        self.send(fname, value)
> +      end
> +    end
> +
> +    # scan command line.
>     begin
> -      self.option_parser.parse!(self.command_line.args)
> +      option_parser.parse!(self.command_line.args)
>     rescue OptionParser::ParseError => detail
>       $stderr.puts detail
>       $stderr.puts "Try 'puppet #{command_line.subcommand_name} --help'"
> diff --git a/spec/integration/application/doc_spec.rb
> b/spec/integration/application/doc_spec.rb
> index cb9f478..eaf5442 100644
> --- a/spec/integration/application/doc_spec.rb
> +++ b/spec/integration/application/doc_spec.rb
> @@ -45,4 +45,11 @@ describe Puppet::Application::Doc do
>       Dir.chdir(old_dir)
>     end
>   end
> +
> +  it "should respect the -o option" do
> +    puppetdoc = Puppet::Application[:doc]
> +    puppetdoc.command_line.stubs(:args).returns(['foo', '-o', 'bar'])
> +    puppetdoc.parse_options
> +    puppetdoc.options[:outputdir].should == 'bar'
> +  end
>  end
> diff --git a/spec/unit/application_spec.rb b/spec/unit/application_spec.rb
> index 4338091..be7cda3 100755
> --- a/spec/unit/application_spec.rb
> +++ b/spec/unit/application_spec.rb
> @@ -191,24 +191,17 @@ describe Puppet::Application do
>       Puppet.settings.stubs(:optparse_addargs).returns([])
>     end
>
> -    it "should create a new option parser when needed" do
> -      option_parser = stub "option parser"
> -      option_parser.stubs(:on)
> -      OptionParser.expects(:new).returns(option_parser).once
> -      @app.option_parser.should == option_parser
> -      @app.option_parser.should == option_parser
> -    end
> -
>     it "should pass the banner to the option parser" do
>       option_parser = stub "option parser"
>       option_parser.stubs(:on)
> +      option_parser.stubs(:parse!)
>       @app.class.instance_eval do
>         banner "banner"
>       end
>
>       OptionParser.expects(:new).with("banner").returns(option_parser)
>
> -      @app.option_parser
> +      @app.parse_options
>     end
>
>     it "should get options from Puppet.settings.optparse_addargs" do
> @@ -219,15 +212,14 @@ describe Puppet::Application do
>
>     it "should add Puppet.settings options to OptionParser" do
>       Puppet.settings.stubs(:optparse_addargs).returns( [["--option","-o",
> "Funny Option"]])
> -
> -      @app.option_parser.expects(:on).with { |*arg| arg ==
> ["--option","-o", "Funny Option"] }
> -
> +      Puppet.settings.expects(:handlearg).with("--option", 'true')
> +      @app.command_line.stubs(:args).returns(["--option"])
>       @app.parse_options
>     end
>
>     it "should ask OptionParser to parse the command-line argument" do
>       @app.command_line.stubs(:args).returns(%w{ fake args })
> -      @app.option_parser.expects(:parse!).with(%w{ fake args })
> +      OptionParser.any_instance.expects(:parse!).with(%w{ fake args })
>
>       @app.parse_options
>     end
> @@ -258,31 +250,30 @@ describe Puppet::Application do
>
>     describe "when dealing with an argument not declared directly by the
> application" do
>       it "should pass it to handle_unknown if this method exists" do
> -
>  Puppet.settings.stubs(:optparse_addargs).returns([["--not-handled"]])
> -        @app.option_parser.stubs(:on).yields("value")
> +
>  Puppet.settings.stubs(:optparse_addargs).returns([["--not-handled",
> :REQUIRED]])
>
>         @app.expects(:handle_unknown).with("--not-handled",
> "value").returns(true)
> -
> +        @app.command_line.stubs(:args).returns(["--not-handled", "value"])
>         @app.parse_options
>       end
>
>       it "should pass it to Puppet.settings if handle_unknown says so" do
> -        Puppet.settings.stubs(:optparse_addargs).returns([["--topuppet"]])
> -        @app.option_parser.stubs(:on).yields("value")
> +        Puppet.settings.stubs(:optparse_addargs).returns([["--topuppet",
> :REQUIRED]])
>
>         @app.stubs(:handle_unknown).with("--topuppet",
> "value").returns(false)
>
>         Puppet.settings.expects(:handlearg).with("--topuppet", "value")
> +        @app.command_line.stubs(:args).returns(["--topuppet", "value"])
>         @app.parse_options
>       end
>
>       it "should pass it to Puppet.settings if there is no handle_unknown
> method" do
> -        Puppet.settings.stubs(:optparse_addargs).returns([["--topuppet"]])
> -        @app.option_parser.stubs(:on).yields("value")
> +        Puppet.settings.stubs(:optparse_addargs).returns([["--topuppet",
> :REQUIRED]])
>
>         @app.stubs(:respond_to?).returns(false)
>
>         Puppet.settings.expects(:handlearg).with("--topuppet", "value")
> +        @app.command_line.stubs(:args).returns(["--topuppet", "value"])
>         @app.parse_options
>       end
>
> @@ -310,7 +301,7 @@ describe Puppet::Application do
>
>     it "should exit if OptionParser raises an error" do
>       $stderr.stubs(:puts)
> -
>  @app.option_parser.stubs(:parse!).raises(OptionParser::ParseError.new("blah
> blah"))
> +
>  
> OptionParser.any_instance.stubs(:parse!).raises(OptionParser::ParseError.new("blah
> blah"))
>
>       @app.expects(:exit)
>
> @@ -478,7 +469,7 @@ describe Puppet::Application do
>           @app.class.option("--[no-]test3","-t") do
>           end
>
> -          @app.option_parser
> +          @app.parse_options
>         end
>
>         it "should pass a block that calls our defined method" do
> @@ -490,7 +481,7 @@ describe Puppet::Application do
>           @app.class.option("--test4","-t") do
>           end
>
> -          @app.option_parser
> +          @app.parse_options
>         end
>       end
>
> @@ -501,7 +492,7 @@ describe Puppet::Application do
>
>           @app.class.option("--test4","-t")
>
> -          @app.option_parser
> +          @app.parse_options
>         end
>
>         it "should give to OptionParser a block that adds the the value to
> the options array" do
> @@ -512,7 +503,7 @@ describe Puppet::Application do
>
>           @app.class.option("--test4","-t")
>
> -          @app.option_parser
> +          @app.parse_options
>         end
>       end
>     end
> --
> 1.7.2
>
> --
> You received this message because you are subscribed to the Google Groups
> "Puppet Developers" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<puppet-dev%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/puppet-dev?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to