liquid 5.0.1 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 98bb40e18a2bb905a917743968edb79732f903b3beb1f51ab9551e1aaee3f91a
4
- data.tar.gz: 264b8ccd158a79f2b43a0308a055d38b018b0f4132f316007f3589e778f5d9dd
3
+ metadata.gz: d033978c659ebc86ff6ae3a36adaa1a90b8f69580e0cd033eb9c2c669ff6d66d
4
+ data.tar.gz: 5c440b450df6ac2c673b0a23091d97e497ccb8207a443b0b6011f2b1a9b6529b
5
5
  SHA512:
6
- metadata.gz: 19b30524fc6b7828de10e3eecc4e28b5595436144eacedad06c36d6472b740d01e971d315f7aa911ebad80dac5c075b75649c0b506f588e50ff8c977f08ed365
7
- data.tar.gz: 53726f629d8a76ebcc4e134bc12abe981df9526fb5baa4d9312b68bc967e691af329bfcabadad86af65b8149034bd94479a2f98a93a9056a090fd28ba2901597
6
+ metadata.gz: 114697a0375800b4f67d7c216f9c56f823bb4468203632d45bda92bc597e0677acd0c4151c60f92fc121c2cd1b8d0d1c18d2482f1265acb62dbf190f12773d5c
7
+ data.tar.gz: 3c013aef59a531829e202b73c4ce33d63ad5f58d763b7f2c610a3ff96fdab13fe2fdcf7e9401b63e09bb136fb1518ad69300b41114ebc1f076565c7d2953de78
data/History.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Liquid Change Log
2
2
 
