liquid 5.1.0 → 5.2.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: d033978c659ebc86ff6ae3a36adaa1a90b8f69580e0cd033eb9c2c669ff6d66d
4
- data.tar.gz: 5c440b450df6ac2c673b0a23091d97e497ccb8207a443b0b6011f2b1a9b6529b
3
+ metadata.gz: 0e15bedf89a61f8c69c63cb18007fea0639ba1da3e06126dbcc569bea596c300
4
+ data.tar.gz: 8bee4895c2d61314d9e1bede8bf9839c5fd1771031452ee9a07cac47dcfa460b
5
5
  SHA512:
6
- metadata.gz: 114697a0375800b4f67d7c216f9c56f823bb4468203632d45bda92bc597e0677acd0c4151c60f92fc121c2cd1b8d0d1c18d2482f1265acb62dbf190f12773d5c
7
- data.tar.gz: 3c013aef59a531829e202b73c4ce33d63ad5f58d763b7f2c610a3ff96fdab13fe2fdcf7e9401b63e09bb136fb1518ad69300b41114ebc1f076565c7d2953de78
6
+ metadata.gz: da978fffe487c1256d718df59a34bdb86f5c8dc9dd66b85d8169dfef0ab5d0fbf3feffb932b1ea30bea71ef573ceee8d8c021b78ee12f2988f365c0d0fa39e87
7
+ data.tar.gz: 45360ea60c3059c64508caf7e14cf7fbac0dd6198c6fba7ac4a525653f8f508348223770174b2872f8e54cd5a80ab0bfa70d13ad62975cefe0dd93247e694480
data/History.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Liquid Change Log
2
2
 
