Given the inheritance model for actions, we are sometimes going to need to set
them to 'default' at runtime, rather than during their static declaration.

Add tests to verify that this works correctly, and update the code to ensure
that happens.  This gives up caching of the default action, but this should be
an extremely rare operation - pretty much only CLI invocation, really.

Reviewed-By: Pieter van de Bruggen <[email protected]>
---
 lib/puppet/interface/action_manager.rb |   15 ++++++++++-----
 spec/unit/interface/action_spec.rb     |   18 ++++++++++++++++++
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/lib/puppet/interface/action_manager.rb 
b/lib/puppet/interface/action_manager.rb
index fbf588d..5c9af4f 100644
--- a/lib/puppet/interface/action_manager.rb
+++ b/lib/puppet/interface/action_manager.rb
@@ -7,13 +7,14 @@ module Puppet::Interface::ActionManager
     require 'puppet/interface/action_builder'
 
     @actions ||= {}
-    @default_action ||= nil
     raise "Action #{name} already defined for #{self}" if action?(name)
+
     action = Puppet::Interface::ActionBuilder.build(self, name, &block)
-    if action.default
-      raise "Actions #{@default_action.name} and #{name} cannot both be 
default" if @default_action
-      @default_action = action
+
+    if action.default and current = get_default_action
+      raise "Actions #{current.name} and #{name} cannot both be default"
     end
+
     @actions[action.name] = action
   end
 
@@ -61,7 +62,11 @@ module Puppet::Interface::ActionManager
   end
 
   def get_default_action
-    @default_action
+    default = actions.map {|x| get_action(x) }.select {|x| x.default }
+    if default.length > 1
+      raise "The actions #{default.map(&:name).join(", ")} cannot all be 
default"
+    end
+    default.first
   end
 
   def action?(name)
diff --git a/spec/unit/interface/action_spec.rb 
b/spec/unit/interface/action_spec.rb
index dbbf847..d71a7d0 100755
--- a/spec/unit/interface/action_spec.rb
+++ b/spec/unit/interface/action_spec.rb
@@ -597,4 +597,22 @@ describe Puppet::Interface::Action do
       end
     end
   end
+
+  context "runtime manipulations" do
+    subject do
+      Puppet::Interface.new(:runtime_manipulations, '1.0.0') do
+        action :foo do
+          when_invoked do |options| options end
+        end
+      end
+    end
+
+    let :action do subject.get_action :foo end
+
+    it "should be the face default action if default is set true" do
+      subject.get_default_action.should be_nil
+      action.default = true
+      subject.get_default_action.should == action
+    end
+  end
 end
-- 
1.7.6

-- 
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