liquid 3.0.6 → 4.0.3

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.
Files changed (103) hide show
  1. checksums.yaml +5 -5
  2. data/History.md +154 -58
  3. data/{MIT-LICENSE → LICENSE} +0 -0
  4. data/README.md +33 -0
  5. data/lib/liquid/block.rb +42 -125
  6. data/lib/liquid/block_body.rb +99 -79
  7. data/lib/liquid/condition.rb +52 -32
  8. data/lib/liquid/context.rb +57 -51
  9. data/lib/liquid/document.rb +19 -9
  10. data/lib/liquid/drop.rb +17 -16
  11. data/lib/liquid/errors.rb +20 -24
  12. data/lib/liquid/expression.rb +26 -10
  13. data/lib/liquid/extensions.rb +19 -7
  14. data/lib/liquid/file_system.rb +11 -11
  15. data/lib/liquid/forloop_drop.rb +42 -0
  16. data/lib/liquid/i18n.rb +6 -6
  17. data/lib/liquid/interrupts.rb +1 -2
  18. data/lib/liquid/lexer.rb +12 -8
  19. data/lib/liquid/locales/en.yml +6 -2
  20. data/lib/liquid/parse_context.rb +38 -0
  21. data/lib/liquid/parse_tree_visitor.rb +42 -0
  22. data/lib/liquid/parser_switching.rb +4 -4
  23. data/lib/liquid/profiler/hooks.rb +7 -7
  24. data/lib/liquid/profiler.rb +18 -19
  25. data/lib/liquid/range_lookup.rb +16 -1
  26. data/lib/liquid/resource_limits.rb +23 -0
  27. data/lib/liquid/standardfilters.rb +207 -61
  28. data/lib/liquid/strainer.rb +15 -8
  29. data/lib/liquid/tablerowloop_drop.rb +62 -0
  30. data/lib/liquid/tag.rb +9 -8
  31. data/lib/liquid/tags/assign.rb +25 -4
  32. data/lib/liquid/tags/break.rb +0 -3
  33. data/lib/liquid/tags/capture.rb +1 -1
  34. data/lib/liquid/tags/case.rb +27 -12
  35. data/lib/liquid/tags/comment.rb +2 -2
  36. data/lib/liquid/tags/cycle.rb +16 -8
  37. data/lib/liquid/tags/decrement.rb +1 -4
  38. data/lib/liquid/tags/for.rb +103 -75
  39. data/lib/liquid/tags/if.rb +60 -44
  40. data/lib/liquid/tags/ifchanged.rb +0 -2
  41. data/lib/liquid/tags/include.rb +71 -51
  42. data/lib/liquid/tags/raw.rb +32 -4
  43. data/lib/liquid/tags/table_row.rb +21 -31
  44. data/lib/liquid/tags/unless.rb +3 -4
  45. data/lib/liquid/template.rb +42 -54
  46. data/lib/liquid/tokenizer.rb +31 -0
  47. data/lib/liquid/truffle.rb +5 -0
  48. data/lib/liquid/utils.rb +52 -8
  49. data/lib/liquid/variable.rb +59 -46
  50. data/lib/liquid/variable_lookup.rb +14 -6
  51. data/lib/liquid/version.rb +2 -1
  52. data/lib/liquid.rb +10 -7
  53. data/test/integration/assign_test.rb +8 -8
  54. data/test/integration/blank_test.rb +14 -14
  55. data/test/integration/block_test.rb +12 -0
  56. data/test/integration/context_test.rb +2 -2
  57. data/test/integration/document_test.rb +19 -0
  58. data/test/integration/drop_test.rb +42 -40
  59. data/test/integration/error_handling_test.rb +96 -43
  60. data/test/integration/filter_test.rb +60 -20
  61. data/test/integration/hash_ordering_test.rb +9 -9
  62. data/test/integration/output_test.rb +26 -27
  63. data/test/integration/parse_tree_visitor_test.rb +247 -0
  64. data/test/integration/parsing_quirks_test.rb +19 -13
  65. data/test/integration/render_profiling_test.rb +20 -20
  66. data/test/integration/security_test.rb +23 -7
  67. data/test/integration/standard_filter_test.rb +426 -46
  68. data/test/integration/tags/break_tag_test.rb +1 -2
  69. data/test/integration/tags/continue_tag_test.rb +0 -1
  70. data/test/integration/tags/for_tag_test.rb +135 -100
  71. data/test/integration/tags/if_else_tag_test.rb +75 -77
  72. data/test/integration/tags/include_tag_test.rb +50 -31
  73. data/test/integration/tags/increment_tag_test.rb +10 -11
  74. data/test/integration/tags/raw_tag_test.rb +7 -1
  75. data/test/integration/tags/standard_tag_test.rb +121 -122
  76. data/test/integration/tags/statements_test.rb +3 -5
  77. data/test/integration/tags/table_row_test.rb +20 -19
  78. data/test/integration/tags/unless_else_tag_test.rb +6 -6
  79. data/test/integration/template_test.rb +199 -49
  80. data/test/integration/trim_mode_test.rb +529 -0
  81. data/test/integration/variable_test.rb +27 -13
  82. data/test/test_helper.rb +33 -6
  83. data/test/truffle/truffle_test.rb +9 -0
  84. data/test/unit/block_unit_test.rb +8 -5
  85. data/test/unit/condition_unit_test.rb +94 -77
  86. data/test/unit/context_unit_test.rb +69 -72
  87. data/test/unit/file_system_unit_test.rb +3 -3
  88. data/test/unit/i18n_unit_test.rb +2 -2
  89. data/test/unit/lexer_unit_test.rb +12 -9
  90. data/test/unit/parser_unit_test.rb +2 -2
  91. data/test/unit/regexp_unit_test.rb +1 -1
  92. data/test/unit/strainer_unit_test.rb +96 -1
  93. data/test/unit/tag_unit_test.rb +7 -2
  94. data/test/unit/tags/case_tag_unit_test.rb +1 -1
  95. data/test/unit/tags/for_tag_unit_test.rb +2 -2
  96. data/test/unit/tags/if_tag_unit_test.rb +1 -1
  97. data/test/unit/template_unit_test.rb +14 -5
  98. data/test/unit/tokenizer_unit_test.rb +24 -7
  99. data/test/unit/variable_unit_test.rb +60 -43
  100. metadata +62 -50
  101. data/lib/liquid/module_ex.rb +0 -62
  102. data/lib/liquid/token.rb +0 -18
  103. data/test/unit/module_ex_unit_test.rb +0 -87
