Class: Roda::RodaPlugins::Render::TemplateMtimeWrapper

Inherits:
Object
  • Object
show all
Defined in:
lib/roda/plugins/render.rb

Overview

Wrapper object for the Tilt template, that checks the modified time of the template file, and rebuilds the template if the template file has been modified. This is an internal class and the API is subject to change at any time.

Instance Method Summary collapse

Constructor Details

#initialize(roda_class, opts, template_opts) ⇒ TemplateMtimeWrapper

Returns a new instance of TemplateMtimeWrapper.



414
415
416
417
418
419
420
421
422
423
424
# File 'lib/roda/plugins/render.rb', line 414

def initialize(roda_class, opts, template_opts)
  @roda_class = roda_class
  @opts = opts
  @template_opts = template_opts
  reset_template

  @path = opts[:path]
  deps = opts[:dependencies]
  @dependencies = ([@path] + Array(deps)) if deps
  @mtime = template_last_modified
end

Instance Method Details

#define_compiled_method(roda_class, method_name, locals_keys = EMPTY_ARRAY) ⇒ Object

Compile a method in the given module with the given name that will call the compiled template method, updating the compiled template method



473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
# File 'lib/roda/plugins/render.rb', line 473

def define_compiled_method(roda_class, method_name, locals_keys=EMPTY_ARRAY)
  mod = roda_class::RodaCompiledTemplates
  internal_method_name = :"_#{method_name}"
  begin
    mod.send(:define_method, internal_method_name, compiled_method(locals_keys, roda_class))
  rescue ::NotImplementedError
    return false
  end

  mod.send(:private, internal_method_name)
  mod.send(:define_method, method_name, &compiled_method_lambda(roda_class, internal_method_name, locals_keys))
  mod.send(:private, method_name)

  method_name
end

#define_compiled_method_cache_value(roda_class, method_name, locals_keys = EMPTY_ARRAY) ⇒ Object

Returns an appropriate value for the template method cache.



490
491
492
493
494
495
496
# File 'lib/roda/plugins/render.rb', line 490

def define_compiled_method_cache_value(roda_class, method_name, locals_keys=EMPTY_ARRAY)
  if compiled_method = define_compiled_method(roda_class, method_name, locals_keys)
    [compiled_method, false].freeze
  else
    compiled_method
  end
end

#fixed_locals?Boolean

Whether the underlying template uses fixed locals.

Returns:

  • (Boolean)


467
468
469
# File 'lib/roda/plugins/render.rb', line 467

def fixed_locals?
  Render.tilt_template_fixed_locals?(@template)
end

#if_modifiedObject

If the template file has been updated, return true and update the template object and the modification time. Other return false.



451
452
453
454
455
456
457
458
459
460
461
462
463
# File 'lib/roda/plugins/render.rb', line 451

def if_modified
  begin
    mtime = template_last_modified
  rescue
    # ignore errors
  else
    if mtime != @mtime
      reset_template
      yield
      @mtime = mtime
    end
  end
end

#render(*args, &block) ⇒ Object

If the template file exists and the modification time has changed, rebuild the template file, then call render on it.



428
429
430
431
432
433
434
435
436
# File 'lib/roda/plugins/render.rb', line 428

def render(*args, &block)
  res = nil
  modified = false
  if_modified do
    res = @template.render(*args, &block)
    modified = true
  end
  modified ? res : @template.render(*args, &block)
end

#template_last_modifiedObject

Return when the template was last modified. If the template depends on any other files, check the modification times of all dependencies and return the maximum.



441
442
443
444
445
446
447
# File 'lib/roda/plugins/render.rb', line 441

def template_last_modified
  if deps = @dependencies
    deps.map{|f| File.mtime(f)}.max
  else
    File.mtime(@path)
  end
end