1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Allow nested and multiple fallbacks for generators.

This commit is contained in:
José Valim 2009-07-21 12:16:25 +02:00
parent 10fd021789
commit edda0bfe76
2 changed files with 32 additions and 12 deletions

View file

@ -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:

View file

@ -116,16 +116,22 @@ class GeneratorsTest < GeneratorsTestCase
rm_rf File.dirname(template)
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
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_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