summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/interface/action.rb14
-rwxr-xr-xspec/unit/interface/action_spec.rb19
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