slippers 0.0.10 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +1 -1
- data/VERSION.yml +1 -1
- data/lib/engine/engine.rb +1 -0
- data/lib/engine/slippers_nodes.rb +27 -11
- data/lib/engine/template_group.rb +4 -0
- data/lib/engine/template_group_directory.rb +4 -1
- data/spec/engine.rb +7 -0
- data/spec/parse_attributes.rb +7 -4
- data/spec/parse_templates.rb +9 -1
- data/spec/template_group.rb +27 -7
- data/spec/template_group_directory.rb +27 -0
- metadata +3 -3
data/Rakefile
CHANGED
@@ -11,7 +11,7 @@ begin
|
|
11
11
|
gem.name = "slippers"
|
12
12
|
gem.summary = "A strict templating library for Ruby"
|
13
13
|
gem.email = "me@sarahtaraporewalla.com"
|
14
|
-
gem.homepage = "http://github.com/
|
14
|
+
gem.homepage = "http://starapor.github.com/slippers"
|
15
15
|
gem.description = "A strict templating library for ruby"
|
16
16
|
gem.authors = ["Sarah Taraporewalla"]
|
17
17
|
gem.files = FileList["[A-Z]*", "{bin,lib,spec,examples}/**/*"]
|
data/VERSION.yml
CHANGED
data/lib/engine/engine.rb
CHANGED
@@ -3,6 +3,7 @@ Treetop.load File.dirname(__FILE__) + '/slippers'
|
|
3
3
|
module Slippers
|
4
4
|
class Engine
|
5
5
|
DEFAULT_STRING = ''
|
6
|
+
MISSING_HANDLER = lambda { return "" }
|
6
7
|
def initialize(template, params={})
|
7
8
|
@main_template = Slippers::Template.new(template)
|
8
9
|
@template_group = params[:template_group]
|
@@ -2,15 +2,15 @@ module Slippers
|
|
2
2
|
module AttributeToRenderNode
|
3
3
|
|
4
4
|
def eval(object_to_render, template_group)
|
5
|
-
[object_to_render].flatten.inject('') { |rendered, item| rendered + render(value_of(item), template_group) }
|
5
|
+
[object_to_render].flatten.inject('') { |rendered, item| rendered + render(value_of(item, template_group), template_group) }
|
6
6
|
end
|
7
7
|
|
8
|
-
def value_of(item)
|
9
|
-
return
|
8
|
+
def value_of(item, template_group)
|
9
|
+
return default_string(template_group) if attribute == ''
|
10
10
|
return item.to_s if attribute == 'it'
|
11
11
|
return item[to_sym] if item.respond_to?('[]'.to_sym) && item[to_sym]
|
12
12
|
return item.send(attribute) if item.respond_to?(attribute)
|
13
|
-
|
13
|
+
default_string(template_group)
|
14
14
|
end
|
15
15
|
|
16
16
|
def render(object_to_render, template_group)
|
@@ -38,6 +38,12 @@ module Slippers
|
|
38
38
|
def attribute
|
39
39
|
text_value
|
40
40
|
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def default_string(template_group)
|
44
|
+
return Slippers::Engine::DEFAULT_STRING unless template_group
|
45
|
+
template_group.default_string
|
46
|
+
end
|
41
47
|
end
|
42
48
|
|
43
49
|
class AttributeWithExpressionOptionNode < Treetop::Runtime::SyntaxNode
|
@@ -57,11 +63,17 @@ module Slippers
|
|
57
63
|
end
|
58
64
|
|
59
65
|
def apply_attribute_to_subtemplate(item, template_group)
|
60
|
-
return
|
66
|
+
return invoke_misisng_handler unless template_group
|
61
67
|
subtemplate = template_group.find(template_path.to_s)
|
62
|
-
return
|
68
|
+
return invoke_misisng_handler(template_group.missing_handler) unless (subtemplate && subtemplate.respond_to?('render'))
|
63
69
|
subtemplate.render(item)
|
64
70
|
end
|
71
|
+
|
72
|
+
private
|
73
|
+
def invoke_misisng_handler(missing_handler=Slippers::Engine::MISSING_HANDLER)
|
74
|
+
return missing_handler.call(template_path.to_s) if missing_handler.arity == 1
|
75
|
+
missing_handler.call
|
76
|
+
end
|
65
77
|
end
|
66
78
|
|
67
79
|
class AnonymousTemplateNode < Treetop::Runtime::SyntaxNode
|
@@ -82,7 +94,7 @@ module Slippers
|
|
82
94
|
end
|
83
95
|
|
84
96
|
def find_attribute_and_render(item, template_group)
|
85
|
-
object_to_render = attribute.value_of(item)
|
97
|
+
object_to_render = attribute.value_of(item, template_group)
|
86
98
|
[object_to_render].flatten.inject('') { |rendered, i| rendered + template.apply_attribute_to_subtemplate(i, template_group).to_s }
|
87
99
|
end
|
88
100
|
end
|
@@ -90,15 +102,19 @@ module Slippers
|
|
90
102
|
class ConditionalTemplateNode < Treetop::Runtime::SyntaxNode
|
91
103
|
|
92
104
|
def eval(object_to_render, template_group)
|
93
|
-
attribute = if_clause.value_of(object_to_render)
|
94
|
-
if (attribute && attribute !=
|
105
|
+
attribute = if_clause.value_of(object_to_render, template_group)
|
106
|
+
if (attribute && attribute != default_string(template_group)) then
|
95
107
|
if_expression.eval(object_to_render, template_group)
|
96
108
|
else
|
97
|
-
if else_clause.elements then else_clause.else_expression.eval(object_to_render, template_group) else
|
109
|
+
if else_clause.elements then else_clause.else_expression.eval(object_to_render, template_group) else default_string(template_group) end
|
98
110
|
end
|
99
111
|
end
|
100
112
|
|
101
|
-
|
113
|
+
private
|
114
|
+
def default_string(template_group)
|
115
|
+
return Slippers::Engine::DEFAULT_STRING unless template_group
|
116
|
+
template_group.default_string
|
117
|
+
end
|
102
118
|
end
|
103
119
|
|
104
120
|
class TemplatedExpressionNode < Treetop::Runtime::SyntaxNode
|
@@ -3,8 +3,12 @@ module Slippers
|
|
3
3
|
def initialize(params={})
|
4
4
|
@templates = params[:templates]
|
5
5
|
@super_group = params[:super_group]
|
6
|
+
@missing_handler = params[:missing_template_handler] || Slippers::Engine::MISSING_HANDLER
|
7
|
+
@default_string = params[:default_string] || Slippers::Engine::DEFAULT_STRING
|
6
8
|
end
|
7
9
|
|
10
|
+
attr_reader :missing_handler, :default_string
|
11
|
+
|
8
12
|
def find(subtemplate)
|
9
13
|
return nil unless @templates
|
10
14
|
return create_template(subtemplate.to_sym) if @templates.include?(subtemplate.to_sym)
|
@@ -3,8 +3,11 @@ module Slippers
|
|
3
3
|
def initialize(directory_paths, params={})
|
4
4
|
@directory_paths = directory_paths
|
5
5
|
@super_group = params[:super_group]
|
6
|
+
@missing_handler = params[:missing_template_handler] || Slippers::Engine::MISSING_HANDLER
|
7
|
+
@default_string = params[:default_string] || Slippers::Engine::DEFAULT_STRING
|
6
8
|
end
|
7
|
-
|
9
|
+
|
10
|
+
attr_reader :directory_paths, :missing_handler, :default_string
|
8
11
|
|
9
12
|
def find(subtemplate)
|
10
13
|
file_name = @directory_paths.map { |directory_path| directory_path + '/' + subtemplate + '.st' }.find { |f| File.exist? f}
|
data/spec/engine.rb
CHANGED
@@ -79,6 +79,13 @@ describe Slippers::Engine do
|
|
79
79
|
engine = Slippers::Engine.new('$this_is_bad')
|
80
80
|
engine.render(stub('object')).should eql('')
|
81
81
|
end
|
82
|
+
|
83
|
+
it "should handle missing handlers" do
|
84
|
+
template = "This is a string without any holes in it"
|
85
|
+
engine = Slippers::Engine.new(template, :missing_template_handler => nil, :default_string => nil)
|
86
|
+
engine.render.should eql("This is a string without any holes in it")
|
87
|
+
end
|
88
|
+
|
82
89
|
end
|
83
90
|
|
84
91
|
class AgeRenderer
|
data/spec/parse_attributes.rb
CHANGED
@@ -38,13 +38,16 @@ describe SlippersParser do
|
|
38
38
|
@parser.parse('this is $name$').eval(people).should eql("this is fredbarney")
|
39
39
|
end
|
40
40
|
|
41
|
-
it "should render the default string when the attribute cannot be found on the object to render" do
|
41
|
+
it "should render the default string when the attribute cannot be found on the object to render and there is no template group" do
|
42
42
|
Slippers::Engine::DEFAULT_STRING.should eql('')
|
43
43
|
@parser.parse("This is the $adjective$ template with $message$.").eval(OpenStruct.new).should eql("This is the template with .")
|
44
44
|
@parser.parse("$not_me$").eval(:object).should eql('')
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should render the default string of the template group when the attribute cannot be found on the object to render" do
|
48
|
+
template_group = Slippers::TemplateGroup.new(:default_string => "foo" )
|
49
|
+
template_group.default_string.should eql('foo')
|
50
|
+
@parser.parse("$not_me$").eval(:object, template_group).should eql('foo')
|
48
51
|
end
|
49
52
|
|
50
53
|
it "should convert attribute to string" do
|
data/spec/parse_templates.rb
CHANGED
@@ -49,11 +49,19 @@ describe SlippersParser do
|
|
49
49
|
@parser.parse('$people:person()$').eval(object_to_render, template_group).should eql("this is fred flinstone this is barney rubble ")
|
50
50
|
end
|
51
51
|
|
52
|
-
it "should
|
52
|
+
it "should call the default missing handler when the subtemplate cannot be found and there is no template group" do
|
53
|
+
Slippers::Engine::MISSING_HANDLER.call.should eql('')
|
53
54
|
@parser.parse("This is the unknown template $unknown()$!").eval(Person.new('fred', 'flinstone')).should eql("This is the unknown template !")
|
54
55
|
@parser.parse("This is the unknown template $first:unknown()$!").eval(Person.new('fred', 'flinstone')).should eql("This is the unknown template !")
|
55
56
|
end
|
56
57
|
|
58
|
+
it "should call the missing handler when the subtemplate cannot be found" do
|
59
|
+
missing_handler = lambda { |template| "Warning: the template [#{template}] is missing" }
|
60
|
+
template_group = Slippers::TemplateGroup.new(:missing_template_handler => missing_handler)
|
61
|
+
@parser.parse("This is the unknown template $unknown()$!").eval(:object, template_group).should eql("This is the unknown template Warning: the template [unknown] is missing!")
|
62
|
+
@parser.parse("This is the unknown template $first:unknown()$!").eval(Person.new('fred', 'flinstone'), template_group).should eql("This is the unknown template Warning: the template [unknown] is missing!")
|
63
|
+
end
|
64
|
+
|
57
65
|
it "should parse the file template from the template group" do
|
58
66
|
template_group = Slippers::TemplateGroupDirectory.new(['spec/views'])
|
59
67
|
name = OpenStruct.new({:first => 'fred', :last => 'flinestone'})
|
data/spec/template_group.rb
CHANGED
@@ -2,12 +2,12 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
2
2
|
|
3
3
|
describe Slippers::TemplateGroup do
|
4
4
|
it 'should find the right template' do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
subtemplate = Slippers::Engine.new('Hello $first$ $last$')
|
6
|
+
template_group = Slippers::TemplateGroup.new(:templates => {:person => subtemplate})
|
7
|
+
template_group.find(:person).should eql(subtemplate)
|
8
|
+
template_group.find('person').should eql(subtemplate)
|
9
|
+
end
|
10
|
+
|
11
11
|
it 'should wrap a template string in the engine if it is not one' do
|
12
12
|
subtemplate = Slippers::Engine.new('Hello $first$ $last$')
|
13
13
|
template_group = Slippers::TemplateGroup.new(:templates => {:person => 'Hello $first$ $last$'})
|
@@ -48,5 +48,25 @@ describe Slippers::TemplateGroup do
|
|
48
48
|
template_group.has_registered?(date.class).should be_false
|
49
49
|
template_group.render(date).should eql('')
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
|
+
it 'missing handler should be the provided handler' do
|
53
|
+
missing_handler = Proc.new{ |foo| foo.to_s }
|
54
|
+
template_group = Slippers::TemplateGroup.new(:missing_template_handler => missing_handler)
|
55
|
+
template_group.missing_handler.should eql(missing_handler)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'missing handler should be the default handler when none is provided' do
|
59
|
+
template_group = Slippers::TemplateGroup.new()
|
60
|
+
template_group.missing_handler.should eql(Slippers::Engine::MISSING_HANDLER)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'default string should be the provided default' do
|
64
|
+
template_group = Slippers::TemplateGroup.new(:default_string => "Hello Mum")
|
65
|
+
template_group.default_string.should eql("Hello Mum")
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'missing handler should be the default handler when none is provided' do
|
69
|
+
template_group = Slippers::TemplateGroup.new()
|
70
|
+
template_group.default_string.should eql(Slippers::Engine::DEFAULT_STRING)
|
71
|
+
end
|
52
72
|
end
|
@@ -39,5 +39,32 @@ describe Slippers::TemplateGroupDirectory do
|
|
39
39
|
template_group.find('person/age').should eql(Slippers::Engine.new('The age for him is $age$', :template_group => template_group))
|
40
40
|
end
|
41
41
|
|
42
|
+
it 'should accept missing handlers' do
|
43
|
+
template_group = Slippers::TemplateGroupDirectory.new(['spec/views'], :missing_template_handler => nil, :default_string => nil)
|
44
|
+
template_group.find('index').should eql(Slippers::Engine.new('Hey foo', :template_group => template_group))
|
45
|
+
template_group.find('person/age').should eql(Slippers::Engine.new('The age for him is $age$', :template_group => template_group))
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'missing handler should be the provided handler' do
|
49
|
+
missing_handler = Proc.new{ |foo| foo.to_s }
|
50
|
+
template_group = Slippers::TemplateGroupDirectory.new(['spec/views'], :missing_template_handler => missing_handler)
|
51
|
+
template_group.missing_handler.should eql(missing_handler)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'missing handler should be the default handler when none is provided' do
|
55
|
+
template_group = template_group = Slippers::TemplateGroupDirectory.new(['spec/views'])
|
56
|
+
template_group.missing_handler.should eql(Slippers::Engine::MISSING_HANDLER)
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'default string should be the provided default' do
|
60
|
+
template_group = Slippers::TemplateGroupDirectory.new(['spec/views'], :default_string => "Hello Mum")
|
61
|
+
template_group.default_string.should eql("Hello Mum")
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'missing handler should be the default handler when none is provided' do
|
65
|
+
template_group = Slippers::TemplateGroupDirectory.new(['spec/views'])
|
66
|
+
template_group.default_string.should eql(Slippers::Engine::DEFAULT_STRING)
|
67
|
+
end
|
68
|
+
|
42
69
|
|
43
70
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slippers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sarah Taraporewalla
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-30 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -145,7 +145,7 @@ files:
|
|
145
145
|
- spec/views/person/date_renderer.rb
|
146
146
|
- spec/views/person/name.st
|
147
147
|
has_rdoc: true
|
148
|
-
homepage: http://github.com/
|
148
|
+
homepage: http://starapor.github.com/slippers
|
149
149
|
licenses: []
|
150
150
|
|
151
151
|
post_install_message:
|