The accepts function takes 2 arguments:
  $type - the Resources Type
  $resoures - a hash of resources of the form:
      {title=>{attr=>value}, title2=>{attr2=>value,attr3=>value}}

Signed-off-by: Dan Bode <[email protected]>
---
 lib/puppet/parser/functions/accepts.rb     |   15 ++++++++
 spec/unit/parser/functions/accepts_spec.rb |   49 ++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+), 0 deletions(-)
 create mode 100644 lib/puppet/parser/functions/accepts.rb
 create mode 100644 spec/unit/parser/functions/accepts_spec.rb

diff --git a/lib/puppet/parser/functions/accepts.rb 
b/lib/puppet/parser/functions/accepts.rb
new file mode 100644
index 0000000..0b54399
--- /dev/null
+++ b/lib/puppet/parser/functions/accepts.rb
@@ -0,0 +1,15 @@
+Puppet::Parser::Functions::newfunction(:accepts, :doc => '
+Converts a hash into resources and adds them to the catalog.
+Takes two parameters:
+  accepts($type, $resources)
+Creates resources of type $type from the $resources hash. Assumes that hash is 
in the following form:
+  {title=>{attr=>value}}
+') do |args|
+  raise ArgumentError, 'requires resource type and hash' unless args.size == 2
+  args[1].each do |title, params|
+    # eventaully, I would like another argument that specifies constraints
+    raise ArgumentError, 'params should not contain title' if params['title']
+    resource = 
Puppet::Type.type(args[0].to_sym).hash2resource(params.merge(:title => title))
+    catalog.add_resource(resource)
+  end
+end
diff --git a/spec/unit/parser/functions/accepts_spec.rb 
b/spec/unit/parser/functions/accepts_spec.rb
new file mode 100644
index 0000000..25d9a7e
--- /dev/null
+++ b/spec/unit/parser/functions/accepts_spec.rb
@@ -0,0 +1,49 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "the 'accepts' function" do
+
+  before :each do
+    Puppet::Node::Environment.stubs(:current).returns(nil)
+    @compiler = Puppet::Parser::Compiler.new(Puppet::Node.new("foo"))
+    @scope = Puppet::Parser::Scope.new(:compiler => @compiler)
+    @main = Puppet::Resource.new('stage', 'main')
+  end
+
+  it "should exist" do
+    Puppet::Parser::Functions.function("accepts").should == "function_accepts"
+  end
+
+  it "should create multiple resources" do
+    resources = {'foo'=>{'ensure'=>'present', 'gid'=>'1'},
+                 'bar'=>{'home'=>'/home/bar', 'noop'=>true}}
+    @scope.function_accepts(["user", resources])
+    resources.each do |title, params|
+      res = 
Puppet::Type.type('user').hash2resource(params.merge(:title=>title))
+      @scope.catalog.resource('user', title).should == res
+    end
+  end
+
+  it "should create a single resource" do
+    resources = {'foo'=> {}}
+    @scope.function_accepts(["user", resources])
+    resources.each do |title, params|
+      res = Puppet::Resource.new('user', title, params)
+      @scope.catalog.resource('user', title).should == res
+    end
+  end
+
+  it 'should fail if resource has title set in params' do
+    resources = {'foo'=> {'title'=>'bar'}}
+    lambda { @scope.function_accepts(["user", resources]) }.should 
raise_error(ArgumentError)
+  end
+
+  it 'should accept an empty resource hash' do
+    resources = {}
+    @scope.function_accepts(["user", resources])
+    # should only have main stage
+    @scope.catalog.resources.size.should == 1
+  end
+
+end
-- 
1.5.5.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