liquid 2.6.1 → 4.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +5 -5
  2. data/History.md +194 -29
  3. data/{MIT-LICENSE → LICENSE} +0 -0
  4. data/README.md +60 -2
  5. data/lib/liquid.rb +25 -14
  6. data/lib/liquid/block.rb +47 -96
  7. data/lib/liquid/block_body.rb +143 -0
  8. data/lib/liquid/condition.rb +70 -39
  9. data/lib/liquid/context.rb +116 -157
  10. data/lib/liquid/document.rb +19 -9
  11. data/lib/liquid/drop.rb +31 -14
  12. data/lib/liquid/errors.rb +54 -10
  13. data/lib/liquid/expression.rb +49 -0
  14. data/lib/liquid/extensions.rb +19 -7
  15. data/lib/liquid/file_system.rb +25 -14
  16. data/lib/liquid/forloop_drop.rb +42 -0
  17. data/lib/liquid/i18n.rb +39 -0
  18. data/lib/liquid/interrupts.rb +2 -3
  19. data/lib/liquid/lexer.rb +55 -0
  20. data/lib/liquid/locales/en.yml +26 -0
  21. data/lib/liquid/parse_context.rb +38 -0
  22. data/lib/liquid/parse_tree_visitor.rb +42 -0
  23. data/lib/liquid/parser.rb +90 -0
  24. data/lib/liquid/parser_switching.rb +31 -0
  25. data/lib/liquid/profiler.rb +158 -0
  26. data/lib/liquid/profiler/hooks.rb +23 -0
  27. data/lib/liquid/range_lookup.rb +37 -0
  28. data/lib/liquid/resource_limits.rb +23 -0
  29. data/lib/liquid/standardfilters.rb +311 -77
  30. data/lib/liquid/strainer.rb +39 -26
  31. data/lib/liquid/tablerowloop_drop.rb +62 -0
  32. data/lib/liquid/tag.rb +28 -11
  33. data/lib/liquid/tags/assign.rb +34 -10
  34. data/lib/liquid/tags/break.rb +1 -4
  35. data/lib/liquid/tags/capture.rb +11 -9
  36. data/lib/liquid/tags/case.rb +37 -22
  37. data/lib/liquid/tags/comment.rb +10 -3
  38. data/lib/liquid/tags/continue.rb +1 -4
  39. data/lib/liquid/tags/cycle.rb +20 -14
  40. data/lib/liquid/tags/decrement.rb +4 -8
  41. data/lib/liquid/tags/for.rb +121 -60
  42. data/lib/liquid/tags/if.rb +73 -30
  43. data/lib/liquid/tags/ifchanged.rb +3 -5
  44. data/lib/liquid/tags/include.rb +77 -46
  45. data/lib/liquid/tags/increment.rb +4 -8
  46. data/lib/liquid/tags/raw.rb +35 -10
  47. data/lib/liquid/tags/table_row.rb +62 -0
  48. data/lib/liquid/tags/unless.rb +6 -9
  49. data/lib/liquid/template.rb +130 -32
  50. data/lib/liquid/tokenizer.rb +31 -0
  51. data/lib/liquid/truffle.rb +5 -0
  52. data/lib/liquid/utils.rb +57 -4
  53. data/lib/liquid/variable.rb +121 -30
  54. data/lib/liquid/variable_lookup.rb +88 -0
  55. data/lib/liquid/version.rb +2 -1
  56. data/test/fixtures/en_locale.yml +9 -0
  57. data/test/integration/assign_test.rb +48 -0
  58. data/test/integration/blank_test.rb +106 -0
  59. data/test/integration/block_test.rb +12 -0
  60. data/test/{liquid → integration}/capture_test.rb +13 -3
  61. data/test/integration/context_test.rb +32 -0
  62. data/test/integration/document_test.rb +19 -0
  63. data/test/integration/drop_test.rb +273 -0
  64. data/test/integration/error_handling_test.rb +260 -0
  65. data/test/integration/filter_test.rb +178 -0
  66. data/test/integration/hash_ordering_test.rb +23 -0
  67. data/test/integration/output_test.rb +123 -0
  68. data/test/integration/parse_tree_visitor_test.rb +247 -0
  69. data/test/integration/parsing_quirks_test.rb +122 -0
  70. data/test/integration/render_profiling_test.rb +154 -0
  71. data/test/integration/security_test.rb +80 -0
  72. data/test/integration/standard_filter_test.rb +776 -0
  73. data/test/{liquid → integration}/tags/break_tag_test.rb +2 -3
  74. data/test/{liquid → integration}/tags/continue_tag_test.rb +1 -2
  75. data/test/integration/tags/for_tag_test.rb +410 -0
  76. data/test/integration/tags/if_else_tag_test.rb +188 -0
  77. data/test/integration/tags/include_tag_test.rb +253 -0
  78. data/test/integration/tags/increment_tag_test.rb +23 -0
  79. data/test/{liquid → integration}/tags/raw_tag_test.rb +9 -2
  80. data/test/integration/tags/standard_tag_test.rb +296 -0
  81. data/test/integration/tags/statements_test.rb +111 -0
  82. data/test/{liquid/tags/html_tag_test.rb → integration/tags/table_row_test.rb} +25 -24
  83. data/test/integration/tags/unless_else_tag_test.rb +26 -0
  84. data/test/integration/template_test.rb +332 -0
  85. data/test/integration/trim_mode_test.rb +529 -0
  86. data/test/integration/variable_test.rb +96 -0
  87. data/test/test_helper.rb +106 -19
  88. data/test/truffle/truffle_test.rb +9 -0
  89. data/test/{liquid/block_test.rb → unit/block_unit_test.rb} +9 -9
  90. data/test/unit/condition_unit_test.rb +166 -0
  91. data/test/{liquid/context_test.rb → unit/context_unit_test.rb} +85 -74
  92. data/test/unit/file_system_unit_test.rb +35 -0
  93. data/test/unit/i18n_unit_test.rb +37 -0
  94. data/test/unit/lexer_unit_test.rb +51 -0
  95. data/test/unit/parser_unit_test.rb +82 -0
  96. data/test/{liquid/regexp_test.rb → unit/regexp_unit_test.rb} +4 -4
  97. data/test/unit/strainer_unit_test.rb +164 -0
  98. data/test/unit/tag_unit_test.rb +21 -0
  99. data/test/unit/tags/case_tag_unit_test.rb +10 -0
  100. data/test/unit/tags/for_tag_unit_test.rb +13 -0
  101. data/test/unit/tags/if_tag_unit_test.rb +8 -0
  102. data/test/unit/template_unit_test.rb +78 -0
  103. data/test/unit/tokenizer_unit_test.rb +55 -0
  104. data/test/unit/variable_unit_test.rb +162 -0
  105. metadata +157 -77
  106. data/lib/extras/liquid_view.rb +0 -51
  107. data/lib/liquid/htmltags.rb +0 -74
  108. data/lib/liquid/module_ex.rb +0 -62
  109. data/test/liquid/assign_test.rb +0 -21
  110. data/test/liquid/condition_test.rb +0 -127
  111. data/test/liquid/drop_test.rb +0 -180
  112. data/test/liquid/error_handling_test.rb +0 -81
  113. data/test/liquid/file_system_test.rb +0 -29
  114. data/test/liquid/filter_test.rb +0 -125
  115. data/test/liquid/hash_ordering_test.rb +0 -25
  116. data/test/liquid/module_ex_test.rb +0 -87
  117. data/test/liquid/output_test.rb +0 -116
  118. data/test/liquid/parsing_quirks_test.rb +0 -52
  119. data/test/liquid/security_test.rb +0 -64
  120. data/test/liquid/standard_filter_test.rb +0 -251
  121. data/test/liquid/strainer_test.rb +0 -52
  122. data/test/liquid/tags/for_tag_test.rb +0 -297
  123. data/test/liquid/tags/if_else_tag_test.rb +0 -166
  124. data/test/liquid/tags/include_tag_test.rb +0 -166
  125. data/test/liquid/tags/increment_tag_test.rb +0 -24
  126. data/test/liquid/tags/standard_tag_test.rb +0 -295
  127. data/test/liquid/tags/statements_test.rb +0 -134
  128. data/test/liquid/tags/unless_else_tag_test.rb +0 -26
  129. data/test/liquid/template_test.rb +0 -146
  130. data/test/liquid/variable_test.rb +0 -186
