Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -363,8 +363,8 @@ returns the value of the resource's parameter. For example, the following code r
* `prefix`: This function applies a prefix to all elements in an array or to the keys in a hash. For example, `prefix(['a','b','c'], 'p')` returns ['pa','pb','pc'], and `prefix({'a'=>'b','b'=>'c','c'=>'d'}, 'p')` returns {'pa'=>'b','pb'=>'c','pc'=>'d'}. *Type*: rvalue


* `private`: This function sets the current class or definition as private.
Calling the class or definition from outside the current module will fail. For example, `private()` called in class `foo::bar` outputs the following message if class is called from outside module `foo`:
* `assert_private`: This function sets the current class or definition as private.
Calling the class or definition from outside the current module will fail. For example, `assert_private()` called in class `foo::bar` outputs the following message if class is called from outside module `foo`:

```
Class foo::bar is private
Expand All @@ -373,7 +373,7 @@ Calling the class or definition from outside the current module will fail. For e
You can specify the error message you want to use:

```
private("You're not supposed to do that!")
assert_private("You're not supposed to do that!")
```

*Type*: statement
Expand Down
29 changes: 29 additions & 0 deletions lib/puppet/parser/functions/assert_private.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#
# assert_private.rb
#

module Puppet::Parser::Functions
newfunction(:assert_private, :doc => <<-'EOS'
Sets the current class or definition as private.
Calling the class or definition from outside the current module will fail.
EOS
) do |args|

raise(Puppet::ParseError, "assert_private(): Wrong number of arguments "+
"given (#{args.size}}) for 0 or 1)") if args.size > 1

scope = self
if scope.lookupvar('module_name') != scope.lookupvar('caller_module_name')
message = nil
if args[0] and args[0].is_a? String
message = args[0]
else
manifest_name = scope.source.name
manifest_type = scope.source.type
message = (manifest_type.to_s == 'hostclass') ? 'Class' : 'Definition'
message += " #{manifest_name} is private"
end
raise(Puppet::ParseError, message)
end
end
end
24 changes: 6 additions & 18 deletions lib/puppet/parser/functions/private.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,14 @@

module Puppet::Parser::Functions
newfunction(:private, :doc => <<-'EOS'
Sets the current class or definition as private.
DEPRECATED: Sets the current class or definition as private.
Calling the class or definition from outside the current module will fail.
EOS
EOS
) do |args|

raise(Puppet::ParseError, "private(): Wrong number of arguments "+
"given (#{args.size}}) for 0 or 1)") if args.size > 1

scope = self
if scope.lookupvar('module_name') != scope.lookupvar('caller_module_name')
message = nil
if args[0] and args[0].is_a? String
message = args[0]
else
manifest_name = scope.source.name
manifest_type = scope.source.type
message = (manifest_type.to_s == 'hostclass') ? 'Class' : 'Definition'
message += " #{manifest_name} is private"
end
raise(Puppet::ParseError, message)
warning("private() DEPRECATED: This function will cease to function on Puppet 4; please use assert_private() before upgrading to puppet 4 for backwards-compatibility, or migrate to the new parser's typing system.")
if !Puppet::Parser::Functions.autoloader.loaded?(:assert_private)
Puppet::Parser::Functions.autoloader.load(:assert_private)
end
function_assert_private([(args[0] unless args.size < 1)])
end
end
55 changes: 55 additions & 0 deletions spec/functions/assert_private_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#! /usr/bin/env ruby -S rspec
require 'spec_helper'

describe Puppet::Parser::Functions.function(:assert_private) do
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }

subject do
function_name = Puppet::Parser::Functions.function(:assert_private)
scope.method(function_name)
end

context "when called from inside module" do
it "should not fail" do
scope.expects(:lookupvar).with('module_name').returns('foo')
scope.expects(:lookupvar).with('caller_module_name').returns('foo')
expect {
subject.call []
}.not_to raise_error
end
end

context "with an explicit failure message" do
it "prints the failure message on error" do
scope.expects(:lookupvar).with('module_name').returns('foo')
scope.expects(:lookupvar).with('caller_module_name').returns('bar')
expect {
subject.call ['failure message!']
}.to raise_error Puppet::ParseError, /failure message!/
end
end

context "when called from private class" do
it "should fail with a class error message" do
scope.expects(:lookupvar).with('module_name').returns('foo')
scope.expects(:lookupvar).with('caller_module_name').returns('bar')
scope.source.expects(:name).returns('foo::baz')
scope.source.expects(:type).returns('hostclass')
expect {
subject.call []
}.to raise_error Puppet::ParseError, /Class foo::baz is private/
end
end

context "when called from private definition" do
it "should fail with a class error message" do
scope.expects(:lookupvar).with('module_name').returns('foo')
scope.expects(:lookupvar).with('caller_module_name').returns('bar')
scope.source.expects(:name).returns('foo::baz')
scope.source.expects(:type).returns('definition')
expect {
subject.call []
}.to raise_error Puppet::ParseError, /Definition foo::baz is private/
end
end
end
5 changes: 5 additions & 0 deletions spec/functions/private_spec.rb
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@
scope.method(function_name)
end

it 'should issue a warning' do
scope.expects(:warning).with("private() DEPRECATED: This function will cease to function on Puppet 4; please use assert_private() before upgrading to puppet 4 for backwards-compatibility, or migrate to the new parser's typing system.")
subject.call []
end

context "when called from inside module" do
it "should not fail" do
scope.expects(:lookupvar).with('module_name').returns('foo')
Expand Down