slippers 0.0.10
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/LICENSE +20 -0
- data/README +56 -0
- data/Rakefile +27 -0
- data/VERSION.yml +4 -0
- data/examples/blog/README +3 -0
- data/examples/blog/blog.db +0 -0
- data/examples/blog/controller/main.rb +30 -0
- data/examples/blog/model/entry.rb +31 -0
- data/examples/blog/public/styles/blog.css +132 -0
- data/examples/blog/spec/blog.rb +87 -0
- data/examples/blog/start.rb +7 -0
- data/examples/blog/view/edit.st +19 -0
- data/examples/blog/view/edit.xhtml +17 -0
- data/examples/blog/view/entry.st +12 -0
- data/examples/blog/view/index.st +4 -0
- data/examples/blog/view/index.xhtml +17 -0
- data/examples/blog/view/layout.st +11 -0
- data/examples/blog/view/layout.xhtml +11 -0
- data/examples/blog/view/new.st +16 -0
- data/examples/blog/view/new.xhtml +16 -0
- data/examples/forms/Rakefile +22 -0
- data/examples/forms/controller/init.rb +12 -0
- data/examples/forms/controller/main.rb +20 -0
- data/examples/forms/controller/registration.rb +24 -0
- data/examples/forms/forms.db +0 -0
- data/examples/forms/model/core_extensions/string_extensions.rb +5 -0
- data/examples/forms/model/field.rb +33 -0
- data/examples/forms/model/form.rb +33 -0
- data/examples/forms/model/init.rb +18 -0
- data/examples/forms/model/orm/registration.rb +12 -0
- data/examples/forms/model/registration_form_builder.rb +7 -0
- data/examples/forms/model/registration_repository.rb +39 -0
- data/examples/forms/model/registration_rules/incorrect_email_format.rb +11 -0
- data/examples/forms/model/registration_rules/number_field.rb +10 -0
- data/examples/forms/model/registration_rules/required_field.rb +9 -0
- data/examples/forms/model/registration_validator.rb +17 -0
- data/examples/forms/public/css/ramaze_error.css +90 -0
- data/examples/forms/public/dispatch.fcgi +11 -0
- data/examples/forms/public/favicon.ico +0 -0
- data/examples/forms/public/js/jquery.js +3549 -0
- data/examples/forms/public/ramaze.png +0 -0
- data/examples/forms/public/web-application.js +0 -0
- data/examples/forms/spec/form_spec.rb +16 -0
- data/examples/forms/spec/main.rb +25 -0
- data/examples/forms/spec/registration_controller_spec.rb +0 -0
- data/examples/forms/spec/registration_repository_spec.rb +38 -0
- data/examples/forms/spec/registration_validator_spec.rb +53 -0
- data/examples/forms/spec/spec_helper.rb +3 -0
- data/examples/forms/start.rb +12 -0
- data/examples/forms/start.ru +16 -0
- data/examples/forms/view/error.xhtml +64 -0
- data/examples/forms/view/index.xhtml +34 -0
- data/examples/forms/view/page.xhtml +27 -0
- data/examples/forms/view/registration/index.st +26 -0
- data/examples/main_controller.rb +40 -0
- data/examples/start.rb +7 -0
- data/examples/todolist/README +1 -0
- data/examples/todolist/controller/main.rb +71 -0
- data/examples/todolist/layout/page.rb +31 -0
- data/examples/todolist/model/tasks.rb +14 -0
- data/examples/todolist/public/favicon.ico +0 -0
- data/examples/todolist/public/js/jquery.js +1923 -0
- data/examples/todolist/public/ramaze.png +0 -0
- data/examples/todolist/start.rb +11 -0
- data/examples/todolist/todolist.db +11 -0
- data/examples/todolist/view/index.st +39 -0
- data/examples/todolist/view/index.xhtml +17 -0
- data/examples/todolist/view/new.st +41 -0
- data/examples/todolist/view/new.xhtml +7 -0
- data/examples/todolist/view/tasks.st +6 -0
- data/examples/todolist.db +5 -0
- data/examples/view/index.st +11 -0
- data/examples/view/person/age.st +1 -0
- data/examples/view/person/age_renderer.rb +6 -0
- data/examples/view/person/index.st +2 -0
- data/lib/engine/binding_wrapper.rb +10 -0
- data/lib/engine/engine.rb +28 -0
- data/lib/engine/file_template.rb +12 -0
- data/lib/engine/slippers.treetop +169 -0
- data/lib/engine/slippers_nodes.rb +119 -0
- data/lib/engine/template.rb +17 -0
- data/lib/engine/template_group.rb +40 -0
- data/lib/engine/template_group_directory.rb +57 -0
- data/lib/ramazeTemplates/0001-Adding-slippers-as-a-new-template.patch +138 -0
- data/lib/ramazeTemplates/0002-Fixing-problem-with-using-other-renderers.patch +27 -0
- data/lib/ramazeTemplates/slippers.rb +22 -0
- data/lib/slippers.rb +14 -0
- data/spec/binding_wrapper.rb +19 -0
- data/spec/engine.rb +89 -0
- data/spec/file_template.rb +9 -0
- data/spec/parse_attributes.rb +98 -0
- data/spec/parse_renderers.rb +35 -0
- data/spec/parse_templates.rb +73 -0
- data/spec/person_template.st +1 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/template_group.rb +52 -0
- data/spec/template_group_directory.rb +43 -0
- data/spec/views/index.st +1 -0
- data/spec/views/money.rb +2 -0
- data/spec/views/person/age.st +1 -0
- data/spec/views/person/date_renderer.rb +5 -0
- data/spec/views/person/name.st +1 -0
- metadata +218 -0
@@ -0,0 +1,138 @@
|
|
1
|
+
From 11437e4517358214979eef34351208f4d2fefcbb Mon Sep 17 00:00:00 2001
|
2
|
+
From: starapor <me@sarahtaraporewalla.com>
|
3
|
+
Date: Sun, 13 Sep 2009 14:47:14 +0100
|
4
|
+
Subject: [PATCH] Adding slippers as a new template
|
5
|
+
|
6
|
+
---
|
7
|
+
lib/ramaze/view.rb | 1 +
|
8
|
+
lib/ramaze/view/slippers.rb | 22 ++++++++++++++
|
9
|
+
spec/ramaze/view/slippers.rb | 52 +++++++++++++++++++++++++++++++++
|
10
|
+
spec/ramaze/view/slippers/external.st | 8 +++++
|
11
|
+
spec/ramaze/view/slippers/sum.st | 1 +
|
12
|
+
5 files changed, 84 insertions(+), 0 deletions(-)
|
13
|
+
create mode 100644 lib/ramaze/view/slippers.rb
|
14
|
+
create mode 100644 spec/ramaze/view/slippers.rb
|
15
|
+
create mode 100644 spec/ramaze/view/slippers/external.st
|
16
|
+
create mode 100644 spec/ramaze/view/slippers/sum.st
|
17
|
+
|
18
|
+
diff --git a/lib/ramaze/view.rb b/lib/ramaze/view.rb
|
19
|
+
index e69ae84..ec44754 100644
|
20
|
+
--- a/lib/ramaze/view.rb
|
21
|
+
+++ b/lib/ramaze/view.rb
|
22
|
+
@@ -35,5 +35,6 @@ module Ramaze
|
23
|
+
auto_register :Sass, :sass
|
24
|
+
auto_register :Tagz, :rb, :tagz
|
25
|
+
auto_register :Tenjin, :rbhtml, :tenjin
|
26
|
+
+ auto_register :Slippers, :st
|
27
|
+
end
|
28
|
+
end
|
29
|
+
diff --git a/lib/ramaze/view/slippers.rb b/lib/ramaze/view/slippers.rb
|
30
|
+
new file mode 100644
|
31
|
+
index 0000000..f604185
|
32
|
+
--- /dev/null
|
33
|
+
+++ b/lib/ramaze/view/slippers.rb
|
34
|
+
@@ -0,0 +1,22 @@
|
35
|
+
+require 'slippers'
|
36
|
+
+
|
37
|
+
+module Ramaze
|
38
|
+
+ module View
|
39
|
+
+ module Slippers
|
40
|
+
+ def self.call(action, string)
|
41
|
+
+ slippers = View.compile(string){|s| ::Slippers::Engine.new(s, :template_group => template_group(action)) }
|
42
|
+
+ object_to_render = ::Slippers::BindingWrapper.new(action.instance.binding)
|
43
|
+
+ html = slippers.render(object_to_render)
|
44
|
+
+ return html, 'text/html'
|
45
|
+
+ end
|
46
|
+
+
|
47
|
+
+ private
|
48
|
+
+ def self.template_group(action)
|
49
|
+
+ subtemplates = action.instance.ancestral_trait[:slippers_options] || {}
|
50
|
+
+ view_root = "#{action.instance.options[:roots]}/#{action.instance.options[:views]}"
|
51
|
+
+ template_group_directory = ::Slippers::TemplateGroupDirectory.new(view_root)
|
52
|
+
+ template_group = ::Slippers::TemplateGroup.new(:super_group => template_group_directory, :templates => subtemplates)
|
53
|
+
+ end
|
54
|
+
+ end
|
55
|
+
+ end
|
56
|
+
+end
|
57
|
+
diff --git a/spec/ramaze/view/slippers.rb b/spec/ramaze/view/slippers.rb
|
58
|
+
new file mode 100644
|
59
|
+
index 0000000..769b547
|
60
|
+
--- /dev/null
|
61
|
+
+++ b/spec/ramaze/view/slippers.rb
|
62
|
+
@@ -0,0 +1,52 @@
|
63
|
+
+require File.expand_path('../../../../spec/helper', __FILE__)
|
64
|
+
+spec_require 'slippers'
|
65
|
+
+
|
66
|
+
+Ramaze::App.options.views = 'slippers'
|
67
|
+
+
|
68
|
+
+class SpecSlippers < Ramaze::Controller
|
69
|
+
+ map '/'
|
70
|
+
+ engine :Slippers
|
71
|
+
+
|
72
|
+
+ def index
|
73
|
+
+ @value = "foo"
|
74
|
+
+ '<h1>Slippers Index with $value$</h1>'
|
75
|
+
+ end
|
76
|
+
+
|
77
|
+
+ def sum(num1, num2)
|
78
|
+
+ @num1, @num2 = num1.to_i, num2.to_i
|
79
|
+
+ end
|
80
|
+
+
|
81
|
+
+ def external
|
82
|
+
+ end
|
83
|
+
+end
|
84
|
+
+
|
85
|
+
+describe 'Ramaze::View::Slippers' do
|
86
|
+
+ behaves_like :rack_test
|
87
|
+
+
|
88
|
+
+ should 'render' do
|
89
|
+
+ get('/').body.should == '<h1>Slippers Index with foo</h1>'
|
90
|
+
+ end
|
91
|
+
+
|
92
|
+
+ should 'render external template' do
|
93
|
+
+ get('/external').body.strip.
|
94
|
+
+ should == '<html>
|
95
|
+
+ <head>
|
96
|
+
+ <title>Slippers Test</title>
|
97
|
+
+ </head>
|
98
|
+
+ <body>
|
99
|
+
+ <h1>Slippers Template</h1>
|
100
|
+
+ </body>
|
101
|
+
+</html>'
|
102
|
+
+ end
|
103
|
+
+
|
104
|
+
+ should 'render external template with instance variables' do
|
105
|
+
+ got = get('/sum/1/2')
|
106
|
+
+ got.status.should == 200
|
107
|
+
+ got['Content-Type'].should == 'text/html'
|
108
|
+
+ got.body.strip.should ==
|
109
|
+
+"<div>
|
110
|
+
+ 1 and 2
|
111
|
+
+</div>"
|
112
|
+
+ end
|
113
|
+
+
|
114
|
+
+end
|
115
|
+
diff --git a/spec/ramaze/view/slippers/external.st b/spec/ramaze/view/slippers/external.st
|
116
|
+
new file mode 100644
|
117
|
+
index 0000000..431467b
|
118
|
+
--- /dev/null
|
119
|
+
+++ b/spec/ramaze/view/slippers/external.st
|
120
|
+
@@ -0,0 +1,8 @@
|
121
|
+
+<html>
|
122
|
+
+ <head>
|
123
|
+
+ <title>Slippers Test</title>
|
124
|
+
+ </head>
|
125
|
+
+ <body>
|
126
|
+
+ <h1>Slippers Template</h1>
|
127
|
+
+ </body>
|
128
|
+
+</html>
|
129
|
+
diff --git a/spec/ramaze/view/slippers/sum.st b/spec/ramaze/view/slippers/sum.st
|
130
|
+
new file mode 100644
|
131
|
+
index 0000000..728e130
|
132
|
+
--- /dev/null
|
133
|
+
+++ b/spec/ramaze/view/slippers/sum.st
|
134
|
+
@@ -0,0 +1 @@
|
135
|
+
+<div>$num1$ and $num2$</div>
|
136
|
+
--
|
137
|
+
1.6.1
|
138
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
From a72bd79dfa70bc41cf9bc97ef0f5e96273583a17 Mon Sep 17 00:00:00 2001
|
2
|
+
From: starapor <me@sarahtaraporewalla.com>
|
3
|
+
Date: Tue, 15 Sep 2009 19:16:55 +0100
|
4
|
+
Subject: [PATCH 2/2] Fixing problem with using other renderers
|
5
|
+
|
6
|
+
---
|
7
|
+
lib/ramaze/view/slippers.rb | 4 ++--
|
8
|
+
1 files changed, 2 insertions(+), 2 deletions(-)
|
9
|
+
|
10
|
+
diff --git a/lib/ramaze/view/slippers.rb b/lib/ramaze/view/slippers.rb
|
11
|
+
index f604185..7a4569a 100644
|
12
|
+
--- a/lib/ramaze/view/slippers.rb
|
13
|
+
+++ b/lib/ramaze/view/slippers.rb
|
14
|
+
@@ -14,8 +14,8 @@ module Ramaze
|
15
|
+
def self.template_group(action)
|
16
|
+
subtemplates = action.instance.ancestral_trait[:slippers_options] || {}
|
17
|
+
view_root = "#{action.instance.options[:roots]}/#{action.instance.options[:views]}"
|
18
|
+
- template_group_directory = ::Slippers::TemplateGroupDirectory.new(view_root)
|
19
|
+
- template_group = ::Slippers::TemplateGroup.new(:super_group => template_group_directory, :templates => subtemplates)
|
20
|
+
+ super_group = ::Slippers::TemplateGroup.new(:templates => subtemplates)
|
21
|
+
+ ::Slippers::TemplateGroupDirectory.new(view_root, :super_group => super_group)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
--
|
26
|
+
1.6.1
|
27
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'slippers'
|
2
|
+
|
3
|
+
module Ramaze
|
4
|
+
module View
|
5
|
+
module Slippers
|
6
|
+
def self.call(action, string)
|
7
|
+
slippers = View.compile(string){|s| ::Slippers::Engine.new(s, :template_group => template_group(action)) }
|
8
|
+
object_to_render = ::Slippers::BindingWrapper.new(action.instance.binding)
|
9
|
+
html = slippers.render(object_to_render)
|
10
|
+
return html, 'text/html'
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
def self.template_group(action)
|
15
|
+
subtemplates = action.instance.ancestral_trait[:slippers_options] || {}
|
16
|
+
views = action.instance.options[:views].map{|view| "#{action.instance.options[:roots]}/#{view}" }
|
17
|
+
super_group = ::Slippers::TemplateGroup.new(:templates => subtemplates)
|
18
|
+
::Slippers::TemplateGroupDirectory.new(views, :super_group => super_group)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/slippers.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'treetop'
|
3
|
+
require 'active_support'
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + '/engine/template'
|
6
|
+
require File.dirname(__FILE__) + '/engine/file_template'
|
7
|
+
require File.dirname(__FILE__) + '/engine/template_group'
|
8
|
+
require File.dirname(__FILE__) + '/engine/template_group_directory'
|
9
|
+
require File.dirname(__FILE__) + '/engine/engine'
|
10
|
+
require File.dirname(__FILE__) + '/engine/binding_wrapper'
|
11
|
+
require File.dirname(__FILE__) + '/engine/slippers_nodes'
|
12
|
+
|
13
|
+
|
14
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe Slippers::BindingWrapper do
|
4
|
+
def f
|
5
|
+
@a = 22
|
6
|
+
@b = 33
|
7
|
+
binding
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should evaluate the bindings" do
|
11
|
+
bindings_wrapper = Slippers::BindingWrapper.new(f())
|
12
|
+
bindings_wrapper['a'].should eql(22)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should evaluate the bindings" do
|
16
|
+
bindings_wrapper = Slippers::BindingWrapper.new(f())
|
17
|
+
bindings_wrapper['z'].should eql(nil)
|
18
|
+
end
|
19
|
+
end
|
data/spec/engine.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe Slippers::Engine do
|
4
|
+
before do
|
5
|
+
template = 'Hello $first$ $last$'
|
6
|
+
@engine = Slippers::Engine.new(template)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should render a template without any holes" do
|
10
|
+
template = "This is a string without any holes in it"
|
11
|
+
engine = Slippers::Engine.new(template)
|
12
|
+
engine.render.should eql("This is a string without any holes in it")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should fill in a hole within a template" do
|
16
|
+
template = "This is a string with a message of $message$"
|
17
|
+
engine = Slippers::Engine.new(template)
|
18
|
+
engine.render(:message => "hello world").should eql("This is a string with a message of hello world")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should render a subtemplate within a template" do
|
22
|
+
subtemplate = Slippers::Engine.new("this is a subtemplate")
|
23
|
+
template_group = Slippers::TemplateGroup.new(:templates => {:message => subtemplate})
|
24
|
+
template = "This is a template and then $message()$"
|
25
|
+
engine = Slippers::Engine.new(template, :template_group => template_group)
|
26
|
+
engine.render.should eql("This is a template and then this is a subtemplate")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should apply a template to an attribute" do
|
30
|
+
subtemplate = Slippers::Engine.new("this is a subtemplate with a message of $saying$")
|
31
|
+
template_group = Slippers::TemplateGroup.new(:templates => {:message_subtemplate => subtemplate})
|
32
|
+
template = "This is a template and then $message:message_subtemplate()$!"
|
33
|
+
engine = Slippers::Engine.new(template, :template_group => template_group)
|
34
|
+
engine.render(:message => {:saying => 'hello world'}).should eql("This is a template and then this is a subtemplate with a message of hello world!")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should apply an anonymous subtemplate to an attribute" do
|
38
|
+
template = "This is a template and then $message:{this is a subtemplate with a message of $saying$}$!"
|
39
|
+
engine = Slippers::Engine.new(template)
|
40
|
+
engine.render(:message => {:saying => 'hello world'}).should eql("This is a template and then this is a subtemplate with a message of hello world!")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should render a subtemplate using different rendering technologies" do
|
44
|
+
age_renderer = AgeRenderer.new
|
45
|
+
subtemplate = Slippers::Engine.new('$first$ $last$')
|
46
|
+
person = OpenStruct.new({:name => {:last => 'Flinstone', :first => 'Fred'}, :dob => Date.new(DateTime.now.year - 34, 2, 4)})
|
47
|
+
template_group = Slippers::TemplateGroup.new(:templates => {:name => subtemplate, :age => age_renderer})
|
48
|
+
engine = Slippers::Engine.new("Introducing $name:name()$ who is $dob:age()$.", :template_group => template_group)
|
49
|
+
engine.render(person).should eql("Introducing Fred Flinstone who is 34 years old.")
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should select a renderer based on the type of the object to render" do
|
53
|
+
person = OpenStruct.new({:name => {:first => 'Fred', :last => 'Flinstone'}, :dob => Date.new(DateTime.now.year - 34, 2, 4)})
|
54
|
+
template_group = Slippers::TemplateGroup.new(:templates => {:name => Slippers::Engine.new('$first$ $last$'), Date => AgeRenderer.new})
|
55
|
+
|
56
|
+
engine = Slippers::Engine.new("Introducing $name:name()$ who is $dob$.", :template_group => template_group)
|
57
|
+
engine.render(person).should eql("Introducing Fred Flinstone who is 34 years old.")
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should render a bindings wrapper' do
|
61
|
+
@first = 'fred'
|
62
|
+
@last = 'flinstone'
|
63
|
+
|
64
|
+
person_binding = Slippers::BindingWrapper.new(binding)
|
65
|
+
@engine.render(person_binding).should eql('Hello fred flinstone')
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should render a list of objects' do
|
69
|
+
subtemplate = Slippers::Engine.new('Hello $first$ $last$ ')
|
70
|
+
template_group = Slippers::TemplateGroup.new(:templates => {:person => subtemplate})
|
71
|
+
template = 'Say: $people:person()$'
|
72
|
+
@people = [OpenStruct.new({:first => 'fred', :last => 'flinstone'}), OpenStruct.new({:first => 'barney', :last => 'rubble'})]
|
73
|
+
|
74
|
+
engine = Slippers::Engine.new(template, :template_group => template_group)
|
75
|
+
engine.render(Slippers::BindingWrapper.new(binding)).should eql('Say: Hello fred flinstone Hello barney rubble ')
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should render empty string if the template can not be evaluated' do
|
79
|
+
engine = Slippers::Engine.new('$this_is_bad')
|
80
|
+
engine.render(stub('object')).should eql('')
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class AgeRenderer
|
85
|
+
def render(date)
|
86
|
+
age = DateTime.now.year - date.year
|
87
|
+
age.to_s + " years old"
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe Slippers::FileTemplate, " when rendering" do
|
4
|
+
it "should read the template from a file" do
|
5
|
+
template_file = Slippers::FileTemplate.new('spec/person_template.st')
|
6
|
+
template_file.template.should eql('This is a $template$')
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe SlippersParser do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@parser = SlippersParser.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should return the string unparsed when there are no keywords in it" do
|
10
|
+
@parser.parse('').eval(nil).should eql('')
|
11
|
+
@parser.parse(' ').eval(nil).should eql(' ')
|
12
|
+
@parser.parse('this should be returned unchanged').eval.should eql('this should be returned unchanged')
|
13
|
+
@parser.parse(' this should be returned unchanged ').eval.should eql(' this should be returned unchanged ')
|
14
|
+
@parser.parse('this should be 1234567890 ').eval.should eql('this should be 1234567890 ')
|
15
|
+
@parser.parse('this should be abc1234567890 ').eval.should eql('this should be abc1234567890 ')
|
16
|
+
@parser.parse('this should be !@£%^&*()').eval.should eql('this should be !@£%^&*()')
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should find the keyword within the delimiters' do
|
20
|
+
message = OpenStruct.new({:message => 'the message', :message2 => 'the second message', :name => 'fred', :full_name => 'fred flinstone'})
|
21
|
+
@parser.parse('$message$').eval(message).should eql('the message')
|
22
|
+
@parser.parse('$message$ for $name$').eval(message).should eql('the message for fred')
|
23
|
+
@parser.parse('we want to find $message$').eval(message).should eql('we want to find the message')
|
24
|
+
@parser.parse('$message$ has spoken').eval(message).should eql('the message has spoken')
|
25
|
+
@parser.parse('Yes! $message$ has spoken').eval(message).should eql('Yes! the message has spoken')
|
26
|
+
@parser.parse('Yes! $full_name$ has spoken').eval(message).should eql('Yes! fred flinstone has spoken')
|
27
|
+
@parser.parse('Yes! $message2$ has spoken').eval(message).should eql('Yes! the second message has spoken')
|
28
|
+
@parser.parse('Yes! "$message2$" has spoken').eval(message).should eql('Yes! "the second message" has spoken')
|
29
|
+
@parser.parse('$$').eval(message).should eql('')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should not match on escaped delimiters' do
|
33
|
+
@parser.parse('stuff \$notmatched\$').eval(stub(:nothing)).should eql('stuff \$notmatched\$')
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should render a list of objects" do
|
37
|
+
people = [OpenStruct.new({:name => 'fred'}), OpenStruct.new({:name => 'barney'}) ]
|
38
|
+
@parser.parse('this is $name$').eval(people).should eql("this is fredbarney")
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should render the default string when the attribute cannot be found on the object to render" do
|
42
|
+
Slippers::Engine::DEFAULT_STRING.should eql('')
|
43
|
+
@parser.parse("This is the $adjective$ template with $message$.").eval(OpenStruct.new).should eql("This is the template with .")
|
44
|
+
@parser.parse("$not_me$").eval(:object).should eql('')
|
45
|
+
Slippers::Engine::DEFAULT_STRING = "foo"
|
46
|
+
@parser.parse("$not_me$").eval(:object).should eql('foo')
|
47
|
+
Slippers::Engine::DEFAULT_STRING = ""
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should convert attribute to string" do
|
51
|
+
fred = OpenStruct.new({:name => 'fred', :dob => DateTime.new(1983, 1, 2)})
|
52
|
+
template_group = Slippers::TemplateGroup.new(:templates => {:date => Slippers::Engine.new('$year$')} )
|
53
|
+
@parser.parse("This is $name$ who was born in $dob:date()$").eval(fred, template_group).should eql('This is fred who was born in 1983')
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should render a hash" do
|
57
|
+
hash_object = {:title => 'Domain driven design', :author => 'Eric Evans', :find => 'method on a hash'}
|
58
|
+
@parser.parse("should parse $title$ by $author$").eval(hash_object).should eql("should parse Domain driven design by Eric Evans")
|
59
|
+
@parser.parse("should parse a symbol before a $find$").eval(hash_object).should eql('should parse a symbol before a method on a hash')
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should render a symbol on a hash before its methods" do
|
63
|
+
hash_object = {:find => 'method on a hash'}
|
64
|
+
@parser.parse("should parse a symbol before a $find$").eval(hash_object).should eql('should parse a symbol before a method on a hash')
|
65
|
+
@parser.parse("should still render the method $size$").eval(hash_object).should eql('should still render the method 1')
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should return an empty string if the template is not correctly formed' do
|
69
|
+
@parser.parse("$not_properly_formed").should eql(nil)
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should use the specified expression options to render list items' do
|
73
|
+
@parser.parse('$list; null="-1", seperator=", "$').eval(:list => [1,2,nil,3]).should eql("1, 2, -1, 3")
|
74
|
+
@parser.parse('$list; seperator=", "$').eval(:list => [1,2,3]).should eql("1, 2, 3")
|
75
|
+
@parser.parse('$list; seperator="!!"$').eval(:list => [1,2,3,nil]).should eql("1!!2!!3")
|
76
|
+
@parser.parse('$list; null="-1"$').eval(:list => [1,nil,3]).should eql("1-13")
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should conditionally parse some text' do
|
80
|
+
@parser.parse("$if(greeting)$ Hello $end$").eval(:greeting => true).should eql(" Hello ")
|
81
|
+
@parser.parse("$if(greeting)$ Hello $end$").eval(:greeting => true).should eql(" Hello ")
|
82
|
+
@parser.parse("$if(greeting)$ Hello $end$").eval(:greeting => false).should eql("")
|
83
|
+
@parser.parse("$if(greeting)$ Hello $end$").eval(:greeting => nil).should eql("")
|
84
|
+
@parser.parse("$if(greeting)$Hello$else$Goodbye$end$").eval(:greeting => true).should eql("Hello")
|
85
|
+
@parser.parse("$if(greeting)$ Hello $else$ Goodbye $end$").eval(:greeting => false).should eql(" Goodbye ")
|
86
|
+
@parser.parse("$if(greeting)$ Hello $end$").eval(:greetingzzzz => true).should eql("")
|
87
|
+
@parser.parse("$if(greeting)$ $greeting$ $end$").eval(:greeting => 'Hi').should eql(" Hi ")
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should conditionally parse a template' do
|
91
|
+
@parser.parse("$if(greeting)$ $greeting$ $end$").eval(:greeting => 'Hi').should eql(" Hi ")
|
92
|
+
@parser.parse("$if(greeting)$$greeting$ $else$ Nothing to see here $end$").eval(:greeting => 'Hi').should eql("Hi ")
|
93
|
+
@parser.parse("$if(greeting)$$greeting$ $else$ Nothing to see here $end$").eval(:greeting => nil).should eql(" Nothing to see here ")
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
class Foo
|
4
|
+
end
|
5
|
+
class FooRenderer
|
6
|
+
def render(object)
|
7
|
+
"foo renderer"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
describe SlippersParser do
|
11
|
+
|
12
|
+
before(:each) do
|
13
|
+
@parser = SlippersParser.new
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should return an empty string if the subtemplate does not respond to render' do
|
17
|
+
template_group = Slippers::TemplateGroup.new(:templates => {:not_this_one => stub('renderer')})
|
18
|
+
@parser.parse("$not_this_one()$").eval(stub('object'), template_group).should eql('')
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should find a renderer based on the type of the object to render' do
|
22
|
+
foo = Foo.new
|
23
|
+
template_group = Slippers::TemplateGroup.new(:templates => {:foo => FooRenderer.new})
|
24
|
+
@parser.parse("$foo()$").eval(foo, template_group).should eql('foo renderer')
|
25
|
+
@parser.parse("$foobar:foo()$").eval({:foobar => foo}, template_group).should eql('foo renderer')
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should find a renderer based on the type of the object to render' do
|
29
|
+
foo = Foo.new
|
30
|
+
template_group = Slippers::TemplateGroup.new(:templates => {Foo => FooRenderer.new})
|
31
|
+
@parser.parse("$foobar$").eval({:foobar => foo}, template_group).should eql('foo renderer')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
class Person
|
4
|
+
def initialize(first, last)
|
5
|
+
@first, @last = first, last
|
6
|
+
end
|
7
|
+
attr_reader :first, :last
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
describe SlippersParser do
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
@parser = SlippersParser.new
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should parse the subtemplate found within the delimiters' do
|
18
|
+
template = Slippers::Engine.new('template for this')
|
19
|
+
template_with_underscore = Slippers::Engine.new('template with underscore')
|
20
|
+
predefined_templates = {:template => template, :template_with_underscore => template_with_underscore, :template_2 => template}
|
21
|
+
template_group = Slippers::TemplateGroup.new(:templates => predefined_templates)
|
22
|
+
|
23
|
+
@parser.parse('$template()$').eval(nil, template_group).should eql('template for this')
|
24
|
+
@parser.parse('$template_2()$').eval(nil, template_group).should eql('template for this')
|
25
|
+
@parser.parse('Stuff before $template()$ and after').eval(nil, template_group).should eql('Stuff before template for this and after')
|
26
|
+
@parser.parse('then there is $template_with_underscore()$').eval(nil, template_group).should eql('then there is template with underscore')
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should apply the attribute to a subtemplate when parsing it' do
|
30
|
+
person = OpenStruct.new({:name => Person.new('fred', 'flinstone')})
|
31
|
+
subtemplate = Slippers::Engine.new('Hello $first$ $last$')
|
32
|
+
template_group = Slippers::TemplateGroup.new(:templates => {:person => subtemplate})
|
33
|
+
|
34
|
+
@parser.parse('$name:person()$').eval(person, template_group).should eql('Hello fred flinstone')
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should parse an anonymous subtemplate' do
|
38
|
+
@parser.parse('$people:{template for this $name$}$').eval(:people => {:name => 'fred'}).should eql('template for this fred')
|
39
|
+
@parser.parse('$people:{template for this "$name$"}$').eval(:people => {:name => 'fred'}).should eql('template for this "fred"')
|
40
|
+
@parser.parse('${template for this $name$}$').eval(:name => 'fred').should eql('template for this fred')
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should apply a list of objects to subtemplates" do
|
44
|
+
people = [ Person.new('fred', 'flinstone'), Person.new('barney', 'rubble') ]
|
45
|
+
subtemplate = Slippers::Engine.new('this is $first$ $last$ ')
|
46
|
+
template_group = Slippers::TemplateGroup.new(:templates => {:person => subtemplate})
|
47
|
+
object_to_render = OpenStruct.new({:people => people})
|
48
|
+
|
49
|
+
@parser.parse('$people:person()$').eval(object_to_render, template_group).should eql("this is fred flinstone this is barney rubble ")
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should render an empty string when the subtemplate cannot be found" do
|
53
|
+
@parser.parse("This is the unknown template $unknown()$!").eval(Person.new('fred', 'flinstone')).should eql("This is the unknown template !")
|
54
|
+
@parser.parse("This is the unknown template $first:unknown()$!").eval(Person.new('fred', 'flinstone')).should eql("This is the unknown template !")
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should parse the file template from the template group" do
|
58
|
+
template_group = Slippers::TemplateGroupDirectory.new(['spec/views'])
|
59
|
+
name = OpenStruct.new({:first => 'fred', :last => 'flinestone'})
|
60
|
+
people = OpenStruct.new({:fred => name})
|
61
|
+
@parser.parse("should parse $person/name()$").eval(name, template_group).should eql("should parse fred flinestone")
|
62
|
+
@parser.parse("should parse $fred:person/name()$").eval(people, template_group).should eql("should parse fred flinestone")
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should render the object if the keyword it is used' do
|
66
|
+
supergroup = Slippers::TemplateGroup.new(:templates => {:bold => Slippers::Engine.new("<b>$it$</b>")})
|
67
|
+
subgroup = Slippers::TemplateGroup.new(:templates => {}, :super_group => supergroup)
|
68
|
+
@parser.parse("<b>$it$</b>").eval("Sarah", subgroup).should eql('<b>Sarah</b>')
|
69
|
+
@parser.parse("$name:bold()$").eval({:name => "Sarah"}, subgroup).should eql('<b>Sarah</b>')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
This is a $template$
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe Slippers::TemplateGroup do
|
4
|
+
it 'should find the right template' do
|
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
|
+
it 'should wrap a template string in the engine if it is not one' do
|
12
|
+
subtemplate = Slippers::Engine.new('Hello $first$ $last$')
|
13
|
+
template_group = Slippers::TemplateGroup.new(:templates => {:person => 'Hello $first$ $last$'})
|
14
|
+
template_group.find(:person).should eql(subtemplate)
|
15
|
+
template_group.find('person').should eql(subtemplate)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should return nil if it cannot find the right template' do
|
19
|
+
template_group = Slippers::TemplateGroup.new()
|
20
|
+
template_group.find(:not_this).should eql(nil)
|
21
|
+
template_group.find('not_this').should eql(nil)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should look in the super template group if it cannot find the template' do
|
25
|
+
template = Slippers::Engine.new('Hello $first$ $last$')
|
26
|
+
super_template_group = Slippers::TemplateGroup.new(:templates => {:person => template})
|
27
|
+
template_group = Slippers::TemplateGroup.new(:templates => {}, :super_group => super_template_group)
|
28
|
+
template_group.find(:person).should eql(template)
|
29
|
+
template_group.find(:not_this).should eql(nil)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should render an item if its class is registered' do
|
33
|
+
date = Date.new(DateTime.now.year, 2, 4)
|
34
|
+
rendered_text = "rendered text"
|
35
|
+
template_group = Slippers::TemplateGroup.new(:templates => {Date => OpenStruct.new({:render => rendered_text})})
|
36
|
+
|
37
|
+
template_group.has_registered?(date.class).should be_true
|
38
|
+
template_group.render(date).should eql(rendered_text)
|
39
|
+
|
40
|
+
template_group.has_registered?(template_group.class).should be_false
|
41
|
+
template_group.render(template_group).should eql('')
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should not render an item if there are no templates' do
|
45
|
+
date = Date.new(DateTime.now.year, 2, 4)
|
46
|
+
template_group = Slippers::TemplateGroup.new()
|
47
|
+
|
48
|
+
template_group.has_registered?(date.class).should be_false
|
49
|
+
template_group.render(date).should eql('')
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe Slippers::TemplateGroupDirectory do
|
4
|
+
|
5
|
+
it 'should find the file in the directory folder' do
|
6
|
+
template_group = Slippers::TemplateGroupDirectory.new(['spec/views'])
|
7
|
+
template_group.find('index').should eql(Slippers::Engine.new('Hey foo', :template_group => template_group))
|
8
|
+
template_group.find('person/age').should eql(Slippers::Engine.new('The age for him is $age$', :template_group => template_group))
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should return nil if it cannot find the file in the directory folder' do
|
12
|
+
template_group = Slippers::TemplateGroupDirectory.new(['spec/views'])
|
13
|
+
template_group.find('person/not_found').should eql(nil)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should read the st template file and return a new slipers engine for it' do
|
17
|
+
template_group = Slippers::TemplateGroupDirectory.new(['spec/views'])
|
18
|
+
template_group.find('index').should eql(Slippers::Engine.new('Hey foo', :template_group => template_group))
|
19
|
+
template_group.find('person/age').should eql(Slippers::Engine.new('The age for him is $age$', :template_group => template_group))
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should load the ruby file found in the directory folder' do
|
23
|
+
template_group = Slippers::TemplateGroupDirectory.new(['spec/views'])
|
24
|
+
template_group.find('person/date_renderer').class.should eql(DateRenderer)
|
25
|
+
template_group.find('money').class.should eql(Money)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should look in the super template group if it cannot find the template' do
|
29
|
+
template = stub 'template'
|
30
|
+
super_template_group = Slippers::TemplateGroup.new(:templates => {:person => template})
|
31
|
+
template_group = Slippers::TemplateGroupDirectory.new(['spec/views'], :super_group => super_template_group)
|
32
|
+
template_group.find('person').should eql(template)
|
33
|
+
template_group.find('not_this').should eql(nil)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should look in all the directories provided for the template' do
|
37
|
+
template_group = Slippers::TemplateGroupDirectory.new(['examples/blog', 'spec/views'])
|
38
|
+
template_group.find('index').should eql(Slippers::Engine.new('Hey foo', :template_group => template_group))
|
39
|
+
template_group.find('person/age').should eql(Slippers::Engine.new('The age for him is $age$', :template_group => template_group))
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
end
|
data/spec/views/index.st
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Hey foo
|
data/spec/views/money.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
The age for him is $age$
|