aboutsummaryrefslogtreecommitdiffstats
path: root/railties
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2009-07-21 12:16:25 +0200
committerJosé Valim <jose.valim@gmail.com>2009-07-21 12:16:25 +0200
commitedda0bfe76fc9b2adcdb705665aaef2769e6ef03 (patch)
tree707bb51e1f6d2ad6a891ebc85cd9f8a19c7167ba /railties
parent10fd0217894fbdf600f3ea6cf080598ce0569809 (diff)
downloadrails-edda0bfe76fc9b2adcdb705665aaef2769e6ef03.tar.gz
rails-edda0bfe76fc9b2adcdb705665aaef2769e6ef03.tar.bz2
rails-edda0bfe76fc9b2adcdb705665aaef2769e6ef03.zip
Allow nested and multiple fallbacks for generators.
Diffstat (limited to 'railties')
-rw-r--r--railties/lib/generators.rb26
-rw-r--r--railties/test/generators_test.rb16
2 files changed, 31 insertions, 11 deletions
diff --git a/railties/lib/generators.rb b/railties/lib/generators.rb
index bb821c0896..45344bf45f 100644
--- a/railties/lib/generators.rb
+++ b/railties/lib/generators.rb
@@ -162,11 +162,7 @@ module Rails
base, name = name.split(':')
return find_by_namespace(name, base)
when 0
- if base
- base = base.to_sym
- attempts << "#{base}:generators:#{name}"
- attempts << "#{fallbacks[base]}:generators:#{name}" if fallbacks[base]
- end
+ attempts << "#{base}:generators:#{name}" if base
attempts << "#{name}:generators:#{context}" if context
end
@@ -179,7 +175,7 @@ module Rails
return klass if klass
end
- nil
+ invoke_fallbacks_for(name, base)
end
# Receives a namespace, arguments and the behavior to invoke the generator.
@@ -242,6 +238,24 @@ module Rails
end
end
+ # Try callbacks for the given base.
+ #
+ def self.invoke_fallbacks_for(name, base)
+ return nil unless base && fallbacks[base.to_sym]
+
+ invoked_fallbacks = []
+
+ Array(fallbacks[base.to_sym]).each do |fallback|
+ next if invoked_fallbacks.include?(fallback)
+ invoked_fallbacks << fallback
+
+ klass = find_by_namespace(name, fallback)
+ return klass if klass
+ end
+
+ nil
+ 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:
diff --git a/railties/test/generators_test.rb b/railties/test/generators_test.rb
index 56c95caa41..ea3f7d5487 100644
--- a/railties/test/generators_test.rb
+++ b/railties/test/generators_test.rb
@@ -116,16 +116,22 @@ class GeneratorsTest < GeneratorsTestCase
rm_rf File.dirname(template)
end
+ def test_fallbacks_for_generators_on_find_by_namespace
+ Rails::Generators.fallbacks[:remarkable] = :test_unit
+ klass = Rails::Generators.find_by_namespace(:plugin, :remarkable)
+ assert klass
+ assert_equal "test_unit:generators:plugin", klass.namespace
+ end
+
def test_fallbacks_for_generators_on_invoke
Rails::Generators.fallbacks[:shoulda] = :test_unit
TestUnit::Generators::ModelGenerator.expects(:start).with(["Account"], {})
Rails::Generators.invoke "shoulda:model", ["Account"]
end
- def test_fallbacks_for_generators_on_find_by_namespace
- Rails::Generators.fallbacks[:remarkable] = :test_unit
- klass = Rails::Generators.find_by_namespace(:plugin, :remarkable)
- assert klass
- assert_equal "test_unit:generators:plugin", klass.namespace
+ def test_nested_fallbacks_for_generators
+ Rails::Generators.fallbacks[:super_shoulda] = :shoulda
+ TestUnit::Generators::ModelGenerator.expects(:start).with(["Account"], {})
+ Rails::Generators.invoke "super_shoulda:model", ["Account"]
end
end