class Consul::Async::ConsulTemplateRender

Object handling the whole rendering of a template It stores the input, the output and flags about last result being modified or simply readiness information about whether the template did receive all data to be fully rendered

Attributes

hot_reload_failure[R]
output_file[R]
params[R]
template_file[R]
template_file_ctime[R]

Public Class Methods

new(template_manager, template_file, output_file, hot_reload_failure: 'die', params: {}) click to toggle source
# File lib/consul/async/consul_template_render.rb, line 28
def initialize(template_manager, template_file, output_file, hot_reload_failure: 'die', params: {})
  @hot_reload_failure = hot_reload_failure
  @template_file = template_file
  @output_file = output_file
  @template_manager = template_manager
  @last_result = ''
  @last_result = File.read(output_file) if File.exist? output_file
  @template = load_template
  @params = params
  @was_rendered_once = false
end

Public Instance Methods

render(tpl = @template, current_template_info: _build_default_template_info) click to toggle source
# File lib/consul/async/consul_template_render.rb, line 40
def render(tpl = @template, current_template_info: _build_default_template_info)
  @template_manager.render(tpl, template_file, params, current_template_info: current_template_info)
end
run() click to toggle source
# File lib/consul/async/consul_template_render.rb, line 44
def run
  hot_reloaded = hot_reload_if_needed
  was_success, modified, last_result = write
  ConsulTemplateRenderedResult.new(template_file, output_file, hot_reloaded, was_success, modified, last_result)
end

Private Instance Methods

_build_default_template_info() click to toggle source
# File lib/consul/async/consul_template_render.rb, line 67
def _build_default_template_info
  {
    'destination' => @output_file,
    'source_root' => template_file.freeze,
    'source' => template_file.freeze,
    'was_rendered_once' => @was_rendered_once
  }
end
hot_reload_if_needed() click to toggle source
# File lib/consul/async/consul_template_render.rb, line 84
def hot_reload_if_needed
  new_time = File.ctime(template_file)
  if template_file_ctime != new_time
    begin
      current_template_info = _build_default_template_info.merge('ready' => false, 'hot_reloading_in_progress' => true)
      @template_file_ctime = new_time
      return update_template(load_template, current_template_info: current_template_info)
    rescue Consul::Async::InvalidTemplateException => e
      warn "****\n[ERROR] HOT Reload of template #{template_file} did fail due to:\n #{e}\n****\n template_info: #{current_template_info}\n****"
      raise e unless hot_reload_failure == 'keep'

      warn "[WARN] Hot reload of #{template_file} was not taken into account, keep running with previous version"
    end
  end
  false
end
load_template() click to toggle source
# File lib/consul/async/consul_template_render.rb, line 52
def load_template
  @template_file_ctime = File.ctime(template_file)
  File.read(template_file)
end
update_template(new_template, current_template_info) click to toggle source

Will throw Consul::Async::InvalidTemplateException if template invalid

# File lib/consul/async/consul_template_render.rb, line 58
def update_template(new_template, current_template_info)
  return false unless new_template != @template

  # We render to ensure the template is valid
  render(new_template, current_template_info: current_template_info)
  @template = new_template.freeze
  true
end
write() click to toggle source
# File lib/consul/async/consul_template_render.rb, line 76
def write
  current_template_info = _build_default_template_info
  success, modified, last_res = @template_manager.write(@output_file, @template, @last_result, template_file, params, current_template_info: current_template_info)
  @last_result = last_res if last_res
  @was_rendered_once ||= success
  [success, modified, @last_result]
end