class BrainDamage::ViewSchemas::Base

Attributes

views[R]

Public Class Methods

new(resource) click to toggle source
# File lib/generators/brain_damage/lib/views/schemas/base.rb, line 12
def initialize(resource)
  @views = {}
  @resource = resource
  find_views_names
end

Private Class Methods

dir() click to toggle source
# File lib/generators/brain_damage/lib/views/schemas/base.rb, line 88
def self.dir
  __dir__
end

Public Instance Methods

describe_view(name, options = {}) click to toggle source
# File lib/generators/brain_damage/lib/views/schemas/base.rb, line 44
def describe_view(name, options = {})
  # First it tries BrainDamage::View::[SpecificSchemaClass]::[SpecificViewClass]
  # Then it tries BrainDamage::View::[SpecificSchemaClass]::Base
  # If none exists, it will try both again with SpecificSchemaClass.parent, until eventually
  # landing on BrainDamage::View::Base::Base

  schema_class = self.class
  view_class_name = options[:view_class_name] || name.to_s.split('/').map{ |part| part.gsub('.', '_').camelize }.join('::')
  options[:schema] = self

  loop do
    specific_view_class_name = "BrainDamage::View::#{schema_class.name.demodulize}::#{view_class_name}"
    if Object.const_defined? specific_view_class_name
      @views[name] = eval(specific_view_class_name).new @resource, options
      break
    end

    base_view_class_name = "BrainDamage::View::#{schema_class.name.demodulize}::Base"
    #puts base_view_class_name
    if Object.const_defined? base_view_class_name
      klass = eval base_view_class_name

      if (options[:template_name] and Pathname.new(options[:template_name]).absolute?) or klass.has_template? name
        options[:file_name] = "#{name}.html.haml" unless options[:file_name]
        options[:template_name] = "#{name}.html.haml" unless options[:template_name]
        @views[name] = eval(base_view_class_name).new @resource, options
        break
      end
    end

    schema_class = schema_class.superclass

    if schema_class == Object
      puts "ERROR: Unable to find any class capable of rendering the view: #{name}"
      break
    end
  end
end
ensure_views_descriptions() click to toggle source
# File lib/generators/brain_damage/lib/views/schemas/base.rb, line 38
def ensure_views_descriptions
  @views_names.each do |name|
    describe_view name unless view_described? name
  end
end
find_views_names() click to toggle source
# File lib/generators/brain_damage/lib/views/schemas/base.rb, line 18
def find_views_names
  schema_class = self.class
  @views_names = []

  loop do
    path = File.join(dir, schema_class.name.demodulize.underscore, 'templates/')

    @views_names += Dir.glob(path + '**/*' ).select{ |name|
      name =~ /html.haml$/
    }.map{ |name|
      name.gsub('.html.haml', '').gsub(path, '')
    }

    break if schema_class == BrainDamage::ViewSchemas::Base
    schema_class = schema_class.superclass
  end

  @views_names.uniq!
end
view_described?(name) click to toggle source
# File lib/generators/brain_damage/lib/views/schemas/base.rb, line 83
def view_described? name
  @views.has_key? name
end

Private Instance Methods

dir() click to toggle source
# File lib/generators/brain_damage/lib/views/schemas/base.rb, line 92
def dir
  __dir__
end