Class: Arrow::TemplateFactory

Inherits:
Object
  • Object
show all
Defined in:
lib/arrow/templatefactory.rb

Overview

The TemplateFactory class, which is responsible for interpreting the ‘templates’ section of the configuration, and providing template-loading and -caching according to that configuration,

Authors

Please see the file LICENSE in the top-level directory for licensing details.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Object

deprecate_class_method, deprecate_method, inherited

Constructor Details

#initialize(config) ⇒ TemplateFactory

Create a new TemplateFactory from the given configuration object, which should specify a loader class for templates.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/arrow/templatefactory.rb', line 56

def initialize( config )
	@config = config
	@cache = nil
	
	if config.templates.cache
		@cache = Arrow::Cache.new(
			"Template Factory",
			config.templates.cacheConfig,
			&method(:template_expiration_hook) )
	end

	@loader = self.class.build_template_loader( config )
	@path = config.templates.path

	super()
end

Instance Attribute Details

#cacheObject

The Arrow::Cache object used to cache template objects.



79
80
81
# File 'lib/arrow/templatefactory.rb', line 79

def cache
  @cache
end

#loaderObject

The loader object that the factory uses to load templates



82
83
84
# File 'lib/arrow/templatefactory.rb', line 82

def loader
  @loader
end

#pathObject

The path to search for templates



85
86
87
# File 'lib/arrow/templatefactory.rb', line 85

def path
  @path
end

Class Method Details

.build_template_loader(config) ⇒ Object

Given an Arrow::Config object (config), attempt to load and instantiate the configured template loader object.



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/arrow/templatefactory.rb', line 28

def self::build_template_loader( config )

	# Resolve the loader name into the Class object by traversing
	# constants.
	klass = config.templates.loader.
		split( /::/ ).
		inject( Object ) {|mod, name|
			mod.const_get( name ) or raise ConfigError,
				"No such template loader class #{name} for #{mod.name}"
		}

	if klass.respond_to?( :load, false )
		Arrow::Logger[ self ].debug "Loader (%s) class responds to ::load; using it directly: %p" %
			[ klass.name, klass.method(:load) ]
		return klass
	else
		Arrow::Logger[ self ].debug "Loader (%s) expects instantiation." % [ klass.name ]
		return klass.new( config )
	end
end

Instance Method Details

#get_template(name) ⇒ Object

Load a template object with the specified name.



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/arrow/templatefactory.rb', line 89

def get_template( name )
	self.log.debug "Fetching template '#{name}'"

	if @cache
		self.log.debug "Doing cached fetch."
		tmpl = @cache.fetch( name, &method(:load_from_file) )

		if tmpl.changed?
			self.log.debug "Template has changed on disk: reloading"
			@cache.invalidate( name )
			tmpl = @cache.fetch( name, &method(:load_from_file) )
		end

		return tmpl.dup
	else
		self.log.debug "Caching disabled. Loading from file."
		return self.load_from_file( name )
	end
end

#load_from_file(name) ⇒ Object

Load a template from its source file (ie., if caching is turned off or if the cached version is either expired or not yet seen)



112
113
114
115
# File 'lib/arrow/templatefactory.rb', line 112

def load_from_file( name )
	self.log.debug "Loading template #{name} from the filesystem"
	return @loader.load( name, @path )
end

#template_expiration_hook(key, template) ⇒ Object

Called when a template is expired from the cache



119
120
121
# File 'lib/arrow/templatefactory.rb', line 119

def template_expiration_hook( key, template )
	self.log.debug "Template %s is expiring." % key
end