liquid 5.0.1 → 5.1.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/lib/liquid/condition.rb +3 -3
- data/lib/liquid/context.rb +1 -1
- data/lib/liquid/range_lookup.rb +8 -0
- data/lib/liquid/standardfilters.rb +30 -2
- data/lib/liquid/tags/case.rb +8 -1
- data/lib/liquid/tags/if.rb +5 -1
- data/lib/liquid/tags/unless.rb +10 -2
- data/lib/liquid/tokenizer.rb +2 -2
- data/lib/liquid/utils.rb +8 -0
- data/lib/liquid/variable_lookup.rb +3 -0
- data/lib/liquid/version.rb +1 -1
- data/test/integration/standard_filter_test.rb +42 -0
- data/test/integration/template_test.rb +14 -0
- data/test/integration/variable_test.rb +31 -0
- data/test/test_helper.rb +38 -0
- data/test/unit/parse_tree_visitor_test.rb +7 -0
- metadata +39 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d033978c659ebc86ff6ae3a36adaa1a90b8f69580e0cd033eb9c2c669ff6d66d
|
4
|
+
data.tar.gz: 5c440b450df6ac2c673b0a23091d97e497ccb8207a443b0b6011f2b1a9b6529b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/liquid/condition.rb
CHANGED
@@ -8,7 +8,7 @@ module Liquid
|
|
8
8
|
# c = Condition.new(1, '==', 1)
|
9
9
|
# c.evaluate #=> true
|
10
10
|
#
|
11
|
-
class Condition
|
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
|
|
data/lib/liquid/context.rb
CHANGED
data/lib/liquid/range_lookup.rb
CHANGED
@@ -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
|
'&' => '&',
|
10
12
|
'>' => '>',
|
@@ -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 =
|
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
|
|
data/lib/liquid/tags/case.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/liquid/tags/if.rb
CHANGED
@@ -50,7 +50,11 @@ module Liquid
|
|
50
50
|
|
51
51
|
def render_to_output_buffer(context, output)
|
52
52
|
@blocks.each do |block|
|
53
|
-
|
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
|
data/lib/liquid/tags/unless.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
data/lib/liquid/tokenizer.rb
CHANGED
@@ -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.
|
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?(:[]) &&
|
data/lib/liquid/version.rb
CHANGED
@@ -145,6 +145,40 @@ class StandardFiltersTest < Minitest::Test
|
|
145
145
|
assert_equal('<strong>Hulk</strong>', @filters.escape_once('<strong>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
|
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-
|
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.
|
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/
|
217
|
-
- test/
|
218
|
-
- test/
|
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/
|
222
|
-
- test/integration/
|
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/
|
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/
|
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/
|
241
|
-
- test/integration/
|
242
|
-
- test/integration/
|
243
|
-
- test/integration/
|
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/
|
249
|
-
- test/integration/output_test.rb
|
248
|
+
- test/integration/variable_test.rb
|
250
249
|
- test/integration/hash_ordering_test.rb
|
251
|
-
- test/integration/
|
250
|
+
- test/integration/assign_test.rb
|
251
|
+
- test/integration/capture_test.rb
|