3
+ ## 5.1.0 / 2021-09-09
4
+
5
+ ### Features
6
+ * Add `base64_encode`, `base64_decode`, `base64_url_safe_encode`, and `base64_url_safe_decode` filters (#1450) [Daniel Insley]
7
+ * Introduce `to_liquid_value` in `Liquid::Drop` (#1441) [Michael Go]
8
+
9
+ ### Fixes
10
+ * Fix support for using a String subclass for the liquid source (#1421) [Dylan Thacker-Smith]
11
+ * Add `ParseTreeVisitor` to `RangeLookup` (#1470) [CP Clermont]
12
+ * Translate `RangeError` to `Liquid::Error` for `truncatewords` with large int (#1431) [Dylan Thacker-Smith]
13
+
3
14
  ## 5.0.1 / 2021-03-24
4
15
 
5
16
  ### Fixes
@@ -8,7 +8,7 @@ module Liquid
8
8
  # c = Condition.new(1, '==', 1)
9
9
  # c.evaluate #=> true
10
10
  #
11
- class Condition #:nodoc:
11
+ class Condition # :nodoc:
12
12
  @@operators = {
13
13
  '==' => ->(cond, left, right) { cond.send(:equal_variables, left, right) },
14
14
  '!=' => ->(cond, left, right) { !cond.send(:equal_variables, left, right) },
@@ -134,8 +134,8 @@ module Liquid
134
134
  # return this as the result.
135
135
  return context.evaluate(left) if op.nil?
136
136
 
137
- left = context.evaluate(left)
138
- right = context.evaluate(right)
137
+ left = Liquid::Utils.to_liquid_value(context.evaluate(left))
138
+ right = Liquid::Utils.to_liquid_value(context.evaluate(right))
139
139
 
140
140
  operation = self.class.operators[op] || raise(Liquid::ArgumentError, "Unknown operator #{op}")
141
141
 
@@ -124,7 +124,7 @@ module Liquid
124
124
  # context['var'] = 'hi'
125
125
  # end
126
126
  #
127
- # context['var] #=> nil
127
+ # context['var'] #=> nil
128
128
  def stack(new_scope = {})
129
129
  push(new_scope)
130
130
  yield
@@ -12,6 +12,8 @@ module Liquid
12
12
  end
13
13
  end
14
14
 
15
+ attr_reader :start_obj, :end_obj
16
+
15
17
  def initialize(start_obj, end_obj)
16
18
  @start_obj = start_obj
17
19
  @end_obj = end_obj
@@ -35,5 +37,11 @@ module Liquid
35
37
  Utils.to_integer(input)
36
38
  end
37
39
  end
40
+
41
+ class ParseTreeVisitor < Liquid::ParseTreeVisitor
42
+ def children
43
+ [@node.start_obj, @node.end_obj]
44
+ end
45
+ end
38
46
  end
39
47
  end
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'cgi'
4
+ require 'base64'
4
5
  require 'bigdecimal'
5
6
 
6
7
  module Liquid
7
8
  module StandardFilters
9
+ MAX_INT = (1 << 31) - 1
8
10
  HTML_ESCAPE = {
9
11
  '&' => '&amp;',
10
12
  '>' => '&gt;',
@@ -62,6 +64,26 @@ module Liquid
62
64
  result
63
65
  end
64
66
 
67
+ def base64_encode(input)
68
+ Base64.strict_encode64(input.to_s)
69
+ end
70
+
71
+ def base64_decode(input)
72
+ Base64.strict_decode64(input.to_s)
73
+ rescue ::ArgumentError
74
+ raise Liquid::ArgumentError, "invalid base64 provided to base64_decode"
75
+ end
76
+
77
+ def base64_url_safe_encode(input)
78
+ Base64.urlsafe_encode64(input.to_s)
79
+ end
80
+
81
+ def base64_url_safe_decode(input)
82
+ Base64.urlsafe_decode64(input.to_s)
83
+ rescue ::ArgumentError
84
+ raise Liquid::ArgumentError, "invalid base64 provided to base64_url_safe_decode"
85
+ end
86
+
65
87
  def slice(input, offset, length = nil)
66
88
  offset = Utils.to_integer(offset)
67
89
  length = length ? Utils.to_integer(length) : 1
@@ -93,7 +115,13 @@ module Liquid
93
115
  words = Utils.to_integer(words)
94
116
  words = 1 if words <= 0
95
117
 
96
- wordlist = input.split(" ", words + 1)
118
+ wordlist = begin
119
+ input.split(" ", words + 1)
120
+ rescue RangeError
121
+ raise if words + 1 < MAX_INT
122
+ # e.g. integer #{words} too big to convert to `int'
123
+ raise Liquid::ArgumentError, "integer #{words} too big for truncatewords"
124
+ end
97
125
  return input if wordlist.length <= words
98
126
 
99
127
  wordlist.pop
@@ -440,7 +468,7 @@ module Liquid
440
468
  #
441
469
  def default(input, default_value = '', options = {})
442
470
  options = {} unless options.is_a?(Hash)
443
- false_check = options['allow_false'] ? input.nil? : !input
471
+ false_check = options['allow_false'] ? input.nil? : !Liquid::Utils.to_liquid_value(input)
444
472
  false_check || (input.respond_to?(:empty?) && input.empty?) ? default_value : input
445
473
  end
446
474
 
@@ -52,7 +52,14 @@ module Liquid
52
52
  @blocks.each do |block|
53
53
  if block.else?
54
54
  block.attachment.render_to_output_buffer(context, output) if execute_else_block
55
- elsif block.evaluate(context)
55
+ next
56
+ end
57
+
58
+ result = Liquid::Utils.to_liquid_value(
59
+ block.evaluate(context)
60
+ )
61
+
62
+ if result
56
63
  execute_else_block = false
57
64
  block.attachment.render_to_output_buffer(context, output)
58
65
  end
@@ -50,7 +50,11 @@ module Liquid
50
50
 
51
51
  def render_to_output_buffer(context, output)
52
52
  @blocks.each do |block|
53
- if block.evaluate(context)
53
+ result = Liquid::Utils.to_liquid_value(
54
+ block.evaluate(context)
55
+ )
56
+
57
+ if result
54
58
  return block.attachment.render_to_output_buffer(context, output)
55
59
  end
56
60
  end
@@ -11,13 +11,21 @@ module Liquid
11
11
  def render_to_output_buffer(context, output)
12
12
  # First condition is interpreted backwards ( if not )
13
13
  first_block = @blocks.first
14
- unless first_block.evaluate(context)
14
+ result = Liquid::Utils.to_liquid_value(
15
+ first_block.evaluate(context)
16
+ )
17
+
18
+ unless result
15
19
  return first_block.attachment.render_to_output_buffer(context, output)
16
20
  end
17
21
 
18
22
  # After the first condition unless works just like if
19
23
  @blocks[1..-1].each do |block|
20
- if block.evaluate(context)
24
+ result = Liquid::Utils.to_liquid_value(
25
+ block.evaluate(context)
26
+ )
27
+
28
+ if result
21
29
  return block.attachment.render_to_output_buffer(context, output)
22
30
  end
23
31
  end
@@ -5,7 +5,7 @@ module Liquid
5
5
  attr_reader :line_number, :for_liquid_tag
6
6
 
7
7
  def initialize(source, line_numbers = false, line_number: nil, for_liquid_tag: false)
8
- @source = source
8
+ @source = source.to_s.to_str
9
9
  @line_number = line_number || (line_numbers ? 1 : nil)
10
10
  @for_liquid_tag = for_liquid_tag
11
11
  @tokens = tokenize
@@ -24,7 +24,7 @@ module Liquid
24
24
  private
25
25
 
26
26
  def tokenize
27
- return [] if @source.to_s.empty?
27
+ return [] if @source.empty?
28
28
 
29
29
  return @source.split("\n") if @for_liquid_tag
30
30
 
data/lib/liquid/utils.rb CHANGED
@@ -81,5 +81,13 @@ module Liquid
81
81
  rescue ::ArgumentError
82
82
  nil
83
83
  end
84
+
85
+ def self.to_liquid_value(obj)
86
+ # Enable "obj" to represent itself as a primitive value like integer, string, or boolean
87
+ return obj.to_liquid_value if obj.respond_to?(:to_liquid_value)
88
+
89
+ # Otherwise return the object itself
90
+ obj
91
+ end
84
92
  end
85
93
  end
@@ -40,6 +40,9 @@ module Liquid
40
40
  @lookups.each_index do |i|
41
41
  key = context.evaluate(@lookups[i])
42
42
 
43
+ # Cast "key" to its liquid value to enable it to act as a primitive value
44
+ key = Liquid::Utils.to_liquid_value(key)
45
+
43
46
  # If object is a hash- or array-like object we look for the
44
47
  # presence of the key and if its available we return it
45
48
  if object.respond_to?(:[]) &&
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Liquid
5
- VERSION = "5.0.1"
5
+ VERSION = "5.1.0"
6
6
  end
@@ -145,6 +145,40 @@ class StandardFiltersTest < Minitest::Test
145
145
  assert_equal('&lt;strong&gt;Hulk&lt;/strong&gt;', @filters.escape_once('&lt;strong&gt;Hulk</strong>'))
146
146
  end
147
147
 
148
+ def test_base64_encode
149
+ assert_equal('b25lIHR3byB0aHJlZQ==', @filters.base64_encode('one two three'))
150
+ assert_equal('', @filters.base64_encode(nil))
151
+ end
152
+
153
+ def test_base64_decode
154
+ assert_equal('one two three', @filters.base64_decode('b25lIHR3byB0aHJlZQ=='))
155
+
156
+ exception = assert_raises(Liquid::ArgumentError) do
157
+ @filters.base64_decode("invalidbase64")
158
+ end
159
+
160
+ assert_equal('Liquid error: invalid base64 provided to base64_decode', exception.message)
161
+ end
162
+
163
+ def test_base64_url_safe_encode
164
+ assert_equal(
165
+ 'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMTIzNDU2Nzg5MCAhQCMkJV4mKigpLT1fKy8_Ljo7W117fVx8',
166
+ @filters.base64_url_safe_encode('abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 !@#$%^&*()-=_+/?.:;[]{}\|')
167
+ )
168
+ assert_equal('', @filters.base64_url_safe_encode(nil))
169
+ end
170
+
171
+ def test_base64_url_safe_decode
172
+ assert_equal(
173
+ 'abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 !@#$%^&*()-=_+/?.:;[]{}\|',
174
+ @filters.base64_url_safe_decode('YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMTIzNDU2Nzg5MCAhQCMkJV4mKigpLT1fKy8_Ljo7W117fVx8')
175
+ )
176
+ exception = assert_raises(Liquid::ArgumentError) do
177
+ @filters.base64_url_safe_decode("invalidbase64")
178
+ end
179
+ assert_equal('Liquid error: invalid base64 provided to base64_url_safe_decode', exception.message)
180
+ end
181
+
148
182
  def test_url_encode
149
183
  assert_equal('foo%2B1%40example.com', @filters.url_encode('foo+1@example.com'))
150
184
  assert_equal('1', @filters.url_encode(1))
@@ -178,6 +212,10 @@ class StandardFiltersTest < Minitest::Test
178
212
  assert_equal('one two three...', @filters.truncatewords("one two\tthree\nfour", 3))
179
213
  assert_equal('one two...', @filters.truncatewords("one two three four", 2))
180
214
  assert_equal('one...', @filters.truncatewords("one two three four", 0))
215
+ exception = assert_raises(Liquid::ArgumentError) do
216
+ @filters.truncatewords("one two three four", 1 << 31)
217
+ end
218
+ assert_equal("Liquid error: integer #{1 << 31} too big for truncatewords", exception.message)
181
219
  end
182
220
 
183
221
  def test_strip_html
@@ -690,6 +728,8 @@ class StandardFiltersTest < Minitest::Test
690
728
  assert_equal("bar", @filters.default([], "bar"))
691
729
  assert_equal("bar", @filters.default({}, "bar"))
692
730
  assert_template_result('bar', "{{ false | default: 'bar' }}")
731
+ assert_template_result('bar', "{{ drop | default: 'bar' }}", 'drop' => BooleanDrop.new(false))
732
+ assert_template_result('Yay', "{{ drop | default: 'bar' }}", 'drop' => BooleanDrop.new(true))
693
733
  end
694
734
 
695
735
  def test_default_handle_false
@@ -700,6 +740,8 @@ class StandardFiltersTest < Minitest::Test
700
740
  assert_equal("bar", @filters.default([], "bar", "allow_false" => true))
701
741
  assert_equal("bar", @filters.default({}, "bar", "allow_false" => true))
702
742
  assert_template_result('false', "{{ false | default: 'bar', allow_false: true }}")
743
+ assert_template_result('Nay', "{{ drop | default: 'bar', allow_false: true }}", 'drop' => BooleanDrop.new(false))
744
+ assert_template_result('Yay', "{{ drop | default: 'bar', allow_false: true }}", 'drop' => BooleanDrop.new(true))
703
745
  end
704
746
 
705
747
  def test_cannot_access_private_methods
@@ -323,4 +323,18 @@ class TemplateTest < Minitest::Test
323
323
  result = t.render('x' => 1, 'y' => 5)
324
324
  assert_equal('12345', result)
325
325
  end
326
+
327
+ def test_source_string_subclass
328
+ string_subclass = Class.new(String) do
329
+ # E.g. ActiveSupport::SafeBuffer does this, so don't just rely on to_s to return a String
330
+ def to_s
331
+ self
332
+ end
333
+ end
334
+ source = string_subclass.new("{% assign x = 2 -%} x= {{- x }}")
335
+ assert_instance_of(string_subclass, source)
336
+ output = Template.parse(source).render!
337
+ assert_equal("x=2", output)
338
+ assert_instance_of(String, output)
339
+ end
326
340
  end
@@ -15,6 +15,33 @@ class VariableTest < Minitest::Test
15
15
  assert_template_result('foobar', '{{ foo }}', 'foo' => ThingWithToLiquid.new)
16
16
  end
17
17
 
18
+ def test_variable_lookup_calls_to_liquid_value
19
+ assert_template_result('1', '{{ foo }}', 'foo' => IntegerDrop.new('1'))
20
+ assert_template_result('2', '{{ list[foo] }}', 'foo' => IntegerDrop.new('1'), 'list' => [1, 2, 3])
21
+ assert_template_result('one', '{{ list[foo] }}', 'foo' => IntegerDrop.new('1'), 'list' => { 1 => 'one' })
22
+ assert_template_result('Yay', '{{ foo }}', 'foo' => BooleanDrop.new(true))
23
+ assert_template_result('YAY', '{{ foo | upcase }}', 'foo' => BooleanDrop.new(true))
24
+ end
25
+
26
+ def test_if_tag_calls_to_liquid_value
27
+ assert_template_result('one', '{% if foo == 1 %}one{% endif %}', 'foo' => IntegerDrop.new('1'))
28
+ assert_template_result('one', '{% if 0 < foo %}one{% endif %}', 'foo' => IntegerDrop.new('1'))
29
+ assert_template_result('one', '{% if foo > 0 %}one{% endif %}', 'foo' => IntegerDrop.new('1'))
30
+ assert_template_result('true', '{% if foo == true %}true{% endif %}', 'foo' => BooleanDrop.new(true))
31
+ assert_template_result('true', '{% if foo %}true{% endif %}', 'foo' => BooleanDrop.new(true))
32
+
33
+ assert_template_result('', '{% if foo %}true{% endif %}', 'foo' => BooleanDrop.new(false))
34
+ assert_template_result('', '{% if foo == true %}True{% endif %}', 'foo' => BooleanDrop.new(false))
35
+ end
36
+
37
+ def test_unless_tag_calls_to_liquid_value
38
+ assert_template_result('', '{% unless foo %}true{% endunless %}', 'foo' => BooleanDrop.new(true))
39
+ end
40
+
41
+ def test_case_tag_calls_to_liquid_value
42
+ assert_template_result('One', '{% case foo %}{% when 1 %}One{% endcase %}', 'foo' => IntegerDrop.new('1'))
43
+ end
44
+
18
45
  def test_simple_with_whitespaces
19
46
  template = Template.parse(%( {{ test }} ))
20
47
  assert_equal(' worked ', template.render!('test' => 'worked'))
@@ -104,4 +131,8 @@ class VariableTest < Minitest::Test
104
131
  def test_dynamic_find_var
105
132
  assert_template_result('bar', '{{ [key] }}', 'key' => 'foo', 'foo' => 'bar')
106
133
  end
134
+
135
+ def test_raw_value_variable
136
+ assert_template_result('bar', '{{ [key] }}', 'key' => 'foo', 'foo' => 'bar')
137
+ end
107
138
  end
data/test/test_helper.rb CHANGED
@@ -119,6 +119,44 @@ class ThingWithToLiquid
119
119
  end
120
120
  end
121
121
 
122
+ class IntegerDrop < Liquid::Drop
123
+ def initialize(value)
124
+ super()
125
+ @value = value.to_i
126
+ end
127
+
128
+ def ==(other)
129
+ @value == other
130
+ end
131
+
132
+ def to_s
133
+ @value.to_s
134
+ end
135
+
136
+ def to_liquid_value
137
+ @value
138
+ end
139
+ end
140
+
141
+ class BooleanDrop < Liquid::Drop
142
+ def initialize(value)
143
+ super()
144
+ @value = value
145
+ end
146
+
147
+ def ==(other)
148
+ @value == other
149
+ end
150
+
151
+ def to_liquid_value
152
+ @value
153
+ end
154
+
155
+ def to_s
156
+ @value ? "Yay" : "Nay"
157
+ end
158
+ end
159
+
122
160
  class ErrorDrop < Liquid::Drop
123
161
  def standard_error
124
162
  raise Liquid::StandardError, 'standard error'
@@ -159,6 +159,13 @@ class ParseTreeVisitorTest < Minitest::Test
159
159
  )
160
160
  end
161
161
 
162
+ def test_for_range
163
+ assert_equal(
164
+ ["test"],
165
+ visit(%({% for x in (1..test) %}{% endfor %}))
166
+ )
167
+ end
168
+
162
169
  def test_tablerow_in
163
170
  assert_equal(
164
171
  ["test"],
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: liquid
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.1
4
+ version: 5.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Lütke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-24 00:00:00.000000000 Z
11
+ date: 2021-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -187,65 +187,65 @@ required_rubygems_version: !ruby/object:Gem::Requirement
187
187
  - !ruby/object:Gem::Version
188
188
  version: 1.3.7
189
189
  requirements: []
190
- rubygems_version: 3.0.3
190
+ rubygems_version: 3.2.20
191
191
  signing_key:
192
192
  specification_version: 4
193
193
  summary: A secure, non-evaling end user template engine with aesthetic markup.
194
194
  test_files:
195
+ - test/test_helper.rb
195
196
  - test/fixtures/en_locale.yml
196
- - test/unit/condition_unit_test.rb
197
- - test/unit/variable_unit_test.rb
198
- - test/unit/template_unit_test.rb
199
- - test/unit/strainer_template_unit_test.rb
200
- - test/unit/file_system_unit_test.rb
201
- - test/unit/static_registers_unit_test.rb
202
- - test/unit/tags/for_tag_unit_test.rb
203
- - test/unit/tags/if_tag_unit_test.rb
204
- - test/unit/tags/case_tag_unit_test.rb
205
197
  - test/unit/strainer_factory_unit_test.rb
206
- - test/unit/parse_tree_visitor_test.rb
207
- - test/unit/lexer_unit_test.rb
208
- - test/unit/block_unit_test.rb
209
198
  - test/unit/regexp_unit_test.rb
199
+ - test/unit/static_registers_unit_test.rb
200
+ - test/unit/template_unit_test.rb
210
201
  - test/unit/partial_cache_unit_test.rb
202
+ - test/unit/block_unit_test.rb
203
+ - test/unit/parse_tree_visitor_test.rb
211
204
  - test/unit/parser_unit_test.rb
212
- - test/unit/tag_unit_test.rb
213
205
  - test/unit/i18n_unit_test.rb
206
+ - test/unit/file_system_unit_test.rb
207
+ - test/unit/tags/case_tag_unit_test.rb
208
+ - test/unit/tags/if_tag_unit_test.rb
209
+ - test/unit/tags/for_tag_unit_test.rb
214
210
  - test/unit/tokenizer_unit_test.rb
215
211
  - test/unit/template_factory_unit_test.rb
216
- - test/test_helper.rb
217
- - test/integration/blank_test.rb
218
- - test/integration/standard_filter_test.rb
212
+ - test/unit/lexer_unit_test.rb
213
+ - test/unit/condition_unit_test.rb
214
+ - test/unit/tag_unit_test.rb
215
+ - test/unit/strainer_template_unit_test.rb
216
+ - test/unit/variable_unit_test.rb
217
+ - test/integration/error_handling_test.rb
218
+ - test/integration/tag_test.rb
219
+ - test/integration/filter_test.rb
220
+ - test/integration/context_test.rb
221
+ - test/integration/block_test.rb
222
+ - test/integration/template_test.rb
223
+ - test/integration/profiler_test.rb
219
224
  - test/integration/parsing_quirks_test.rb
220
225
  - test/integration/tag/disableable_test.rb
221
- - test/integration/context_test.rb
222
- - test/integration/error_handling_test.rb
226
+ - test/integration/trim_mode_test.rb
227
+ - test/integration/expression_test.rb
228
+ - test/integration/output_test.rb
223
229
  - test/integration/security_test.rb
224
- - test/integration/capture_test.rb
225
- - test/integration/assign_test.rb
230
+ - test/integration/drop_test.rb
226
231
  - test/integration/tags/increment_tag_test.rb
227
- - test/integration/tags/break_tag_test.rb
232
+ - test/integration/tags/raw_tag_test.rb
228
233
  - test/integration/tags/if_else_tag_test.rb
229
- - test/integration/tags/liquid_tag_test.rb
230
- - test/integration/tags/for_tag_test.rb
231
- - test/integration/tags/unless_else_tag_test.rb
232
234
  - test/integration/tags/include_tag_test.rb
233
- - test/integration/tags/echo_test.rb
234
235
  - test/integration/tags/statements_test.rb
236
+ - test/integration/tags/break_tag_test.rb
235
237
  - test/integration/tags/render_tag_test.rb
236
- - test/integration/tags/raw_tag_test.rb
237
238
  - test/integration/tags/continue_tag_test.rb
238
239
  - test/integration/tags/table_row_test.rb
240
+ - test/integration/tags/unless_else_tag_test.rb
241
+ - test/integration/tags/echo_test.rb
239
242
  - test/integration/tags/standard_tag_test.rb
240
- - test/integration/variable_test.rb
241
- - test/integration/template_test.rb
242
- - test/integration/block_test.rb
243
- - test/integration/profiler_test.rb
244
- - test/integration/drop_test.rb
245
- - test/integration/expression_test.rb
246
- - test/integration/filter_test.rb
243
+ - test/integration/tags/liquid_tag_test.rb
244
+ - test/integration/tags/for_tag_test.rb
245
+ - test/integration/standard_filter_test.rb
246
+ - test/integration/blank_test.rb
247
247
  - test/integration/document_test.rb
248
- - test/integration/trim_mode_test.rb
249
- - test/integration/output_test.rb
248
+ - test/integration/variable_test.rb
250
249
  - test/integration/hash_ordering_test.rb
251
- - test/integration/tag_test.rb
250
+ - test/integration/assign_test.rb
251
+ - test/integration/capture_test.rb