tilt-handlebars 1.2.0 → 2.0.0
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.
- checksums.yaml +5 -5
- data/.editorconfig +12 -0
- data/.github/workflows/ci.yml +76 -0
- data/.github/workflows/publish.yml +58 -0
- data/.gitignore +14 -15
- data/.rspec +1 -0
- data/.rubocop.yml +189 -0
- data/Appraisals +9 -0
- data/CONTRIBUTING.md +75 -0
- data/Gemfile +3 -1
- data/LICENSE +22 -0
- data/README.md +34 -19
- data/RELEASE_NOTES.md +50 -8
- data/Rakefile +4 -8
- data/bin/audit +8 -0
- data/bin/build +8 -0
- data/bin/bundle +114 -0
- data/bin/bundler-audit +29 -0
- data/bin/console +15 -0
- data/bin/doc +7 -0
- data/bin/lint +8 -0
- data/bin/rake +29 -0
- data/bin/release +25 -0
- data/bin/rspec +29 -0
- data/bin/rubocop +29 -0
- data/bin/setup +13 -0
- data/bin/tag +25 -0
- data/bin/test +7 -0
- data/bin/version +24 -0
- data/gemfiles/tilt_1.gemfile +7 -0
- data/gemfiles/tilt_2.gemfile +7 -0
- data/lib/sinatra/handlebars.rb +10 -6
- data/lib/tilt/handlebars/version.rb +3 -1
- data/lib/tilt/handlebars.rb +57 -46
- data/lib/tilt-handlebars.rb +3 -0
- data/spec/fixtures/helpers.rb +21 -0
- data/spec/fixtures/views/hello.hbs +1 -0
- data/spec/fixtures/views/hello_missing.hbs +1 -0
- data/spec/fixtures/views/hello_partial.hbs +1 -0
- data/spec/fixtures/views/hello_partial2.hbs +1 -0
- data/spec/fixtures/views/partial.hbs +1 -0
- data/spec/fixtures/views/partial2.handlebars +1 -0
- data/spec/sinatra/handlebars_spec.rb +47 -0
- data/spec/spec_coverage.rb +19 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/tilt/handlebars_template_spec.rb +543 -0
- data/spec/tilt_spec.rb +40 -0
- data/tasks/doc.rake +8 -0
- data/tasks/gem.rake +7 -0
- data/tasks/lint.rake +7 -0
- data/tasks/test.rake +10 -0
- data/tilt-handlebars.gemspec +48 -23
- metadata +261 -65
- data/.travis.yml +0 -6
- data/LICENSE.txt +0 -22
- data/test/fixtures/views/hello.hbs +0 -1
- data/test/fixtures/views/missing_partial.hbs +0 -1
- data/test/fixtures/views/partial.hbs +0 -1
- data/test/fixtures/views/partial2.handlebars +0 -1
- data/test/fixtures/views/partial_test.hbs +0 -1
- data/test/fixtures/views/partial_test2.handlebars +0 -1
- data/test/fixtures/views/two_partials.hbs +0 -1
- data/test/sinatra_test.rb +0 -38
- data/test/test_helper.rb +0 -9
- data/test/tilt_handlebarstemplate_test.rb +0 -276
@@ -1,276 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
require 'tilt'
|
4
|
-
require 'tilt/handlebars'
|
5
|
-
|
6
|
-
def make_template(text)
|
7
|
-
Tilt::HandlebarsTemplate.new { |t| text }
|
8
|
-
end
|
9
|
-
|
10
|
-
describe Tilt::HandlebarsTemplate do
|
11
|
-
it 'renders from file' do
|
12
|
-
template = Tilt.new('test/fixtures/views/hello.hbs')
|
13
|
-
template.render(nil, name: 'Joe', emotion: 'happy').must_equal "Hello, Joe. I'm happy to meet you.\n"
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'is registered for .hbs files' do
|
17
|
-
Tilt['test.hbs'].must_equal Tilt::HandlebarsTemplate
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'is registered for .handlebars files' do
|
21
|
-
Tilt['test.handlebars'].must_equal Tilt::HandlebarsTemplate
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'renders static template' do
|
25
|
-
template = make_template "Hello World!"
|
26
|
-
template.render.must_equal "Hello World!"
|
27
|
-
end
|
28
|
-
|
29
|
-
it "can be rendered more than once" do
|
30
|
-
template = make_template "Hello World!"
|
31
|
-
3.times { template.render.must_equal "Hello World!" }
|
32
|
-
end
|
33
|
-
|
34
|
-
it "substitutes locals in template" do
|
35
|
-
template = make_template "Hey {{ name }}!"
|
36
|
-
template.render(nil, :name => 'Joe').must_equal "Hey Joe!"
|
37
|
-
end
|
38
|
-
|
39
|
-
it "displays nested properties" do
|
40
|
-
template = make_template "Hey {{ person.name }}!"
|
41
|
-
template.render(nil, :person => { :name => 'Joe' }).must_equal "Hey Joe!"
|
42
|
-
end
|
43
|
-
|
44
|
-
it "displays text from block" do
|
45
|
-
template = make_template "Deck the halls. Fa {{ yield }}."
|
46
|
-
rendered = template.render(nil) { "la la la la"}
|
47
|
-
rendered.must_equal "Deck the halls. Fa la la la la."
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
describe "arrays" do
|
52
|
-
shopping_list = %w[milk eggs flour sugar]
|
53
|
-
|
54
|
-
it "displays element from array" do
|
55
|
-
template = make_template "Don't forget the {{ shopping_list.[1] }}!"
|
56
|
-
template.render(nil, :shopping_list => shopping_list).must_equal "Don't forget the eggs!"
|
57
|
-
end
|
58
|
-
|
59
|
-
it "displays elements in an array in a loop" do
|
60
|
-
template = make_template 'Items to buy:{{#each shopping_list}} {{ this }}{{/each}}'
|
61
|
-
template.render(nil, :shopping_list => shopping_list).must_equal "Items to buy: milk eggs flour sugar"
|
62
|
-
end
|
63
|
-
|
64
|
-
it "displays alternate text when array is empty" do
|
65
|
-
template = make_template 'Items to buy:{{#each shopping_list}} {{ this }}{{else}} All done!{{/each}}'
|
66
|
-
template.render(nil, :shopping_list => []).must_equal "Items to buy: All done!"
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
describe "conditionals" do
|
71
|
-
template = make_template '{{#if morning}}Good morning{{else}}Hello{{/if}}, {{ name }}'
|
72
|
-
|
73
|
-
it "displays text if value is true" do
|
74
|
-
template.render(nil, :name => 'Joe', :morning => true).must_equal "Good morning, Joe"
|
75
|
-
end
|
76
|
-
|
77
|
-
it "displays alternate text if value is false" do
|
78
|
-
template.render(nil, :name => 'Joe', :morning => false).must_equal "Hello, Joe"
|
79
|
-
end
|
80
|
-
|
81
|
-
it "displays alternate text if value is missing" do
|
82
|
-
template.render(nil, :name => 'Joe').must_equal "Hello, Joe"
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
describe "unless expressions" do
|
87
|
-
template = make_template 'Hello, {{ name }}.{{#unless weekend}} Time to go to work.{{/unless}}'
|
88
|
-
|
89
|
-
it "displays text if value is false" do
|
90
|
-
template.render(nil, :name => 'Joe', :weekend => false).must_equal "Hello, Joe. Time to go to work."
|
91
|
-
end
|
92
|
-
|
93
|
-
it "does not display text if value is true" do
|
94
|
-
template.render(nil, :name => 'Joe', :weekend => true).must_equal "Hello, Joe."
|
95
|
-
end
|
96
|
-
|
97
|
-
it "displays text if value is missing" do
|
98
|
-
template.render(nil, :name => 'Joe').must_equal "Hello, Joe. Time to go to work."
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
describe "escape HTML" do
|
103
|
-
it "escapes HTML characters" do
|
104
|
-
template = make_template "Hey {{ name }}!"
|
105
|
-
template.render(nil, :name => '<b>Joe</b>' ).must_equal "Hey <b>Joe</b>!"
|
106
|
-
end
|
107
|
-
|
108
|
-
it "does not escape HTML characters in triple-stash" do
|
109
|
-
template = make_template "Hey {{{ name }}}!"
|
110
|
-
template.render(nil, :name => '<b>Joe</b>' ).must_equal "Hey <b>Joe</b>!"
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
describe "helpers" do
|
115
|
-
|
116
|
-
it "applies simple helper to value" do
|
117
|
-
template = make_template '{{upper greeting}}, world'
|
118
|
-
template.register_helper(:upper) do |this, *args|
|
119
|
-
"#{args[0].upcase}"
|
120
|
-
end
|
121
|
-
|
122
|
-
template.render(nil, :greeting => 'hello').must_equal "HELLO, world"
|
123
|
-
end
|
124
|
-
|
125
|
-
it "applies simple helper to quoted value" do
|
126
|
-
template = make_template '{{upper "greetings and salutations"}}, world'
|
127
|
-
template.register_helper(:upper) do |this, *args|
|
128
|
-
"#{args[0].upcase}"
|
129
|
-
end
|
130
|
-
|
131
|
-
template.render.must_equal "GREETINGS AND SALUTATIONS, world"
|
132
|
-
end
|
133
|
-
|
134
|
-
it "applies block helper to static text" do
|
135
|
-
template = make_template '{{#upper}}Hello, World.{{/upper}}'
|
136
|
-
template.register_helper(:upper) do |this, block|
|
137
|
-
block.fn(this).upcase
|
138
|
-
end
|
139
|
-
|
140
|
-
template.render.must_equal "HELLO, WORLD."
|
141
|
-
end
|
142
|
-
|
143
|
-
it "applies block helper to nested values" do
|
144
|
-
template = make_template '{{#upper}}Hey {{name}}{{/upper}}!'
|
145
|
-
template.register_helper(:upper) do |this, block|
|
146
|
-
block.fn(this).upcase
|
147
|
-
end
|
148
|
-
|
149
|
-
template.render(nil, :name => 'Joe').must_equal "HEY JOE!"
|
150
|
-
end
|
151
|
-
|
152
|
-
it "displays properties from object using 'with' helper" do
|
153
|
-
template = make_template '{{#with person}}Hello, {{ first_name }} {{ last_name }}{{/with}}'
|
154
|
-
joe = Person.new "Joe", "Blow"
|
155
|
-
template.render(nil, :person => joe).must_equal "Hello, Joe Blow"
|
156
|
-
end
|
157
|
-
|
158
|
-
end
|
159
|
-
|
160
|
-
describe "using scope object to render template" do
|
161
|
-
class Person
|
162
|
-
attr_reader :first_name, :last_name
|
163
|
-
|
164
|
-
def initialize(first_name, last_name)
|
165
|
-
@first_name = first_name
|
166
|
-
@last_name = last_name
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
class HashPerson
|
171
|
-
attr_reader :first_name, :last_name
|
172
|
-
|
173
|
-
def initialize(first_name, last_name)
|
174
|
-
@first_name = first_name
|
175
|
-
@last_name = last_name
|
176
|
-
end
|
177
|
-
|
178
|
-
def to_h
|
179
|
-
{ first_name: @first_name, last_name: @last_name }
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
joe = Person.new "John", "Doe"
|
184
|
-
|
185
|
-
it "displays properties of object passed as scope" do
|
186
|
-
template = make_template "Hello, {{ first_name }} {{ last_name }}."
|
187
|
-
template.render(joe).must_equal "Hello, John Doe."
|
188
|
-
end
|
189
|
-
|
190
|
-
it "merges scope object properties with locals" do
|
191
|
-
template = make_template "{{ greeting }}, {{ first_name }} {{ last_name }}."
|
192
|
-
template.render(joe, :greeting => "Salut").must_equal "Salut, John Doe."
|
193
|
-
end
|
194
|
-
|
195
|
-
it "prefers locals over scope object properties with same name" do
|
196
|
-
template = make_template "Hello, {{ first_name }} {{ last_name }}."
|
197
|
-
template.render(joe, :first_name => "Jane").must_equal "Hello, Jane Doe."
|
198
|
-
end
|
199
|
-
|
200
|
-
it "prefers locals over scope object properties with same name when object defines to_h" do
|
201
|
-
joe_hash = HashPerson.new "John", "Doe"
|
202
|
-
|
203
|
-
template = make_template "Hello, {{ first_name }} {{ last_name }}."
|
204
|
-
template.render(joe_hash, :first_name => "Jane").must_equal "Hello, Jane Doe."
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
describe "comments" do
|
209
|
-
it "does not render comments" do
|
210
|
-
template = make_template "Hello world{{! what a wonderful world }}"
|
211
|
-
template.render.must_equal "Hello world"
|
212
|
-
end
|
213
|
-
|
214
|
-
it "does not render comments, alternative syntax" do
|
215
|
-
template = make_template "Hello world{{!-- what a wonderful world --}}"
|
216
|
-
template.render.must_equal "Hello world"
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
describe "partials" do
|
221
|
-
it "looks for partial relative to the template file" do
|
222
|
-
template = Tilt.new('test/fixtures/views/partial_test.hbs')
|
223
|
-
template.render(nil, :author => "Stephanie Queen").must_equal "My all time favorite book is It Came From the Partial Side by Stephanie Queen."
|
224
|
-
end
|
225
|
-
|
226
|
-
it "can load partial from absolute path" do
|
227
|
-
dir = Dir.pwd
|
228
|
-
template = make_template "Have you read {{> \"#{dir}/test/fixtures/views/partial\" }}?"
|
229
|
-
template.render(nil, :author => "Stephanie Queen").must_equal "Have you read It Came From the Partial Side by Stephanie Queen?"
|
230
|
-
end
|
231
|
-
|
232
|
-
it "also recognizes .handlebars extension" do
|
233
|
-
template = Tilt.new('test/fixtures/views/partial_test2.handlebars')
|
234
|
-
template.render(nil, :author => "Stephanie Queen").must_equal "My all time favorite book is It Came From the Partial Side by Stephanie Queen."
|
235
|
-
end
|
236
|
-
|
237
|
-
it "can load relative partial along with registered partial" do
|
238
|
-
template = Tilt.new('test/fixtures/views/two_partials.hbs')
|
239
|
-
template.register_partial :director, "Gary Rockhammer"
|
240
|
-
template.render(nil, :author => "Stephanie Queen").must_equal "It Came From the Partial Side by Stephanie Queen may be a good book, but I'm waiting for the movie directed by Gary Rockhammer."
|
241
|
-
end
|
242
|
-
|
243
|
-
it "gives precedence to registered partial over relative file" do
|
244
|
-
template = Tilt.new('test/fixtures/views/partial_test.hbs')
|
245
|
-
template.register_partial :partial, "Revenge of the Partial"
|
246
|
-
template.render.must_equal "My all time favorite book is Revenge of the Partial."
|
247
|
-
end
|
248
|
-
|
249
|
-
it "raises error if partial cannot be found" do
|
250
|
-
template = Tilt.new('test/fixtures/views/missing_partial.hbs')
|
251
|
-
# template.render
|
252
|
-
proc { template.render }.must_raise V8::Error
|
253
|
-
end
|
254
|
-
|
255
|
-
it "cannot automatically load partial when template is created from string instead of file" do
|
256
|
-
template = make_template "I wish I could load a partial like this: {{> my_partial}}."
|
257
|
-
proc { template.render }.must_raise V8::Error
|
258
|
-
end
|
259
|
-
|
260
|
-
it "allows partial to be registered" do
|
261
|
-
template = make_template "{{> greeting}}. Nice to meet you."
|
262
|
-
template.register_partial :greeting, "Hey, {{name}}"
|
263
|
-
template.render(nil, :name => "Joe").must_equal "Hey, Joe. Nice to meet you."
|
264
|
-
end
|
265
|
-
|
266
|
-
it "calls registered method if partial is missing" do
|
267
|
-
template = make_template "{{> where}} I've been looking for you."
|
268
|
-
template.partial_missing do |partial_name|
|
269
|
-
"Where have you been, {{name}}?" if partial_name == 'where'
|
270
|
-
end
|
271
|
-
template.render(nil, :name => "Joe").must_equal "Where have you been, Joe? I've been looking for you."
|
272
|
-
end
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
|