Skip to content

Addition of new length function #736

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 14, 2017
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: 5 additions & 1 deletion README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -815,6 +815,10 @@ The return value is an array in which each element is one joined key/value pair.

Returns the keys of a hash as an array. *Type*: rvalue.

#### `length`

Returns the length of a given string, array or hash. To eventually replace the deprecated size() function as can handle the new type functionality introduced in Puppet 4. *Type*: rvalue.

#### `loadyaml`

Loads a YAML file containing an array, string, or hash, and returns the data in the corresponding native data type.
Expand Down Expand Up @@ -1067,7 +1071,7 @@ Randomizes the order of a string or array elements. *Type*: rvalue.

#### `size`

Returns the number of elements in a string, an array or a hash. *Type*: rvalue.
Returns the number of elements in a string, an array or a hash. May get confused around Puppet 4 type values and as such is to be deprecated in the next release and replaced with the new stdlib length function. *Type*: rvalue.

#### `sort`

Expand Down
14 changes: 14 additions & 0 deletions lib/puppet/functions/length.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#A function to eventually replace the old size() function for stdlib - The original size function did not handle Puppets new type capabilities, so this function is a Puppet 4 compatible solution.
Puppet::Functions.create_function(:length) do
dispatch :length do
param 'Variant[String,Array,Hash]', :value
end
def length(value)
if value.is_a?(String)
result = value.length
elsif value.is_a?(Array) || value.is_a?(Hash)
result = value.size
end
return result
end
end
2 changes: 2 additions & 0 deletions lib/puppet/parser/functions/size.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ module Puppet::Parser::Functions

item = arguments[0]

function_deprecation([:size, 'This method is going to be deprecated, please use the stdlib length function.'])

if item.is_a?(String)

begin
Expand Down
35 changes: 35 additions & 0 deletions spec/functions/length.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
require 'spec_helper'

describe 'length' do
it { is_expected.not_to eq(nil) }
it { is_expected.to run.with_params().and_raise_error(ArgumentError, /'length' expects 1 argument, got none/) }
it { is_expected.to run.with_params([], 'extra').and_raise_error(ArgumentError, /'length' expects 1 argument, got 2/) }
it { is_expected.to run.with_params(1).and_raise_error(ArgumentError, /expects a value of type String, Array, or Hash, got Integer/) }
it { is_expected.to run.with_params(true).and_raise_error(ArgumentError, /expects a value of type String, Array, or Hash, got Boolean/) }
it { is_expected.to run.with_params('1').and_return(1) }
it { is_expected.to run.with_params('1.0').and_return(3) }
it { is_expected.to run.with_params([]).and_return(0) }
it { is_expected.to run.with_params(['a']).and_return(1) }
it { is_expected.to run.with_params(['one', 'two', 'three']).and_return(3) }
it { is_expected.to run.with_params(['one', 'two', 'three', 'four']).and_return(4) }

it { is_expected.to run.with_params({}).and_return(0) }
it { is_expected.to run.with_params({'1' => '2'}).and_return(1) }
it { is_expected.to run.with_params({'1' => '2', '4' => '4'}).and_return(2) }
it { is_expected.to run.with_params({'€' => '@', '竹' => 'ǿňè'}).and_return(2) }

it { is_expected.to run.with_params('').and_return(0) }
it { is_expected.to run.with_params('a').and_return(1) }
it { is_expected.to run.with_params('abc').and_return(3) }
it { is_expected.to run.with_params('abcd').and_return(4) }
it { is_expected.to run.with_params('万').and_return(1) }
it { is_expected.to run.with_params('āβćđ').and_return(4) }

context 'when using a class extending String' do
it 'should call its size method' do
value = AlsoString.new('asdfghjkl')
value.expects(:length).returns('foo')
expect(subject).to run.with_params(value).and_return('foo')
end
end
end