3
+ ## 5.2.0 2021-03-01
4
+
5
+ ### Features
6
+ * Add `remove_last`, and `replace_last` filters (#1422) [Anders Hagbard]
7
+ * Eagerly cache global filters (#1524) [Jean Boussier]
8
+
9
+ ### Fixes
10
+ * Fix some internal errors in filters from invalid input (#1476) [Dylan Thacker-Smith]
11
+ * Allow dash in filter kwarg name for consistency with Liquid::C (#1518) [CP Clermont]
12
+
13
+
3
14
  ## 5.1.0 / 2021-09-09
4
15
 
5
16
  ### Features
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  * [Contributing guidelines](CONTRIBUTING.md)
7
7
  * [Version history](History.md)
8
- * [Liquid documentation from Shopify](http://docs.shopify.com/themes/liquid-basics)
8
+ * [Liquid documentation from Shopify](https://shopify.dev/api/liquid)
9
9
  * [Liquid Wiki at GitHub](https://github.com/Shopify/liquid/wiki)
10
10
  * [Website](http://liquidmarkup.org/)
11
11
 
@@ -56,7 +56,7 @@ For standard use you can just pass it the content of a file and call render with
56
56
 
57
57
  Setting the error mode of Liquid lets you specify how strictly you want your templates to be interpreted.
58
58
  Normally the parser is very lax and will accept almost anything without error. Unfortunately this can make
59
- it very hard to debug and can lead to unexpected behaviour.
59
+ it very hard to debug and can lead to unexpected behaviour.
60
60
 
61
61
  Liquid also comes with a stricter parser that can be used when editing templates to give better error messages
62
62
  when templates are invalid. You can enable this new parser like this:
@@ -231,8 +231,8 @@ module Liquid
231
231
  end
232
232
 
233
233
  def create_variable(token, parse_context)
234
- token.scan(ContentOfVariable) do |content|
235
- markup = content.first
234
+ if token =~ ContentOfVariable
235
+ markup = Regexp.last_match(1)
236
236
  return Variable.new(markup, parse_context)
237
237
  end
238
238
  BlockBody.raise_missing_variable_terminator(token, parse_context)
@@ -10,21 +10,23 @@ module Liquid
10
10
  'empty' => ''
11
11
  }.freeze
12
12
 
13
- SINGLE_QUOTED_STRING = /\A\s*'(.*)'\s*\z/m
14
- DOUBLE_QUOTED_STRING = /\A\s*"(.*)"\s*\z/m
15
- INTEGERS_REGEX = /\A\s*(-?\d+)\s*\z/
16
- FLOATS_REGEX = /\A\s*(-?\d[\d\.]+)\s*\z/
13
+ INTEGERS_REGEX = /\A(-?\d+)\z/
14
+ FLOATS_REGEX = /\A(-?\d[\d\.]+)\z/
17
15
 
18
16
  # Use an atomic group (?>...) to avoid pathological backtracing from
19
17
  # malicious input as described in https://github.com/Shopify/liquid/issues/1357
20
- RANGES_REGEX = /\A\s*\(\s*(?>(\S+)\s*\.\.)\s*(\S+)\s*\)\s*\z/
18
+ RANGES_REGEX = /\A\(\s*(?>(\S+)\s*\.\.)\s*(\S+)\s*\)\z/
21
19
 
22
20
  def self.parse(markup)
21
+ return nil unless markup
22
+
23
+ markup = markup.strip
24
+ if (markup.start_with?('"') && markup.end_with?('"')) ||
25
+ (markup.start_with?("'") && markup.end_with?("'"))
26
+ return markup[1..-2]
27
+ end
28
+
23
29
  case markup
24
- when nil
25
- nil
26
- when SINGLE_QUOTED_STRING, DOUBLE_QUOTED_STRING
27
- Regexp.last_match(1)
28
30
  when INTEGERS_REGEX
29
31
  Regexp.last_match(1).to_i
30
32
  when RANGES_REGEX
@@ -32,7 +34,6 @@ module Liquid
32
34
  when FLOATS_REGEX
33
35
  Regexp.last_match(1).to_f
34
36
  else
35
- markup = markup.strip
36
37
  if LITERALS.key?(markup)
37
38
  LITERALS[markup]
38
39
  else
@@ -213,17 +213,23 @@ module Liquid
213
213
 
214
214
  if ary.empty?
215
215
  []
216
- elsif ary.first.respond_to?(:[]) && target_value.nil?
217
- begin
218
- ary.select { |item| item[property] }
216
+ elsif target_value.nil?
217
+ ary.select do |item|
218
+ item[property]
219
219
  rescue TypeError
220
220
  raise_property_error(property)
221
+ rescue NoMethodError
222
+ return nil unless item.respond_to?(:[])
223
+ raise
221
224
  end
222
- elsif ary.first.respond_to?(:[])
223
- begin
224
- ary.select { |item| item[property] == target_value }
225
+ else
226
+ ary.select do |item|
227
+ item[property] == target_value
225
228
  rescue TypeError
226
229
  raise_property_error(property)
230
+ rescue NoMethodError
231
+ return nil unless item.respond_to?(:[])
232
+ raise
227
233
  end
228
234
  end
229
235
  end
@@ -237,11 +243,14 @@ module Liquid
237
243
  ary.uniq
238
244
  elsif ary.empty? # The next two cases assume a non-empty array.
239
245
  []
240
- elsif ary.first.respond_to?(:[])
241
- begin
242
- ary.uniq { |a| a[property] }
246
+ else
247
+ ary.uniq do |item|
248
+ item[property]
243
249
  rescue TypeError
244
250
  raise_property_error(property)
251
+ rescue NoMethodError
252
+ return nil unless item.respond_to?(:[])
253
+ raise
245
254
  end
246
255
  end
247
256
  end
@@ -277,11 +286,14 @@ module Liquid
277
286
  ary.compact
278
287
  elsif ary.empty? # The next two cases assume a non-empty array.
279
288
  []
280
- elsif ary.first.respond_to?(:[])
281
- begin
282
- ary.reject { |a| a[property].nil? }
289
+ else
290
+ ary.reject do |item|
291
+ item[property].nil?
283
292
  rescue TypeError
284
293
  raise_property_error(property)
294
+ rescue NoMethodError
295
+ return nil unless item.respond_to?(:[])
296
+ raise
285
297
  end
286
298
  end
287
299
  end
@@ -296,14 +308,34 @@ module Liquid
296
308
  input.to_s.sub(string.to_s, replacement.to_s)
297
309
  end
298
310
 
311
+ # Replace the last occurrences of a string with another
312
+ def replace_last(input, string, replacement)
313
+ input = input.to_s
314
+ string = string.to_s
315
+ replacement = replacement.to_s
316
+
317
+ start_index = input.rindex(string)
318
+
319
+ return input unless start_index
320
+
321
+ output = input.dup
322
+ output[start_index, string.length] = replacement
323
+ output
324
+ end
325
+
299
326
  # remove a substring
300
327
  def remove(input, string)
301
- input.to_s.gsub(string.to_s, '')
328
+ replace(input, string, '')
302
329
  end
303
330
 
304
331
  # remove the first occurrences of a substring
305
332
  def remove_first(input, string)
306
- input.to_s.sub(string.to_s, '')
333
+ replace_first(input, string, '')
334
+ end
335
+
336
+ # remove the last occurences of a substring
337
+ def remove_last(input, string)
338
+ replace_last(input, string, '')
307
339
  end
308
340
 
309
341
  # add one string to another
@@ -486,10 +518,16 @@ module Liquid
486
518
  end
487
519
 
488
520
  def nil_safe_compare(a, b)
489
- if !a.nil? && !b.nil?
490
- a <=> b
521
+ result = a <=> b
522
+
523
+ if result
524
+ result
525
+ elsif a.nil?
526
+ 1
527
+ elsif b.nil?
528
+ -1
491
529
  else
492
- a.nil? ? 1 : -1
530
+ raise Liquid::ArgumentError, "cannot sort values of incompatible types"
493
531
  end
494
532
  end
495
533
 
@@ -7,25 +7,26 @@ module Liquid
7
7
 
8
8
  def add_global_filter(filter)
9
9
  strainer_class_cache.clear
10
- global_filters << filter
10
+ GlobalCache.add_filter(filter)
11
11
  end
12
12
 
13
13
  def create(context, filters = [])
14
14
  strainer_from_cache(filters).new(context)
15
15
  end
16
16
 
17
- private
17
+ GlobalCache = Class.new(StrainerTemplate)
18
18
 
19
- def global_filters
20
- @global_filters ||= []
21
- end
19
+ private
22
20
 
23
21
  def strainer_from_cache(filters)
24
- strainer_class_cache[filters] ||= begin
25
- klass = Class.new(StrainerTemplate)
26
- global_filters.each { |f| klass.add_filter(f) }
27
- filters.each { |f| klass.add_filter(f) }
28
- klass
22
+ if filters.empty?
23
+ GlobalCache
24
+ else
25
+ strainer_class_cache[filters] ||= begin
26
+ klass = Class.new(GlobalCache)
27
+ filters.each { |f| klass.add_filter(f) }
28
+ klass
29
+ end
29
30
  end
30
31
  end
31
32
 
@@ -31,6 +31,11 @@ module Liquid
31
31
  filter_methods.include?(method.to_s)
32
32
  end
33
33
 
34
+ def inherited(subclass)
35
+ super
36
+ subclass.instance_variable_set(:@filter_methods, @filter_methods.dup)
37
+ end
38
+
34
39
  private
35
40
 
36
41
  def filter_methods
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Liquid
5
- VERSION = "5.1.0"
5
+ VERSION = "5.2.0"
6
6
  end
data/lib/liquid.rb CHANGED
@@ -36,7 +36,7 @@ module Liquid
36
36
  VariableIncompleteEnd = /\}\}?/
37
37
  QuotedString = /"[^"]*"|'[^']*'/
38
38
  QuotedFragment = /#{QuotedString}|(?:[^\s,\|'"]|#{QuotedString})+/o
39
- TagAttributes = /(\w+)\s*\:\s*(#{QuotedFragment})/o
39
+ TagAttributes = /(\w[\w-]*)\s*\:\s*(#{QuotedFragment})/o
40
40
  AnyStartingTag = /#{TagStart}|#{VariableStart}/o
41
41
  PartialTemplateParser = /#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableIncompleteEnd}/om
42
42
  TemplateParser = /(#{PartialTemplateParser}|#{AnyStartingTag})/om
@@ -59,8 +59,8 @@ require 'liquid/forloop_drop'
59
59
  require 'liquid/extensions'
60
60
  require 'liquid/errors'
61
61
  require 'liquid/interrupts'
62
- require 'liquid/strainer_factory'
63
62
  require 'liquid/strainer_template'
63
+ require 'liquid/strainer_factory'
64
64
  require 'liquid/expression'
65
65
  require 'liquid/context'
66
66
  require 'liquid/parser_switching'
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class FilterKwargTest < Minitest::Test
6
+ module KwargFilter
7
+ def html_tag(_tag, attributes)
8
+ attributes
9
+ .map { |key, value| "#{key}='#{value}'" }
10
+ .join(' ')
11
+ end
12
+ end
13
+
14
+ include Liquid
15
+
16
+ def test_can_parse_data_kwargs
17
+ with_global_filter(KwargFilter) do
18
+ assert_equal(
19
+ "data-src='src' data-widths='100, 200'",
20
+ Template.parse("{{ 'img' | html_tag: data-src: 'src', data-widths: '100, 200' }}").render(nil, nil)
21
+ )
22
+ end
23
+ end
24
+ end
@@ -259,8 +259,8 @@ class StandardFiltersTest < Minitest::Test
259
259
  { "price" => 1, "handle" => "gamma" },
260
260
  { "price" => 2, "handle" => "epsilon" },
261
261
  { "price" => 4, "handle" => "alpha" },
262
- { "handle" => "delta" },
263
262
  { "handle" => "beta" },
263
+ { "handle" => "delta" },
264
264
  ]
265
265
  assert_equal(expectation, @filters.sort(input, "price"))
266
266
  end
@@ -539,19 +539,31 @@ class StandardFiltersTest < Minitest::Test
539
539
  end
540
540
 
541
541
  def test_replace
542
- assert_equal('2 2 2 2', @filters.replace('1 1 1 1', '1', 2))
542
+ assert_equal('b b b b', @filters.replace('a a a a', 'a', 'b'))
543
543
  assert_equal('2 2 2 2', @filters.replace('1 1 1 1', 1, 2))
544
- assert_equal('2 1 1 1', @filters.replace_first('1 1 1 1', '1', 2))
544
+ assert_equal('1 1 1 1', @filters.replace('1 1 1 1', 2, 3))
545
+ assert_template_result('2 2 2 2', "{{ '1 1 1 1' | replace: '1', 2 }}")
546
+
547
+ assert_equal('b a a a', @filters.replace_first('a a a a', 'a', 'b'))
545
548
  assert_equal('2 1 1 1', @filters.replace_first('1 1 1 1', 1, 2))
549
+ assert_equal('1 1 1 1', @filters.replace_first('1 1 1 1', 2, 3))
546
550
  assert_template_result('2 1 1 1', "{{ '1 1 1 1' | replace_first: '1', 2 }}")
551
+
552
+ assert_equal('a a a b', @filters.replace_last('a a a a', 'a', 'b'))
553
+ assert_equal('1 1 1 2', @filters.replace_last('1 1 1 1', 1, 2))
554
+ assert_equal('1 1 1 1', @filters.replace_last('1 1 1 1', 2, 3))
555
+ assert_template_result('1 1 1 2', "{{ '1 1 1 1' | replace_last: '1', 2 }}")
547
556
  end
548
557
 
549
558
  def test_remove
550
559
  assert_equal(' ', @filters.remove("a a a a", 'a'))
551
- assert_equal(' ', @filters.remove("1 1 1 1", 1))
552
- assert_equal('a a a', @filters.remove_first("a a a a", 'a '))
553
- assert_equal(' 1 1 1', @filters.remove_first("1 1 1 1", 1))
554
- assert_template_result('a a a', "{{ 'a a a a' | remove_first: 'a ' }}")
560
+ assert_template_result(' ', "{{ '1 1 1 1' | remove: 1 }}")
561
+
562
+ assert_equal('b a a', @filters.remove_first("a b a a", 'a '))
563
+ assert_template_result(' 1 1 1', "{{ '1 1 1 1' | remove_first: 1 }}")
564
+
565
+ assert_equal('a a b', @filters.remove_last("a a b a", ' a'))
566
+ assert_template_result('1 1 1 ', "{{ '1 1 1 1' | remove_last: 1 }}")
555
567
  end
556
568
 
557
569
  def test_pipes_in_string_arguments
@@ -770,6 +782,18 @@ class StandardFiltersTest < Minitest::Test
770
782
  assert_equal(expectation, @filters.where(input, "ok"))
771
783
  end
772
784
 
785
+ def test_where_string_keys
786
+ input = [
787
+ "alpha", "beta", "gamma", "delta"
788
+ ]
789
+
790
+ expectation = [
791
+ "beta",
792
+ ]
793
+
794
+ assert_equal(expectation, @filters.where(input, "be"))
795
+ end
796
+
773
797
  def test_where_no_key_set
774
798
  input = [
775
799
  { "handle" => "alpha", "ok" => true },
@@ -840,19 +864,14 @@ class StandardFiltersTest < Minitest::Test
840
864
  { 1 => "bar" },
841
865
  ["foo", 123, nil, true, false, Drop, ["foo"], { foo: "bar" }],
842
866
  ]
843
- test_types.each do |first|
844
- test_types.each do |other|
845
- (@filters.methods - Object.methods).each do |method|
846
- arg_count = @filters.method(method).arity
847
- arg_count *= -1 if arg_count < 0
848
- inputs = [first]
849
- inputs << ([other] * (arg_count - 1)) if arg_count > 1
850
- begin
851
- @filters.send(method, *inputs)
852
- rescue Liquid::ArgumentError, Liquid::ZeroDivisionError
853
- nil
854
- end
855
- end
867
+ StandardFilters.public_instance_methods(false).each do |method|
868
+ arg_count = @filters.method(method).arity
869
+ arg_count *= -1 if arg_count < 0
870
+
871
+ test_types.repeated_permutation(arg_count) do |args|
872
+ @filters.send(method, *args)
873
+ rescue Liquid::Error
874
+ nil
856
875
  end
857
876
  end
858
877
  end
data/test/test_helper.rb CHANGED
@@ -72,21 +72,21 @@ module Minitest
72
72
  end
73
73
 
74
74
  def with_global_filter(*globals)
75
- original_global_filters = Liquid::StrainerFactory.instance_variable_get(:@global_filters)
76
- Liquid::StrainerFactory.instance_variable_set(:@global_filters, [])
77
- globals.each do |global|
78
- Liquid::StrainerFactory.add_global_filter(global)
79
- end
80
-
81
- Liquid::StrainerFactory.send(:strainer_class_cache).clear
75
+ original_global_cache = Liquid::StrainerFactory::GlobalCache
76
+ Liquid::StrainerFactory.send(:remove_const, :GlobalCache)
77
+ Liquid::StrainerFactory.const_set(:GlobalCache, Class.new(Liquid::StrainerTemplate))
82
78
 
83
79
  globals.each do |global|
84
80
  Liquid::Template.register_filter(global)
85
81
  end
86
- yield
87
- ensure
88
82
  Liquid::StrainerFactory.send(:strainer_class_cache).clear
89
- Liquid::StrainerFactory.instance_variable_set(:@global_filters, original_global_filters)
83
+ begin
84
+ yield
85
+ ensure
86
+ Liquid::StrainerFactory.send(:remove_const, :GlobalCache)
87
+ Liquid::StrainerFactory.const_set(:GlobalCache, original_global_cache)
88
+ Liquid::StrainerFactory.send(:strainer_class_cache).clear
89
+ end
90
90
  end
91
91
 
92
92
  def with_error_mode(mode)
@@ -52,7 +52,8 @@ class StrainerFactoryUnitTest < Minitest::Test
52
52
  /\ALiquid error: wrong number of arguments \((1 for 0|given 1, expected 0)\)\z/,
53
53
  exception.message
54
54
  )
55
- assert_equal(exception.backtrace[0].split(':')[0], __FILE__)
55
+ source = AccessScopeFilters.instance_method(:public_filter).source_location
56
+ assert_equal(source.map(&:to_s), exception.backtrace[0].split(':')[0..1])
56
57
  end
57
58
 
58
59
  def test_strainer_only_invokes_public_filter_methods
@@ -57,8 +57,8 @@ class StrainerTemplateUnitTest < Minitest::Test
57
57
  end
58
58
 
59
59
  def test_add_filter_does_not_raise_when_module_overrides_previously_registered_method
60
- strainer = Context.new.strainer
61
60
  with_global_filter do
61
+ strainer = Context.new.strainer
62
62
  strainer.class.add_filter(PublicMethodOverrideFilter)
63
63
  assert(strainer.class.send(:filter_methods).include?('public_filter'))
64
64
  end
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.1.0
4
+ version: 5.2.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-09-15 00:00:00.000000000 Z
11
+ date: 2022-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -120,6 +120,7 @@ files:
120
120
  - test/integration/drop_test.rb
121
121
  - test/integration/error_handling_test.rb
122
122
  - test/integration/expression_test.rb
123
+ - test/integration/filter_kwarg_test.rb
123
124
  - test/integration/filter_test.rb
124
125
  - test/integration/hash_ordering_test.rb
125
126
  - test/integration/output_test.rb
@@ -192,60 +193,61 @@ signing_key:
192
193
  specification_version: 4
193
194
  summary: A secure, non-evaling end user template engine with aesthetic markup.
194
195
  test_files:
195
- - test/test_helper.rb
196
- - test/fixtures/en_locale.yml
197
- - test/unit/strainer_factory_unit_test.rb
198
- - test/unit/regexp_unit_test.rb
199
- - test/unit/static_registers_unit_test.rb
200
- - test/unit/template_unit_test.rb
201
- - test/unit/partial_cache_unit_test.rb
202
- - test/unit/block_unit_test.rb
203
- - test/unit/parse_tree_visitor_test.rb
204
- - test/unit/parser_unit_test.rb
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
210
- - test/unit/tokenizer_unit_test.rb
211
- - test/unit/template_factory_unit_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
224
- - test/integration/parsing_quirks_test.rb
225
196
  - test/integration/tag/disableable_test.rb
197
+ - test/integration/parsing_quirks_test.rb
198
+ - test/integration/context_test.rb
199
+ - test/integration/filter_kwarg_test.rb
200
+ - test/integration/capture_test.rb
226
201
  - test/integration/trim_mode_test.rb
227
- - test/integration/expression_test.rb
228
202
  - test/integration/output_test.rb
229
- - test/integration/security_test.rb
230
- - test/integration/drop_test.rb
231
- - test/integration/tags/increment_tag_test.rb
232
203
  - test/integration/tags/raw_tag_test.rb
204
+ - test/integration/tags/continue_tag_test.rb
205
+ - test/integration/tags/increment_tag_test.rb
233
206
  - test/integration/tags/if_else_tag_test.rb
207
+ - test/integration/tags/table_row_test.rb
234
208
  - test/integration/tags/include_tag_test.rb
235
- - test/integration/tags/statements_test.rb
236
209
  - test/integration/tags/break_tag_test.rb
237
- - test/integration/tags/render_tag_test.rb
238
- - test/integration/tags/continue_tag_test.rb
239
- - test/integration/tags/table_row_test.rb
240
210
  - test/integration/tags/unless_else_tag_test.rb
241
- - test/integration/tags/echo_test.rb
242
211
  - test/integration/tags/standard_tag_test.rb
243
- - test/integration/tags/liquid_tag_test.rb
244
212
  - test/integration/tags/for_tag_test.rb
213
+ - test/integration/tags/statements_test.rb
214
+ - test/integration/tags/liquid_tag_test.rb
215
+ - test/integration/tags/render_tag_test.rb
216
+ - test/integration/tags/echo_test.rb
217
+ - test/integration/drop_test.rb
218
+ - test/integration/error_handling_test.rb
219
+ - test/integration/template_test.rb
220
+ - test/integration/expression_test.rb
245
221
  - test/integration/standard_filter_test.rb
222
+ - test/integration/tag_test.rb
223
+ - test/integration/hash_ordering_test.rb
224
+ - test/integration/security_test.rb
246
225
  - test/integration/blank_test.rb
226
+ - test/integration/filter_test.rb
247
227
  - test/integration/document_test.rb
228
+ - test/integration/block_test.rb
229
+ - test/integration/profiler_test.rb
248
230
  - test/integration/variable_test.rb
249
- - test/integration/hash_ordering_test.rb
250
231
  - test/integration/assign_test.rb
251
- - test/integration/capture_test.rb
232
+ - test/unit/template_unit_test.rb
233
+ - test/unit/tag_unit_test.rb
234
+ - test/unit/condition_unit_test.rb
235
+ - test/unit/strainer_template_unit_test.rb
236
+ - test/unit/lexer_unit_test.rb
237
+ - test/unit/partial_cache_unit_test.rb
238
+ - test/unit/template_factory_unit_test.rb
239
+ - test/unit/tags/if_tag_unit_test.rb
240
+ - test/unit/tags/case_tag_unit_test.rb
241
+ - test/unit/tags/for_tag_unit_test.rb
242
+ - test/unit/static_registers_unit_test.rb
243
+ - test/unit/regexp_unit_test.rb
244
+ - test/unit/i18n_unit_test.rb
245
+ - test/unit/parse_tree_visitor_test.rb
246
+ - test/unit/variable_unit_test.rb
247
+ - test/unit/tokenizer_unit_test.rb
248
+ - test/unit/file_system_unit_test.rb
249
+ - test/unit/block_unit_test.rb
250
+ - test/unit/strainer_factory_unit_test.rb
251
+ - test/unit/parser_unit_test.rb
252
+ - test/test_helper.rb
253
+ - test/fixtures/en_locale.yml