liquid 3.0.0 → 4.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 +4 -4
- data/History.md +130 -62
- data/README.md +31 -0
- data/lib/liquid/block.rb +31 -124
- data/lib/liquid/block_body.rb +75 -59
- data/lib/liquid/condition.rb +23 -22
- data/lib/liquid/context.rb +51 -60
- data/lib/liquid/document.rb +19 -9
- data/lib/liquid/drop.rb +17 -16
- data/lib/liquid/errors.rb +20 -24
- data/lib/liquid/expression.rb +15 -3
- data/lib/liquid/extensions.rb +13 -7
- data/lib/liquid/file_system.rb +11 -11
- data/lib/liquid/forloop_drop.rb +42 -0
- data/lib/liquid/i18n.rb +5 -5
- data/lib/liquid/interrupts.rb +1 -2
- data/lib/liquid/lexer.rb +6 -4
- data/lib/liquid/locales/en.yml +5 -1
- data/lib/liquid/parse_context.rb +37 -0
- data/lib/liquid/parser.rb +1 -1
- data/lib/liquid/parser_switching.rb +4 -4
- data/lib/liquid/profiler/hooks.rb +7 -7
- data/lib/liquid/profiler.rb +18 -19
- data/lib/liquid/range_lookup.rb +16 -1
- data/lib/liquid/resource_limits.rb +23 -0
- data/lib/liquid/standardfilters.rb +121 -61
- data/lib/liquid/strainer.rb +32 -29
- data/lib/liquid/tablerowloop_drop.rb +62 -0
- data/lib/liquid/tag.rb +9 -8
- data/lib/liquid/tags/assign.rb +17 -4
- data/lib/liquid/tags/break.rb +0 -3
- data/lib/liquid/tags/capture.rb +2 -2
- data/lib/liquid/tags/case.rb +19 -12
- data/lib/liquid/tags/comment.rb +2 -2
- data/lib/liquid/tags/cycle.rb +6 -6
- data/lib/liquid/tags/decrement.rb +1 -4
- data/lib/liquid/tags/for.rb +95 -75
- data/lib/liquid/tags/if.rb +48 -43
- data/lib/liquid/tags/ifchanged.rb +0 -2
- data/lib/liquid/tags/include.rb +61 -52
- data/lib/liquid/tags/raw.rb +32 -4
- data/lib/liquid/tags/table_row.rb +12 -31
- data/lib/liquid/tags/unless.rb +4 -5
- data/lib/liquid/template.rb +42 -54
- data/lib/liquid/tokenizer.rb +31 -0
- data/lib/liquid/utils.rb +52 -8
- data/lib/liquid/variable.rb +46 -45
- data/lib/liquid/variable_lookup.rb +9 -5
- data/lib/liquid/version.rb +1 -1
- data/lib/liquid.rb +9 -7
- data/test/integration/assign_test.rb +18 -8
- data/test/integration/blank_test.rb +14 -14
- data/test/integration/capture_test.rb +10 -0
- data/test/integration/context_test.rb +2 -2
- data/test/integration/document_test.rb +19 -0
- data/test/integration/drop_test.rb +42 -40
- data/test/integration/error_handling_test.rb +99 -46
- data/test/integration/filter_test.rb +72 -19
- data/test/integration/hash_ordering_test.rb +9 -9
- data/test/integration/output_test.rb +34 -27
- data/test/integration/parsing_quirks_test.rb +15 -13
- data/test/integration/render_profiling_test.rb +20 -20
- data/test/integration/security_test.rb +9 -7
- data/test/integration/standard_filter_test.rb +198 -42
- data/test/integration/tags/break_tag_test.rb +1 -2
- data/test/integration/tags/continue_tag_test.rb +0 -1
- data/test/integration/tags/for_tag_test.rb +133 -98
- data/test/integration/tags/if_else_tag_test.rb +96 -77
- data/test/integration/tags/include_tag_test.rb +34 -30
- data/test/integration/tags/increment_tag_test.rb +10 -11
- data/test/integration/tags/raw_tag_test.rb +7 -1
- data/test/integration/tags/standard_tag_test.rb +121 -122
- data/test/integration/tags/statements_test.rb +3 -5
- data/test/integration/tags/table_row_test.rb +20 -19
- data/test/integration/tags/unless_else_tag_test.rb +6 -6
- data/test/integration/template_test.rb +190 -49
- data/test/integration/trim_mode_test.rb +525 -0
- data/test/integration/variable_test.rb +23 -13
- data/test/test_helper.rb +44 -9
- data/test/unit/block_unit_test.rb +8 -5
- data/test/unit/condition_unit_test.rb +86 -77
- data/test/unit/context_unit_test.rb +48 -57
- data/test/unit/file_system_unit_test.rb +3 -3
- data/test/unit/i18n_unit_test.rb +2 -2
- data/test/unit/lexer_unit_test.rb +11 -8
- data/test/unit/parser_unit_test.rb +2 -2
- data/test/unit/regexp_unit_test.rb +1 -1
- data/test/unit/strainer_unit_test.rb +85 -8
- data/test/unit/tag_unit_test.rb +7 -2
- data/test/unit/tags/case_tag_unit_test.rb +1 -1
- data/test/unit/tags/for_tag_unit_test.rb +2 -2
- data/test/unit/tags/if_tag_unit_test.rb +1 -1
- data/test/unit/template_unit_test.rb +14 -5
- data/test/unit/tokenizer_unit_test.rb +24 -7
- data/test/unit/variable_unit_test.rb +66 -43
- metadata +55 -50
- data/lib/liquid/module_ex.rb +0 -62
- data/lib/liquid/token.rb +0 -18
- data/test/unit/module_ex_unit_test.rb +0 -87
- /data/{MIT-LICENSE → LICENSE} +0 -0
@@ -0,0 +1,525 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TrimModeTest < Minitest::Test
|
4
|
+
include Liquid
|
5
|
+
|
6
|
+
# Make sure the trim isn't applied to standard output
|
7
|
+
def test_standard_output
|
8
|
+
text = <<-END_TEMPLATE
|
9
|
+
<div>
|
10
|
+
<p>
|
11
|
+
{{ 'John' }}
|
12
|
+
</p>
|
13
|
+
</div>
|
14
|
+
END_TEMPLATE
|
15
|
+
expected = <<-END_EXPECTED
|
16
|
+
<div>
|
17
|
+
<p>
|
18
|
+
John
|
19
|
+
</p>
|
20
|
+
</div>
|
21
|
+
END_EXPECTED
|
22
|
+
assert_template_result(expected, text)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_variable_output_with_multiple_blank_lines
|
26
|
+
text = <<-END_TEMPLATE
|
27
|
+
<div>
|
28
|
+
<p>
|
29
|
+
|
30
|
+
|
31
|
+
{{- 'John' -}}
|
32
|
+
|
33
|
+
|
34
|
+
</p>
|
35
|
+
</div>
|
36
|
+
END_TEMPLATE
|
37
|
+
expected = <<-END_EXPECTED
|
38
|
+
<div>
|
39
|
+
<p>John</p>
|
40
|
+
</div>
|
41
|
+
END_EXPECTED
|
42
|
+
assert_template_result(expected, text)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_tag_output_with_multiple_blank_lines
|
46
|
+
text = <<-END_TEMPLATE
|
47
|
+
<div>
|
48
|
+
<p>
|
49
|
+
|
50
|
+
|
51
|
+
{%- if true -%}
|
52
|
+
yes
|
53
|
+
{%- endif -%}
|
54
|
+
|
55
|
+
|
56
|
+
</p>
|
57
|
+
</div>
|
58
|
+
END_TEMPLATE
|
59
|
+
expected = <<-END_EXPECTED
|
60
|
+
<div>
|
61
|
+
<p>yes</p>
|
62
|
+
</div>
|
63
|
+
END_EXPECTED
|
64
|
+
assert_template_result(expected, text)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Make sure the trim isn't applied to standard tags
|
68
|
+
def test_standard_tags
|
69
|
+
whitespace = ' '
|
70
|
+
text = <<-END_TEMPLATE
|
71
|
+
<div>
|
72
|
+
<p>
|
73
|
+
{% if true %}
|
74
|
+
yes
|
75
|
+
{% endif %}
|
76
|
+
</p>
|
77
|
+
</div>
|
78
|
+
END_TEMPLATE
|
79
|
+
expected = <<-END_EXPECTED
|
80
|
+
<div>
|
81
|
+
<p>
|
82
|
+
#{whitespace}
|
83
|
+
yes
|
84
|
+
#{whitespace}
|
85
|
+
</p>
|
86
|
+
</div>
|
87
|
+
END_EXPECTED
|
88
|
+
assert_template_result(expected, text)
|
89
|
+
|
90
|
+
text = <<-END_TEMPLATE
|
91
|
+
<div>
|
92
|
+
<p>
|
93
|
+
{% if false %}
|
94
|
+
no
|
95
|
+
{% endif %}
|
96
|
+
</p>
|
97
|
+
</div>
|
98
|
+
END_TEMPLATE
|
99
|
+
expected = <<-END_EXPECTED
|
100
|
+
<div>
|
101
|
+
<p>
|
102
|
+
#{whitespace}
|
103
|
+
</p>
|
104
|
+
</div>
|
105
|
+
END_EXPECTED
|
106
|
+
assert_template_result(expected, text)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Make sure the trim isn't too agressive
|
110
|
+
def test_no_trim_output
|
111
|
+
text = '<p>{{- \'John\' -}}</p>'
|
112
|
+
expected = '<p>John</p>'
|
113
|
+
assert_template_result(expected, text)
|
114
|
+
end
|
115
|
+
|
116
|
+
# Make sure the trim isn't too agressive
|
117
|
+
def test_no_trim_tags
|
118
|
+
text = '<p>{%- if true -%}yes{%- endif -%}</p>'
|
119
|
+
expected = '<p>yes</p>'
|
120
|
+
assert_template_result(expected, text)
|
121
|
+
|
122
|
+
text = '<p>{%- if false -%}no{%- endif -%}</p>'
|
123
|
+
expected = '<p></p>'
|
124
|
+
assert_template_result(expected, text)
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_single_line_outer_tag
|
128
|
+
text = '<p> {%- if true %} yes {% endif -%} </p>'
|
129
|
+
expected = '<p> yes </p>'
|
130
|
+
assert_template_result(expected, text)
|
131
|
+
|
132
|
+
text = '<p> {%- if false %} no {% endif -%} </p>'
|
133
|
+
expected = '<p></p>'
|
134
|
+
assert_template_result(expected, text)
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_single_line_inner_tag
|
138
|
+
text = '<p> {% if true -%} yes {%- endif %} </p>'
|
139
|
+
expected = '<p> yes </p>'
|
140
|
+
assert_template_result(expected, text)
|
141
|
+
|
142
|
+
text = '<p> {% if false -%} no {%- endif %} </p>'
|
143
|
+
expected = '<p> </p>'
|
144
|
+
assert_template_result(expected, text)
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_single_line_post_tag
|
148
|
+
text = '<p> {% if true -%} yes {% endif -%} </p>'
|
149
|
+
expected = '<p> yes </p>'
|
150
|
+
assert_template_result(expected, text)
|
151
|
+
|
152
|
+
text = '<p> {% if false -%} no {% endif -%} </p>'
|
153
|
+
expected = '<p> </p>'
|
154
|
+
assert_template_result(expected, text)
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_single_line_pre_tag
|
158
|
+
text = '<p> {%- if true %} yes {%- endif %} </p>'
|
159
|
+
expected = '<p> yes </p>'
|
160
|
+
assert_template_result(expected, text)
|
161
|
+
|
162
|
+
text = '<p> {%- if false %} no {%- endif %} </p>'
|
163
|
+
expected = '<p> </p>'
|
164
|
+
assert_template_result(expected, text)
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_pre_trim_output
|
168
|
+
text = <<-END_TEMPLATE
|
169
|
+
<div>
|
170
|
+
<p>
|
171
|
+
{{- 'John' }}
|
172
|
+
</p>
|
173
|
+
</div>
|
174
|
+
END_TEMPLATE
|
175
|
+
expected = <<-END_EXPECTED
|
176
|
+
<div>
|
177
|
+
<p>John
|
178
|
+
</p>
|
179
|
+
</div>
|
180
|
+
END_EXPECTED
|
181
|
+
assert_template_result(expected, text)
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_pre_trim_tags
|
185
|
+
text = <<-END_TEMPLATE
|
186
|
+
<div>
|
187
|
+
<p>
|
188
|
+
{%- if true %}
|
189
|
+
yes
|
190
|
+
{%- endif %}
|
191
|
+
</p>
|
192
|
+
</div>
|
193
|
+
END_TEMPLATE
|
194
|
+
expected = <<-END_EXPECTED
|
195
|
+
<div>
|
196
|
+
<p>
|
197
|
+
yes
|
198
|
+
</p>
|
199
|
+
</div>
|
200
|
+
END_EXPECTED
|
201
|
+
assert_template_result(expected, text)
|
202
|
+
|
203
|
+
text = <<-END_TEMPLATE
|
204
|
+
<div>
|
205
|
+
<p>
|
206
|
+
{%- if false %}
|
207
|
+
no
|
208
|
+
{%- endif %}
|
209
|
+
</p>
|
210
|
+
</div>
|
211
|
+
END_TEMPLATE
|
212
|
+
expected = <<-END_EXPECTED
|
213
|
+
<div>
|
214
|
+
<p>
|
215
|
+
</p>
|
216
|
+
</div>
|
217
|
+
END_EXPECTED
|
218
|
+
assert_template_result(expected, text)
|
219
|
+
end
|
220
|
+
|
221
|
+
def test_post_trim_output
|
222
|
+
text = <<-END_TEMPLATE
|
223
|
+
<div>
|
224
|
+
<p>
|
225
|
+
{{ 'John' -}}
|
226
|
+
</p>
|
227
|
+
</div>
|
228
|
+
END_TEMPLATE
|
229
|
+
expected = <<-END_EXPECTED
|
230
|
+
<div>
|
231
|
+
<p>
|
232
|
+
John</p>
|
233
|
+
</div>
|
234
|
+
END_EXPECTED
|
235
|
+
assert_template_result(expected, text)
|
236
|
+
end
|
237
|
+
|
238
|
+
def test_post_trim_tags
|
239
|
+
text = <<-END_TEMPLATE
|
240
|
+
<div>
|
241
|
+
<p>
|
242
|
+
{% if true -%}
|
243
|
+
yes
|
244
|
+
{% endif -%}
|
245
|
+
</p>
|
246
|
+
</div>
|
247
|
+
END_TEMPLATE
|
248
|
+
expected = <<-END_EXPECTED
|
249
|
+
<div>
|
250
|
+
<p>
|
251
|
+
yes
|
252
|
+
</p>
|
253
|
+
</div>
|
254
|
+
END_EXPECTED
|
255
|
+
assert_template_result(expected, text)
|
256
|
+
|
257
|
+
text = <<-END_TEMPLATE
|
258
|
+
<div>
|
259
|
+
<p>
|
260
|
+
{% if false -%}
|
261
|
+
no
|
262
|
+
{% endif -%}
|
263
|
+
</p>
|
264
|
+
</div>
|
265
|
+
END_TEMPLATE
|
266
|
+
expected = <<-END_EXPECTED
|
267
|
+
<div>
|
268
|
+
<p>
|
269
|
+
</p>
|
270
|
+
</div>
|
271
|
+
END_EXPECTED
|
272
|
+
assert_template_result(expected, text)
|
273
|
+
end
|
274
|
+
|
275
|
+
def test_pre_and_post_trim_tags
|
276
|
+
text = <<-END_TEMPLATE
|
277
|
+
<div>
|
278
|
+
<p>
|
279
|
+
{%- if true %}
|
280
|
+
yes
|
281
|
+
{% endif -%}
|
282
|
+
</p>
|
283
|
+
</div>
|
284
|
+
END_TEMPLATE
|
285
|
+
expected = <<-END_EXPECTED
|
286
|
+
<div>
|
287
|
+
<p>
|
288
|
+
yes
|
289
|
+
</p>
|
290
|
+
</div>
|
291
|
+
END_EXPECTED
|
292
|
+
assert_template_result(expected, text)
|
293
|
+
|
294
|
+
text = <<-END_TEMPLATE
|
295
|
+
<div>
|
296
|
+
<p>
|
297
|
+
{%- if false %}
|
298
|
+
no
|
299
|
+
{% endif -%}
|
300
|
+
</p>
|
301
|
+
</div>
|
302
|
+
END_TEMPLATE
|
303
|
+
expected = <<-END_EXPECTED
|
304
|
+
<div>
|
305
|
+
<p></p>
|
306
|
+
</div>
|
307
|
+
END_EXPECTED
|
308
|
+
assert_template_result(expected, text)
|
309
|
+
end
|
310
|
+
|
311
|
+
def test_post_and_pre_trim_tags
|
312
|
+
text = <<-END_TEMPLATE
|
313
|
+
<div>
|
314
|
+
<p>
|
315
|
+
{% if true -%}
|
316
|
+
yes
|
317
|
+
{%- endif %}
|
318
|
+
</p>
|
319
|
+
</div>
|
320
|
+
END_TEMPLATE
|
321
|
+
expected = <<-END_EXPECTED
|
322
|
+
<div>
|
323
|
+
<p>
|
324
|
+
yes
|
325
|
+
</p>
|
326
|
+
</div>
|
327
|
+
END_EXPECTED
|
328
|
+
assert_template_result(expected, text)
|
329
|
+
|
330
|
+
whitespace = ' '
|
331
|
+
text = <<-END_TEMPLATE
|
332
|
+
<div>
|
333
|
+
<p>
|
334
|
+
{% if false -%}
|
335
|
+
no
|
336
|
+
{%- endif %}
|
337
|
+
</p>
|
338
|
+
</div>
|
339
|
+
END_TEMPLATE
|
340
|
+
expected = <<-END_EXPECTED
|
341
|
+
<div>
|
342
|
+
<p>
|
343
|
+
#{whitespace}
|
344
|
+
</p>
|
345
|
+
</div>
|
346
|
+
END_EXPECTED
|
347
|
+
assert_template_result(expected, text)
|
348
|
+
end
|
349
|
+
|
350
|
+
def test_trim_output
|
351
|
+
text = <<-END_TEMPLATE
|
352
|
+
<div>
|
353
|
+
<p>
|
354
|
+
{{- 'John' -}}
|
355
|
+
</p>
|
356
|
+
</div>
|
357
|
+
END_TEMPLATE
|
358
|
+
expected = <<-END_EXPECTED
|
359
|
+
<div>
|
360
|
+
<p>John</p>
|
361
|
+
</div>
|
362
|
+
END_EXPECTED
|
363
|
+
assert_template_result(expected, text)
|
364
|
+
end
|
365
|
+
|
366
|
+
def test_trim_tags
|
367
|
+
text = <<-END_TEMPLATE
|
368
|
+
<div>
|
369
|
+
<p>
|
370
|
+
{%- if true -%}
|
371
|
+
yes
|
372
|
+
{%- endif -%}
|
373
|
+
</p>
|
374
|
+
</div>
|
375
|
+
END_TEMPLATE
|
376
|
+
expected = <<-END_EXPECTED
|
377
|
+
<div>
|
378
|
+
<p>yes</p>
|
379
|
+
</div>
|
380
|
+
END_EXPECTED
|
381
|
+
assert_template_result(expected, text)
|
382
|
+
|
383
|
+
text = <<-END_TEMPLATE
|
384
|
+
<div>
|
385
|
+
<p>
|
386
|
+
{%- if false -%}
|
387
|
+
no
|
388
|
+
{%- endif -%}
|
389
|
+
</p>
|
390
|
+
</div>
|
391
|
+
END_TEMPLATE
|
392
|
+
expected = <<-END_EXPECTED
|
393
|
+
<div>
|
394
|
+
<p></p>
|
395
|
+
</div>
|
396
|
+
END_EXPECTED
|
397
|
+
assert_template_result(expected, text)
|
398
|
+
end
|
399
|
+
|
400
|
+
def test_whitespace_trim_output
|
401
|
+
text = <<-END_TEMPLATE
|
402
|
+
<div>
|
403
|
+
<p>
|
404
|
+
{{- 'John' -}},
|
405
|
+
{{- '30' -}}
|
406
|
+
</p>
|
407
|
+
</div>
|
408
|
+
END_TEMPLATE
|
409
|
+
expected = <<-END_EXPECTED
|
410
|
+
<div>
|
411
|
+
<p>John,30</p>
|
412
|
+
</div>
|
413
|
+
END_EXPECTED
|
414
|
+
assert_template_result(expected, text)
|
415
|
+
end
|
416
|
+
|
417
|
+
def test_whitespace_trim_tags
|
418
|
+
text = <<-END_TEMPLATE
|
419
|
+
<div>
|
420
|
+
<p>
|
421
|
+
{%- if true -%}
|
422
|
+
yes
|
423
|
+
{%- endif -%}
|
424
|
+
</p>
|
425
|
+
</div>
|
426
|
+
END_TEMPLATE
|
427
|
+
expected = <<-END_EXPECTED
|
428
|
+
<div>
|
429
|
+
<p>yes</p>
|
430
|
+
</div>
|
431
|
+
END_EXPECTED
|
432
|
+
assert_template_result(expected, text)
|
433
|
+
|
434
|
+
text = <<-END_TEMPLATE
|
435
|
+
<div>
|
436
|
+
<p>
|
437
|
+
{%- if false -%}
|
438
|
+
no
|
439
|
+
{%- endif -%}
|
440
|
+
</p>
|
441
|
+
</div>
|
442
|
+
END_TEMPLATE
|
443
|
+
expected = <<-END_EXPECTED
|
444
|
+
<div>
|
445
|
+
<p></p>
|
446
|
+
</div>
|
447
|
+
END_EXPECTED
|
448
|
+
assert_template_result(expected, text)
|
449
|
+
end
|
450
|
+
|
451
|
+
def test_complex_trim_output
|
452
|
+
text = <<-END_TEMPLATE
|
453
|
+
<div>
|
454
|
+
<p>
|
455
|
+
{{- 'John' -}}
|
456
|
+
{{- '30' -}}
|
457
|
+
</p>
|
458
|
+
<b>
|
459
|
+
{{ 'John' -}}
|
460
|
+
{{- '30' }}
|
461
|
+
</b>
|
462
|
+
<i>
|
463
|
+
{{- 'John' }}
|
464
|
+
{{ '30' -}}
|
465
|
+
</i>
|
466
|
+
</div>
|
467
|
+
END_TEMPLATE
|
468
|
+
expected = <<-END_EXPECTED
|
469
|
+
<div>
|
470
|
+
<p>John30</p>
|
471
|
+
<b>
|
472
|
+
John30
|
473
|
+
</b>
|
474
|
+
<i>John
|
475
|
+
30</i>
|
476
|
+
</div>
|
477
|
+
END_EXPECTED
|
478
|
+
assert_template_result(expected, text)
|
479
|
+
end
|
480
|
+
|
481
|
+
def test_complex_trim
|
482
|
+
text = <<-END_TEMPLATE
|
483
|
+
<div>
|
484
|
+
{%- if true -%}
|
485
|
+
{%- if true -%}
|
486
|
+
<p>
|
487
|
+
{{- 'John' -}}
|
488
|
+
</p>
|
489
|
+
{%- endif -%}
|
490
|
+
{%- endif -%}
|
491
|
+
</div>
|
492
|
+
END_TEMPLATE
|
493
|
+
expected = <<-END_EXPECTED
|
494
|
+
<div><p>John</p></div>
|
495
|
+
END_EXPECTED
|
496
|
+
assert_template_result(expected, text)
|
497
|
+
end
|
498
|
+
|
499
|
+
def test_raw_output
|
500
|
+
whitespace = ' '
|
501
|
+
text = <<-END_TEMPLATE
|
502
|
+
<div>
|
503
|
+
{% raw %}
|
504
|
+
{%- if true -%}
|
505
|
+
<p>
|
506
|
+
{{- 'John' -}}
|
507
|
+
</p>
|
508
|
+
{%- endif -%}
|
509
|
+
{% endraw %}
|
510
|
+
</div>
|
511
|
+
END_TEMPLATE
|
512
|
+
expected = <<-END_EXPECTED
|
513
|
+
<div>
|
514
|
+
#{whitespace}
|
515
|
+
{%- if true -%}
|
516
|
+
<p>
|
517
|
+
{{- 'John' -}}
|
518
|
+
</p>
|
519
|
+
{%- endif -%}
|
520
|
+
#{whitespace}
|
521
|
+
</div>
|
522
|
+
END_EXPECTED
|
523
|
+
assert_template_result(expected, text)
|
524
|
+
end
|
525
|
+
end # TrimModeTest
|
@@ -4,7 +4,7 @@ class VariableTest < Minitest::Test
|
|
4
4
|
include Liquid
|
5
5
|
|
6
6
|
def test_simple_variable
|
7
|
-
template = Template.parse(
|
7
|
+
template = Template.parse(%({{test}}))
|
8
8
|
assert_equal 'worked', template.render!('test' => 'worked')
|
9
9
|
assert_equal 'worked wonderfully', template.render!('test' => 'worked wonderfully')
|
10
10
|
end
|
@@ -14,19 +14,29 @@ class VariableTest < Minitest::Test
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_simple_with_whitespaces
|
17
|
-
template = Template.parse(
|
17
|
+
template = Template.parse(%( {{ test }} ))
|
18
18
|
assert_equal ' worked ', template.render!('test' => 'worked')
|
19
19
|
assert_equal ' worked wonderfully ', template.render!('test' => 'worked wonderfully')
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_ignore_unknown
|
23
|
-
template = Template.parse(
|
23
|
+
template = Template.parse(%({{ test }}))
|
24
|
+
assert_equal '', template.render!
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_using_blank_as_variable_name
|
28
|
+
template = Template.parse("{% assign foo = blank %}{{ foo }}")
|
29
|
+
assert_equal '', template.render!
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_using_empty_as_variable_name
|
33
|
+
template = Template.parse("{% assign foo = empty %}{{ foo }}")
|
24
34
|
assert_equal '', template.render!
|
25
35
|
end
|
26
36
|
|
27
37
|
def test_hash_scoping
|
28
|
-
template = Template.parse(
|
29
|
-
assert_equal 'worked', template.render!('test' => {'test' => 'worked'})
|
38
|
+
template = Template.parse(%({{ test.test }}))
|
39
|
+
assert_equal 'worked', template.render!('test' => { 'test' => 'worked' })
|
30
40
|
end
|
31
41
|
|
32
42
|
def test_false_renders_as_false
|
@@ -40,23 +50,23 @@ class VariableTest < Minitest::Test
|
|
40
50
|
end
|
41
51
|
|
42
52
|
def test_preset_assigns
|
43
|
-
template = Template.parse(
|
53
|
+
template = Template.parse(%({{ test }}))
|
44
54
|
template.assigns['test'] = 'worked'
|
45
55
|
assert_equal 'worked', template.render!
|
46
56
|
end
|
47
57
|
|
48
58
|
def test_reuse_parsed_template
|
49
|
-
template = Template.parse(
|
59
|
+
template = Template.parse(%({{ greeting }} {{ name }}))
|
50
60
|
template.assigns['greeting'] = 'Goodbye'
|
51
61
|
assert_equal 'Hello Tobi', template.render!('greeting' => 'Hello', 'name' => 'Tobi')
|
52
62
|
assert_equal 'Hello ', template.render!('greeting' => 'Hello', 'unknown' => 'Tobi')
|
53
63
|
assert_equal 'Hello Brian', template.render!('greeting' => 'Hello', 'name' => 'Brian')
|
54
64
|
assert_equal 'Goodbye Brian', template.render!('name' => 'Brian')
|
55
|
-
assert_equal({'greeting'=>'Goodbye'}, template.assigns)
|
65
|
+
assert_equal({ 'greeting' => 'Goodbye' }, template.assigns)
|
56
66
|
end
|
57
67
|
|
58
68
|
def test_assigns_not_polluted_from_template
|
59
|
-
template = Template.parse(
|
69
|
+
template = Template.parse(%({{ test }}{% assign test = 'bar' %}{{ test }}))
|
60
70
|
template.assigns['test'] = 'baz'
|
61
71
|
assert_equal 'bazbar', template.render!
|
62
72
|
assert_equal 'bazbar', template.render!
|
@@ -65,14 +75,14 @@ class VariableTest < Minitest::Test
|
|
65
75
|
end
|
66
76
|
|
67
77
|
def test_hash_with_default_proc
|
68
|
-
template = Template.parse(
|
69
|
-
assigns = Hash.new { |h,k| raise "Unknown variable '#{k}'" }
|
78
|
+
template = Template.parse(%(Hello {{ test }}))
|
79
|
+
assigns = Hash.new { |h, k| raise "Unknown variable '#{k}'" }
|
70
80
|
assigns['test'] = 'Tobi'
|
71
81
|
assert_equal 'Hello Tobi', template.render!(assigns)
|
72
82
|
assigns.delete('test')
|
73
|
-
e = assert_raises(RuntimeError)
|
83
|
+
e = assert_raises(RuntimeError) do
|
74
84
|
template.render!(assigns)
|
75
|
-
|
85
|
+
end
|
76
86
|
assert_equal "Unknown variable 'test'", e.message
|
77
87
|
end
|
78
88
|
|
data/test/test_helper.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
ENV["MT_NO_EXPECTATIONS"] = "1"
|
3
4
|
require 'minitest/autorun'
|
4
5
|
require 'spy/integration'
|
5
6
|
|
6
|
-
|
7
|
+
$LOAD_PATH.unshift(File.join(File.expand_path(__dir__), '..', 'lib'))
|
7
8
|
require 'liquid.rb'
|
9
|
+
require 'liquid/profiler'
|
8
10
|
|
9
11
|
mode = :strict
|
10
12
|
if env_mode = ENV['LIQUID_PARSER_MODE']
|
@@ -13,6 +15,11 @@ if env_mode = ENV['LIQUID_PARSER_MODE']
|
|
13
15
|
end
|
14
16
|
Liquid::Template.error_mode = mode
|
15
17
|
|
18
|
+
if ENV['LIQUID-C'] == '1'
|
19
|
+
puts "-- LIQUID C"
|
20
|
+
require 'liquid/c'
|
21
|
+
end
|
22
|
+
|
16
23
|
if Minitest.const_defined?('Test')
|
17
24
|
# We're on Minitest 5+. Nothing to do here.
|
18
25
|
else
|
@@ -23,7 +30,7 @@ end
|
|
23
30
|
module Minitest
|
24
31
|
class Test
|
25
32
|
def fixture(name)
|
26
|
-
File.join(File.expand_path(
|
33
|
+
File.join(File.expand_path(__dir__), "fixtures", name)
|
27
34
|
end
|
28
35
|
end
|
29
36
|
|
@@ -31,30 +38,36 @@ module Minitest
|
|
31
38
|
include Liquid
|
32
39
|
|
33
40
|
def assert_template_result(expected, template, assigns = {}, message = nil)
|
34
|
-
assert_equal expected, Template.parse(template).render!(assigns)
|
41
|
+
assert_equal expected, Template.parse(template).render!(assigns), message
|
35
42
|
end
|
36
43
|
|
37
44
|
def assert_template_result_matches(expected, template, assigns = {}, message = nil)
|
38
45
|
return assert_template_result(expected, template, assigns, message) unless expected.is_a? Regexp
|
39
46
|
|
40
|
-
assert_match expected, Template.parse(template).render!(assigns)
|
47
|
+
assert_match expected, Template.parse(template).render!(assigns), message
|
41
48
|
end
|
42
49
|
|
43
|
-
def assert_match_syntax_error(match, template,
|
44
|
-
exception = assert_raises(Liquid::SyntaxError)
|
50
|
+
def assert_match_syntax_error(match, template, assigns = {})
|
51
|
+
exception = assert_raises(Liquid::SyntaxError) do
|
45
52
|
Template.parse(template).render(assigns)
|
46
|
-
|
53
|
+
end
|
47
54
|
assert_match match, exception.message
|
48
55
|
end
|
49
56
|
|
50
57
|
def with_global_filter(*globals)
|
51
|
-
|
58
|
+
original_global_strainer = Liquid::Strainer.class_variable_get(:@@global_strainer)
|
59
|
+
Liquid::Strainer.class_variable_set(:@@global_strainer, Class.new(Liquid::Strainer) do
|
60
|
+
@filter_methods = Set.new
|
61
|
+
end)
|
62
|
+
Liquid::Strainer.class_variable_get(:@@strainer_class_cache).clear
|
63
|
+
|
52
64
|
globals.each do |global|
|
53
65
|
Liquid::Template.register_filter(global)
|
54
66
|
end
|
55
67
|
yield
|
56
68
|
ensure
|
57
|
-
Liquid::Strainer.
|
69
|
+
Liquid::Strainer.class_variable_get(:@@strainer_class_cache).clear
|
70
|
+
Liquid::Strainer.class_variable_set(:@@global_strainer, original_global_strainer)
|
58
71
|
end
|
59
72
|
|
60
73
|
def with_taint_mode(mode)
|
@@ -80,3 +93,25 @@ class ThingWithToLiquid
|
|
80
93
|
'foobar'
|
81
94
|
end
|
82
95
|
end
|
96
|
+
|
97
|
+
class ErrorDrop < Liquid::Drop
|
98
|
+
def standard_error
|
99
|
+
raise Liquid::StandardError, 'standard error'
|
100
|
+
end
|
101
|
+
|
102
|
+
def argument_error
|
103
|
+
raise Liquid::ArgumentError, 'argument error'
|
104
|
+
end
|
105
|
+
|
106
|
+
def syntax_error
|
107
|
+
raise Liquid::SyntaxError, 'syntax error'
|
108
|
+
end
|
109
|
+
|
110
|
+
def runtime_error
|
111
|
+
raise 'runtime error'
|
112
|
+
end
|
113
|
+
|
114
|
+
def exception
|
115
|
+
raise Exception, 'exception'
|
116
|
+
end
|
117
|
+
end
|