slippers 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- 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$
|