diff options
author | David Schmitt <david.schmitt@puppet.com> | 2017-03-14 14:26:41 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-14 14:26:41 +0000 |
commit | 84a1ddda335f6dc6c8e58cc4b4a8fe91cbed270f (patch) | |
tree | 9fae09345281e0488227df50d27a49385bc20d8e | |
parent | e4ea1c46e7408f6878819dc08905be445a9c7bc8 (diff) | |
parent | 2d9a94ebe827d88222c46af33416ae333ae102b2 (diff) |
Merge pull request #736 from HelenCampbell/lengthfunct
Addition of new length function
-rw-r--r-- | README.markdown | 6 | ||||
-rw-r--r-- | lib/puppet/functions/length.rb | 14 | ||||
-rw-r--r-- | lib/puppet/parser/functions/size.rb | 2 | ||||
-rwxr-xr-x | spec/functions/length.rb | 35 |
4 files changed, 56 insertions, 1 deletions
diff --git a/README.markdown b/README.markdown index c8c2819..4eca785 100644 --- a/README.markdown +++ b/README.markdown @@ -831,6 +831,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. @@ -1083,7 +1087,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` diff --git a/lib/puppet/functions/length.rb b/lib/puppet/functions/length.rb new file mode 100644 index 0000000..86e735c --- /dev/null +++ b/lib/puppet/functions/length.rb @@ -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 diff --git a/lib/puppet/parser/functions/size.rb b/lib/puppet/parser/functions/size.rb index 507c72a..b503aa0 100644 --- a/lib/puppet/parser/functions/size.rb +++ b/lib/puppet/parser/functions/size.rb @@ -12,6 +12,8 @@ Returns the number of elements in a string, an array or a hash 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 diff --git a/spec/functions/length.rb b/spec/functions/length.rb new file mode 100755 index 0000000..d1ab003 --- /dev/null +++ b/spec/functions/length.rb @@ -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 |