@@ -5,116 +5,116 @@ class StandardTagTest < Minitest::Test
5
5
 
6
6
  def test_no_transform
7
7
  assert_template_result('this text should come out of the template without change...',
8
- 'this text should come out of the template without change...')
8
+ 'this text should come out of the template without change...')
9
9
 
10
- assert_template_result('blah','blah')
11
- assert_template_result('<blah>','<blah>')
12
- assert_template_result('|,.:','|,.:')
13
- assert_template_result('','')
10
+ assert_template_result('blah', 'blah')
11
+ assert_template_result('<blah>', '<blah>')
12
+ assert_template_result('|,.:', '|,.:')
13
+ assert_template_result('', '')
14
14
 
15
- text = %|this shouldnt see any transformation either but has multiple lines
16
- as you can clearly see here ...|
17
- assert_template_result(text,text)
15
+ text = %(this shouldnt see any transformation either but has multiple lines
16
+ as you can clearly see here ...)
17
+ assert_template_result(text, text)
18
18
  end
19
19
 
20
20
  def test_has_a_block_which_does_nothing
21
- assert_template_result(%|the comment block should be removed .. right?|,
22
- %|the comment block should be removed {%comment%} be gone.. {%endcomment%} .. right?|)
23
-
24
- assert_template_result('','{%comment%}{%endcomment%}')
25
- assert_template_result('','{%comment%}{% endcomment %}')
26
- assert_template_result('','{% comment %}{%endcomment%}')
27
- assert_template_result('','{% comment %}{% endcomment %}')
28
- assert_template_result('','{%comment%}comment{%endcomment%}')
29
- assert_template_result('','{% comment %}comment{% endcomment %}')
30
- assert_template_result('','{% comment %} 1 {% comment %} 2 {% endcomment %} 3 {% endcomment %}')
31
-
32
- assert_template_result('','{%comment%}{%blabla%}{%endcomment%}')
33
- assert_template_result('','{% comment %}{% blabla %}{% endcomment %}')
34
- assert_template_result('','{%comment%}{% endif %}{%endcomment%}')
35
- assert_template_result('','{% comment %}{% endwhatever %}{% endcomment %}')
36
- assert_template_result('','{% comment %}{% raw %} {{%%%%}} }} { {% endcomment %} {% comment {% endraw %} {% endcomment %}')
37
-
38
- assert_template_result('foobar','foo{%comment%}comment{%endcomment%}bar')
39
- assert_template_result('foobar','foo{% comment %}comment{% endcomment %}bar')
40
- assert_template_result('foobar','foo{%comment%} comment {%endcomment%}bar')
41
- assert_template_result('foobar','foo{% comment %} comment {% endcomment %}bar')
42
-
43
- assert_template_result('foo bar','foo {%comment%} {%endcomment%} bar')
44
- assert_template_result('foo bar','foo {%comment%}comment{%endcomment%} bar')
45
- assert_template_result('foo bar','foo {%comment%} comment {%endcomment%} bar')
46
-
47
- assert_template_result('foobar','foo{%comment%}
21
+ assert_template_result(%(the comment block should be removed .. right?),
22
+ %(the comment block should be removed {%comment%} be gone.. {%endcomment%} .. right?))
23
+
24
+ assert_template_result('', '{%comment%}{%endcomment%}')
25
+ assert_template_result('', '{%comment%}{% endcomment %}')
26
+ assert_template_result('', '{% comment %}{%endcomment%}')
27
+ assert_template_result('', '{% comment %}{% endcomment %}')
28
+ assert_template_result('', '{%comment%}comment{%endcomment%}')
29
+ assert_template_result('', '{% comment %}comment{% endcomment %}')
30
+ assert_template_result('', '{% comment %} 1 {% comment %} 2 {% endcomment %} 3 {% endcomment %}')
31
+
32
+ assert_template_result('', '{%comment%}{%blabla%}{%endcomment%}')
33
+ assert_template_result('', '{% comment %}{% blabla %}{% endcomment %}')
34
+ assert_template_result('', '{%comment%}{% endif %}{%endcomment%}')
35
+ assert_template_result('', '{% comment %}{% endwhatever %}{% endcomment %}')
36
+ assert_template_result('', '{% comment %}{% raw %} {{%%%%}} }} { {% endcomment %} {% comment {% endraw %} {% endcomment %}')
37
+
38
+ assert_template_result('foobar', 'foo{%comment%}comment{%endcomment%}bar')
39
+ assert_template_result('foobar', 'foo{% comment %}comment{% endcomment %}bar')
40
+ assert_template_result('foobar', 'foo{%comment%} comment {%endcomment%}bar')
41
+ assert_template_result('foobar', 'foo{% comment %} comment {% endcomment %}bar')
42
+
43
+ assert_template_result('foo bar', 'foo {%comment%} {%endcomment%} bar')
44
+ assert_template_result('foo bar', 'foo {%comment%}comment{%endcomment%} bar')
45
+ assert_template_result('foo bar', 'foo {%comment%} comment {%endcomment%} bar')
46
+
47
+ assert_template_result('foobar', 'foo{%comment%}
48
48
  {%endcomment%}bar')
49
49
  end
50
50
 
51
51
  def test_hyphenated_assign
52
- assigns = {'a-b' => '1' }
52
+ assigns = { 'a-b' => '1' }
53
53
  assert_template_result('a-b:1 a-b:2', 'a-b:{{a-b}} {%assign a-b = 2 %}a-b:{{a-b}}', assigns)
54
54
  end
55
55
 
56
56
  def test_assign_with_colon_and_spaces
57
- assigns = {'var' => {'a:b c' => {'paged' => '1' }}}
57
+ assigns = { 'var' => { 'a:b c' => { 'paged' => '1' } } }
58
58
  assert_template_result('var2: 1', '{%assign var2 = var["a:b c"].paged %}var2: {{var2}}', assigns)
59
59
  end
60
60
 
61
61
  def test_capture
62
- assigns = {'var' => 'content' }
62
+ assigns = { 'var' => 'content' }
63
63
  assert_template_result('content foo content foo ',
64
- '{{ var2 }}{% capture var2 %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
65
- assigns)
64
+ '{{ var2 }}{% capture var2 %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
65
+ assigns)
66
66
  end
67
67
 
68
68
  def test_capture_detects_bad_syntax
69
69
  assert_raises(SyntaxError) do
70
70
  assert_template_result('content foo content foo ',
71
- '{{ var2 }}{% capture %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
72
- {'var' => 'content' })
71
+ '{{ var2 }}{% capture %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
72
+ { 'var' => 'content' })
73
73
  end