@@ -1,134 +0,0 @@
1
- require 'test_helper'
2
-
3
- class StatementsTest < Test::Unit::TestCase
4
- include Liquid
5
-
6
- def test_true_eql_true
7
- text = %| {% if true == true %} true {% else %} false {% endif %} |
8
- expected = %| true |
9
- assert_equal expected, Template.parse(text).render
10
- end
11
-
12
- def test_true_not_eql_true
13
- text = %| {% if true != true %} true {% else %} false {% endif %} |
14
- expected = %| false |
15
- assert_equal expected, Template.parse(text).render
16
- end
17
-
18
- def test_true_lq_true
19
- text = %| {% if 0 > 0 %} true {% else %} false {% endif %} |
20
- expected = %| false |
21
- assert_equal expected, Template.parse(text).render
22
- end
23
-
24
- def test_one_lq_zero
25
- text = %| {% if 1 > 0 %} true {% else %} false {% endif %} |
26
- expected = %| true |
27
- assert_equal expected, Template.parse(text).render
28
- end
29
-
30
- def test_zero_lq_one
31
- text = %| {% if 0 < 1 %} true {% else %} false {% endif %} |
32
- expected = %| true |
33
- assert_equal expected, Template.parse(text).render
34
- end
35
-
36
- def test_zero_lq_or_equal_one
37
- text = %| {% if 0 <= 0 %} true {% else %} false {% endif %} |
38
- expected = %| true |
39
- assert_equal expected, Template.parse(text).render
40
- end
41
-
42
- def test_zero_lq_or_equal_one_involving_nil
43
- text = %| {% if null <= 0 %} true {% else %} false {% endif %} |
44
- expected = %| false |
45
- assert_equal expected, Template.parse(text).render
46
-
47
-
48
- text = %| {% if 0 <= null %} true {% else %} false {% endif %} |
49
- expected = %| false |
50
- assert_equal expected, Template.parse(text).render
51
- end
52
-
53
- def test_zero_lqq_or_equal_one
54
- text = %| {% if 0 >= 0 %} true {% else %} false {% endif %} |
55
- expected = %| true |
56
- assert_equal expected, Template.parse(text).render
57
- end
58
-
59
- def test_strings
60
- text = %| {% if 'test' == 'test' %} true {% else %} false {% endif %} |
61
- expected = %| true |
62
- assert_equal expected, Template.parse(text).render
63
- end
64
-
65
- def test_strings_not_equal
66
- text = %| {% if 'test' != 'test' %} true {% else %} false {% endif %} |
67
- expected = %| false |
68
- assert_equal expected, Template.parse(text).render
69
- end
70
-
71
- def test_var_strings_equal
72
- text = %| {% if var == "hello there!" %} true {% else %} false {% endif %} |
73
- expected = %| true |
74
- assert_equal expected, Template.parse(text).render('var' => 'hello there!')
75
- end
76
-
77
- def test_var_strings_are_not_equal
78
- text = %| {% if "hello there!" == var %} true {% else %} false {% endif %} |
79
- expected = %| true |
80
- assert_equal expected, Template.parse(text).render('var' => 'hello there!')
81
- end
82
-
83
- def test_var_and_long_string_are_equal
84
- text = %| {% if var == 'hello there!' %} true {% else %} false {% endif %} |
85
- expected = %| true |
86
- assert_equal expected, Template.parse(text).render('var' => 'hello there!')
87
- end
88
-
89
-
90
- def test_var_and_long_string_are_equal_backwards
91
- text = %| {% if 'hello there!' == var %} true {% else %} false {% endif %} |
92
- expected = %| true |
93
- assert_equal expected, Template.parse(text).render('var' => 'hello there!')
94
- end
95
-
96
- #def test_is_nil
97
- # text = %| {% if var != nil %} true {% else %} false {% end %} |
98
- # @template.assigns = { 'var' => 'hello there!'}
99
- # expected = %| true |
100
- # assert_equal expected, @template.parse(text)
101
- #end
102
-
103
- def test_is_collection_empty
104
- text = %| {% if array == empty %} true {% else %} false {% endif %} |
105
- expected = %| true |
106
- assert_equal expected, Template.parse(text).render('array' => [])
107
- end
108
-
109
- def test_is_not_collection_empty
110
- text = %| {% if array == empty %} true {% else %} false {% endif %} |
111
- expected = %| false |
112
- assert_equal expected, Template.parse(text).render('array' => [1,2,3])
113
- end
114
-
115
- def test_nil
116
- text = %| {% if var == nil %} true {% else %} false {% endif %} |
117
- expected = %| true |
118
- assert_equal expected, Template.parse(text).render('var' => nil)
119
-
120
- text = %| {% if var == null %} true {% else %} false {% endif %} |
121
- expected = %| true |
122
- assert_equal expected, Template.parse(text).render('var' => nil)
123
- end
124
-
125
- def test_not_nil
126
- text = %| {% if var != nil %} true {% else %} false {% endif %} |
127
- expected = %| true |
128
- assert_equal expected, Template.parse(text).render('var' => 1 )
129
-
130
- text = %| {% if var != null %} true {% else %} false {% endif %} |
131
- expected = %| true |
132
- assert_equal expected, Template.parse(text).render('var' => 1 )
133
- end
134
- end # StatementsTest
@@ -1,26 +0,0 @@
1
- require 'test_helper'
2
-
3
- class UnlessElseTagTest < Test::Unit::TestCase
4
- include Liquid
5
-
6
- def test_unless
7
- assert_template_result(' ',' {% unless true %} this text should not go into the output {% endunless %} ')
8
- assert_template_result(' this text should go into the output ',
9
- ' {% unless false %} this text should go into the output {% endunless %} ')
10
- assert_template_result(' you rock ?','{% unless true %} you suck {% endunless %} {% unless false %} you rock {% endunless %}?')
11
- end
12
-
13
- def test_unless_else
14
- assert_template_result(' YES ','{% unless true %} NO {% else %} YES {% endunless %}')
15
- assert_template_result(' YES ','{% unless false %} YES {% else %} NO {% endunless %}')
16
- assert_template_result(' YES ','{% unless "foo" %} NO {% else %} YES {% endunless %}')
17
- end
18
-
19
- def test_unless_in_loop
20
- assert_template_result '23', '{% for i in choices %}{% unless i %}{{ forloop.index }}{% endunless %}{% endfor %}', 'choices' => [1, nil, false]
21
- end
22
-
23
- def test_unless_else_in_loop
24
- assert_template_result ' TRUE 2 3 ', '{% for i in choices %}{% unless i %} {{ forloop.index }} {% else %} TRUE {% endunless %}{% endfor %}', 'choices' => [1, nil, false]
25
- end
26
- end # UnlessElseTest
@@ -1,146 +0,0 @@
1
- require 'test_helper'
2
-
3
- class TemplateContextDrop < Liquid::Drop
4
- def before_method(method)
5
- method
6
- end
7
-
8
- def foo
9
- 'fizzbuzz'
10
- end
11
-
12
- def baz
13
- @context.registers['lulz']
14
- end
15
- end
16
-
17
- class TemplateTest < Test::Unit::TestCase
18
- include Liquid
19
-
20
- def test_tokenize_strings
21
- assert_equal [' '], Template.new.send(:tokenize, ' ')
22
- assert_equal ['hello world'], Template.new.send(:tokenize, 'hello world')
23
- end
24
-
25
- def test_tokenize_variables
26
- assert_equal ['{{funk}}'], Template.new.send(:tokenize, '{{funk}}')
27
- assert_equal [' ', '{{funk}}', ' '], Template.new.send(:tokenize, ' {{funk}} ')
28
- assert_equal [' ', '{{funk}}', ' ', '{{so}}', ' ', '{{brother}}', ' '], Template.new.send(:tokenize, ' {{funk}} {{so}} {{brother}} ')
29
- assert_equal [' ', '{{ funk }}', ' '], Template.new.send(:tokenize, ' {{ funk }} ')
30
- end
31
-
32
- def test_tokenize_blocks
33
- assert_equal ['{%comment%}'], Template.new.send(:tokenize, '{%comment%}')
34
- assert_equal [' ', '{%comment%}', ' '], Template.new.send(:tokenize, ' {%comment%} ')
35
-
36
- assert_equal [' ', '{%comment%}', ' ', '{%endcomment%}', ' '], Template.new.send(:tokenize, ' {%comment%} {%endcomment%} ')
37
- assert_equal [' ', '{% comment %}', ' ', '{% endcomment %}', ' '], Template.new.send(:tokenize, " {% comment %} {% endcomment %} ")
38
- end
39
-
40
- def test_instance_assigns_persist_on_same_template_object_between_parses
41
- t = Template.new
42
- assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render
43
- assert_equal 'from instance assigns', t.parse("{{ foo }}").render
44
- end
45
-
46
- def test_instance_assigns_persist_on_same_template_parsing_between_renders
47
- t = Template.new.parse("{{ foo }}{% assign foo = 'foo' %}{{ foo }}")
48
- assert_equal 'foo', t.render
49
- assert_equal 'foofoo', t.render
50
- end
51
-
52
- def test_custom_assigns_do_not_persist_on_same_template
53
- t = Template.new
54
- assert_equal 'from custom assigns', t.parse("{{ foo }}").render('foo' => 'from custom assigns')
55
- assert_equal '', t.parse("{{ foo }}").render
56
- end
57
-
58
- def test_custom_assigns_squash_instance_assigns
59
- t = Template.new
60
- assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render
61
- assert_equal 'from custom assigns', t.parse("{{ foo }}").render('foo' => 'from custom assigns')
62
- end
63
-
64
- def test_persistent_assigns_squash_instance_assigns
65
- t = Template.new
66
- assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render
67
- t.assigns['foo'] = 'from persistent assigns'
68
- assert_equal 'from persistent assigns', t.parse("{{ foo }}").render
69
- end
70
-
71
- def test_lambda_is_called_once_from_persistent_assigns_over_multiple_parses_and_renders
72
- t = Template.new
73
- t.assigns['number'] = lambda { @global ||= 0; @global += 1 }
74
- assert_equal '1', t.parse("{{number}}").render
75
- assert_equal '1', t.parse("{{number}}").render
76
- assert_equal '1', t.render
77
- @global = nil
78
- end
79
-
80
- def test_lambda_is_called_once_from_custom_assigns_over_multiple_parses_and_renders
81
- t = Template.new
82
- assigns = {'number' => lambda { @global ||= 0; @global += 1 }}
83
- assert_equal '1', t.parse("{{number}}").render(assigns)
84
- assert_equal '1', t.parse("{{number}}").render(assigns)
85
- assert_equal '1', t.render(assigns)
86
- @global = nil
87
- end
88
-
89
- def test_resource_limits_render_length
90
- t = Template.parse("0123456789")
91
- t.resource_limits = { :render_length_limit => 5 }
92
- assert_equal "Liquid error: Memory limits exceeded", t.render()
93
- assert t.resource_limits[:reached]
94
- t.resource_limits = { :render_length_limit => 10 }
95
- assert_equal "0123456789", t.render()
96
- assert_not_nil t.resource_limits[:render_length_current]
97
- end
98
-
99
- def test_resource_limits_render_score
100
- t = Template.parse("{% for a in (1..10) %} {% for a in (1..10) %} foo {% endfor %} {% endfor %}")
101
- t.resource_limits = { :render_score_limit => 50 }
102
- assert_equal "Liquid error: Memory limits exceeded", t.render()
103
- assert t.resource_limits[:reached]
104
- t = Template.parse("{% for a in (1..100) %} foo {% endfor %}")
105
- t.resource_limits = { :render_score_limit => 50 }
106
- assert_equal "Liquid error: Memory limits exceeded", t.render()
107
- assert t.resource_limits[:reached]
108
- t.resource_limits = { :render_score_limit => 200 }
109
- assert_equal (" foo " * 100), t.render()
110
- assert_not_nil t.resource_limits[:render_score_current]
111
- end
112
-
113
- def test_resource_limits_assign_score
114
- t = Template.parse("{% assign foo = 42 %}{% assign bar = 23 %}")
115
- t.resource_limits = { :assign_score_limit => 1 }
116
- assert_equal "Liquid error: Memory limits exceeded", t.render()
117
- assert t.resource_limits[:reached]
118
- t.resource_limits = { :assign_score_limit => 2 }
119
- assert_equal "", t.render()
120
- assert_not_nil t.resource_limits[:assign_score_current]
121
- end
122
-
123
- def test_resource_limits_aborts_rendering_after_first_error
124
- t = Template.parse("{% for a in (1..100) %} foo1 {% endfor %} bar {% for a in (1..100) %} foo2 {% endfor %}")
125
- t.resource_limits = { :render_score_limit => 50 }
126
- assert_equal "Liquid error: Memory limits exceeded", t.render()
127
- assert t.resource_limits[:reached]
128
- end
129
-
130
- def test_resource_limits_hash_in_template_gets_updated_even_if_no_limits_are_set
131
- t = Template.parse("{% for a in (1..100) %} {% assign foo = 1 %} {% endfor %}")
132
- t.render()
133
- assert t.resource_limits[:assign_score_current] > 0
134
- assert t.resource_limits[:render_score_current] > 0
135
- assert t.resource_limits[:render_length_current] > 0
136
- end
137
-
138
- def test_can_use_drop_as_context
139
- t = Template.new
140
- t.registers['lulz'] = 'haha'
141
- drop = TemplateContextDrop.new
142
- assert_equal 'fizzbuzz', t.parse('{{foo}}').render(drop)
143
- assert_equal 'bar', t.parse('{{bar}}').render(drop)
144
- assert_equal 'haha', t.parse("{{baz}}").render(drop)
145
- end
146
- end # TemplateTest
@@ -1,186 +0,0 @@
1
- require 'test_helper'
2
-
3
- class VariableTest < Test::Unit::TestCase
4
- include Liquid
5
-
6
- def test_variable
7
- var = Variable.new('hello')
8
- assert_equal 'hello', var.name
9
- end
10
-
11
- def test_filters
12
- var = Variable.new('hello | textileze')
13
- assert_equal 'hello', var.name
14
- assert_equal [["textileze",[]]], var.filters
15
-
16
- var = Variable.new('hello | textileze | paragraph')
17
- assert_equal 'hello', var.name
18
- assert_equal [["textileze",[]], ["paragraph",[]]], var.filters
19
-
20
- var = Variable.new(%! hello | strftime: '%Y'!)
21
- assert_equal '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 '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 '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
-
55
- var = Variable.new(%! '2006-06-06' | date: "%m/%d/%Y"!)
56
- assert_equal "'2006-06-06'", var.name
57
- assert_equal [["date",["\"%m/%d/%Y\""]]], var.filters
58
-
59
- end
60
-
61
- def test_filters_without_whitespace
62
- var = Variable.new('hello | textileze | paragraph')
63
- assert_equal 'hello', var.name
64
- assert_equal [["textileze",[]], ["paragraph",[]]], var.filters
65
-
66
- var = Variable.new('hello|textileze|paragraph')
67
- assert_equal 'hello', var.name
68
- assert_equal [["textileze",[]], ["paragraph",[]]], var.filters
69
-
70
- var = Variable.new("hello|replace:'foo','bar'|textileze")
71
- assert_equal 'hello', var.name
72
- assert_equal [["replace", ["'foo'", "'bar'"]], ["textileze", []]], var.filters
73
- end
74
-
75
- def test_symbol
76
- var = Variable.new("http://disney.com/logo.gif | image: 'med' ")
77
- assert_equal 'http://disney.com/logo.gif', var.name
78
- assert_equal [["image",["'med'"]]], var.filters
79
- end
80
-
81
- def test_string_single_quoted
82
- var = Variable.new(%| "hello" |)
83
- assert_equal '"hello"', var.name
84
- end
85
-
86
- def test_string_double_quoted
87
- var = Variable.new(%| 'hello' |)
88
- assert_equal "'hello'", var.name
89
- end
90
-
91
- def test_integer
92
- var = Variable.new(%| 1000 |)
93
- assert_equal "1000", var.name
94
- end
95
-
96
- def test_float
97
- var = Variable.new(%| 1000.01 |)
98
- assert_equal "1000.01", var.name
99
- end
100
-
101
- def test_string_with_special_chars
102
- var = Variable.new(%| 'hello! $!@.;"ddasd" ' |)
103
- assert_equal %|'hello! $!@.;"ddasd" '|, var.name
104
- end
105
-
106
- def test_string_dot
107
- var = Variable.new(%| test.test |)
108
- assert_equal 'test.test', var.name
109
- end
110
-
111
- def test_filter_with_keyword_arguments
112
- var = Variable.new(%! hello | things: greeting: "world", farewell: 'goodbye'!)
113
- assert_equal 'hello', var.name
114
- assert_equal [['things',["greeting: \"world\"","farewell: 'goodbye'"]]], var.filters
115
- end
116
-
117
- def test_lax_filter_argument_parsing
118
- var = Variable.new(%! number_of_comments | pluralize: 'comment': 'comments' !)
119
- assert_equal 'number_of_comments', var.name
120
- assert_equal [['pluralize',["'comment'","'comments'"]]], var.filters
121
- end
122
- end
123
-
124
-
125
- class VariableResolutionTest < Test::Unit::TestCase
126
- include Liquid
127
-
128
- def test_simple_variable
129
- template = Template.parse(%|{{test}}|)
130
- assert_equal 'worked', template.render('test' => 'worked')
131
- assert_equal 'worked wonderfully', template.render('test' => 'worked wonderfully')
132
- end
133
-
134
- def test_simple_with_whitespaces
135
- template = Template.parse(%| {{ test }} |)
136
- assert_equal ' worked ', template.render('test' => 'worked')
137
- assert_equal ' worked wonderfully ', template.render('test' => 'worked wonderfully')
138
- end
139
-
140
- def test_ignore_unknown
141
- template = Template.parse(%|{{ test }}|)
142
- assert_equal '', template.render
143
- end
144
-
145
- def test_hash_scoping
146
- template = Template.parse(%|{{ test.test }}|)
147
- assert_equal 'worked', template.render('test' => {'test' => 'worked'})
148
- end
149
-
150
- def test_preset_assigns
151
- template = Template.parse(%|{{ test }}|)
152
- template.assigns['test'] = 'worked'
153
- assert_equal 'worked', template.render
154
- end
155
-
156
- def test_reuse_parsed_template
157
- template = Template.parse(%|{{ greeting }} {{ name }}|)
158
- template.assigns['greeting'] = 'Goodbye'
159
- assert_equal 'Hello Tobi', template.render('greeting' => 'Hello', 'name' => 'Tobi')
160
- assert_equal 'Hello ', template.render('greeting' => 'Hello', 'unknown' => 'Tobi')
161
- assert_equal 'Hello Brian', template.render('greeting' => 'Hello', 'name' => 'Brian')
162
- assert_equal 'Goodbye Brian', template.render('name' => 'Brian')
163
- assert_equal({'greeting'=>'Goodbye'}, template.assigns)
164
- end
165
-
166
- def test_assigns_not_polluted_from_template
167
- template = Template.parse(%|{{ test }}{% assign test = 'bar' %}{{ test }}|)
168
- template.assigns['test'] = 'baz'
169
- assert_equal 'bazbar', template.render
170
- assert_equal 'bazbar', template.render
171
- assert_equal 'foobar', template.render('test' => 'foo')
172
- assert_equal 'bazbar', template.render
173
- end
174
-
175
- def test_hash_with_default_proc
176
- template = Template.parse(%|Hello {{ test }}|)
177
- assigns = Hash.new { |h,k| raise "Unknown variable '#{k}'" }
178
- assigns['test'] = 'Tobi'
179
- assert_equal 'Hello Tobi', template.render!(assigns)
180
- assigns.delete('test')
181
- e = assert_raises(RuntimeError) {
182
- template.render!(assigns)
183
- }
184
- assert_equal "Unknown variable 'test'", e.message
185
- end
186
- end # VariableTest