diff options
author | José Valim <jose.valim@gmail.com> | 2009-07-21 12:16:25 +0200 |
---|---|---|
committer | José Valim <jose.valim@gmail.com> | 2009-07-21 12:16:25 +0200 |
commit | edda0bfe76fc9b2adcdb705665aaef2769e6ef03 (patch) | |
tree | 707bb51e1f6d2ad6a891ebc85cd9f8a19c7167ba | |
parent | 10fd0217894fbdf600f3ea6cf080598ce0569809 (diff) | |
download | rails-edda0bfe76fc9b2adcdb705665aaef2769e6ef03.tar.gz rails-edda0bfe76fc9b2adcdb705665aaef2769e6ef03.tar.bz2 rails-edda0bfe76fc9b2adcdb705665aaef2769e6ef03.zip |
Allow nested and multiple fallbacks for generators.
-rw-r--r-- | railties/lib/generators.rb | 26 | ||||
-rw-r--r-- | railties/test/generators_test.rb | 16 |
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 |