feat(support): add inflector for pluralization and word casing
This commit is contained in:
1 parent
0a872ab5c9
commit
6cae5b0792
1 file changed
+49
@@ -0,0 +1,49 @@
|
|||||||
|
module Prism
|
||||||
|
module Inflector
|
||||||
|
module_function
|
||||||
|
|
||||||
|
def underscore(string)
|
||||||
|
string.to_s
|
||||||
|
.gsub(/::/, '/')
|
||||||
|
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
||||||
|
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
||||||
|
.tr('-', '_')
|
||||||
|
.downcase
|
||||||
|
end
|
||||||
|
|
||||||
|
def camelize(string)
|
||||||
|
string.to_s.split(/_|\//).map { |part| part[0]&.upcase.to_s + part[1..].to_s }.join
|
||||||
|
end
|
||||||
|
|
||||||
|
def pluralize(word)
|
||||||
|
text = word.to_s
|
||||||
|
return text if text.empty?
|
||||||
|
case text
|
||||||
|
when /(?:s|x|z|ch|sh)\z/ then "#{text}es"
|
||||||
|
when /([^aeiou])y\z/ then "#{text[0..-2]}ies"
|
||||||
|
when /fe?\z/ then text.sub(/fe?\z/, 'ves')
|
||||||
|
when /s\z/ then text
|
||||||
|
else "#{text}s"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def singularize(word)
|
||||||
|
text = word.to_s
|
||||||
|
case text
|
||||||
|
when /ies\z/ then "#{text[0..-4]}y"
|
||||||
|
when /ves\z/ then "#{text[0..-4]}fe"
|
||||||
|
when /(?:s|x|z|ch|sh)es\z/ then text[0..-3]
|
||||||
|
when /s\z/ then text[0..-2]
|
||||||
|
else text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def tableize(class_name)
|
||||||
|
pluralize(underscore(class_name.to_s.split('::').last))
|
||||||
|
end
|
||||||
|
|
||||||
|
def classify(table_name)
|
||||||
|
camelize(singularize(table_name.to_s))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in new issue
Block a user