diff options
| author | Daniel Pittman <daniel@puppetlabs.com> | 2011-03-24 13:33:30 -0700 |
|---|---|---|
| committer | Daniel Pittman <daniel@puppetlabs.com> | 2011-03-24 13:41:31 -0700 |
| commit | 633f63cdbc1d5630e546041bb0c1e714216158d0 (patch) | |
| tree | bb2706ed7c77ec0142eb13fa820c9371142792b0 | |
| parent | b3c059e74b1900c80c0fb875b696b7c5e2b5448b (diff) | |
(#6833) support 'script' as a short form of 'action'
At the moment the action method is a fairly heavy tool: it provides a DSL, and
is designed to allow substantial metadata to be added to the action.
For some users this is low on value, since they just want to write a little
script that drives things a bit differently. Which there is substantial value
in the metadata, adding the capability to do these light-weight things quickly
is valid.
To meet this we add a script action; the contrast is:
action :foo do
# other metadata goes here
invoke do |args|
# method body goes here
end
end
script :bar do |args|
# method body goes here
end
# ...and if you want metadata, you have to add it in more ugly, procedural
# ways, which we are not going to encourage.
Reviewed-By: Pieter van de Bruggen <pieter@puppetlabs.com>
| -rw-r--r-- | lib/puppet/interface/action.rb | 12 | ||||
| -rw-r--r-- | lib/puppet/interface/action_builder.rb | 9 | ||||
| -rw-r--r-- | lib/puppet/interface/action_manager.rb | 9 | ||||
| -rwxr-xr-x[-rw-r--r--] | spec/unit/interface/action_manager_spec.rb | 28 |
4 files changed, 49 insertions, 9 deletions
diff --git a/lib/puppet/interface/action.rb b/lib/puppet/interface/action.rb index e4c2a4666..1c19bd08c 100644 --- a/lib/puppet/interface/action.rb +++ b/lib/puppet/interface/action.rb @@ -3,9 +3,11 @@ require 'puppet/interface' class Puppet::Interface::Action attr_reader :name - def initialize(interface, name) + def initialize(interface, name, attrs = {}) name = name.to_s raise "'#{name}' is an invalid action name" unless name =~ /^[a-z]\w*$/ + + attrs.each do |k,v| send("#{k}=", v) end @interface = interface @name = name end @@ -13,4 +15,12 @@ class Puppet::Interface::Action def invoke(*args, &block) @interface.method(name).call(*args,&block) end + + def invoke=(block) + if @interface.is_a?(Class) + @interface.define_method(@name, &block) + else + @interface.meta_def(@name, &block) + end + end end diff --git a/lib/puppet/interface/action_builder.rb b/lib/puppet/interface/action_builder.rb index e76fb1c6e..e389ea3ea 100644 --- a/lib/puppet/interface/action_builder.rb +++ b/lib/puppet/interface/action_builder.rb @@ -18,13 +18,10 @@ class Puppet::Interface::ActionBuilder end # Ideally the method we're defining here would be added to the action, and a - # method on the interface would defer to it + # method on the interface would defer to it, but we can't get scope correct, + # so we stick with this. --daniel 2011-03-24 def invoke(&block) raise "Invoke called on an ActionBuilder with no corresponding Action" unless @action - if @interface.is_a?(Class) - @interface.define_method(@action.name, &block) - else - @interface.meta_def(@action.name, &block) - end + @action.invoke = block end end diff --git a/lib/puppet/interface/action_manager.rb b/lib/puppet/interface/action_manager.rb index 0db82d612..8b2944bb1 100644 --- a/lib/puppet/interface/action_manager.rb +++ b/lib/puppet/interface/action_manager.rb @@ -14,6 +14,15 @@ module Puppet::Interface::ActionManager @actions[name] = action end + # This is the short-form of an action definition; it doesn't use the + # builder, just creates the action directly from the block. + def script(name, &block) + @actions ||= {} + name = name.to_s.downcase.to_sym + raise "Action #{name} already defined for #{self}" if action?(name) + @actions[name] = Puppet::Interface::Action.new(self, name, :invoke => block) + end + def actions @actions ||= {} result = @actions.keys diff --git a/spec/unit/interface/action_manager_spec.rb b/spec/unit/interface/action_manager_spec.rb index d1a7e31be..3aff7ac11 100644..100755 --- a/spec/unit/interface/action_manager_spec.rb +++ b/spec/unit/interface/action_manager_spec.rb @@ -19,6 +19,12 @@ describe Puppet::Interface::ActionManager do end end + it "should be able to define a 'script' style action" do + subject.script :bar do + "a bar is where beer is found" + end + end + it "should be able to list defined actions" do subject.action(:foo) do invoke { "something" } @@ -27,8 +33,21 @@ describe Puppet::Interface::ActionManager do invoke { "something" } end - subject.actions.should include(:bar) - subject.actions.should include(:foo) + subject.actions.should =~ [:foo, :bar] + end + + it "should list 'script' actions" do + subject.script :foo do "foo" end + subject.actions.should =~ [:foo] + end + + it "should list both script and normal actions" do + subject.action :foo do + invoke do "foo" end + end + subject.script :bar do "a bar is where beer is found" end + + subject.actions.should =~ [:foo, :bar] end it "should be able to indicate when an action is defined" do @@ -39,6 +58,11 @@ describe Puppet::Interface::ActionManager do subject.should be_action(:foo) end + it "should indicate an action is defined for script actions" do + subject.script :foo do "foo" end + subject.should be_action :foo + end + it "should correctly treat action names specified as strings" do subject.action(:foo) do invoke { "something" } |
