liquid 5.1.0 → 5.2.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 +11 -0
- data/README.md +2 -2
- data/lib/liquid/block_body.rb +2 -2
- data/lib/liquid/expression.rb +11 -10
- data/lib/liquid/standardfilters.rb +55 -17
- data/lib/liquid/strainer_factory.rb +11 -10
- data/lib/liquid/strainer_template.rb +5 -0
- data/lib/liquid/version.rb +1 -1
- data/lib/liquid.rb +2 -2
- data/test/integration/filter_kwarg_test.rb +24 -0
- data/test/integration/standard_filter_test.rb +39 -20
- data/test/test_helper.rb +10 -10
- data/test/unit/strainer_factory_unit_test.rb +2 -1
- data/test/unit/strainer_template_unit_test.rb +1 -1
- metadata +46 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e15bedf89a61f8c69c63cb18007fea0639ba1da3e06126dbcc569bea596c300
|
4
|
+
data.tar.gz: 8bee4895c2d61314d9e1bede8bf9839c5fd1771031452ee9a07cac47dcfa460b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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](
|
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:
|
data/lib/liquid/block_body.rb
CHANGED
@@ -231,8 +231,8 @@ module Liquid
|
|
231
231
|
end
|
232
232
|
|
233
233
|
def create_variable(token, parse_context)
|
234
|
-
token
|
235
|
-
markup =
|
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)
|
data/lib/liquid/expression.rb
CHANGED
@@ -10,21 +10,23 @@ module Liquid
|
|
10
10
|
'empty' => ''
|
11
11
|
}.freeze
|
12
12
|
|
13
|
-
|
14
|
-
|
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\
|
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
|
217
|
-
|
218
|
-
|
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
|
-
|
223
|
-
|
224
|
-
|
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
|
-
|
241
|
-
|
242
|
-
|
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
|
-
|
281
|
-
|
282
|
-
|
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
|
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
|
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
|
-
|
490
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
17
|
+
GlobalCache = Class.new(StrainerTemplate)
|
18
18
|
|
19
|
-
|
20
|
-
@global_filters ||= []
|
21
|
-
end
|
19
|
+
private
|
22
20
|
|
23
21
|
def strainer_from_cache(filters)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
filters
|
28
|
-
|
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
|
|
data/lib/liquid/version.rb
CHANGED
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
|
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('
|
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('
|
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
|
-
|
552
|
-
|
553
|
-
assert_equal('
|
554
|
-
assert_template_result('
|
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
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
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
|
-
|
76
|
-
Liquid::StrainerFactory.
|
77
|
-
|
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
|
-
|
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
|
-
|
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.
|
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:
|
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/
|
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
|