liquid 2.6.3 → 3.0.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 +46 -13
- data/README.md +27 -2
- data/lib/liquid/block.rb +85 -51
- data/lib/liquid/block_body.rb +123 -0
- data/lib/liquid/condition.rb +26 -15
- data/lib/liquid/context.rb +106 -140
- data/lib/liquid/document.rb +3 -3
- data/lib/liquid/drop.rb +17 -1
- data/lib/liquid/errors.rb +50 -2
- data/lib/liquid/expression.rb +33 -0
- data/lib/liquid/file_system.rb +17 -6
- data/lib/liquid/i18n.rb +39 -0
- data/lib/liquid/interrupts.rb +1 -1
- data/lib/liquid/lexer.rb +51 -0
- data/lib/liquid/locales/en.yml +22 -0
- data/lib/liquid/parser.rb +90 -0
- data/lib/liquid/parser_switching.rb +31 -0
- data/lib/liquid/profiler/hooks.rb +23 -0
- data/lib/liquid/profiler.rb +159 -0
- data/lib/liquid/range_lookup.rb +22 -0
- data/lib/liquid/standardfilters.rb +143 -55
- data/lib/liquid/strainer.rb +14 -4
- data/lib/liquid/tag.rb +25 -9
- data/lib/liquid/tags/assign.rb +12 -9
- data/lib/liquid/tags/break.rb +1 -1
- data/lib/liquid/tags/capture.rb +10 -8
- data/lib/liquid/tags/case.rb +13 -13
- data/lib/liquid/tags/comment.rb +9 -2
- data/lib/liquid/tags/continue.rb +1 -4
- data/lib/liquid/tags/cycle.rb +5 -7
- data/lib/liquid/tags/decrement.rb +3 -4
- data/lib/liquid/tags/for.rb +69 -36
- data/lib/liquid/tags/if.rb +52 -25
- data/lib/liquid/tags/ifchanged.rb +3 -3
- data/lib/liquid/tags/include.rb +19 -8
- data/lib/liquid/tags/increment.rb +4 -8
- data/lib/liquid/tags/raw.rb +4 -7
- data/lib/liquid/tags/table_row.rb +73 -0
- data/lib/liquid/tags/unless.rb +2 -4
- data/lib/liquid/template.rb +124 -14
- data/lib/liquid/token.rb +18 -0
- data/lib/liquid/utils.rb +13 -4
- data/lib/liquid/variable.rb +103 -25
- data/lib/liquid/variable_lookup.rb +78 -0
- data/lib/liquid/version.rb +1 -1
- data/lib/liquid.rb +19 -11
- data/test/fixtures/en_locale.yml +9 -0
- data/test/{liquid → integration}/assign_test.rb +18 -1
- data/test/integration/blank_test.rb +106 -0
- data/test/{liquid → integration}/capture_test.rb +3 -3
- data/test/integration/context_test.rb +32 -0
- data/test/integration/drop_test.rb +271 -0
- data/test/integration/error_handling_test.rb +207 -0
- data/test/{liquid → integration}/filter_test.rb +11 -11
- data/test/integration/hash_ordering_test.rb +23 -0
- data/test/{liquid → integration}/output_test.rb +13 -13
- data/test/integration/parsing_quirks_test.rb +116 -0
- data/test/integration/render_profiling_test.rb +154 -0
- data/test/{liquid → integration}/security_test.rb +10 -10
- data/test/{liquid → integration}/standard_filter_test.rb +148 -32
- data/test/{liquid → integration}/tags/break_tag_test.rb +1 -1
- data/test/{liquid → integration}/tags/continue_tag_test.rb +1 -1
- data/test/{liquid → integration}/tags/for_tag_test.rb +80 -2
- data/test/{liquid → integration}/tags/if_else_tag_test.rb +24 -21
- data/test/integration/tags/include_tag_test.rb +234 -0
- data/test/{liquid → integration}/tags/increment_tag_test.rb +1 -1
- data/test/{liquid → integration}/tags/raw_tag_test.rb +2 -1
- data/test/{liquid → integration}/tags/standard_tag_test.rb +28 -26
- data/test/integration/tags/statements_test.rb +113 -0
- data/test/{liquid/tags/html_tag_test.rb → integration/tags/table_row_test.rb} +5 -5
- data/test/{liquid → integration}/tags/unless_else_tag_test.rb +1 -1
- data/test/{liquid → integration}/template_test.rb +81 -45
- data/test/integration/variable_test.rb +82 -0
- data/test/test_helper.rb +73 -20
- data/test/{liquid/block_test.rb → unit/block_unit_test.rb} +2 -5
- data/test/{liquid/condition_test.rb → unit/condition_unit_test.rb} +23 -1
- data/test/{liquid/context_test.rb → unit/context_unit_test.rb} +39 -25
- data/test/{liquid/file_system_test.rb → unit/file_system_unit_test.rb} +11 -5
- data/test/unit/i18n_unit_test.rb +37 -0
- data/test/unit/lexer_unit_test.rb +48 -0
- data/test/{liquid/module_ex_test.rb → unit/module_ex_unit_test.rb} +7 -7
- data/test/unit/parser_unit_test.rb +82 -0
- data/test/{liquid/regexp_test.rb → unit/regexp_unit_test.rb} +3 -3
- data/test/{liquid/strainer_test.rb → unit/strainer_unit_test.rb} +20 -1
- data/test/unit/tag_unit_test.rb +16 -0
- data/test/unit/tags/case_tag_unit_test.rb +10 -0
- data/test/unit/tags/for_tag_unit_test.rb +13 -0
- data/test/unit/tags/if_tag_unit_test.rb +8 -0
- data/test/unit/template_unit_test.rb +69 -0
- data/test/unit/tokenizer_unit_test.rb +38 -0
- data/test/unit/variable_unit_test.rb +139 -0
- metadata +135 -67
- data/lib/extras/liquid_view.rb +0 -51
- data/lib/liquid/htmltags.rb +0 -73
- data/test/liquid/drop_test.rb +0 -180
- data/test/liquid/error_handling_test.rb +0 -81
- data/test/liquid/hash_ordering_test.rb +0 -25
- data/test/liquid/parsing_quirks_test.rb +0 -52
- data/test/liquid/tags/include_tag_test.rb +0 -166
- data/test/liquid/tags/statements_test.rb +0 -134
- data/test/liquid/variable_test.rb +0 -186
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class LexerUnitTest < Minitest::Test
|
4
|
+
include Liquid
|
5
|
+
|
6
|
+
def test_strings
|
7
|
+
tokens = Lexer.new(%! 'this is a test""' "wat 'lol'"!).tokenize
|
8
|
+
assert_equal [[:string,%!'this is a test""'!], [:string, %!"wat 'lol'"!], [:end_of_string]], tokens
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_integer
|
12
|
+
tokens = Lexer.new('hi 50').tokenize
|
13
|
+
assert_equal [[:id,'hi'], [:number, '50'], [:end_of_string]], tokens
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_float
|
17
|
+
tokens = Lexer.new('hi 5.0').tokenize
|
18
|
+
assert_equal [[:id,'hi'], [:number, '5.0'], [:end_of_string]], tokens
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_comparison
|
22
|
+
tokens = Lexer.new('== <> contains').tokenize
|
23
|
+
assert_equal [[:comparison,'=='], [:comparison, '<>'], [:comparison, 'contains'], [:end_of_string]], tokens
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_specials
|
27
|
+
tokens = Lexer.new('| .:').tokenize
|
28
|
+
assert_equal [[:pipe, '|'], [:dot, '.'], [:colon, ':'], [:end_of_string]], tokens
|
29
|
+
tokens = Lexer.new('[,]').tokenize
|
30
|
+
assert_equal [[:open_square, '['], [:comma, ','], [:close_square, ']'], [:end_of_string]], tokens
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_fancy_identifiers
|
34
|
+
tokens = Lexer.new('hi! five?').tokenize
|
35
|
+
assert_equal [[:id,'hi!'], [:id, 'five?'], [:end_of_string]], tokens
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_whitespace
|
39
|
+
tokens = Lexer.new("five|\n\t ==").tokenize
|
40
|
+
assert_equal [[:id,'five'], [:pipe, '|'], [:comparison, '=='], [:end_of_string]], tokens
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_unexpected_character
|
44
|
+
assert_raises(SyntaxError) do
|
45
|
+
Lexer.new("%").tokenize
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -36,7 +36,7 @@ class TestClassC::LiquidDropClass
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
class
|
39
|
+
class ModuleExUnitTest < Minitest::Test
|
40
40
|
include Liquid
|
41
41
|
|
42
42
|
def setup
|
@@ -77,11 +77,11 @@ class ModuleExTest < Test::Unit::TestCase
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def test_should_use_regular_objects_as_drops
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
80
|
+
assert_template_result 'allowedA', "{{ a.allowedA }}", 'a'=>@a
|
81
|
+
assert_template_result 'allowedB', "{{ a.chainedB.allowedB }}", 'a'=>@a
|
82
|
+
assert_template_result 'allowedC', "{{ a.chainedB.chainedC.allowedC }}", 'a'=>@a
|
83
|
+
assert_template_result 'another_allowedC', "{{ a.chainedB.chainedC.another_allowedC }}", 'a'=>@a
|
84
|
+
assert_template_result '', "{{ a.restricted }}", 'a'=>@a
|
85
|
+
assert_template_result '', "{{ a.unknown }}", 'a'=>@a
|
86
86
|
end
|
87
87
|
end # ModuleExTest
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ParserUnitTest < Minitest::Test
|
4
|
+
include Liquid
|
5
|
+
|
6
|
+
def test_consume
|
7
|
+
p = Parser.new("wat: 7")
|
8
|
+
assert_equal 'wat', p.consume(:id)
|
9
|
+
assert_equal ':', p.consume(:colon)
|
10
|
+
assert_equal '7', p.consume(:number)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_jump
|
14
|
+
p = Parser.new("wat: 7")
|
15
|
+
p.jump(2)
|
16
|
+
assert_equal '7', p.consume(:number)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_consume?
|
20
|
+
p = Parser.new("wat: 7")
|
21
|
+
assert_equal 'wat', p.consume?(:id)
|
22
|
+
assert_equal false, p.consume?(:dot)
|
23
|
+
assert_equal ':', p.consume(:colon)
|
24
|
+
assert_equal '7', p.consume?(:number)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_id?
|
28
|
+
p = Parser.new("wat 6 Peter Hegemon")
|
29
|
+
assert_equal 'wat', p.id?('wat')
|
30
|
+
assert_equal false, p.id?('endgame')
|
31
|
+
assert_equal '6', p.consume(:number)
|
32
|
+
assert_equal 'Peter', p.id?('Peter')
|
33
|
+
assert_equal false, p.id?('Achilles')
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_look
|
37
|
+
p = Parser.new("wat 6 Peter Hegemon")
|
38
|
+
assert_equal true, p.look(:id)
|
39
|
+
assert_equal 'wat', p.consume(:id)
|
40
|
+
assert_equal false, p.look(:comparison)
|
41
|
+
assert_equal true, p.look(:number)
|
42
|
+
assert_equal true, p.look(:id, 1)
|
43
|
+
assert_equal false, p.look(:number, 1)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_expressions
|
47
|
+
p = Parser.new("hi.there hi[5].! hi.there.bob")
|
48
|
+
assert_equal 'hi.there', p.expression
|
49
|
+
assert_equal 'hi[5].!', p.expression
|
50
|
+
assert_equal 'hi.there.bob', p.expression
|
51
|
+
|
52
|
+
p = Parser.new("567 6.0 'lol' \"wut\"")
|
53
|
+
assert_equal '567', p.expression
|
54
|
+
assert_equal '6.0', p.expression
|
55
|
+
assert_equal "'lol'", p.expression
|
56
|
+
assert_equal '"wut"', p.expression
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_ranges
|
60
|
+
p = Parser.new("(5..7) (1.5..9.6) (young..old) (hi[5].wat..old)")
|
61
|
+
assert_equal '(5..7)', p.expression
|
62
|
+
assert_equal '(1.5..9.6)', p.expression
|
63
|
+
assert_equal '(young..old)', p.expression
|
64
|
+
assert_equal '(hi[5].wat..old)', p.expression
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_arguments
|
68
|
+
p = Parser.new("filter: hi.there[5], keyarg: 7")
|
69
|
+
assert_equal 'filter', p.consume(:id)
|
70
|
+
assert_equal ':', p.consume(:colon)
|
71
|
+
assert_equal 'hi.there[5]', p.argument
|
72
|
+
assert_equal ',', p.consume(:comma)
|
73
|
+
assert_equal 'keyarg: 7', p.argument
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_invalid_expression
|
77
|
+
assert_raises(SyntaxError) do
|
78
|
+
p = Parser.new("==")
|
79
|
+
p.expression
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class RegexpUnitTest < Minitest::Test
|
4
4
|
include Liquid
|
5
5
|
|
6
6
|
def test_empty
|
@@ -21,11 +21,11 @@ class RegexpTest < Test::Unit::TestCase
|
|
21
21
|
assert_equal ['<style', 'class="hello">', '</style>'], %|<style class="hello">' </style>|.scan(QuotedFragment)
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
24
|
+
def test_double_quoted_words
|
25
25
|
assert_equal ['arg1', 'arg2', '"arg 3"'], 'arg1 arg2 "arg 3"'.scan(QuotedFragment)
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
28
|
+
def test_single_quoted_words
|
29
29
|
assert_equal ['arg1', 'arg2', "'arg 3'"], 'arg1 arg2 \'arg 3\''.scan(QuotedFragment)
|
30
30
|
end
|
31
31
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class StrainerUnitTest < Minitest::Test
|
4
4
|
include Liquid
|
5
5
|
|
6
6
|
module AccessScopeFilters
|
@@ -22,6 +22,13 @@ class StrainerTest < Test::Unit::TestCase
|
|
22
22
|
assert_equal "public", strainer.invoke("public_filter")
|
23
23
|
end
|
24
24
|
|
25
|
+
def test_stainer_raises_argument_error
|
26
|
+
strainer = Strainer.create(nil)
|
27
|
+
assert_raises(Liquid::ArgumentError) do
|
28
|
+
strainer.invoke("public_filter", 1)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
25
32
|
def test_strainer_only_invokes_public_filter_methods
|
26
33
|
strainer = Strainer.create(nil)
|
27
34
|
assert_equal false, strainer.invokable?('__test__')
|
@@ -49,4 +56,16 @@ class StrainerTest < Test::Unit::TestCase
|
|
49
56
|
assert_equal "has_method?", strainer.invoke("invoke", "has_method?", "invoke")
|
50
57
|
end
|
51
58
|
|
59
|
+
def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation
|
60
|
+
a = Module.new
|
61
|
+
b = Module.new
|
62
|
+
strainer = Strainer.create(nil, [a,b])
|
63
|
+
assert_kind_of Strainer, strainer
|
64
|
+
assert_kind_of a, strainer
|
65
|
+
assert_kind_of b, strainer
|
66
|
+
Strainer.class_variable_get(:@@filters).each do |m|
|
67
|
+
assert_kind_of m, strainer
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
52
71
|
end # StrainerTest
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TagUnitTest < Minitest::Test
|
4
|
+
include Liquid
|
5
|
+
|
6
|
+
def test_tag
|
7
|
+
tag = Tag.parse('tag', [], [], {})
|
8
|
+
assert_equal 'liquid::tag', tag.name
|
9
|
+
assert_equal '', tag.render(Context.new)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_return_raw_text_of_tag
|
13
|
+
tag = Tag.parse("long_tag", "param1, param2, param3", [], {})
|
14
|
+
assert_equal("long_tag param1, param2, param3", tag.raw)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CaseTagUnitTest < Minitest::Test
|
4
|
+
include Liquid
|
5
|
+
|
6
|
+
def test_case_nodelist
|
7
|
+
template = Liquid::Template.parse('{% case var %}{% when true %}WHEN{% else %}ELSE{% endcase %}')
|
8
|
+
assert_equal ['WHEN', 'ELSE'], template.root.nodelist[0].nodelist
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ForTagUnitTest < Minitest::Test
|
4
|
+
def test_for_nodelist
|
5
|
+
template = Liquid::Template.parse('{% for item in items %}FOR{% endfor %}')
|
6
|
+
assert_equal ['FOR'], template.root.nodelist[0].nodelist
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_for_else_nodelist
|
10
|
+
template = Liquid::Template.parse('{% for item in items %}FOR{% else %}ELSE{% endfor %}')
|
11
|
+
assert_equal ['FOR', 'ELSE'], template.root.nodelist[0].nodelist
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TemplateUnitTest < Minitest::Test
|
4
|
+
include Liquid
|
5
|
+
|
6
|
+
def test_sets_default_localization_in_document
|
7
|
+
t = Template.new
|
8
|
+
t.parse('')
|
9
|
+
assert_instance_of I18n, t.root.options[:locale]
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_sets_default_localization_in_context_with_quick_initialization
|
13
|
+
t = Template.new
|
14
|
+
t.parse('{{foo}}', :locale => I18n.new(fixture("en_locale.yml")))
|
15
|
+
|
16
|
+
assert_instance_of I18n, t.root.options[:locale]
|
17
|
+
assert_equal fixture("en_locale.yml"), t.root.options[:locale].path
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_with_cache_classes_tags_returns_the_same_class
|
21
|
+
original_cache_setting = Liquid.cache_classes
|
22
|
+
Liquid.cache_classes = true
|
23
|
+
|
24
|
+
original_klass = Class.new
|
25
|
+
Object.send(:const_set, :CustomTag, original_klass)
|
26
|
+
Template.register_tag('custom', CustomTag)
|
27
|
+
|
28
|
+
Object.send(:remove_const, :CustomTag)
|
29
|
+
|
30
|
+
new_klass = Class.new
|
31
|
+
Object.send(:const_set, :CustomTag, new_klass)
|
32
|
+
|
33
|
+
assert Template.tags['custom'].equal?(original_klass)
|
34
|
+
ensure
|
35
|
+
Object.send(:remove_const, :CustomTag)
|
36
|
+
Template.tags.delete('custom')
|
37
|
+
Liquid.cache_classes = original_cache_setting
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_without_cache_classes_tags_reloads_the_class
|
41
|
+
original_cache_setting = Liquid.cache_classes
|
42
|
+
Liquid.cache_classes = false
|
43
|
+
|
44
|
+
original_klass = Class.new
|
45
|
+
Object.send(:const_set, :CustomTag, original_klass)
|
46
|
+
Template.register_tag('custom', CustomTag)
|
47
|
+
|
48
|
+
Object.send(:remove_const, :CustomTag)
|
49
|
+
|
50
|
+
new_klass = Class.new
|
51
|
+
Object.send(:const_set, :CustomTag, new_klass)
|
52
|
+
|
53
|
+
assert Template.tags['custom'].equal?(new_klass)
|
54
|
+
ensure
|
55
|
+
Object.send(:remove_const, :CustomTag)
|
56
|
+
Template.tags.delete('custom')
|
57
|
+
Liquid.cache_classes = original_cache_setting
|
58
|
+
end
|
59
|
+
|
60
|
+
class FakeTag; end
|
61
|
+
|
62
|
+
def test_tags_delete
|
63
|
+
Template.register_tag('fake', FakeTag)
|
64
|
+
assert_equal FakeTag, Template.tags['fake']
|
65
|
+
|
66
|
+
Template.tags.delete('fake')
|
67
|
+
assert_nil Template.tags['fake']
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TokenizerTest < Minitest::Test
|
4
|
+
def test_tokenize_strings
|
5
|
+
assert_equal [' '], tokenize(' ')
|
6
|
+
assert_equal ['hello world'], tokenize('hello world')
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_tokenize_variables
|
10
|
+
assert_equal ['{{funk}}'], tokenize('{{funk}}')
|
11
|
+
assert_equal [' ', '{{funk}}', ' '], tokenize(' {{funk}} ')
|
12
|
+
assert_equal [' ', '{{funk}}', ' ', '{{so}}', ' ', '{{brother}}', ' '], tokenize(' {{funk}} {{so}} {{brother}} ')
|
13
|
+
assert_equal [' ', '{{ funk }}', ' '], tokenize(' {{ funk }} ')
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_tokenize_blocks
|
17
|
+
assert_equal ['{%comment%}'], tokenize('{%comment%}')
|
18
|
+
assert_equal [' ', '{%comment%}', ' '], tokenize(' {%comment%} ')
|
19
|
+
|
20
|
+
assert_equal [' ', '{%comment%}', ' ', '{%endcomment%}', ' '], tokenize(' {%comment%} {%endcomment%} ')
|
21
|
+
assert_equal [' ', '{% comment %}', ' ', '{% endcomment %}', ' '], tokenize(" {% comment %} {% endcomment %} ")
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_calculate_line_numbers_per_token_with_profiling
|
25
|
+
template = Liquid::Template.parse("", :profile => true)
|
26
|
+
|
27
|
+
assert_equal [1], template.send(:tokenize, "{{funk}}").map(&:line_number)
|
28
|
+
assert_equal [1, 1, 1], template.send(:tokenize, " {{funk}} ").map(&:line_number)
|
29
|
+
assert_equal [1, 2, 2], template.send(:tokenize, "\n{{funk}}\n").map(&:line_number)
|
30
|
+
assert_equal [1, 1, 3], template.send(:tokenize, " {{\n funk \n}} ").map(&:line_number)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def tokenize(source)
|
36
|
+
Liquid::Template.new.send(:tokenize, source)
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class VariableUnitTest < Minitest::Test
|
4
|
+
include Liquid
|
5
|
+
|
6
|
+
def test_variable
|
7
|
+
var = Variable.new('hello')
|
8
|
+
assert_equal VariableLookup.new('hello'), var.name
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_filters
|
12
|
+
var = Variable.new('hello | textileze')
|
13
|
+
assert_equal VariableLookup.new('hello'), var.name
|
14
|
+
assert_equal [['textileze',[]]], var.filters
|
15
|
+
|
16
|
+
var = Variable.new('hello | textileze | paragraph')
|
17
|
+
assert_equal VariableLookup.new('hello'), var.name
|
18
|
+
assert_equal [['textileze',[]], ['paragraph',[]]], var.filters
|
19
|
+
|
20
|
+
var = Variable.new(%! hello | strftime: '%Y'!)
|
21
|
+
assert_equal VariableLookup.new('hello'), var.name
|
22
|
+
assert_equal [['strftime',['%Y']]], var.filters
|
23
|
+
|
24
|
+
var = Variable.new(%! 'typo' | link_to: 'Typo', true !)
|
25
|
+
assert_equal 'typo', var.name
|
26
|
+
assert_equal [['link_to',['Typo', true]]], var.filters
|
27
|
+
|
28
|
+
var = Variable.new(%! 'typo' | link_to: 'Typo', false !)
|
29
|
+
assert_equal 'typo', var.name
|
30
|
+
assert_equal [['link_to',['Typo', false]]], var.filters
|
31
|
+
|
32
|
+
var = Variable.new(%! 'foo' | repeat: 3 !)
|
33
|
+
assert_equal 'foo', var.name
|
34
|
+
assert_equal [['repeat',[3]]], var.filters
|
35
|
+
|
36
|
+
var = Variable.new(%! 'foo' | repeat: 3, 3 !)
|
37
|
+
assert_equal 'foo', var.name
|
38
|
+
assert_equal [['repeat',[3,3]]], var.filters
|
39
|
+
|
40
|
+
var = Variable.new(%! 'foo' | repeat: 3, 3, 3 !)
|
41
|
+
assert_equal 'foo', var.name
|
42
|
+
assert_equal [['repeat',[3,3,3]]], var.filters
|
43
|
+
|
44
|
+
var = Variable.new(%! hello | strftime: '%Y, okay?'!)
|
45
|
+
assert_equal VariableLookup.new('hello'), var.name
|
46
|
+
assert_equal [['strftime',['%Y, okay?']]], var.filters
|
47
|
+
|
48
|
+
var = Variable.new(%! hello | things: "%Y, okay?", 'the other one'!)
|
49
|
+
assert_equal VariableLookup.new('hello'), var.name
|
50
|
+
assert_equal [['things',['%Y, okay?','the other one']]], var.filters
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_filter_with_date_parameter
|
54
|
+
var = Variable.new(%! '2006-06-06' | date: "%m/%d/%Y"!)
|
55
|
+
assert_equal '2006-06-06', var.name
|
56
|
+
assert_equal [['date',['%m/%d/%Y']]], var.filters
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_filters_without_whitespace
|
60
|
+
var = Variable.new('hello | textileze | paragraph')
|
61
|
+
assert_equal VariableLookup.new('hello'), var.name
|
62
|
+
assert_equal [['textileze',[]], ['paragraph',[]]], var.filters
|
63
|
+
|
64
|
+
var = Variable.new('hello|textileze|paragraph')
|
65
|
+
assert_equal VariableLookup.new('hello'), var.name
|
66
|
+
assert_equal [['textileze',[]], ['paragraph',[]]], var.filters
|
67
|
+
|
68
|
+
var = Variable.new("hello|replace:'foo','bar'|textileze")
|
69
|
+
assert_equal VariableLookup.new('hello'), var.name
|
70
|
+
assert_equal [['replace', ['foo', 'bar']], ['textileze', []]], var.filters
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_symbol
|
74
|
+
var = Variable.new("http://disney.com/logo.gif | image: 'med' ", :error_mode => :lax)
|
75
|
+
assert_equal VariableLookup.new('http://disney.com/logo.gif'), var.name
|
76
|
+
assert_equal [['image',['med']]], var.filters
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_string_to_filter
|
80
|
+
var = Variable.new("'http://disney.com/logo.gif' | image: 'med' ")
|
81
|
+
assert_equal 'http://disney.com/logo.gif', var.name
|
82
|
+
assert_equal [['image',['med']]], var.filters
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_string_single_quoted
|
86
|
+
var = Variable.new(%| "hello" |)
|
87
|
+
assert_equal 'hello', var.name
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_string_double_quoted
|
91
|
+
var = Variable.new(%| 'hello' |)
|
92
|
+
assert_equal 'hello', var.name
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_integer
|
96
|
+
var = Variable.new(%| 1000 |)
|
97
|
+
assert_equal 1000, var.name
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_float
|
101
|
+
var = Variable.new(%| 1000.01 |)
|
102
|
+
assert_equal 1000.01, var.name
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_string_with_special_chars
|
106
|
+
var = Variable.new(%| 'hello! $!@.;"ddasd" ' |)
|
107
|
+
assert_equal 'hello! $!@.;"ddasd" ', var.name
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_string_dot
|
111
|
+
var = Variable.new(%| test.test |)
|
112
|
+
assert_equal VariableLookup.new('test.test'), var.name
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_filter_with_keyword_arguments
|
116
|
+
var = Variable.new(%! hello | things: greeting: "world", farewell: 'goodbye'!)
|
117
|
+
assert_equal VariableLookup.new('hello'), var.name
|
118
|
+
assert_equal [['things', [], { 'greeting' => 'world', 'farewell' => 'goodbye' }]], var.filters
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_lax_filter_argument_parsing
|
122
|
+
var = Variable.new(%! number_of_comments | pluralize: 'comment': 'comments' !, :error_mode => :lax)
|
123
|
+
assert_equal VariableLookup.new('number_of_comments'), var.name
|
124
|
+
assert_equal [['pluralize',['comment','comments']]], var.filters
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_strict_filter_argument_parsing
|
128
|
+
with_error_mode(:strict) do
|
129
|
+
assert_raises(SyntaxError) do
|
130
|
+
Variable.new(%! number_of_comments | pluralize: 'comment': 'comments' !)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_output_raw_source_of_variable
|
136
|
+
var = Variable.new(%! name_of_variable | upcase !)
|
137
|
+
assert_equal " name_of_variable | upcase ", var.raw
|
138
|
+
end
|
139
|
+
end
|