74
74
  end
75
75
 
76
76
  def test_case
77
- assigns = {'condition' => 2 }
77
+ assigns = { 'condition' => 2 }
78
78
  assert_template_result(' its 2 ',
79
- '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
80
- assigns)
79
+ '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
80
+ assigns)
81
81
 
82
- assigns = {'condition' => 1 }
82
+ assigns = { 'condition' => 1 }
83
83
  assert_template_result(' its 1 ',
84
- '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
85
- assigns)
84
+ '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
85
+ assigns)
86
86
 
87
- assigns = {'condition' => 3 }
87
+ assigns = { 'condition' => 3 }
88
88
  assert_template_result('',
89
- '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
90
- assigns)
89
+ '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
90
+ assigns)
91
91
 
92
- assigns = {'condition' => "string here" }
92
+ assigns = { 'condition' => "string here" }
93
93
  assert_template_result(' hit ',
94
- '{% case condition %}{% when "string here" %} hit {% endcase %}',
95
- assigns)
94
+ '{% case condition %}{% when "string here" %} hit {% endcase %}',
95
+ assigns)
96
96
 
97
- assigns = {'condition' => "bad string here" }
97
+ assigns = { 'condition' => "bad string here" }
98
98
  assert_template_result('',
99
- '{% case condition %}{% when "string here" %} hit {% endcase %}',\
100
- assigns)
99
+ '{% case condition %}{% when "string here" %} hit {% endcase %}',\
100
+ assigns)
101
101
  end
