Class: BrainDamage::ViewSchemas::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/generators/brain_damage/lib/views/schemas/base.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resource) ⇒ Base

Returns a new instance of Base.



12
13
14
15
16
# File 'lib/generators/brain_damage/lib/views/schemas/base.rb', line 12

def initialize(resource)
  @views = {}
  @resource = resource
  find_views_names
end

Instance Attribute Details

#viewsObject (readonly)

Returns the value of attribute views.



10
11
12
# File 'lib/generators/brain_damage/lib/views/schemas/base.rb', line 10

def views
  @views
end

Instance Method Details

#describe_view(name, options = {}) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# 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_descriptionsObject



38
39
40
41
42
# 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_namesObject



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 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) ⇒ Boolean

Returns:

  • (Boolean)


83
84
85
# File 'lib/generators/brain_damage/lib/views/schemas/base.rb', line 83

def view_described? name
  @views.has_key? name
end