Permalink
Browse files

reworked parts of the template finder

The template finder is now the instance to ask for templates. It was
already looking for them, so it should be able to handle questions
regarding the existence of templates too.
  • Loading branch information...
1 parent d74f3da commit 714c540e4b40c931be365d12c31bbe9cbdfa5fb9 @Gibheer Gibheer committed Feb 27, 2013
@@ -61,6 +61,9 @@ class TemplateFinder
# @returns [Regex] the regex built from the path
attr_reader :path_regex
+ # returns all templates found
+ attr_reader :templates
+
# initialize a new template finder
#
# @example
@@ -75,25 +78,90 @@ def initialize(path, type_map)
@path = path
@type_map = sanity_map(type_map)
@path_regex = /#{path}/
+ @templates = load_templates
+ end
+
+ # get the template
+ #
+ # This function returns the template when found.
+ # @raise ArgumentError when the template was not found the type
+ # @param template [String] the template to return
+ # @param type [String] the type to return the template for
+ # @return [Tilt::Template] the tilt template
+ def get(template, types)
+ raise ArgumentError.new(<<-ERROR) unless exist?(template)
+ Template '#{template}' does not exist!
+ ERROR
+ types.each do |type|
+ return Tilt.new(get_template(template, type)) if has_template?(template, type)
+ end
+ raise ArgumentError.new(<<-ERROR)
+ Template '#{template}' not found!
+ types: #{types.inspect}
+ ERROR
+ end
+
+ # check if a specific template exists
+ #
+ # This function checks for the existance of the specifiec template.
+ # @param template [String] the template to find
+ # @returns [Boolean] true when template was found
+ def exist?(template)
+ templates.has_key?(template)
+ end
+
+ # check if the template exists for the specified types
+ #
+ # This function takes the template and searches for any template for the
+ # types.
+ # @param template [String] the template to look for
+ # @param types [Array<String>] the types to test
+ # @return [Boolean] true when a template is found, else false
+ def exist_for_types?(template, types)
+ return false unless exist?(template)
+ types.each do |type|
+ return has_template?(template, type)
+ end
+ false
+ end
+
+ private
+
+ # checks if the template has support for the type
+ #
+ # @param template [String] the template to look for
+ # @param type [String] the type to look for
+ # @return [Boolean] true when the template was found
+ def has_template?(template, type)
+ templates[template].has_key?(type)
+ end
+
+ # returns the template for the type
+ #
+ # This function returns the template for the specified type.
+ # @param template [String] the template to return
+ # @param type [String] the type to return the template for
+ # @return [String] the filename for the template
+ def get_template(template, type)
+ templates[template][type]
end
# traverses the template path to gather all templates
#
# This function traverses the template path, collects and sorts all
# templates into the target types given at initialization.
# @return [Hash] the map of type to template
- def get_templates
- result = Hash.new {|hash, key| hash[key] = {} }
+ def load_templates
+ result = {}
search_files.each do |file|
key, value = add_template(file)
+ result[key] = {} unless result.has_key?(key)
result[key] = result[key].merge(value)
end
result
end
- private
-
# returns a list of files found at @path
#
# This method returns all files found in @path, which look like a template.
@@ -0,0 +1,25 @@
+require 'spec_helper'
+
+describe Zero::Renderer::TemplateFinder, '#exist_for_types?' do
+ subject { described_class.new(template_path, type_map) }
+ let(:template_path) { 'spec/fixtures/templates/' }
+ let(:type_map) { {'html' => 'text/html'} }
+ let(:html_types) { ['text/html'] }
+ let(:foo_types) { ['foo/bar', 'bar/foo'] }
+
+ it 'returns true when template exists' do
+ expect(subject.exist_for_types?('index', html_types)).to be(true)
+ end
+
+ it 'returns false when template does not exist' do
+ expect(subject.exist_for_types?('not_found', html_types)).to be(false)
+ end
+
+ it 'returns false when template for types does not exists' do
+ expect(subject.exist_for_types?('index', foo_types)).to be(false)
+ end
+
+ it 'returns false when no types are defined' do
+ expect(subject.exist_for_types?('index', [])).to be(false)
+ end
+end
@@ -0,0 +1,15 @@
+require 'spec_helper'
+
+describe Zero::Renderer::TemplateFinder, '#exist?' do
+ subject { described_class.new(template_path, type_map) }
+ let(:template_path) { 'spec/fixtures/templates/' }
+ let(:type_map) { {'html' => 'text/html'} }
+
+ it 'returns true when the template exists' do
+ expect(subject.exist?('index')).to be(true)
+ end
+
+ it 'returns false when the template does not exist' do
+ expect(subject.exist?('not_found')).to be(false)
+ end
+end
@@ -0,0 +1,27 @@
+require 'spec_helper'
+
+describe Zero::Renderer::TemplateFinder, '#get' do
+ subject { described_class.new(template_path, type_map) }
+ let(:template_path) { 'spec/fixtures/templates/' }
+ let(:type_map) {{
+ 'html' => ['text/html', 'text/xml', '*/*'],
+ 'json' => ['application/json', 'plain/text']
+ }}
+ let(:html_types) { ['text/html'] }
+ let(:json_types) { ['application/json'] }
+ let(:foo_types) { ['foo/bar', 'bar/foo'] }
+
+ it 'returns a Tilt template' do
+ expect(subject.get('index', html_types)).to be_kind_of(Tilt::Template)
+ end
+
+ it 'raises an Error when the template is not found' do
+ expect { subject.get('not_exist', html_types) }.to raise_error(
+ ArgumentError, /Template 'not_exist' does not exist/)
+ end
+
+ it 'raises an Error when no type for the template was found' do
+ expect { subject.get('index', foo_types) }.to raise_error(
+ ArgumentError, /Template 'index' not found/)
+ end
+end
@@ -17,7 +17,7 @@
shared_examples_for 'a template loader' do
it 'creates a template tree' do
- subject.get_templates['welcome/index'].should eq(result)
+ subject.templates['welcome/index'].should eq(result)
end
end
@@ -55,11 +55,4 @@
it_behaves_like 'a template loader'
end
-
- it 'creates an empty templates list without templates in path' do
- subject = Zero::Renderer.new("bar/", {})
- subject.read_template_path!
-
- subject.templates.should eq({})
- end
end

0 comments on commit 714c540

Please sign in to comment.