diff options
Diffstat (limited to 'railties/lib/rails/generators/named_base.rb')
-rw-r--r-- | railties/lib/rails/generators/named_base.rb | 64 |
1 files changed, 61 insertions, 3 deletions
diff --git a/railties/lib/rails/generators/named_base.rb b/railties/lib/rails/generators/named_base.rb index 44f831e6f3..9131a19043 100644 --- a/railties/lib/rails/generators/named_base.rb +++ b/railties/lib/rails/generators/named_base.rb @@ -5,6 +5,8 @@ module Rails module Generators class NamedBase < Base argument :name, :type => :string + class_option :skip_namespace, :type => :boolean, :default => false, + :desc => "Skip namespace (affects only isolated applications)" def initialize(args, *options) #:nodoc: # Unfreeze name in case it's given as a frozen string @@ -15,16 +17,72 @@ module Rails end protected - - attr_reader :class_path, :file_name + attr_reader :file_name alias :singular_name :file_name + # Wrap block with namespace of current application + # if namespace exists and is not skipped + def module_namespacing(&block) + inside_namespace do + content = capture(&block) + content = wrap_with_namespace(content) if namespaced? + concat(content) + end + end + + def indent(content, multiplier = 2) + spaces = " " * multiplier + content.each_line.map {|line| "#{spaces}#{line}" }.join("\n") + end + + def wrap_with_namespace(content) + content = indent(content) + "module #{namespace.name}\n#{content}\nend\n" + end + + def inside_namespace + @inside_namespace = true if namespaced? + result = yield + result + ensure + @inside_namespace = false + end + + def namespace + @namespace ||= if defined?(Rails) && Rails.application + Rails.application.class.parents.detect { |n| n.respond_to?(:_railtie) } + end + end + + def namespaced? + !options[:skip_namespace] && !!namespace + end + + def inside_namespace? + @inside_namespace + end + def file_path @file_path ||= (class_path + [file_name]).join('/') end + def class_path + inside_namespace? || !namespaced? ? regular_class_path : namespaced_class_path + end + + def regular_class_path + @class_path + end + + def namespaced_class_path + @namespaced_class_path ||= begin + namespace_path = namespace.name.split("::").map {|m| m.underscore } + namespace_path + @class_path + end + end + def class_name - @class_name ||= (class_path + [file_name]).map!{ |m| m.camelize }.join('::') + (class_path + [file_name]).map!{ |m| m.camelize }.join('::') end def human_name |