diff options
Diffstat (limited to 'railties')
-rwxr-xr-x | railties/bin/gen | 10 | ||||
-rw-r--r-- | railties/lib/generators.rb | 36 |
2 files changed, 38 insertions, 8 deletions
diff --git a/railties/bin/gen b/railties/bin/gen index 036b1d8275..a6363edd54 100755 --- a/railties/bin/gen +++ b/railties/bin/gen @@ -34,15 +34,9 @@ Rails::Generators.builtin.each do |group, name| require "generators/#{group}/#{name}/#{name}_generator" end -name = ARGV.shift -middle = name.sub(':', ':generators:') if name.count(':') == 1 -full = "rails:generators:#{name}" if name.count(':') == 0 +name = ARGV.shift -if full && klass = Thor::Util.find_by_namespace(full) - klass.start -elsif middle && klass = Thor::Util.find_by_namespace(middle) - klass.start -elsif klass = Thor::Util.find_by_namespace(name) +if klass = Rails::Generators.find_by_namespace(name, "rails") klass.start else puts "Could not find generator #{name}." diff --git a/railties/lib/generators.rb b/railties/lib/generators.rb index 3ed1bd4b17..4cc18e26cf 100644 --- a/railties/lib/generators.rb +++ b/railties/lib/generators.rb @@ -22,6 +22,42 @@ module Rails file.split('/')[-2, 2] end end + + # Receives a namespace and tries different combinations to find a generator. + # + # ==== Examples + # + # lookup_by_namespace :webrat, :rails, :integration + # + # Will search for the following generators: + # + # "rails:generators:webrat", "webrat:generators:integration", "webrat" + # + # If the namespace has ":" included we consider that a absolute namespace + # was given and the lookup above does not happen. Just the name is searched. + # + # Finally, it deals with one kind of shortcut: + # + # lookup_by_namespace "test_unit:model" + # + # It will search for generators at: + # + # "test_unit:generators:model", "test_unit:model" + # + def self.find_by_namespace(name, base=nil, context=nil) + attempts = [ ] + attempts << "#{base}:generators:#{name}" if base && name.count(':') == 0 + attempts << "#{name}:generators:#{context}" if context && name.count(':') == 0 + attempts << name.sub(':', ':generators:') if name.count(':') == 1 + attempts << name + + attempts.each do |namespace| + klass, task = Thor::Util.find_by_namespace(namespace) + return klass if klass + end + + nil + end end end |