summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuke Kanies <luke@puppetlabs.com>2010-06-10 19:21:05 -0700
committertest branch <puppet-dev@googlegroups.com>2010-02-17 06:50:53 -0800
commit50a626daa1bef956ea63c405fddeaeab8a9a0756 (patch)
tree88a8fcf4ed68351a85935cef65a938a97c5513aa
parent5d1934bbb118c254ed99f5a625844ad7c9064d8e (diff)
downloadpuppet-50a626daa1bef956ea63c405fddeaeab8a9a0756.tar.gz
puppet-50a626daa1bef956ea63c405fddeaeab8a9a0756.tar.xz
puppet-50a626daa1bef956ea63c405fddeaeab8a9a0756.zip
Fixing #1545 - Adding 'caller_module_name' variable
This will produce the name of the module that a given resource is defined in, rather than the module that the resource type itself is defined in. For instance: # in one/manifests/onedef.pp define one::onedef { notice "Called $name from $caller_module_name" } # in two/manifests/init.pp class two { one::onedef { yay: } } produces: Called yay from two This could obviously be extended to actually build a caller stack, as frightening as that seems. Signed-off-by: Luke Kanies <luke@puppetlabs.com>
-rw-r--r--lib/puppet/parser/scope.rb6
-rw-r--r--lib/puppet/resource/type.rb4
-rwxr-xr-xspec/unit/parser/scope.rb15
-rwxr-xr-xspec/unit/resource/type.rb8
4 files changed, 33 insertions, 0 deletions
diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb
index 140c8c1b5..c974aee78 100644
--- a/lib/puppet/parser/scope.rb
+++ b/lib/puppet/parser/scope.rb
@@ -306,6 +306,12 @@ class Puppet::Parser::Scope
self.nodescope
end
+ def parent_module_name
+ return nil unless @parent
+ return nil unless @parent.source
+ @parent.source.module_name
+ end
+
# Return the list of scopes up to the top scope, ordered with our own first.
# This is used for looking up variables and defaults.
def scope_path
diff --git a/lib/puppet/resource/type.rb b/lib/puppet/resource/type.rb
index 227c544e6..e13b1834e 100644
--- a/lib/puppet/resource/type.rb
+++ b/lib/puppet/resource/type.rb
@@ -214,6 +214,10 @@ class Puppet::Resource::Type
scope.setvar("title", resource.title) unless set.include? :title
scope.setvar("name", resource.name) unless set.include? :name
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?
end
diff --git a/spec/unit/parser/scope.rb b/spec/unit/parser/scope.rb
index b14b2d3b6..4f30ff0cc 100755
--- a/spec/unit/parser/scope.rb
+++ b/spec/unit/parser/scope.rb
@@ -28,6 +28,21 @@ describe Puppet::Parser::Scope do
@scope.class_scope(klass).should == "myscope"
end
+ it "should be able to retrieve its parent module name from the source of its parent type" do
+ @topscope.source = Puppet::Resource::Type.new(:hostclass, :foo)
+ @topscope.source.module_name = "foo"
+
+ @scope.parent_module_name.should == "foo"
+ end
+
+ it "should return a nil parent module name if it has no parent" do
+ @topscope.parent_module_name.should be_nil
+ end
+
+ it "should return a nil parent module name if its parent has no source" do
+ @scope.parent_module_name.should be_nil
+ end
+
# #620 - Nodes and classes should conflict, else classes don't get evaluated
describe "when evaluating nodes and classes with the same name (#620)" do
diff --git a/spec/unit/resource/type.rb b/spec/unit/resource/type.rb
index 59e46238e..3d0e82498 100755
--- a/spec/unit/resource/type.rb
+++ b/spec/unit/resource/type.rb
@@ -322,6 +322,14 @@ describe Puppet::Resource::Type do
@scope.lookupvar("module_name").should == "mymod"
end
+
+ it "should set its caller module name in the scope if available" do
+ @scope.expects(:parent_module_name).returns "mycaller"
+
+ @type.set_resource_parameters(@resource, @scope)
+
+ @scope.lookupvar("caller_module_name").should == "mycaller"
+ end
end
describe "when describing and managing parent classes" do