Skip to content

Commit ead5c6b

Browse files
authored
Merge pull request #1244 from alexjfisher/ensure_packages
Convert `ensure_packages` to new API and refactor
2 parents b97c657 + b565f7f commit ead5c6b

File tree

4 files changed

+71
-69
lines changed

4 files changed

+71
-69
lines changed

REFERENCE.md

+28-3
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ or the default value if nothing was found.
6060
* [`empty`](#empty): **Deprecated:** Returns true if the variable is empty.
6161
* [`enclose_ipv6`](#enclose_ipv6): Takes an array of ip addresses and encloses the ipv6 addresses with square brackets.
6262
* [`ensure_packages`](#ensure_packages): Takes a list of packages and only installs them if they don't already exist.
63+
* [`ensure_packages`](#ensure_packages): Deprecated 3x version of the `ensure_packages` function
6364
* [`ensure_resource`](#ensure_resource): Takes a resource type, title, and a list of attributes that describe a
6465
resource.
6566
* [`ensure_resources`](#ensure_resources): Takes a resource type, title (only hash), and a list of attributes that describe a
@@ -1966,17 +1967,41 @@ Returns: `Any` encloses the ipv6 addresses with square brackets.
19661967

19671968
### <a name="ensure_packages"></a>`ensure_packages`
19681969

1969-
Type: Ruby 3.x API
1970+
Type: Ruby 4.x API
19701971

19711972
It optionally takes a hash as a second parameter that will be passed as the
19721973
third argument to the ensure_resource() function.
19731974

1974-
#### `ensure_packages()`
1975+
#### `ensure_packages(Variant[String[1], Array[String[1]], Hash[String[1], Any]] $packages, Optional[Hash] $default_attributes)`
19751976

19761977
It optionally takes a hash as a second parameter that will be passed as the
19771978
third argument to the ensure_resource() function.
19781979

1979-
Returns: `Any` install the passed packages
1980+
Returns: `Undef` Returns nothing.
1981+
1982+
##### `packages`
1983+
1984+
Data type: `Variant[String[1], Array[String[1]], Hash[String[1], Any]]`
1985+
1986+
The packages to ensure are installed. If it's a Hash it will be passed to `ensure_resource`
1987+
1988+
##### `default_attributes`
1989+
1990+
Data type: `Optional[Hash]`
1991+
1992+
Default attributes to be passed to the `ensure_resource()` function
1993+
1994+
### <a name="ensure_packages"></a>`ensure_packages`
1995+
1996+
Type: Ruby 3.x API
1997+
1998+
Deprecated 3x version of the `ensure_packages` function
1999+
2000+
#### `ensure_packages()`
2001+
2002+
The ensure_packages function.
2003+
2004+
Returns: `Any`
19802005

19812006
### <a name="ensure_resource"></a>`ensure_resource`
19822007

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# frozen_string_literal: true
2+
3+
# @summary Takes a list of packages and only installs them if they don't already exist.
4+
#
5+
# It optionally takes a hash as a second parameter that will be passed as the
6+
# third argument to the ensure_resource() function.
7+
Puppet::Functions.create_function(:ensure_packages, Puppet::Functions::InternalFunction) do
8+
# @param packages
9+
# The packages to ensure are installed. If it's a Hash it will be passed to `ensure_resource`
10+
# @param default_attributes
11+
# Default attributes to be passed to the `ensure_resource()` function
12+
# @return [Undef] Returns nothing.
13+
dispatch :ensure_packages do
14+
scope_param
15+
param 'Variant[String[1], Array[String[1]], Hash[String[1], Any]]', :packages
16+
optional_param 'Hash', :default_attributes
17+
return_type 'Undef'
18+
end
19+
20+
def ensure_packages(scope, packages, default_attributes = nil)
21+
if default_attributes
22+
defaults = { 'ensure' => 'installed' }.merge(default_attributes)
23+
if defaults['ensure'] == 'present'
24+
defaults['ensure'] = 'installed'
25+
end
26+
else
27+
defaults = { 'ensure' => 'installed' }
28+
end
29+
30+
if packages.is_a?(Hash)
31+
scope.call_function('ensure_resources', ['package', packages.dup, defaults])
32+
else
33+
Array(packages).each do |package_name|
34+
scope.call_function('ensure_resource', ['package', package_name, defaults])
35+
end
36+
end
37+
nil
38+
end
39+
end
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,9 @@
11
# frozen_string_literal: true
22

3-
#
4-
# ensure_packages.rb
5-
#
63
module Puppet::Parser::Functions
7-
newfunction(:ensure_packages, type: :statement, doc: <<-DOC
8-
@summary
9-
Takes a list of packages and only installs them if they don't already exist.
10-
11-
It optionally takes a hash as a second parameter that will be passed as the
12-
third argument to the ensure_resource() function.
13-
14-
@return
15-
install the passed packages
16-
DOC
17-
) do |arguments|
18-
raise(Puppet::ParseError, "ensure_packages(): Wrong number of arguments given (#{arguments.size} for 1 or 2)") if arguments.size > 2 || arguments.empty?
19-
raise(Puppet::ParseError, 'ensure_packages(): Requires second argument to be a Hash') if arguments.size == 2 && !arguments[1].is_a?(Hash)
20-
21-
if arguments[0].is_a?(Hash)
22-
if arguments[1]
23-
defaults = { 'ensure' => 'installed' }.merge(arguments[1])
24-
if defaults['ensure'] == 'present'
25-
defaults['ensure'] = 'installed'
26-
end
27-
else
28-
defaults = { 'ensure' => 'installed' }
29-
end
30-
31-
Puppet::Parser::Functions.function(:ensure_resources)
32-
function_ensure_resources(['package', arguments[0].dup, defaults])
33-
else
34-
packages = Array(arguments[0])
35-
36-
if arguments[1]
37-
defaults = { 'ensure' => 'installed' }.merge(arguments[1])
38-
if defaults['ensure'] == 'present'
39-
defaults['ensure'] = 'installed'
40-
end
41-
else
42-
defaults = { 'ensure' => 'installed' }
43-
end
44-
45-
Puppet::Parser::Functions.function(:ensure_resource)
46-
packages.each do |package_name|
47-
raise(Puppet::ParseError, 'ensure_packages(): Empty String provided for package name') if package_name.empty?
48-
function_ensure_resource(['package', package_name, defaults])
49-
end
50-
end
4+
newfunction(:ensure_packages, type: :statement, doc: '@summary Deprecated 3x version of the `ensure_packages` function') do |arguments|
5+
# Call the 4.x version of this function in case 3.x ruby code uses this function
6+
Puppet.warn_once('deprecations', '3xfunction#ensure_packages', 'Calling function_ensure_packages via the Scope class is deprecated. Use Scope#call_function instead')
7+
call_function('ensure_packages', arguments)
518
end
529
end
53-
54-
# vim: set ts=2 sw=2 et :

spec/functions/ensure_packages_spec.rb

-17
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,6 @@
44

55
describe 'ensure_packages' do
66
it { is_expected.not_to eq(nil) }
7-
it { is_expected.to run.with_params.and_raise_error(Puppet::ParseError) }
8-
it {
9-
pending('should not accept numbers as arguments')
10-
is_expected.to run.with_params(1).and_raise_error(Puppet::ParseError)
11-
}
12-
it {
13-
pending('should not accept numbers as arguments')
14-
is_expected.to run.with_params(['packagename', 1]).and_raise_error(Puppet::ParseError)
15-
}
167
it { is_expected.to run.with_params('packagename') }
178
it { is_expected.to run.with_params(['packagename1', 'packagename2']) }
189

@@ -36,14 +27,6 @@
3627
end
3728
end
3829

39-
context 'when given an empty packages array' do
40-
let(:pre_condition) { 'notify { "hi": } -> Package <| |>; $somearray = ["vim",""]; ensure_packages($somearray)' }
41-
42-
describe 'after running ensure_package(["vim", ""])' do
43-
it { expect { catalogue }.to raise_error(Puppet::ParseError, %r{Empty String provided}) }
44-
end
45-
end
46-
4730
context 'when given hash of packages' do
4831
before(:each) do
4932
subject.execute({ 'foo' => { 'provider' => 'rpm' }, 'bar' => { 'provider' => 'gem' } }, 'ensure' => 'present')

0 commit comments

Comments
 (0)