提交 edda0bfe 编写于 作者: J José Valim

Allow nested and multiple fallbacks for generators.

上级 10fd0217
......@@ -162,11 +162,7 @@ def self.find_by_namespace(name, base=nil, context=nil) #:nodoc:
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 @@ def self.find_by_namespace(name, base=nil, context=nil) #:nodoc:
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 @@ def self.builtin #:nodoc:
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:
......
......@@ -116,16 +116,22 @@ def test_rails_root_templates
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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册