102
102
 
103
103
  def test_case_with_else
104
- assigns = {'condition' => 5 }
104
+ assigns = { 'condition' => 5 }
105
105
  assert_template_result(' hit ',
106
- '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
107
- assigns)
106
+ '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
107
+ assigns)
108
108
 
109
- assigns = {'condition' => 6 }
109
+ assigns = { 'condition' => 6 }
110
110
  assert_template_result(' else ',
111
- '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
112
- assigns)
111
+ '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
112
+ assigns)
113
113
 
114
- assigns = {'condition' => 6 }
114
+ assigns = { 'condition' => 6 }
115
115
  assert_template_result(' else ',
116
- '{% case condition %} {% when 5 %} hit {% else %} else {% endcase %}',
117
- assigns)
116
+ '{% case condition %} {% when 5 %} hit {% else %} else {% endcase %}',
117
+ assigns)
118
118
  end
119
119
 
120
120
  def test_case_on_size
@@ -128,87 +128,87 @@ class StandardTagTest < Minitest::Test
128
128
 
129
129
  def test_case_on_size_with_else
130
130
  assert_template_result('else',
131
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
132
- 'a' => [])
131
+ '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
132
+ 'a' => [])
133
133
 
134
134
  assert_template_result('1',
135
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
136
- 'a' => [1])
135
+ '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
136
+ 'a' => [1])
137
137
 
138
138
  assert_template_result('2',
139
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
140
- 'a' => [1, 1])
139
+ '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
140
+ 'a' => [1, 1])
141
141
 
142
142
  assert_template_result('else',
143
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
144
- 'a' => [1, 1, 1])
143
+ '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
144
+ 'a' => [1, 1, 1])
145
145
 
146
146
  assert_template_result('else',
147
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
148
- 'a' => [1, 1, 1, 1])
147
+ '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
148
+ 'a' => [1, 1, 1, 1])
149
149
 
150
150
  assert_template_result('else',
151
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
152
- 'a' => [1, 1, 1, 1, 1])
151
+ '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
152
+ 'a' => [1, 1, 1, 1, 1])
153
153
  end
154
154
 
155
155
  def test_case_on_length_with_else
156
156
  assert_template_result('else',
157
- '{% case a.empty? %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
158
- {})
157
+ '{% case a.empty? %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
158
+ {})
159
159
 
160
160
  assert_template_result('false',
161
- '{% case false %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
162
- {})
161
+ '{% case false %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
162
+ {})
163
163
 
164
164
  assert_template_result('true',
165
- '{% case true %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
166
- {})
165
+ '{% case true %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
166
+ {})
167
167
 
