diff options
Diffstat (limited to 'railties/lib/generator/named_base.rb')
-rw-r--r-- | railties/lib/generator/named_base.rb | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/railties/lib/generator/named_base.rb b/railties/lib/generator/named_base.rb index 1d3de123d5..c35667576a 100644 --- a/railties/lib/generator/named_base.rb +++ b/railties/lib/generator/named_base.rb @@ -3,6 +3,61 @@ require 'generator/base' module Rails module Generators class NamedBase < Base + argument :name, :type => :string + + attr_reader :class_name, :singular_name, :plural_name, :table_name, + :class_path, :file_path, :class_nesting, :class_nesting_depth + alias :file_name :singular_name + + def initialize(*args) + super + assign_names! + end + + protected + + def assign_names! + base_name, @class_path, @file_path, @class_nesting, @class_nesting_depth = extract_modules(name) + @class_name_without_nesting, @singular_name, @plural_name = inflect_names(base_name) + + @table_name = if !defined?(ActiveRecord::Base) || ActiveRecord::Base.pluralize_table_names + plural_name + else + singular_name + end + @table_name.gsub! '/', '_' + + if @class_nesting.empty? + @class_name = @class_name_without_nesting + else + @table_name = @class_nesting.underscore << "_" << @table_name + @class_name = "#{@class_nesting}::#{@class_name_without_nesting}" + end + end + + # Extract modules from filesystem-style or ruby-style path. Both + # good/fun/stuff and Good::Fun::Stuff produce the same results. + # + def extract_modules(name) + modules = name.include?('/') ? name.split('/') : name.split('::') + name = modules.pop + path = modules.map { |m| m.underscore } + + file_path = (path + [name.underscore]).join('/') + nesting = modules.map { |m| m.camelize }.join('::') + + [name, path, file_path, nesting, modules.size] + end + + # Receives name and return camelized, underscored and pluralized names. + # + def inflect_names(name) + camel = name.camelize + under = camel.underscore + plural = under.pluralize + [camel, under, plural] + end + end end end |