liquid 2.6.3 → 5.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +5 -5
  2. data/History.md +272 -26
  3. data/README.md +67 -3
  4. data/lib/liquid/block.rb +62 -94
  5. data/lib/liquid/block_body.rb +255 -0
  6. data/lib/liquid/condition.rb +96 -38
  7. data/lib/liquid/context.rb +172 -154
  8. data/lib/liquid/document.rb +57 -9
  9. data/lib/liquid/drop.rb +33 -14
  10. data/lib/liquid/errors.rb +56 -10
  11. data/lib/liquid/expression.rb +45 -0
  12. data/lib/liquid/extensions.rb +21 -7
  13. data/lib/liquid/file_system.rb +27 -14
  14. data/lib/liquid/forloop_drop.rb +92 -0
  15. data/lib/liquid/i18n.rb +41 -0
  16. data/lib/liquid/interrupts.rb +3 -2
  17. data/lib/liquid/lexer.rb +62 -0
  18. data/lib/liquid/locales/en.yml +29 -0
  19. data/lib/liquid/parse_context.rb +54 -0
  20. data/lib/liquid/parse_tree_visitor.rb +42 -0
  21. data/lib/liquid/parser.rb +102 -0
  22. data/lib/liquid/parser_switching.rb +45 -0
  23. data/lib/liquid/partial_cache.rb +24 -0
  24. data/lib/liquid/profiler/hooks.rb +35 -0
  25. data/lib/liquid/profiler.rb +139 -0
  26. data/lib/liquid/range_lookup.rb +47 -0
  27. data/lib/liquid/registers.rb +51 -0
  28. data/lib/liquid/resource_limits.rb +62 -0
  29. data/lib/liquid/standardfilters.rb +789 -118
  30. data/lib/liquid/strainer_factory.rb +41 -0
  31. data/lib/liquid/strainer_template.rb +62 -0
  32. data/lib/liquid/tablerowloop_drop.rb +121 -0
  33. data/lib/liquid/tag/disableable.rb +22 -0
  34. data/lib/liquid/tag/disabler.rb +21 -0
  35. data/lib/liquid/tag.rb +49 -10
  36. data/lib/liquid/tags/assign.rb +61 -19
  37. data/lib/liquid/tags/break.rb +14 -4
  38. data/lib/liquid/tags/capture.rb +29 -21
  39. data/lib/liquid/tags/case.rb +80 -31
  40. data/lib/liquid/tags/comment.rb +24 -2
  41. data/lib/liquid/tags/continue.rb +14 -13
  42. data/lib/liquid/tags/cycle.rb +50 -32
  43. data/lib/liquid/tags/decrement.rb +24 -26
  44. data/lib/liquid/tags/echo.rb +41 -0
  45. data/lib/liquid/tags/for.rb +164 -100
  46. data/lib/liquid/tags/if.rb +105 -44
  47. data/lib/liquid/tags/ifchanged.rb +10 -11
  48. data/lib/liquid/tags/include.rb +85 -65
  49. data/lib/liquid/tags/increment.rb +24 -22
  50. data/lib/liquid/tags/inline_comment.rb +43 -0
  51. data/lib/liquid/tags/raw.rb +50 -11
  52. data/lib/liquid/tags/render.rb +109 -0
  53. data/lib/liquid/tags/table_row.rb +88 -0
  54. data/lib/liquid/tags/unless.rb +37 -21
  55. data/lib/liquid/template.rb +124 -46
  56. data/lib/liquid/template_factory.rb +9 -0
  57. data/lib/liquid/tokenizer.rb +39 -0
  58. data/lib/liquid/usage.rb +8 -0
  59. data/lib/liquid/utils.rb +68 -5
  60. data/lib/liquid/variable.rb +128 -32
  61. data/lib/liquid/variable_lookup.rb +96 -0
  62. data/lib/liquid/version.rb +3 -1
  63. data/lib/liquid.rb +36 -13
  64. metadata +69 -77
  65. data/lib/extras/liquid_view.rb +0 -51
  66. data/lib/liquid/htmltags.rb +0 -73
  67. data/lib/liquid/module_ex.rb +0 -62
  68. data/lib/liquid/strainer.rb +0 -53
  69. data/test/liquid/assign_test.rb +0 -21
  70. data/test/liquid/block_test.rb +0 -58
  71. data/test/liquid/capture_test.rb +0 -40
  72. data/test/liquid/condition_test.rb +0 -127
  73. data/test/liquid/context_test.rb +0 -478
  74. data/test/liquid/drop_test.rb +0 -180
  75. data/test/liquid/error_handling_test.rb +0 -81
  76. data/test/liquid/file_system_test.rb +0 -29
  77. data/test/liquid/filter_test.rb +0 -125
  78. data/test/liquid/hash_ordering_test.rb +0 -25
  79. data/test/liquid/module_ex_test.rb +0 -87
  80. data/test/liquid/output_test.rb +0 -116
  81. data/test/liquid/parsing_quirks_test.rb +0 -52
  82. data/test/liquid/regexp_test.rb +0 -44
  83. data/test/liquid/security_test.rb +0 -64
  84. data/test/liquid/standard_filter_test.rb +0 -263
  85. data/test/liquid/strainer_test.rb +0 -52
  86. data/test/liquid/tags/break_tag_test.rb +0 -16
  87. data/test/liquid/tags/continue_tag_test.rb +0 -16
  88. data/test/liquid/tags/for_tag_test.rb +0 -297
  89. data/test/liquid/tags/html_tag_test.rb +0 -63
  90. data/test/liquid/tags/if_else_tag_test.rb +0 -166
  91. data/test/liquid/tags/include_tag_test.rb +0 -166
  92. data/test/liquid/tags/increment_tag_test.rb +0 -24
  93. data/test/liquid/tags/raw_tag_test.rb +0 -24
  94. data/test/liquid/tags/standard_tag_test.rb +0 -295
  95. data/test/liquid/tags/statements_test.rb +0 -134
  96. data/test/liquid/tags/unless_else_tag_test.rb +0 -26
  97. data/test/liquid/template_test.rb +0 -146
  98. data/test/liquid/variable_test.rb +0 -186
  99. data/test/test_helper.rb +0 -29
  100. /data/{MIT-LICENSE → LICENSE} +0 -0
@@ -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
data/test/test_helper.rb DELETED
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'test/unit'
4
- require 'test/unit/assertions'
5
- begin
6
- require 'ruby-debug'
7
- rescue LoadError
8
- puts "Couldn't load ruby-debug. gem install ruby-debug if you need it."
9
- end
10
- require File.join(File.dirname(__FILE__), '..', 'lib', 'liquid')
11
-
12
-
13
- module Test
14
- module Unit
15
- module Assertions
16
- include Liquid
17
-
18
- def assert_template_result(expected, template, assigns = {}, message = nil)
19
- assert_equal expected, Template.parse(template).render(assigns)
20
- end
21
-
22
- def assert_template_result_matches(expected, template, assigns = {}, message = nil)
23
- return assert_template_result(expected, template, assigns, message) unless expected.is_a? Regexp
24
-
25
- assert_match expected, Template.parse(template).render(assigns)
26
- end
27
- end # Assertions
28
- end # Unit
29
- end # Test
File without changes