From: Dan Bode <[email protected]>

I have always been annoyed that special variables for defines and hostclasses 
can not be evaluated as param defaults. Special variables are: $name, $title, 
$module_name.

Code example:
class x (
  foo = $name
  ) { notice($name)}

should print x, and with my patch, it does.

Signed-off-by: Dan Bode <[email protected]>
---
 lib/puppet/resource/type.rb     |   26 +++++++++++++-------------
 spec/unit/resource/type_spec.rb |   21 +++++++++++++++++++++
 2 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/lib/puppet/resource/type.rb b/lib/puppet/resource/type.rb
index 7b21e55..502b1c4 100644
--- a/lib/puppet/resource/type.rb
+++ b/lib/puppet/resource/type.rb
@@ -217,6 +217,19 @@ class Puppet::Resource::Type
       set[param] = true
     end
 
+    if @type == :hostclass
+      scope.setvar("title", resource.title.to_s.downcase) unless set.include? 
:title
+      scope.setvar("name",  resource.name.to_s.downcase ) unless set.include? 
:name
+    else
+      scope.setvar("title", resource.title              ) unless set.include? 
:title
+      scope.setvar("name",  resource.name               ) unless set.include? 
:name
+    end
+    scope.setvar("module_name", module_name) if module_name and ! set.include? 
:module_name
+
+    if caller_name = scope.parent_module_name and ! 
set.include?(:caller_module_name)
+      scope.setvar("caller_module_name", caller_name)
+    end
+    scope.class_set(self.name,scope) if hostclass? or node?
     # Verify that all required arguments are either present or
     # have been provided with defaults.
     arguments.each do |param, default|
@@ -233,19 +246,6 @@ class Puppet::Resource::Type
       resource[param] = value
     end
 
-    if @type == :hostclass
-      scope.setvar("title", resource.title.to_s.downcase) unless set.include? 
:title
-      scope.setvar("name",  resource.name.to_s.downcase ) unless set.include? 
:name
-    else
-      scope.setvar("title", resource.title              ) unless set.include? 
:title
-      scope.setvar("name",  resource.name               ) unless set.include? 
:name
-    end
-    scope.setvar("module_name", module_name) if module_name and ! set.include? 
:module_name
-
-    if caller_name = scope.parent_module_name and ! 
set.include?(:caller_module_name)
-      scope.setvar("caller_module_name", caller_name)
-    end
-    scope.class_set(self.name,scope) if hostclass? or node?
   end
 
   # Create a new subscope in which to evaluate our code.
diff --git a/spec/unit/resource/type_spec.rb b/spec/unit/resource/type_spec.rb
index f58092e..8c8e0df 100755
--- a/spec/unit/resource/type_spec.rb
+++ b/spec/unit/resource/type_spec.rb
@@ -261,6 +261,27 @@ describe Puppet::Resource::Type do
       @type = Puppet::Resource::Type.new(:hostclass, "foo")
     end
 
+    ['module_name', 'name', 'title'].each do |variable|
+      it "should allow #{variable} to be evaluated as param default" do
+        @type.module_name = "bar"
+        var = Puppet::Parser::AST::Variable.new({'value' => variable})
+        @type.set_arguments :foo => var  
+        @type.set_resource_parameters(@resource, @scope)
+        @scope.lookupvar('foo').should == 'bar'
+      end
+    end
+    # this test is to clarify a crazy edge case
+    # if you specify these special names as params, the resource
+    # will override the special variables
+    it "resource should override defaults" do
+      @type.set_arguments :name => nil
+      @resource[:name] = 'foobar'
+      var = Puppet::Parser::AST::Variable.new({'value' => 'name'})
+      @type.set_arguments :foo => var  
+      @type.set_resource_parameters(@resource, @scope)
+      @scope.lookupvar('foo').should == 'foobar'
+    end
+
     it "should set each of the resource's parameters as variables in the 
scope" do
       @type.set_arguments :foo => nil, :boo => nil
       @resource[:foo] = "bar"
-- 
1.6.5.1

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