[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, upstream, updated. 0.25.5-639-g8f94f35
test branch
puppet-dev at googlegroups.com
Wed Jul 14 10:34:11 UTC 2010
The following commit has been merged in the upstream branch:
commit bc90df6e7c0ea194f46ecc3c1753226b8da648c8
Author: Luke Kanies <luke at reductivelabs.com>
Date: Tue Mar 16 08:17:49 2010 -0700
Functions are added to a module instead of Scope
We were previously adding them directly to Scope, but
now they're in a module that Scope includes.
This is the first half of #1175 - we can now maintain
environment-specific collections of functions. We need
some way of tracking which environment a given function
is loaded from.
Well, maybe it's the first third - the core functions
probably need to be added to all of these modules,
or there needs to be a 'common' module that is included by
all of them.
Signed-off-by: Luke Kanies <luke at reductivelabs.com>
diff --git a/lib/puppet/parser/functions.rb b/lib/puppet/parser/functions.rb
index 38bb2eb..4179cb8 100644
--- a/lib/puppet/parser/functions.rb
+++ b/lib/puppet/parser/functions.rb
@@ -2,10 +2,12 @@ require 'puppet/util/autoload'
require 'puppet/parser/scope'
# A module for managing parser functions. Each specified function
-# becomes an instance method on the Scope class.
+# is added to a central module that then gets included into the Scope
+# class.
module Puppet::Parser::Functions
@functions = {}
+ @modules = {}
class << self
include Puppet::Util
@@ -22,6 +24,10 @@ module Puppet::Parser::Functions
@autoloader
end
+ def self.environment_module(env = nil)
+ @module ||= Module.new
+ end
+
# Create a new function type.
def self.newfunction(name, options = {}, &block)
name = symbolize(name)
@@ -43,7 +49,7 @@ module Puppet::Parser::Functions
end
fname = "function_" + name.to_s
- Puppet::Parser::Scope.send(:define_method, fname, &block)
+ environment_module.send(:define_method, fname, &block)
# Someday we'll support specifying an arity, but for now, nope
#@functions[name] = {:arity => arity, :type => ftype}
@@ -64,7 +70,7 @@ module Puppet::Parser::Functions
@functions.delete(name)
fname = "function_" + name.to_s
- Puppet::Parser::Scope.send(:remove_method, fname)
+ environment_module.send(:remove_method, fname)
end
# Determine if a given name is a function
diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb
index 19d79e6..991e123 100644
--- a/lib/puppet/parser/scope.rb
+++ b/lib/puppet/parser/scope.rb
@@ -105,6 +105,11 @@ class Puppet::Parser::Scope
end
end
+ # Remove this when rebasing
+ def environment
+ compiler.environment
+ end
+
# Are we the top scope?
def topscope?
@level == 1
@@ -141,6 +146,8 @@ class Puppet::Parser::Scope
end
}
+ extend_with_functions_module()
+
@tags = []
# The symbol table for this scope. This is where we store variables.
@@ -494,4 +501,10 @@ class Puppet::Parser::Scope
setvar("#{i+1}", m, :file => file, :line => line, :ephemeral => true)
end
end
+
+ private
+
+ def extend_with_functions_module
+ extend Puppet::Parser::Functions.environment_module(compiler ? environment : nil)
+ end
end
diff --git a/spec/unit/parser/functions.rb b/spec/unit/parser/functions.rb
index fe44913..f605052 100644
--- a/spec/unit/parser/functions.rb
+++ b/spec/unit/parser/functions.rb
@@ -4,9 +4,6 @@ require File.dirname(__FILE__) + '/../../spec_helper'
describe Puppet::Parser::Functions do
- before(:each) do
- end
-
after(:each) do
# Rationale:
# our various tests will almost all register to Pupet::Parser::Functions
@@ -23,33 +20,51 @@ describe Puppet::Parser::Functions do
end
end
+ it "should have a method for returning an environment-specific module" do
+ Puppet::Parser::Functions.environment_module("myenv").should be_instance_of(Module)
+ end
+
+ it "should use the current default environment if no environment is provided" do
+ Puppet::Parser::Functions.environment_module().should be_instance_of(Module)
+ end
+
describe "when calling newfunction" do
- it "should create the function in the scope class" do
- Puppet::Parser::Scope.expects(:define_method).with { |name,block| name == "function_name" }
+ before do
+ @module = Module.new
+ Puppet::Parser::Functions.stubs(:environment_module).returns @module
+ end
+
+ it "should create the function in the environment module" do
+ @module.expects(:define_method).with { |name,block| name == "function_name" }
Puppet::Parser::Functions.newfunction("name", :type => :rvalue)
end
it "should raise an error if the function already exists" do
- Puppet::Parser::Scope.expects(:define_method).with { |name,block| name == "function_name" }.once
+ @module.expects(:define_method).with { |name,block| name == "function_name" }.once
Puppet::Parser::Functions.newfunction("name", :type => :rvalue)
lambda { Puppet::Parser::Functions.newfunction("name", :type => :rvalue) }.should raise_error
end
it "should raise an error if the function type is not correct" do
- Puppet::Parser::Scope.expects(:define_method).with { |name,block| name == "function_name" }.never
+ @module.expects(:define_method).with { |name,block| name == "function_name" }.never
lambda { Puppet::Parser::Functions.newfunction("name", :type => :unknown) }.should raise_error
end
end
describe "when calling rmfunction" do
+ before do
+ @module = Module.new
+ Puppet::Parser::Functions.stubs(:environment_module).returns @module
+ end
+
it "should remove the function in the scope class" do
- Puppet::Parser::Scope.expects(:define_method).with { |name,block| name == "function_name" }
+ @module.expects(:define_method).with { |name,block| name == "function_name" }
Puppet::Parser::Functions.newfunction("name", :type => :rvalue)
- Puppet::Parser::Scope.expects(:remove_method).with("function_name").once
+ @module.expects(:remove_method).with("function_name").once
Puppet::Parser::Functions.rmfunction("name")
end
@@ -60,6 +75,10 @@ describe Puppet::Parser::Functions do
end
describe "when calling function to test function existance" do
+ before do
+ @module = Module.new
+ Puppet::Parser::Functions.stubs(:environment_module).returns @module
+ end
it "should return false if the function doesn't exist" do
Puppet::Parser::Functions.autoloader.stubs(:load)
@@ -67,8 +86,8 @@ describe Puppet::Parser::Functions do
Puppet::Parser::Functions.function("name").should be_false
end
- it "should return it's name if the function exists" do
- Puppet::Parser::Scope.expects(:define_method).with { |name,block| name == "function_name" }
+ it "should return its name if the function exists" do
+ @module.expects(:define_method).with { |name,block| name == "function_name" }
Puppet::Parser::Functions.newfunction("name", :type => :rvalue)
Puppet::Parser::Functions.function("name").should == "function_name"
diff --git a/spec/unit/parser/scope.rb b/spec/unit/parser/scope.rb
index c030f25..7093279 100755
--- a/spec/unit/parser/scope.rb
+++ b/spec/unit/parser/scope.rb
@@ -58,6 +58,24 @@ describe Puppet::Parser::Scope do
Puppet::Parser::Scope.ancestors.should include(Puppet::Resource::TypeCollectionHelper)
end
+ describe "when initializing" do
+ it "should extend itself with its environment's Functions module" do
+ env = Puppet::Node::Environment.new("myenv")
+ compiler = stub 'compiler', :environment => env
+ mod = Module.new
+ Puppet::Parser::Functions.expects(:environment_module).with(env).returns mod
+
+ Puppet::Parser::Scope.new(:compiler => compiler).metaclass.ancestors.should be_include(mod)
+ end
+
+ it "should extend itself with the default Functions module if it has no environment" do
+ mod = Module.new
+ Puppet::Parser::Functions.expects(:environment_module).with(nil).returns mod
+
+ Puppet::Parser::Scope.new().metaclass.ancestors.should be_include(mod)
+ end
+ end
+
describe "when looking up a variable" do
it "should default to an empty string" do
@scope.lookupvar("var").should == ""
--
Puppet packaging for Debian
More information about the Pkg-puppet-devel
mailing list