168
168
  assert_template_result('else',
169
- '{% case NULL %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
170
- {})
169
+ '{% case NULL %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
170
+ {})
171
171
  end
172
172
 
173
173
  def test_assign_from_case
174
174
  # Example from the shopify forums
175
- code = %q({% case collection.handle %}{% when 'menswear-jackets' %}{% assign ptitle = 'menswear' %}{% when 'menswear-t-shirts' %}{% assign ptitle = 'menswear' %}{% else %}{% assign ptitle = 'womenswear' %}{% endcase %}{{ ptitle }})
175
+ code = "{% case collection.handle %}{% when 'menswear-jackets' %}{% assign ptitle = 'menswear' %}{% when 'menswear-t-shirts' %}{% assign ptitle = 'menswear' %}{% else %}{% assign ptitle = 'womenswear' %}{% endcase %}{{ ptitle }}"
176
176
  template = Liquid::Template.parse(code)
177
- assert_equal "menswear", template.render!("collection" => {'handle' => 'menswear-jackets'})
178
- assert_equal "menswear", template.render!("collection" => {'handle' => 'menswear-t-shirts'})
179
- assert_equal "womenswear", template.render!("collection" => {'handle' => 'x'})
180
- assert_equal "womenswear", template.render!("collection" => {'handle' => 'y'})
181
- assert_equal "womenswear", template.render!("collection" => {'handle' => 'z'})
177
+ assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-jackets' })
178
+ assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-t-shirts' })
179
+ assert_equal "womenswear", template.render!("collection" => { 'handle' => 'x' })
180
+ assert_equal "womenswear", template.render!("collection" => { 'handle' => 'y' })
181
+ assert_equal "womenswear", template.render!("collection" => { 'handle' => 'z' })
182
182
  end
183
183
 
184
184
  def test_case_when_or
185
185
  code = '{% case condition %}{% when 1 or 2 or 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
186
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 1 })
187
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 2 })
188
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 3 })
189
- assert_template_result(' its 4 ', code, {'condition' => 4 })
190
- assert_template_result('', code, {'condition' => 5 })
186
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
187
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 2 })
188
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 3 })
189
+ assert_template_result(' its 4 ', code, { 'condition' => 4 })
190
+ assert_template_result('', code, { 'condition' => 5 })
191
191
 
192
192
  code = '{% case condition %}{% when 1 or "string" or null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
193
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 1 })
194
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 'string' })
195
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => nil })
196
- assert_template_result('', code, {'condition' => 'something else' })
193
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
194
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 'string' })
195
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => nil })
196
+ assert_template_result('', code, { 'condition' => 'something else' })
197
197
  end
198
198
 
199
199
  def test_case_when_comma
200
200
  code = '{% case condition %}{% when 1, 2, 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
201
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 1 })
202
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 2 })
203
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 3 })
204
- assert_template_result(' its 4 ', code, {'condition' => 4 })
205
- assert_template_result('', code, {'condition' => 5 })
201
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
202
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 2 })
203
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 3 })
204
+ assert_template_result(' its 4 ', code, { 'condition' => 4 })
205
+ assert_template_result('', code, { 'condition' => 5 })
206
206
 
207
207
  code = '{% case condition %}{% when 1, "string", null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
208
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 1 })
209
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 'string' })
210
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => nil })
211
- assert_template_result('', code, {'condition' => 'something else' })
208
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
209
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 'string' })
210
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => nil })
211
+ assert_template_result('', code, { 'condition' => 'something else' })
212
212
  end
213
213
 
214
214
  def test_assign
@@ -236,15 +236,14 @@ class StandardTagTest < Minitest::Test
236
236
  assert_raises(SyntaxError) do
237
237
  assert_template_result('', '{% case false %}{% huh %}true{% endcase %}', {})
238
238
  end
239
-
240
239
  end
241
240
 
242
241
  def test_cycle
243
- assert_template_result('one','{%cycle "one", "two"%}')
244
- assert_template_result('one two','{%cycle "one", "two"%} {%cycle "one", "two"%}')
245
- assert_template_result(' two','{%cycle "", "two"%} {%cycle "", "two"%}')
242
+ assert_template_result('one', '{%cycle "one", "two"%}')
243
+ assert_template_result('one two', '{%cycle "one", "two"%} {%cycle "one", "two"%}')
244
+ assert_template_result(' two', '{%cycle "", "two"%} {%cycle "", "two"%}')
246
245
 
