class RablRails::Library

Constants

RENDERER_MAP
UnknownFormat

Public Class Methods

new() click to toggle source
# File lib/rabl-rails/library.rb, line 17
def initialize
  @cached_templates = {}
  @monitor = Monitor.new
end

Public Instance Methods

compile_template_from_path(path, view) click to toggle source
# File lib/rabl-rails/library.rb, line 42
def compile_template_from_path(path, view)
  if RablRails.configuration.cache_templates
    synchronized_compile(path, nil, view)
  else
    source = fetch_source(path, view)
    compile(source, view)
  end
end
compile_template_from_source(source, view) click to toggle source
# File lib/rabl-rails/library.rb, line 33
def compile_template_from_source(source, view)
  if RablRails.configuration.cache_templates
    path = view.instance_variable_get(:@virtual_path)
    synchronized_compile(path, source, view)
  else
    compile(source, view)
  end
end
get_rendered_template(source, view, locals = nil) click to toggle source
# File lib/rabl-rails/library.rb, line 26
def get_rendered_template(source, view, locals = nil)
  compiled_template = compile_template_from_source(source, view)
  format = view.lookup_context.formats.first || :json
  raise UnknownFormat, "#{format} is not supported in rabl-rails" unless RENDERER_MAP.key?(format)
  RENDERER_MAP[format].render(compiled_template, view, locals)
end
reset_cache!() click to toggle source
# File lib/rabl-rails/library.rb, line 22
def reset_cache!
  @cached_templates = {}
end

Private Instance Methods

compile(source, view) click to toggle source
# File lib/rabl-rails/library.rb, line 65
def compile(source, view)
  Compiler.new(view).compile_source(source)
end
fetch_source(path, view) click to toggle source
# File lib/rabl-rails/library.rb, line 69
def fetch_source(path, view)
  t = view.lookup_context.find_template(path, [], false)
  t = t.refresh(view) unless t.source
  t.source
end
synchronized_compile(path, source, view) click to toggle source
# File lib/rabl-rails/library.rb, line 53
def synchronized_compile(path, source, view)
  @cached_templates[path] || @monitor.synchronize do
    # Any thread holding this lock will be compiling the template needed
    # by the threads waiting. So re-check the template presence to avoid
    # re-compilation
    @cached_templates.fetch(path) do
      source ||= fetch_source(path, view)
      @cached_templates[path] = compile(source, view)
    end
  end
end