mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
868e6b08df
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7139 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
44 lines
1.3 KiB
Ruby
44 lines
1.3 KiB
Ruby
module Rails
|
|
module Generator
|
|
# A spec knows where a generator was found and how to instantiate it.
|
|
# Metadata include the generator's name, its base path, and the source
|
|
# which yielded it (PathSource, GemPathSource, etc.)
|
|
class Spec
|
|
attr_reader :name, :path, :source
|
|
|
|
def initialize(name, path, source)
|
|
@name, @path, @source = name, path, source
|
|
end
|
|
|
|
# Look up the generator class. Require its class file, find the class
|
|
# in ObjectSpace, tag it with this spec, and return.
|
|
def klass
|
|
unless @klass
|
|
require class_file
|
|
@klass = lookup_class
|
|
@klass.spec = self
|
|
end
|
|
@klass
|
|
end
|
|
|
|
def class_file
|
|
"#{path}/#{name}_generator.rb"
|
|
end
|
|
|
|
def class_name
|
|
"#{name.camelize}Generator"
|
|
end
|
|
|
|
private
|
|
# Search for the first Class descending from Rails::Generator::Base
|
|
# whose name matches the requested class name.
|
|
def lookup_class
|
|
ObjectSpace.each_object(Class) do |obj|
|
|
return obj if obj.ancestors.include?(Rails::Generator::Base) and
|
|
obj.name.split('::').last == class_name
|
|
end
|
|
raise NameError, "Missing #{class_name} class in #{class_file}"
|
|
end
|
|
end
|
|
end
|
|
end
|