From 83f7fe2028df15e058205c93308c0e19abd7157a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Tue, 23 Jun 2009 16:50:21 +0200 Subject: NamedBase. --- railties/lib/generator/base.rb | 3 +- .../generator/generators/metal/metal_generator.rb | 10 +--- railties/lib/generator/named_base.rb | 55 ++++++++++++++++++++++ 3 files changed, 57 insertions(+), 11 deletions(-) (limited to 'railties/lib/generator') diff --git a/railties/lib/generator/base.rb b/railties/lib/generator/base.rb index c1452cdb7f..8e778e1d15 100644 --- a/railties/lib/generator/base.rb +++ b/railties/lib/generator/base.rb @@ -41,8 +41,7 @@ module Rails # def self.generator_name @generator_name ||= begin - klass_name = self.name - klass_name.gsub!(/^Rails::Generators::/, '') + klass_name = self.name.gsub(/^Rails::Generators::/, '') klass_name.gsub!(/Generator$/, '') klass_name.underscore end diff --git a/railties/lib/generator/generators/metal/metal_generator.rb b/railties/lib/generator/generators/metal/metal_generator.rb index d999bd89f7..ba062b30be 100644 --- a/railties/lib/generator/generators/metal/metal_generator.rb +++ b/railties/lib/generator/generators/metal/metal_generator.rb @@ -1,15 +1,7 @@ module Rails::Generators - class MetalGenerator < Base - argument :file_name, :type => :string - + class MetalGenerator < NamedBase def create_file template "metal.rb", "app/metal/#{file_name}.rb" end - - protected - - def class_name - file_name.classify - end end end 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 -- cgit v1.2.3