1+ require 'singleton'
2+
13module OAI ::Provider ::Metadata
24 # == Metadata Base Class
35 #
@@ -55,8 +57,8 @@ def value_for(field, record, map)
5557 method = map [ field ] ? map [ field ] . to_s : field . to_s
5658
5759 methods = record . public_methods ( false )
58- if methods . include? ( method . pluralize )
59- record . send method . pluralize
60+ if methods . include? ( pluralize ( method ) )
61+ record . send pluralize ( method )
6062 elsif methods . include? ( method )
6163 record . send method
6264 else
@@ -68,6 +70,46 @@ def value_for(field, record, map)
6870 def header_specification
6971 raise NotImplementedError . new
7072 end
73+
74+ # Shamelessly lifted form ActiveSupport. Thanks Rails community!
75+ def pluralize ( word )
76+ # Use ActiveSupports pluralization if it's available.
77+ return word . pluralize if word . respond_to? ( :pluralize )
78+
79+ # Otherwise use our own simple pluralization rules.
80+ result = word . to_s . dup
81+
82+ # Uncountable words
83+ return result if %w( equipment information rice money species series fish sheep ) . include? ( result )
84+
85+ # Irregular words
86+ { 'person' => 'people' , 'man' => 'men' , 'child' => 'children' , 'sex' => 'sexes' ,
87+ 'move' => 'moves' , 'cow' => 'kine' } . each { |k , v | return v if word == k }
88+
89+ rules . each { |( rule , replacement ) | break if result . gsub! ( rule , replacement ) }
90+ end
91+
92+ def rules
93+ [
94+ [ /$/ , 's' ] ,
95+ [ /s$/i , 's' ] ,
96+ [ /(ax|test)is$/i , '\1es' ] ,
97+ [ /(octop|vir)us$/i , '\1i' ] ,
98+ [ /(alias|status)$/i , '\1es' ] ,
99+ [ /(bu)s$/i , '\1ses' ] ,
100+ [ /(buffal|tomat)o$/i , '\1oes' ] ,
101+ [ /([ti])um$/i , '\1a' ] ,
102+ [ /sis$/i , 'ses' ] ,
103+ [ /(?:([^f])fe|([lr])f)$/i , '\1\2ves' ] ,
104+ [ /(hive)$/i , '\1s' ] ,
105+ [ /([^aeiouy]|qu)y$/i , '\1ies' ] ,
106+ [ /(x|ch|ss|sh)$/i , '\1es' ] ,
107+ [ /(matr|vert|ind)(?:ix|ex)$/i , '\1ices' ] ,
108+ [ /([m|l])ouse$/i , '\1ice' ] ,
109+ [ /^(ox)$/i , '\1en' ] ,
110+ [ /(quiz)$/i , '\1zes' ]
111+ ]
112+ end
71113
72114 end
73115
0 commit comments