summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/interface/action_manager.rb5
-rwxr-xr-xspec/unit/interface/action_manager_spec.rb50
2 files changed, 42 insertions, 13 deletions
diff --git a/lib/puppet/interface/action_manager.rb b/lib/puppet/interface/action_manager.rb
index c5eb8e08a..fbf588d7d 100644
--- a/lib/puppet/interface/action_manager.rb
+++ b/lib/puppet/interface/action_manager.rb
@@ -34,7 +34,10 @@ module Puppet::Interface::ActionManager
elsif self.class.respond_to?(:actions)
result += self.class.actions
end
- result.sort
+ # We need to uniq the result, because we duplicate actions when they are
+ # fetched to ensure that they have the correct bindings; they shadow the
+ # parent, and uniq implements that. --daniel 2011-06-01
+ result.uniq.sort
end
def get_action(name)
diff --git a/spec/unit/interface/action_manager_spec.rb b/spec/unit/interface/action_manager_spec.rb
index e357a5fa1..3a84e4f83 100755
--- a/spec/unit/interface/action_manager_spec.rb
+++ b/spec/unit/interface/action_manager_spec.rb
@@ -186,23 +186,49 @@ describe Puppet::Interface::ActionManager do
@instance.should be_action(:foo)
end
- it "should list actions defined in superclasses" do
- @subclass = Class.new(@klass)
- @instance = @subclass.new
+ context "with actions defined in superclass" do
+ before :each do
+ @subclass = Class.new(@klass)
+ @instance = @subclass.new
+
+ @klass.action(:parent) do
+ when_invoked { |options| "a" }
+ end
+ @subclass.action(:sub) do
+ when_invoked { |options| "a" }
+ end
+ @instance.action(:instance) do
+ when_invoked { |options| "a" }
+ end
+ end
+
+ it "should list actions defined in superclasses" do
+ @instance.should be_action(:parent)
+ @instance.should be_action(:sub)
+ @instance.should be_action(:instance)
+ end
- @klass.action(:parent) do
- when_invoked { |options| "a" }
+ it "should list inherited actions" do
+ @instance.actions.should =~ [:instance, :parent, :sub]
end
- @subclass.action(:sub) do
- when_invoked { |options| "a" }
+
+ it "should not duplicate instance actions after fetching them (#7699)" do
+ @instance.actions.should =~ [:instance, :parent, :sub]
+ @instance.get_action(:instance)
+ @instance.actions.should =~ [:instance, :parent, :sub]
end
- @instance.action(:instance) do
- when_invoked { |options| "a" }
+
+ it "should not duplicate subclass actions after fetching them (#7699)" do
+ @instance.actions.should =~ [:instance, :parent, :sub]
+ @instance.get_action(:sub)
+ @instance.actions.should =~ [:instance, :parent, :sub]
end
- @instance.should be_action(:parent)
- @instance.should be_action(:sub)
- @instance.should be_action(:instance)
+ it "should not duplicate superclass actions after fetching them (#7699)" do
+ @instance.actions.should =~ [:instance, :parent, :sub]
+ @instance.get_action(:parent)
+ @instance.actions.should =~ [:instance, :parent, :sub]
+ end
end
it "should create an instance method when an action is defined in a superclass" do