diff options
-rw-r--r-- | lib/puppet/interface/action.rb | 14 | ||||
-rwxr-xr-x | spec/unit/interface/action_spec.rb | 19 |
2 files changed, 33 insertions, 0 deletions
diff --git a/lib/puppet/interface/action.rb b/lib/puppet/interface/action.rb index 9c9741b52..b842c2831 100644 --- a/lib/puppet/interface/action.rb +++ b/lib/puppet/interface/action.rb @@ -255,6 +255,20 @@ WRAPPER end def validate_args(args) + # Check for multiple aliases for the same option... + args.last.keys.each do |name| + # #7290: If this isn't actually an option, ignore it for now. We should + # probably fail, but that wasn't our API, and I don't want to perturb + # behaviour this late in the RC cycle. --daniel 2011-04-29 + if option = get_option(name) then + overlap = (option.aliases & args.last.keys) + unless overlap.length == 1 then + raise ArgumentError, "Multiple aliases for the same option passed: #{overlap.join(', ')}" + end + end + end + + # Check for missing mandatory options. required = options.map do |name| get_option(name) end.select(&:required?).collect(&:name) - args.last.keys diff --git a/spec/unit/interface/action_spec.rb b/spec/unit/interface/action_spec.rb index 23d0de490..f6796a82b 100755 --- a/spec/unit/interface/action_spec.rb +++ b/spec/unit/interface/action_spec.rb @@ -445,4 +445,23 @@ describe Puppet::Interface::Action do it "should fail if a second block is given for the same type" it "should return the block if asked" end + + context "#validate_args" do + subject do + Puppet::Interface.new(:validate_args, '1.0.0') do + script :test do true end + end + end + + it "should fail if a required option is not passed" do + subject.option "--foo" do required end + expect { subject.test }.to raise_error ArgumentError, /options are required/ + end + + it "should fail if two aliases to one option are passed" do + subject.option "--foo", "-f" + expect { subject.test :foo => true, :f => true }. + to raise_error ArgumentError, /Multiple aliases for the same option/ + end + end end |