247
- assert_template_result('one two one','{%cycle "one", "two"%} {%cycle "one", "two"%} {%cycle "one", "two"%}')
246
+ assert_template_result('one two one', '{%cycle "one", "two"%} {%cycle "one", "two"%} {%cycle "one", "two"%}')
248
247
 
249
248
  assert_template_result('text-align: left text-align: right',
250
249
  '{%cycle "text-align: left", "text-align: right" %} {%cycle "text-align: left", "text-align: right"%}')
@@ -261,18 +260,18 @@ class StandardTagTest < Minitest::Test
261
260
  end
262
261
 
263
262
  def test_multiple_named_cycles_with_names_from_context
264
- assigns = {"var1" => 1, "var2" => 2 }
263
+ assigns = { "var1" => 1, "var2" => 2 }
265
264
  assert_template_result('one one two two one one',
266
265
  '{%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %}', assigns)
267
266
  end
268
267
 
269
268
  def test_size_of_array
270
- assigns = {"array" => [1,2,3,4]}
269
+ assigns = { "array" => [1, 2, 3, 4] }
271
270
  assert_template_result('array has 4 elements', "array has {{ array.size }} elements", assigns)
272
271
  end
273
272
 
274
273
  def test_size_of_hash
275
- assigns = {"hash" => {:a => 1, :b => 2, :c=> 3, :d => 4}}
274
+ assigns = { "hash" => { a: 1, b: 2, c: 3, d: 4 } }
276
275
  assert_template_result('hash has 4 elements', "hash has {{ hash.size }} elements", assigns)
277
276
  end
278
277
 
@@ -284,11 +283,11 @@ class StandardTagTest < Minitest::Test
284
283
  end
285
284
 
286
285
  def test_ifchanged
287
- assigns = {'array' => [ 1, 1, 2, 2, 3, 3] }
288
- assert_template_result('123','{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}',assigns)
286
+ assigns = { 'array' => [ 1, 1, 2, 2, 3, 3] }
287
+ assert_template_result('123', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns)
289
288
 
290
- assigns = {'array' => [ 1, 1, 1, 1] }
291
- assert_template_result('1','{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}',assigns)
289
+ assigns = { 'array' => [ 1, 1, 1, 1] }
290
+ assert_template_result('1', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns)
292
291
  end
293
292
 
294
293
  def test_multiline_tag
@@ -37,7 +37,6 @@ class StatementsTest < Minitest::Test
37
37
  text = ' {% if null <= 0 %} true {% else %} false {% endif %} '
38
38
  assert_template_result ' false ', text
39
39
 
40
-
41
40
  text = ' {% if 0 <= null %} true {% else %} false {% endif %} '
42
41
  assert_template_result ' false ', text
43
42
  end
@@ -72,18 +71,17 @@ class StatementsTest < Minitest::Test
72
71
  assert_template_result ' true ', text, 'var' => 'hello there!'
73
72
  end
74
73
 
75
-
76
74
  def test_var_and_long_string_are_equal_backwards
77
75
  text = " {% if 'hello there!' == var %} true {% else %} false {% endif %} "
78
76
  assert_template_result ' true ', text, 'var' => 'hello there!'
79
77
  end
80
78
 
81
- #def test_is_nil
79
+ # def test_is_nil
82
80
  # text = %| {% if var != nil %} true {% else %} false {% end %} |
83
81
  # @template.assigns = { 'var' => 'hello there!'}
84
82
  # expected = %| true |
85
83
  # assert_equal expected, @template.parse(text)
86
- #end
84
+ # end
87
85
 
88
86
  def test_is_collection_empty
89
87
  text = ' {% if array == empty %} true {% else %} false {% endif %} '
@@ -92,7 +90,7 @@ class StatementsTest < Minitest::Test
92
90
 
93
91
  def test_is_not_collection_empty
94
92
  text = ' {% if array == empty %} true {% else %} false {% endif %} '
95
- assert_template_result ' false ', text, 'array' => [1,2,3]
93
+ assert_template_result ' false ', text, 'array' => [1, 2, 3]
96
94
  end
97
95
 
98
96
  def test_nil
@@ -16,48 +16,49 @@ class TableRowTest < Minitest::Test
16
16
  end
17
17
 
18
18
  def test_table_row
