summaryrefslogtreecommitdiffstats
path: root/lib/puppet/interface
diff options
context:
space:
mode:
authorDaniel Pittman <daniel@puppetlabs.com>2011-03-24 13:33:30 -0700
committerDaniel Pittman <daniel@puppetlabs.com>2011-03-24 13:41:31 -0700
commit633f63cdbc1d5630e546041bb0c1e714216158d0 (patch)
treebb2706ed7c77ec0142eb13fa820c9371142792b0 /lib/puppet/interface
parentb3c059e74b1900c80c0fb875b696b7c5e2b5448b (diff)
downloadpuppet-633f63cdbc1d5630e546041bb0c1e714216158d0.tar.gz
puppet-633f63cdbc1d5630e546041bb0c1e714216158d0.tar.xz
puppet-633f63cdbc1d5630e546041bb0c1e714216158d0.zip
(#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>
Diffstat (limited to 'lib/puppet/interface')
-rw-r--r--lib/puppet/interface/action.rb12
-rw-r--r--lib/puppet/interface/action_builder.rb9
-rw-r--r--lib/puppet/interface/action_manager.rb9
3 files changed, 23 insertions, 7 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