summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff McCune <jeff@puppetlabs.com>2013-04-10 14:40:13 -0700
committerJeff McCune <jeff@puppetlabs.com>2013-04-10 14:40:13 -0700
commit2e2830deda7eede79110a191d0de9d6fc423b440 (patch)
treed16e812759ffb19855c8bb13cffdf15104c41f07
parent6f9361e383982c5b719bbdf17ed72b85850b9d91 (diff)
parente81a45ee0085597dad5067cada94b05cf11c6c0c (diff)
downloadpuppet-stdlib-2e2830deda7eede79110a191d0de9d6fc423b440.tar.gz
puppet-stdlib-2e2830deda7eede79110a191d0de9d6fc423b440.tar.bz2
Merge branch 'dalen-count'
* dalen-count: (maint) Make stdlib usable as a Ruby GEM (maint) Add the behavior for count() with arrays and hashes Add a count function closes #143
-rw-r--r--.gemspec31
-rw-r--r--Gemfile1
-rw-r--r--lib/puppet/parser/functions/count.rb22
-rw-r--r--spec/unit/puppet/parser/functions/count_spec.rb31
4 files changed, 85 insertions, 0 deletions
diff --git a/.gemspec b/.gemspec
new file mode 100644
index 0000000..805e170
--- /dev/null
+++ b/.gemspec
@@ -0,0 +1,31 @@
+#
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+ s.name = "puppetmodule-stdlib"
+
+ s.version = "3.2.0"
+
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+ s.authors = ["Puppet Labs"]
+ s.date = "2013-04-10"
+ s.description = "Puppet Labs Standard Library module"
+ s.email = "support@puppetlabs.com"
+ s.executables = []
+ s.files = []
+ s.homepage = "https://github.com/puppetlabs/puppetlabs-stdlib"
+ s.rdoc_options = ["--title", "Puppet Standard Library Module", "--main", "README.markdown", "--line-numbers"]
+ s.require_paths = ["lib"]
+ s.rubyforge_project = "puppetmodule_stdlib"
+ s.rubygems_version = "1.8.24"
+ s.summary = "This module provides a standard library of resources for developing Puppet Modules."
+
+ if s.respond_to? :specification_version then
+ s.specification_version = 3
+
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+ else
+ end
+ else
+ end
+end
diff --git a/Gemfile b/Gemfile
index 1026074..442dd9d 100644
--- a/Gemfile
+++ b/Gemfile
@@ -6,6 +6,7 @@ end
group :development, :test do
gem 'rake'
+ gem 'puppetmodule-stdlib', ">= 1.0.0", :path => File.expand_path("..", __FILE__)
gem 'rspec', "~> 2.11.0", :require => false
gem 'mocha', "~> 0.10.5", :require => false
gem 'puppetlabs_spec_helper', :require => false
diff --git a/lib/puppet/parser/functions/count.rb b/lib/puppet/parser/functions/count.rb
new file mode 100644
index 0000000..52de1b8
--- /dev/null
+++ b/lib/puppet/parser/functions/count.rb
@@ -0,0 +1,22 @@
+module Puppet::Parser::Functions
+ newfunction(:count, :type => :rvalue, :arity => -2, :doc => <<-EOS
+Takes an array as first argument and an optional second argument.
+Count the number of elements in array that matches second argument.
+If called with only an array it counts the number of elements that are not nil/undef.
+ EOS
+ ) do |args|
+
+ if (args.size > 2) then
+ raise(ArgumentError, "count(): Wrong number of arguments "+
+ "given #{args.size} for 1 or 2.")
+ end
+
+ collection, item = args
+
+ if item then
+ collection.count item
+ else
+ collection.count { |obj| obj != nil && obj != :undef && obj != '' }
+ end
+ end
+end
diff --git a/spec/unit/puppet/parser/functions/count_spec.rb b/spec/unit/puppet/parser/functions/count_spec.rb
new file mode 100644
index 0000000..2453815
--- /dev/null
+++ b/spec/unit/puppet/parser/functions/count_spec.rb
@@ -0,0 +1,31 @@
+#! /usr/bin/env ruby -S rspec
+
+require 'spec_helper'
+
+describe "the count function" do
+ let(:scope) { PuppetlabsSpec::PuppetInternals.scope }
+
+ it "should exist" do
+ Puppet::Parser::Functions.function("count").should == "function_count"
+ end
+
+ it "should raise a ArgumentError if there is more than 2 arguments" do
+ lambda { scope.function_count(['foo', 'bar', 'baz']) }.should( raise_error(ArgumentError))
+ end
+
+ it "should be able to count arrays" do
+ scope.function_count([["1","2","3"]]).should(eq(3))
+ end
+
+ it "should be able to count matching elements in arrays" do
+ scope.function_count([["1", "2", "2"], "2"]).should(eq(2))
+ end
+
+ it "should not count nil or empty strings" do
+ scope.function_count([["foo","bar",nil,""]]).should(eq(2))
+ end
+
+ it 'does not count an undefined hash key or an out of bound array index (which are both :undef)' do
+ expect(scope.function_count([["foo",:undef,:undef]])).to eq(1)
+ end
+end