aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--railties/lib/generators.rb90
-rw-r--r--railties/lib/generators/active_record.rb1
-rw-r--r--railties/test/fixtures/vendor/another_gem_path/xspec/lib/generators/xspec_generator.rb2
-rw-r--r--railties/test/fixtures/vendor/plugins/mspec/lib/generators/mspec_generator.rb (renamed from railties/test/fixtures/vendor/gems/gems/mspec/lib/generators/mspec_generator.rb)0
-rw-r--r--railties/test/generators/generators_test_helper.rb7
-rw-r--r--railties/test/generators/session_migration_generator_test.rb13
-rw-r--r--railties/test/generators_test.rb19
7 files changed, 64 insertions, 68 deletions
diff --git a/railties/lib/generators.rb b/railties/lib/generators.rb
index c97c61507a..a2f462ae81 100644
--- a/railties/lib/generators.rb
+++ b/railties/lib/generators.rb
@@ -76,39 +76,37 @@ module Rails
}
def self.aliases #:nodoc:
- @@aliases ||= DEFAULT_ALIASES.dup
+ @aliases ||= DEFAULT_ALIASES.dup
end
def self.options #:nodoc:
- @@options ||= DEFAULT_OPTIONS.dup
+ @options ||= DEFAULT_OPTIONS.dup
end
- # Get paths only from loaded rubygems. In other words, to use rspec
- # generators, you first have to ensure that rspec gem was already loaded.
+ # We have two scenarios here: when rubygems is loaded and when bundler is
+ # being used. If rubygems is loaded, we get all generators paths from loaded
+ # specs. Otherwise we just have to look into vendor/gems/gems.
#
- def self.rubygems_generators_paths
+ def self.gems_generators_paths
paths = []
- return paths unless defined?(Gem)
- Gem.loaded_specs.each do |name, spec|
- generator_path = File.join(spec.full_gem_path, "lib/generators")
- paths << generator_path if File.exist?(generator_path)
+ if defined?(Gem) && Gem.respond_to?(:loaded_specs)
+ Gem.loaded_specs.each do |name, spec|
+ generator_path = File.join(spec.full_gem_path, "lib/generators")
+ paths << generator_path if File.exist?(generator_path)
+ end
+ elsif defined?(RAILS_ROOT)
+ paths += Dir[File.join(RAILS_ROOT, "vendor", "gems", "gems", "*", "lib", "generators")]
end
paths
end
- # If RAILS_ROOT is defined, add vendor/gems, vendor/plugins and lib/generators
- # paths.
+ # Load paths from plugin.
#
- def self.rails_root_generators_paths
- paths = []
- if defined?(RAILS_ROOT)
- paths += Dir[File.join(RAILS_ROOT, "vendor", "gems", "gems", "*", "lib", "generators")]
- paths += Dir[File.join(RAILS_ROOT, "vendor", "plugins", "*", "lib", "generators")]
- paths << File.join(RAILS_ROOT, "lib", "generators")
- end
- paths
+ def self.plugins_generators_paths
+ return [] unless defined?(RAILS_ROOT)
+ Dir[File.join(RAILS_ROOT, "vendor", "plugins", "*", "lib", "generators")]
end
# Hold configured generators fallbacks. If a plugin developer wants a
@@ -125,7 +123,7 @@ module Rails
# Rails::Generators.fallbacks[:shoulda] = :test_unit
#
def self.fallbacks
- @@fallbacks ||= {}
+ @fallbacks ||= {}
end
# Remove the color from output.
@@ -143,14 +141,17 @@ module Rails
# 5) rubygems generators
# 6) builtin generators
#
- # TODO Remove hardcoded paths for all, except (1).
+ # TODO Remove hardcoded paths for all, except (6).
#
def self.load_paths
- @@load_paths ||= begin
- paths = self.rails_root_generators_paths
+ @load_paths ||= begin
+ paths = []
+ paths << File.join(RAILS_ROOT, "lib", "generators") if defined?(RAILS_ROOT)
paths << File.join(Thor::Util.user_home, ".rails", "generators")
- paths += self.rubygems_generators_paths
+ paths += self.plugins_generators_paths
+ paths += self.gems_generators_paths
paths << File.expand_path(File.join(File.dirname(__FILE__), "generators"))
+ paths.uniq!
paths
end
end
@@ -279,39 +280,18 @@ module Rails
end
# Receives namespaces in an array and tries to find matching generators
- # in the load path. Each path is traversed into directory lookups. For
- # example:
- #
- # rails:generators:model
- #
- # Becomes:
- #
- # generators/rails/model/model_generator.rb
- # generators/rails/model_generator.rb
- # generators/model_generator.rb
+ # in the load path.
#
def self.lookup(attempts) #:nodoc:
- attempts.each do |attempt|
- generators_path = ['.']
-
- paths = attempt.gsub(':generators:', ':').split(':')
- name = "#{paths.last}_generator.rb"
-
- until paths.empty?
- generators_path.unshift File.join(*paths)
- paths.pop
- end
-
- generators_path.uniq!
- generators_path = "{#{generators_path.join(',')}}"
-
- self.load_paths.each do |path|
- Dir[File.join(path, generators_path, name)].each do |file|
- begin
- require file
- rescue Exception => e
- warn "[WARNING] Could not load generator at #{file.inspect}. Error: #{e.message}"
- end
+ attempts = attempts.map { |a| "#{a.split(":").last}_generator" }.uniq
+ attempts = "{#{attempts.join(',')}}.rb"
+
+ self.load_paths.each do |path|
+ Dir[File.join(path, '**', attempts)].each do |file|
+ begin
+ require file
+ rescue Exception => e
+ warn "[WARNING] Could not load generator at #{file.inspect}. Error: #{e.message}"
end
end
end
diff --git a/railties/lib/generators/active_record.rb b/railties/lib/generators/active_record.rb
index 924b70881a..ff3093f356 100644
--- a/railties/lib/generators/active_record.rb
+++ b/railties/lib/generators/active_record.rb
@@ -1,7 +1,6 @@
require 'generators/named_base'
require 'generators/migration'
require 'generators/active_model'
-require 'active_record'
module ActiveRecord
module Generators
diff --git a/railties/test/fixtures/vendor/another_gem_path/xspec/lib/generators/xspec_generator.rb b/railties/test/fixtures/vendor/another_gem_path/xspec/lib/generators/xspec_generator.rb
new file mode 100644
index 0000000000..cd477eb4c9
--- /dev/null
+++ b/railties/test/fixtures/vendor/another_gem_path/xspec/lib/generators/xspec_generator.rb
@@ -0,0 +1,2 @@
+class XspecGenerator < Rails::Generators::NamedBase
+end
diff --git a/railties/test/fixtures/vendor/gems/gems/mspec/lib/generators/mspec_generator.rb b/railties/test/fixtures/vendor/plugins/mspec/lib/generators/mspec_generator.rb
index 191bdbf2fc..191bdbf2fc 100644
--- a/railties/test/fixtures/vendor/gems/gems/mspec/lib/generators/mspec_generator.rb
+++ b/railties/test/fixtures/vendor/plugins/mspec/lib/generators/mspec_generator.rb
diff --git a/railties/test/generators/generators_test_helper.rb b/railties/test/generators/generators_test_helper.rb
index 9444a9ed4b..a258574dce 100644
--- a/railties/test/generators/generators_test_helper.rb
+++ b/railties/test/generators/generators_test_helper.rb
@@ -8,9 +8,12 @@ else
RAILS_ROOT = fixtures
end
-$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../../activerecord/lib"
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../lib"
+$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../../activerecord/lib"
+$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../../actionpack/lib"
require 'generators'
+require 'activerecord'
+require 'action_dispatch'
CURRENT_PATH = File.expand_path(Dir.pwd)
Rails::Generators.no_color!
@@ -19,7 +22,7 @@ class GeneratorsTestCase < Test::Unit::TestCase
include FileUtils
def destination_root
- @destination_root ||= File.expand_path(File.join(File.dirname(__FILE__),
+ @destination_root ||= File.expand_path(File.join(File.dirname(__FILE__),
'..', 'fixtures', 'tmp'))
end
diff --git a/railties/test/generators/session_migration_generator_test.rb b/railties/test/generators/session_migration_generator_test.rb
index 57bd755a9a..293b903b87 100644
--- a/railties/test/generators/session_migration_generator_test.rb
+++ b/railties/test/generators/session_migration_generator_test.rb
@@ -2,16 +2,6 @@ require 'abstract_unit'
require 'generators/generators_test_helper'
require 'generators/rails/session_migration/session_migration_generator'
-module ActiveRecord
- module SessionStore
- class Session
- class << self
- attr_accessor :table_name
- end
- end
- end
-end
-
class SessionMigrationGeneratorTest < GeneratorsTestCase
def test_session_migration_with_default_name
@@ -31,7 +21,10 @@ class SessionMigrationGeneratorTest < GeneratorsTestCase
assert_match /class AddSessionsTable < ActiveRecord::Migration/, migration
assert_match /create_table :custom_table_name/, migration
end
+ ensure
+ ActiveRecord::SessionStore::Session.table_name = "sessions"
end
+
protected
def run_generator(args=[])
diff --git a/railties/test/generators_test.rb b/railties/test/generators_test.rb
index 89d52dd170..4cc0b33521 100644
--- a/railties/test/generators_test.rb
+++ b/railties/test/generators_test.rb
@@ -4,6 +4,11 @@ require 'generators/test_unit/model/model_generator'
require 'mocha'
class GeneratorsTest < GeneratorsTestCase
+ def setup
+ Rails::Generators.instance_variable_set(:@load_paths, nil)
+ Gem.stubs(:respond_to?).with(:loaded_specs).returns(false)
+ end
+
def test_invoke_when_generator_is_not_found
output = capture(:stdout){ Rails::Generators.invoke :unknown }
assert_equal "Could not find generator unknown.\n", output
@@ -70,6 +75,20 @@ class GeneratorsTest < GeneratorsTestCase
assert_equal "mspec", klass.namespace
end
+ def test_find_by_namespace_lookup_with_gem_specification
+ assert_nil Rails::Generators.find_by_namespace(:xspec)
+ Rails::Generators.instance_variable_set(:@load_paths, nil)
+
+ spec = Gem::Specification.new
+ spec.expects(:full_gem_path).returns(File.join(RAILS_ROOT, 'vendor', 'another_gem_path', 'xspec'))
+ Gem.expects(:respond_to?).with(:loaded_specs).returns(true)
+ Gem.expects(:loaded_specs).returns(:spec => spec)
+
+ klass = Rails::Generators.find_by_namespace(:xspec)
+ assert klass
+ assert_equal "xspec", klass.namespace
+ end
+
def test_builtin_generators
assert Rails::Generators.builtin.include? %w(rails model)
end