diff --git a/lib/jekyll/core_ext.rb b/lib/jekyll/core_ext.rb index ead448a4..fc40cb38 100644 --- a/lib/jekyll/core_ext.rb +++ b/lib/jekyll/core_ext.rb @@ -19,6 +19,28 @@ class Hash target end + + # Read array from the supplied hash favouring the singular key + # and then the plural key, and handling any nil entries. + # +hash+ the hash to read from + # +singular_key+ the singular key + # +plural_key+ the singular key + # + # Returns an array + def pluralized_array(singular_key, plural_key) + hash = self + if hash.has_key?(singular_key) + array = [hash[singular_key]] if hash[singular_key] + elsif hash.has_key?(plural_key) + case hash[plural_key] + when String + array = hash[plural_key].split + when Array + array = hash[plural_key].compact + end + end + array || [] + end end # Thanks, ActiveSupport! diff --git a/test/test_core_ext.rb b/test/test_core_ext.rb new file mode 100644 index 00000000..85aca649 --- /dev/null +++ b/test/test_core_ext.rb @@ -0,0 +1,66 @@ +require File.dirname(__FILE__) + '/helper' + +class TestCoreExt < Test::Unit::TestCase + context "hash" do + + context "pluralized_array" do + + should "return empty array with no values" do + data = {} + assert_equal [], data.pluralized_array('tag', 'tags') + end + + should "return empty array with no matching values" do + data = { 'foo' => 'bar' } + assert_equal [], data.pluralized_array('tag', 'tags') + end + + should "return empty array with matching nil singular" do + data = { 'foo' => 'bar', 'tag' => nil, 'tags' => ['dog', 'cat'] } + assert_equal [], data.pluralized_array('tag', 'tags') + end + + should "return single value array with matching singular" do + data = { 'foo' => 'bar', 'tag' => 'dog', 'tags' => ['dog', 'cat'] } + assert_equal ['dog'], data.pluralized_array('tag', 'tags') + end + + should "return single value array with matching singular with spaces" do + data = { 'foo' => 'bar', 'tag' => 'dog cat', 'tags' => ['dog', 'cat'] } + assert_equal ['dog cat'], data.pluralized_array('tag', 'tags') + end + + should "return empty array with matching nil plural" do + data = { 'foo' => 'bar', 'tags' => nil } + assert_equal [], data.pluralized_array('tag', 'tags') + end + + should "return empty array with matching empty array" do + data = { 'foo' => 'bar', 'tags' => [] } + assert_equal [], data.pluralized_array('tag', 'tags') + end + + should "return single value array with matching plural with single string value" do + data = { 'foo' => 'bar', 'tags' => 'dog' } + assert_equal ['dog'], data.pluralized_array('tag', 'tags') + end + + should "return multiple value array with matching plural with single string value with spaces" do + data = { 'foo' => 'bar', 'tags' => 'dog cat' } + assert_equal ['dog', 'cat'], data.pluralized_array('tag', 'tags') + end + + should "return single value array with matching plural with single value array" do + data = { 'foo' => 'bar', 'tags' => ['dog'] } + assert_equal ['dog'], data.pluralized_array('tag', 'tags') + end + + should "return multiple value array with matching plural with multiple value array" do + data = { 'foo' => 'bar', 'tags' => ['dog', 'cat'] } + assert_equal ['dog', 'cat'], data.pluralized_array('tag', 'tags') + end + + end + + end +end