19
-
20
19
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
21
- '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
22
- 'numbers' => [1,2,3,4,5,6])
20
+ '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
21
+ 'numbers' => [1, 2, 3, 4, 5, 6])
23
22
 
24
23
  assert_template_result("<tr class=\"row1\">\n</tr>\n",
25
- '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
26
- 'numbers' => [])
24
+ '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
25
+ 'numbers' => [])
27
26
  end
28
27
 
29
28
  def test_table_row_with_different_cols
30
29
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td><td class=\"col4\"> 4 </td><td class=\"col5\"> 5 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 6 </td></tr>\n",
31
- '{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}',
32
- 'numbers' => [1,2,3,4,5,6])
33
-
30
+ '{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}',
31
+ 'numbers' => [1, 2, 3, 4, 5, 6])
34
32
  end
35
33
 
36
34
  def test_table_col_counter
37
35
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row2\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row3\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n",
38
- '{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}',
39
- 'numbers' => [1,2,3,4,5,6])
36
+ '{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}',
37
+ 'numbers' => [1, 2, 3, 4, 5, 6])
40
38
  end
41
39
 
42
40
  def test_quoted_fragment
43
41
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
44
- "{% tablerow n in collections.frontpage cols:3%} {{n}} {% endtablerow %}",
45
- 'collections' => {'frontpage' => [1,2,3,4,5,6]})
42
+ "{% tablerow n in collections.frontpage cols:3%} {{n}} {% endtablerow %}",
43
+ 'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] })
46
44
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
47
- "{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}",
48
- 'collections' => {'frontpage' => [1,2,3,4,5,6]})
49
-
45
+ "{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}",
46
+ 'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] })
50
47
  end
51
48
 
52
49
  def test_enumerable_drop
53
50
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
54
- '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
55
- 'numbers' => ArrayDrop.new([1,2,3,4,5,6]))
51
+ '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
52
+ 'numbers' => ArrayDrop.new([1, 2, 3, 4, 5, 6]))
56
53
  end
57
54
 
58
55
  def test_offset_and_limit
59
56
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
60
- '{% tablerow n in numbers cols:3 offset:1 limit:6%} {{n}} {% endtablerow %}',
61
- 'numbers' => [0,1,2,3,4,5,6,7])
57
+ '{% tablerow n in numbers cols:3 offset:1 limit:6%} {{n}} {% endtablerow %}',
58
+ 'numbers' => [0, 1, 2, 3, 4, 5, 6, 7])
59
+ end
60
+
61
+ def test_blank_string_not_iterable
62
+ assert_template_result("<tr class=\"row1\">\n</tr>\n", "{% tablerow char in characters cols:3 %}I WILL NOT BE OUTPUT{% endtablerow %}", 'characters' => '')
62
63
  end
63
64
  end
@@ -4,16 +4,16 @@ class UnlessElseTagTest < Minitest::Test
4
4
  include Liquid
5
5
 
6
6
  def test_unless
7
- assert_template_result(' ',' {% unless true %} this text should not go into the output {% endunless %} ')
7
+ assert_template_result(' ', ' {% unless true %} this text should not go into the output {% endunless %} ')
8
8
  assert_template_result(' this text should go into the output ',
9
- ' {% unless false %} this text should go into the output {% endunless %} ')
10
- assert_template_result(' you rock ?','{% unless true %} you suck {% endunless %} {% unless false %} you rock {% endunless %}?')
9
+ ' {% unless false %} this text should go into the output {% endunless %} ')
10
+ assert_template_result(' you rock ?', '{% unless true %} you suck {% endunless %} {% unless false %} you rock {% endunless %}?')
11
11
  end
12
12
 
13
13
  def test_unless_else
14
- assert_template_result(' YES ','{% unless true %} NO {% else %} YES {% endunless %}')
15
- assert_template_result(' YES ','{% unless false %} YES {% else %} NO {% endunless %}')
16
- assert_template_result(' YES ','{% unless "foo" %} NO {% else %} YES {% endunless %}')
14
+ assert_template_result(' YES ', '{% unless true %} NO {% else %} YES {% endunless %}')
15
+ assert_template_result(' YES ', '{% unless false %} YES {% else %} NO {% endunless %}')
16
+ assert_template_result(' YES ', '{% unless "foo" %} NO {% else %} YES {% endunless %}')
17
17
  end
18
18
 
19
19
  def test_unless_in_loop