mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Generators are not aware of namespace of isolated engines and applications
Signed-off-by: José Valim <jose.valim@gmail.com>
This commit is contained in:
parent
55b6fa9370
commit
e83634081a
7 changed files with 194 additions and 10 deletions
|
@ -17,12 +17,12 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
def create_model_file
|
||||
template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
|
||||
namespaced_template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
|
||||
end
|
||||
|
||||
def create_module_file
|
||||
return if class_path.empty?
|
||||
template 'module.rb', File.join('app/models', "#{class_path.join('/')}.rb") if behavior == :invoke
|
||||
namespaced_template 'module.rb', File.join('app/models', "#{class_path.join('/')}.rb") if behavior == :invoke
|
||||
end
|
||||
|
||||
hook_for :test_framework
|
||||
|
|
|
@ -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
|
||||
|
@ -16,15 +18,69 @@ module Rails
|
|||
|
||||
protected
|
||||
|
||||
attr_reader :class_path, :file_name
|
||||
def indent(content, multiplier = 2)
|
||||
spaces = " " * multiplier
|
||||
content.each_line.map {|line| "#{spaces}#{line}" }.join("\n")
|
||||
end
|
||||
|
||||
def wrap_with_namespace(content)
|
||||
"module #{namespace.name}\n#{content}\nend\n"
|
||||
end
|
||||
|
||||
def namespaced_template(source, *args, &block)
|
||||
inside_namespace do
|
||||
template(source, *args) do |content|
|
||||
content = block.call(content) if block_given?
|
||||
if namespace
|
||||
content = indent(content)
|
||||
content = wrap_with_namespace(content)
|
||||
end
|
||||
content
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def inside_namespace
|
||||
@inside_namespace = true if namespaced?
|
||||
result = yield
|
||||
@inside_namespace = false
|
||||
result
|
||||
end
|
||||
|
||||
def namespace
|
||||
@namespace ||= if defined?(Rails) && Rails.application
|
||||
Rails.application.parents.detect { |n| n.respond_to?(:_railtie) }
|
||||
end
|
||||
end
|
||||
|
||||
def namespaced?
|
||||
!options[:skip_namespace] && !!namespace
|
||||
end
|
||||
|
||||
def inside_namespace?
|
||||
@inside_namespace
|
||||
end
|
||||
|
||||
attr_reader :file_name
|
||||
alias :singular_name :file_name
|
||||
|
||||
def file_path
|
||||
@file_path ||= (class_path + [file_name]).join('/')
|
||||
end
|
||||
|
||||
def class_path
|
||||
inside_namespace? || !namespaced? ? @class_path : namespaced_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
|
||||
|
|
|
@ -5,7 +5,7 @@ module Rails
|
|||
check_class_collision :suffix => "Controller"
|
||||
|
||||
def create_controller_files
|
||||
template 'controller.rb', File.join('app/controllers', class_path, "#{file_name}_controller.rb")
|
||||
namespaced_template 'controller.rb', File.join('app/controllers', class_path, "#{file_name}_controller.rb")
|
||||
end
|
||||
|
||||
def add_routes
|
||||
|
|
|
@ -4,7 +4,7 @@ module Rails
|
|||
check_class_collision :suffix => "Helper"
|
||||
|
||||
def create_helper_files
|
||||
template 'helper.rb', File.join('app/helpers', class_path, "#{file_name}_helper.rb")
|
||||
namespaced_template 'helper.rb', File.join('app/helpers', class_path, "#{file_name}_helper.rb")
|
||||
end
|
||||
|
||||
hook_for :test_framework
|
||||
|
|
|
@ -11,7 +11,10 @@ require 'action_controller'
|
|||
require 'rails/all'
|
||||
|
||||
# TODO: Remove these hacks
|
||||
class TestApp < Rails::Application
|
||||
config.root = File.dirname(__FILE__)
|
||||
module TestApp
|
||||
class Application < Rails::Application
|
||||
config.root = File.dirname(__FILE__)
|
||||
end
|
||||
end
|
||||
Rails.application = TestApp
|
||||
|
||||
Rails.application = TestApp::Application
|
||||
|
|
|
@ -36,4 +36,4 @@ module GeneratorsTestHelper
|
|||
FileUtils.mkdir_p(destination)
|
||||
FileUtils.cp File.expand_path(routes), destination
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
125
railties/test/generators/namespaced_generators_test.rb
Normal file
125
railties/test/generators/namespaced_generators_test.rb
Normal file
|
@ -0,0 +1,125 @@
|
|||
require 'generators/generators_test_helper'
|
||||
require 'rails/generators/rails/controller/controller_generator'
|
||||
require 'rails/generators/rails/model/model_generator'
|
||||
|
||||
class NamespacedGeneratorTestCase < Rails::Generators::TestCase
|
||||
def setup
|
||||
TestApp::Application.namespace(TestApp)
|
||||
end
|
||||
|
||||
def teardown
|
||||
if TestApp.respond_to?(:_railtie)
|
||||
TestApp.singleton_class.send(:undef_method, :_railtie)
|
||||
TestApp.singleton_class.send(:undef_method, :table_name_prefix)
|
||||
TestApp::Application.namespaced = false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class NamespacedControllerGeneratorTest < NamespacedGeneratorTestCase
|
||||
include GeneratorsTestHelper
|
||||
arguments %w(Account foo bar)
|
||||
tests Rails::Generators::ControllerGenerator
|
||||
|
||||
setup :copy_routes
|
||||
|
||||
def test_namespaced_controller_skeleton_is_created
|
||||
run_generator
|
||||
assert_file "app/controllers/test_app/account_controller.rb", /module TestApp/, / class AccountController < ApplicationController/
|
||||
assert_file "test/functional/test_app/account_controller_test.rb", /TestApp::AccountController/
|
||||
end
|
||||
|
||||
def test_skipping_namespace
|
||||
run_generator ["Account", "--skip-namespace"]
|
||||
assert_file "app/controllers/account_controller.rb", /class AccountController < ApplicationController/
|
||||
assert_file "app/helpers/account_helper.rb", /module AccountHelper/
|
||||
end
|
||||
|
||||
def test_namespaced_controller_with_additional_namespace
|
||||
run_generator ["admin/account"]
|
||||
assert_file "app/controllers/test_app/admin/account_controller.rb", /module TestApp/, / class Admin::AccountController < ApplicationController/
|
||||
end
|
||||
|
||||
def test_helpr_is_also_namespaced
|
||||
run_generator
|
||||
assert_file "app/helpers/test_app/account_helper.rb", /module TestApp/, / module AccountHelper/
|
||||
assert_file "test/unit/helpers/test_app/account_helper_test.rb", /TestApp::AccountHelper/
|
||||
end
|
||||
|
||||
def test_invokes_default_test_framework
|
||||
run_generator
|
||||
assert_file "test/functional/test_app/account_controller_test.rb"
|
||||
end
|
||||
|
||||
def test_invokes_default_template_engine
|
||||
run_generator
|
||||
assert_file "app/views/test_app/account/foo.html.erb", %r(app/views/test_app/account/foo\.html\.erb)
|
||||
assert_file "app/views/test_app/account/bar.html.erb", %r(app/views/test_app/account/bar\.html\.erb)
|
||||
end
|
||||
|
||||
def test_routes_should_not_be_namespaced
|
||||
run_generator
|
||||
assert_file "config/routes.rb", /get "account\/foo"/, /get "account\/bar"/
|
||||
end
|
||||
#
|
||||
def test_invokes_default_template_engine_even_with_no_action
|
||||
run_generator ["account"]
|
||||
assert_file "app/views/test_app/account"
|
||||
end
|
||||
end
|
||||
|
||||
class NamespacedModelGeneratorTest < NamespacedGeneratorTestCase
|
||||
include GeneratorsTestHelper
|
||||
arguments %w(Account name:string age:integer)
|
||||
tests Rails::Generators::ModelGenerator
|
||||
|
||||
def test_adds_namespace_to_model
|
||||
run_generator
|
||||
assert_file "app/models/test_app/account.rb", /module TestApp/, / class Account < ActiveRecord::Base/
|
||||
end
|
||||
|
||||
def test_model_with_namespace
|
||||
run_generator ["admin/account"]
|
||||
assert_file "app/models/test_app/admin.rb", /module TestApp/, /module Admin/
|
||||
assert_file "app/models/test_app/admin.rb", /def self\.table_name_prefix/
|
||||
assert_file "app/models/test_app/admin.rb", /'admin_'/
|
||||
assert_file "app/models/test_app/admin/account.rb", /module TestApp/, /class Admin::Account < ActiveRecord::Base/
|
||||
end
|
||||
|
||||
def test_migration
|
||||
run_generator
|
||||
assert_migration "db/migrate/create_test_app_accounts.rb", /create_table :test_app_accounts/, /class CreateTestAppAccounts < ActiveRecord::Migration/
|
||||
end
|
||||
|
||||
def test_migration_with_namespace
|
||||
run_generator ["Gallery::Image"]
|
||||
assert_migration "db/migrate/create_test_app_gallery_images", /class CreateTestAppGalleryImages < ActiveRecord::Migration/
|
||||
assert_no_migration "db/migrate/create_test_app_images"
|
||||
end
|
||||
|
||||
def test_migration_with_nested_namespace
|
||||
run_generator ["Admin::Gallery::Image"]
|
||||
assert_no_migration "db/migrate/create_images"
|
||||
assert_no_migration "db/migrate/create_gallery_images"
|
||||
assert_migration "db/migrate/create_test_app_admin_gallery_images", /class CreateTestAppAdminGalleryImages < ActiveRecord::Migration/
|
||||
assert_migration "db/migrate/create_test_app_admin_gallery_images", /create_table :test_app_admin_gallery_images/
|
||||
end
|
||||
|
||||
def test_migration_with_nested_namespace_without_pluralization
|
||||
ActiveRecord::Base.pluralize_table_names = false
|
||||
run_generator ["Admin::Gallery::Image"]
|
||||
assert_no_migration "db/migrate/create_images"
|
||||
assert_no_migration "db/migrate/create_gallery_images"
|
||||
assert_no_migration "db/migrate/create_test_app_admin_gallery_images"
|
||||
assert_migration "db/migrate/create_test_app_admin_gallery_image", /class CreateTestAppAdminGalleryImage < ActiveRecord::Migration/
|
||||
assert_migration "db/migrate/create_test_app_admin_gallery_image", /create_table :test_app_admin_gallery_image/
|
||||
ensure
|
||||
ActiveRecord::Base.pluralize_table_names = true
|
||||
end
|
||||
|
||||
def test_invokes_default_test_framework
|
||||
run_generator
|
||||
assert_file "test/unit/test_app/account_test.rb", /class TestApp::AccountTest < ActiveSupport::TestCase/
|
||||
assert_file "test/fixtures/test_app/accounts.yml", /name: MyString/, /age: 1/
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue