Sha256: a50574b2dbe9a3826ddab2a1a090c6f348833c43615d420233613e6bcf85b0fb

Contents?: true

Size: 1.83 KB

Versions: 2

Compression:

Stored size: 1.83 KB

Contents

module Alephant
  class MultiRenderer
    DEFAULT_LOCATION = 'components'

    def initialize(component_id, view_base_path=nil)
      self.base_path = "#{view_base_path}/#{component_id}" unless view_base_path.nil?
      @component_id = component_id
      @logger = ::Alephant.logger
    end

    def base_path
      @base_path || DEFAULT_LOCATION
    end

    def base_path=(path)
      @base_path = File.directory?(path) ? path : (raise Errors::InvalidViewPath)
    end

    def render(data)
      template_locations.reduce({}) do |obj, file|
        template_id = template_id_for file

        obj.tap do |o|
          o[template_id.to_sym] = render_template(
            template_id,
            data
          )
        end
      end
    end

    def render_template(template_file, data)
      renderer(
        template_file,
        base_path,
        data
      ).render
    end

    def renderer(template_file, base_path, data)
      Renderer.new(template_file, base_path, create_instance(template_file, data))
    end

    def create_instance(template_file, data)
      begin
        create_model(template_file, data)
      rescue Exception => e
        @logger.error("Renderer.model: exeception #{e.message}")
        raise Errors::ViewModelNotFound
      end
    end

    private
    def create_model(template_file, data)
      require model_location_for template_file
      klass = Views.get_registered_class("#{@component_id}_#{template_file}")

      @logger.info("Renderer.model: creating new klass #{klass}")
      klass.new(data)
    end

    def model_location_for(template_file)
      File.join(base_path, 'models', "#{template_file}.rb")
    end

    def template_locations
      Dir.glob("#{base_path}/templates/*")
    end

    def template_id_for(template_location)
      template_location.split('/').last.sub(/\.mustache/, '')
    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
alephant-0.0.9.3-java lib/alephant/models/multi_renderer.rb
alephant-0.0.9.2-java lib/alephant/models/multi_renderer.rb