class RubiGen::Spec

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.)

Attributes

name[R]
path[R]
source[R]

Public Class Methods

new(name, path, source) click to toggle source
# File lib/rubigen/spec.rb, line 8
def initialize(name, path, source)
  @name, @path, @source, @klass = name, path, source, nil
end

Public Instance Methods

class_file() click to toggle source
# File lib/rubigen/spec.rb, line 23
def class_file
  "#{path}/#{name}_generator.rb"
end
class_name() click to toggle source
# File lib/rubigen/spec.rb, line 27
def class_name
  "#{name.camelize}Generator"
end
klass() click to toggle source

Look up the generator class. Require its class file, find the class in ObjectSpace, tag it with this spec, and return.

# File lib/rubigen/spec.rb, line 14
def klass
  unless @klass
    require class_file
    @klass = lookup_class
    @klass.spec = self
  end
  @klass
end
usage_file() click to toggle source
# File lib/rubigen/spec.rb, line 31
def usage_file
  "#{path}/USAGE"
end
visible?() click to toggle source
# File lib/rubigen/spec.rb, line 35
def visible?
  File.exists? usage_file
end

Private Instance Methods

lookup_class() click to toggle source

Search for the first Class descending from RubiGen::Base whose name matches the requested class name.

# File lib/rubigen/spec.rb, line 42
def lookup_class
  ObjectSpace.each_object(Class) do |obj|
    return obj if valid_superclass?(obj) and
                  obj.name.split('::').last == class_name
  end
  raise NameError, "Missing #{class_name} class in #{class_file}"
end
valid_generator_superclasses() click to toggle source
# File lib/rubigen/spec.rb, line 57
def valid_generator_superclasses
  @valid_generator_superclasses ||= [
    "RubiGen::Base",
    "Rails::Generator::Base"
  ].inject([]) do |list, class_name|
    klass = class_name.split("::").inject(Object) do |klass, name|
      klass.const_get(name) rescue nil
    end
    list << klass if klass
    list
  end
end
valid_superclass?(obj) click to toggle source
# File lib/rubigen/spec.rb, line 50
def valid_superclass?(obj)
  valid_generator_superclasses.each do |klass|
    return true if obj.ancestors.include?(klass)
  end
  false
end