Sha256: c50780e49c3972cca1caec37d96ecbc1282e9a44199fef2fa42db495c8525567

Contents?: true

Size: 1.18 KB

Versions: 2

Compression:

Stored size: 1.18 KB

Contents

module RubiGen
  # 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 RubiGen::Base
      # whose name matches the requested class name.
      def lookup_class
        ObjectSpace.each_object(Class) do |obj|
          return obj if obj.ancestors.include?(RubiGen::Base) and
                        obj.name.split('::').last == class_name
        end
        raise NameError, "Missing #{class_name} class in #{class_file}"
      end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rubigen-1.0.0 lib/rubigen/spec.rb
rubigen-1.0.1 lib/rubigen/spec.rb