liquid 4.0.4 → 5.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.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +32 -4
  3. data/README.md +6 -0
  4. data/lib/liquid/block.rb +31 -14
  5. data/lib/liquid/block_body.rb +164 -54
  6. data/lib/liquid/condition.rb +39 -18
  7. data/lib/liquid/context.rb +106 -51
  8. data/lib/liquid/document.rb +47 -9
  9. data/lib/liquid/drop.rb +4 -2
  10. data/lib/liquid/errors.rb +20 -18
  11. data/lib/liquid/expression.rb +29 -34
  12. data/lib/liquid/extensions.rb +2 -0
  13. data/lib/liquid/file_system.rb +6 -4
  14. data/lib/liquid/forloop_drop.rb +11 -4
  15. data/lib/liquid/i18n.rb +5 -3
  16. data/lib/liquid/interrupts.rb +3 -1
  17. data/lib/liquid/lexer.rb +30 -23
  18. data/lib/liquid/locales/en.yml +3 -1
  19. data/lib/liquid/parse_context.rb +16 -4
  20. data/lib/liquid/parse_tree_visitor.rb +2 -2
  21. data/lib/liquid/parser.rb +30 -18
  22. data/lib/liquid/parser_switching.rb +17 -3
  23. data/lib/liquid/partial_cache.rb +24 -0
  24. data/lib/liquid/profiler/hooks.rb +26 -14
  25. data/lib/liquid/profiler.rb +67 -86
  26. data/lib/liquid/range_lookup.rb +5 -3
  27. data/lib/liquid/register.rb +6 -0
  28. data/lib/liquid/resource_limits.rb +47 -8
  29. data/lib/liquid/standardfilters.rb +62 -43
  30. data/lib/liquid/static_registers.rb +44 -0
  31. data/lib/liquid/strainer_factory.rb +36 -0
  32. data/lib/liquid/strainer_template.rb +53 -0
  33. data/lib/liquid/tablerowloop_drop.rb +6 -4
  34. data/lib/liquid/tag/disableable.rb +22 -0
  35. data/lib/liquid/tag/disabler.rb +21 -0
  36. data/lib/liquid/tag.rb +28 -6
  37. data/lib/liquid/tags/assign.rb +24 -10
  38. data/lib/liquid/tags/break.rb +8 -3
  39. data/lib/liquid/tags/capture.rb +11 -8
  40. data/lib/liquid/tags/case.rb +33 -27
  41. data/lib/liquid/tags/comment.rb +5 -3
  42. data/lib/liquid/tags/continue.rb +8 -3
  43. data/lib/liquid/tags/cycle.rb +25 -14
  44. data/lib/liquid/tags/decrement.rb +6 -3
  45. data/lib/liquid/tags/echo.rb +26 -0
  46. data/lib/liquid/tags/for.rb +68 -44
  47. data/lib/liquid/tags/if.rb +35 -23
  48. data/lib/liquid/tags/ifchanged.rb +11 -10
  49. data/lib/liquid/tags/include.rb +34 -47
  50. data/lib/liquid/tags/increment.rb +7 -3
  51. data/lib/liquid/tags/raw.rb +14 -11
  52. data/lib/liquid/tags/render.rb +84 -0
  53. data/lib/liquid/tags/table_row.rb +23 -19
  54. data/lib/liquid/tags/unless.rb +15 -15
  55. data/lib/liquid/template.rb +55 -69
  56. data/lib/liquid/template_factory.rb +9 -0
  57. data/lib/liquid/tokenizer.rb +17 -9
  58. data/lib/liquid/usage.rb +8 -0
  59. data/lib/liquid/utils.rb +5 -3
  60. data/lib/liquid/variable.rb +47 -19
  61. data/lib/liquid/variable_lookup.rb +8 -6
  62. data/lib/liquid/version.rb +2 -1
  63. data/lib/liquid.rb +17 -5
  64. data/test/integration/assign_test.rb +74 -5
  65. data/test/integration/blank_test.rb +11 -8
  66. data/test/integration/block_test.rb +47 -1
  67. data/test/integration/capture_test.rb +18 -10
  68. data/test/integration/context_test.rb +608 -5
  69. data/test/integration/document_test.rb +4 -2
  70. data/test/integration/drop_test.rb +67 -57
  71. data/test/integration/error_handling_test.rb +73 -61
  72. data/test/integration/expression_test.rb +46 -0
  73. data/test/integration/filter_test.rb +53 -42
  74. data/test/integration/hash_ordering_test.rb +5 -3
  75. data/test/integration/output_test.rb +26 -24
  76. data/test/integration/parsing_quirks_test.rb +19 -7
  77. data/test/integration/{render_profiling_test.rb → profiler_test.rb} +84 -25
  78. data/test/integration/security_test.rb +30 -21
  79. data/test/integration/standard_filter_test.rb +339 -281
  80. data/test/integration/tag/disableable_test.rb +59 -0
  81. data/test/integration/tag_test.rb +45 -0
  82. data/test/integration/tags/break_tag_test.rb +4 -2
  83. data/test/integration/tags/continue_tag_test.rb +4 -2
  84. data/test/integration/tags/echo_test.rb +13 -0
  85. data/test/integration/tags/for_tag_test.rb +107 -51
  86. data/test/integration/tags/if_else_tag_test.rb +5 -3
  87. data/test/integration/tags/include_tag_test.rb +70 -54
  88. data/test/integration/tags/increment_tag_test.rb +4 -2
  89. data/test/integration/tags/liquid_tag_test.rb +116 -0
  90. data/test/integration/tags/raw_tag_test.rb +14 -11
  91. data/test/integration/tags/render_tag_test.rb +213 -0
  92. data/test/integration/tags/standard_tag_test.rb +38 -31
  93. data/test/integration/tags/statements_test.rb +23 -21
  94. data/test/integration/tags/table_row_test.rb +2 -0
  95. data/test/integration/tags/unless_else_tag_test.rb +4 -2
  96. data/test/integration/template_test.rb +118 -124
  97. data/test/integration/trim_mode_test.rb +78 -44
  98. data/test/integration/variable_test.rb +43 -32
  99. data/test/test_helper.rb +75 -14
  100. data/test/unit/block_unit_test.rb +19 -24
  101. data/test/unit/condition_unit_test.rb +79 -77
  102. data/test/unit/file_system_unit_test.rb +6 -4
  103. data/test/unit/i18n_unit_test.rb +7 -5
  104. data/test/unit/lexer_unit_test.rb +11 -9
  105. data/test/{integration → unit}/parse_tree_visitor_test.rb +1 -1
  106. data/test/unit/parser_unit_test.rb +37 -35
  107. data/test/unit/partial_cache_unit_test.rb +128 -0
  108. data/test/unit/regexp_unit_test.rb +17 -15
  109. data/test/unit/static_registers_unit_test.rb +156 -0
  110. data/test/unit/strainer_factory_unit_test.rb +100 -0
  111. data/test/unit/strainer_template_unit_test.rb +82 -0
  112. data/test/unit/tag_unit_test.rb +5 -3
  113. data/test/unit/tags/case_tag_unit_test.rb +3 -1
  114. data/test/unit/tags/for_tag_unit_test.rb +4 -2
  115. data/test/unit/tags/if_tag_unit_test.rb +3 -1
  116. data/test/unit/template_factory_unit_test.rb +12 -0
  117. data/test/unit/template_unit_test.rb +19 -10
  118. data/test/unit/tokenizer_unit_test.rb +19 -17
  119. data/test/unit/variable_unit_test.rb +51 -49
  120. metadata +75 -47
  121. data/lib/liquid/strainer.rb +0 -66
  122. data/test/unit/context_unit_test.rb +0 -490
  123. data/test/unit/strainer_unit_test.rb +0 -164
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: 4.0.4
4
+ version: 5.0.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: 2023-01-11 00:00:00.000000000 Z
11
+ date: 2021-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -70,14 +70,20 @@ files:
70
70
  - lib/liquid/parse_tree_visitor.rb
71
71
  - lib/liquid/parser.rb
72
72
  - lib/liquid/parser_switching.rb
73
+ - lib/liquid/partial_cache.rb
73
74
  - lib/liquid/profiler.rb
74
75
  - lib/liquid/profiler/hooks.rb
75
76
  - lib/liquid/range_lookup.rb
77
+ - lib/liquid/register.rb
76
78
  - lib/liquid/resource_limits.rb
77
79
  - lib/liquid/standardfilters.rb
78
- - lib/liquid/strainer.rb
80
+ - lib/liquid/static_registers.rb
81
+ - lib/liquid/strainer_factory.rb
82
+ - lib/liquid/strainer_template.rb
79
83
  - lib/liquid/tablerowloop_drop.rb
80
84
  - lib/liquid/tag.rb
85
+ - lib/liquid/tag/disableable.rb
86
+ - lib/liquid/tag/disabler.rb
81
87
  - lib/liquid/tags/assign.rb
82
88
  - lib/liquid/tags/break.rb
83
89
  - lib/liquid/tags/capture.rb
@@ -86,16 +92,20 @@ files:
86
92
  - lib/liquid/tags/continue.rb
87
93
  - lib/liquid/tags/cycle.rb
88
94
  - lib/liquid/tags/decrement.rb
95
+ - lib/liquid/tags/echo.rb
89
96
  - lib/liquid/tags/for.rb
90
97
  - lib/liquid/tags/if.rb
91
98
  - lib/liquid/tags/ifchanged.rb
92
99
  - lib/liquid/tags/include.rb
93
100
  - lib/liquid/tags/increment.rb
94
101
  - lib/liquid/tags/raw.rb
102
+ - lib/liquid/tags/render.rb
95
103
  - lib/liquid/tags/table_row.rb
96
104
  - lib/liquid/tags/unless.rb
97
105
  - lib/liquid/template.rb
106
+ - lib/liquid/template_factory.rb
98
107
  - lib/liquid/tokenizer.rb
108
+ - lib/liquid/usage.rb
99
109
  - lib/liquid/utils.rb
100
110
  - lib/liquid/variable.rb
101
111
  - lib/liquid/variable_lookup.rb
@@ -109,21 +119,26 @@ files:
109
119
  - test/integration/document_test.rb
110
120
  - test/integration/drop_test.rb
111
121
  - test/integration/error_handling_test.rb
122
+ - test/integration/expression_test.rb
112
123
  - test/integration/filter_test.rb
113
124
  - test/integration/hash_ordering_test.rb
114
125
  - test/integration/output_test.rb
115
- - test/integration/parse_tree_visitor_test.rb
116
126
  - test/integration/parsing_quirks_test.rb
117
- - test/integration/render_profiling_test.rb
127
+ - test/integration/profiler_test.rb
118
128
  - test/integration/security_test.rb
119
129
  - test/integration/standard_filter_test.rb
130
+ - test/integration/tag/disableable_test.rb
131
+ - test/integration/tag_test.rb
120
132
  - test/integration/tags/break_tag_test.rb
121
133
  - test/integration/tags/continue_tag_test.rb
134
+ - test/integration/tags/echo_test.rb
122
135
  - test/integration/tags/for_tag_test.rb
123
136
  - test/integration/tags/if_else_tag_test.rb
124
137
  - test/integration/tags/include_tag_test.rb
125
138
  - test/integration/tags/increment_tag_test.rb
139
+ - test/integration/tags/liquid_tag_test.rb
126
140
  - test/integration/tags/raw_tag_test.rb
141
+ - test/integration/tags/render_tag_test.rb
127
142
  - test/integration/tags/standard_tag_test.rb
128
143
  - test/integration/tags/statements_test.rb
129
144
  - test/integration/tags/table_row_test.rb
@@ -134,17 +149,21 @@ files:
134
149
  - test/test_helper.rb
135
150
  - test/unit/block_unit_test.rb
136
151
  - test/unit/condition_unit_test.rb
137
- - test/unit/context_unit_test.rb
138
152
  - test/unit/file_system_unit_test.rb
139
153
  - test/unit/i18n_unit_test.rb
140
154
  - test/unit/lexer_unit_test.rb
155
+ - test/unit/parse_tree_visitor_test.rb
141
156
  - test/unit/parser_unit_test.rb
157
+ - test/unit/partial_cache_unit_test.rb
142
158
  - test/unit/regexp_unit_test.rb
143
- - test/unit/strainer_unit_test.rb
159
+ - test/unit/static_registers_unit_test.rb
160
+ - test/unit/strainer_factory_unit_test.rb
161
+ - test/unit/strainer_template_unit_test.rb
144
162
  - test/unit/tag_unit_test.rb
145
163
  - test/unit/tags/case_tag_unit_test.rb
146
164
  - test/unit/tags/for_tag_unit_test.rb
147
165
  - test/unit/tags/if_tag_unit_test.rb
166
+ - test/unit/template_factory_unit_test.rb
148
167
  - test/unit/template_unit_test.rb
149
168
  - test/unit/tokenizer_unit_test.rb
150
169
  - test/unit/variable_unit_test.rb
@@ -161,63 +180,72 @@ required_ruby_version: !ruby/object:Gem::Requirement
161
180
  requirements:
162
181
  - - ">="
163
182
  - !ruby/object:Gem::Version
164
- version: 2.1.0
183
+ version: 2.5.0
165
184
  required_rubygems_version: !ruby/object:Gem::Requirement
166
185
  requirements:
167
186
  - - ">="
168
187
  - !ruby/object:Gem::Version
169
188
  version: 1.3.7
170
189
  requirements: []
171
- rubygems_version: 3.3.3
190
+ rubygems_version: 3.0.3
172
191
  signing_key:
173
192
  specification_version: 4
174
193
  summary: A secure, non-evaling end user template engine with aesthetic markup.
175
194
  test_files:
176
- - test/fixtures/en_locale.yml
177
- - test/integration/assign_test.rb
195
+ - test/unit/lexer_unit_test.rb
196
+ - test/unit/condition_unit_test.rb
197
+ - test/unit/template_factory_unit_test.rb
198
+ - test/unit/tag_unit_test.rb
199
+ - test/unit/tokenizer_unit_test.rb
200
+ - test/unit/regexp_unit_test.rb
201
+ - test/unit/file_system_unit_test.rb
202
+ - test/unit/block_unit_test.rb
203
+ - test/unit/strainer_factory_unit_test.rb
204
+ - test/unit/i18n_unit_test.rb
205
+ - test/unit/variable_unit_test.rb
206
+ - test/unit/static_registers_unit_test.rb
207
+ - test/unit/strainer_template_unit_test.rb
208
+ - test/unit/template_unit_test.rb
209
+ - test/unit/partial_cache_unit_test.rb
210
+ - test/unit/parse_tree_visitor_test.rb
211
+ - test/unit/tags/if_tag_unit_test.rb
212
+ - test/unit/tags/case_tag_unit_test.rb
213
+ - test/unit/tags/for_tag_unit_test.rb
214
+ - test/unit/parser_unit_test.rb
215
+ - test/test_helper.rb
216
+ - test/integration/expression_test.rb
217
+ - test/integration/parsing_quirks_test.rb
218
+ - test/integration/security_test.rb
219
+ - test/integration/template_test.rb
220
+ - test/integration/filter_test.rb
221
+ - test/integration/drop_test.rb
178
222
  - test/integration/blank_test.rb
179
- - test/integration/block_test.rb
180
223
  - test/integration/capture_test.rb
181
224
  - test/integration/context_test.rb
182
225
  - test/integration/document_test.rb
183
- - test/integration/drop_test.rb
184
- - test/integration/error_handling_test.rb
185
- - test/integration/filter_test.rb
186
- - test/integration/hash_ordering_test.rb
187
- - test/integration/output_test.rb
188
- - test/integration/parse_tree_visitor_test.rb
189
- - test/integration/parsing_quirks_test.rb
190
- - test/integration/render_profiling_test.rb
191
- - test/integration/security_test.rb
226
+ - test/integration/block_test.rb
227
+ - test/integration/tag_test.rb
228
+ - test/integration/tag/disableable_test.rb
192
229
  - test/integration/standard_filter_test.rb
193
- - test/integration/tags/break_tag_test.rb
194
- - test/integration/tags/continue_tag_test.rb
195
- - test/integration/tags/for_tag_test.rb
196
- - test/integration/tags/if_else_tag_test.rb
197
- - test/integration/tags/include_tag_test.rb
198
- - test/integration/tags/increment_tag_test.rb
230
+ - test/integration/output_test.rb
231
+ - test/integration/assign_test.rb
232
+ - test/integration/profiler_test.rb
233
+ - test/integration/trim_mode_test.rb
234
+ - test/integration/error_handling_test.rb
235
+ - test/integration/tags/echo_test.rb
199
236
  - test/integration/tags/raw_tag_test.rb
200
- - test/integration/tags/standard_tag_test.rb
201
237
  - test/integration/tags/statements_test.rb
238
+ - test/integration/tags/for_tag_test.rb
239
+ - test/integration/tags/standard_tag_test.rb
240
+ - test/integration/tags/render_tag_test.rb
202
241
  - test/integration/tags/table_row_test.rb
242
+ - test/integration/tags/break_tag_test.rb
243
+ - test/integration/tags/if_else_tag_test.rb
203
244
  - test/integration/tags/unless_else_tag_test.rb
204
- - test/integration/template_test.rb
205
- - test/integration/trim_mode_test.rb
245
+ - test/integration/tags/continue_tag_test.rb
246
+ - test/integration/tags/include_tag_test.rb
247
+ - test/integration/tags/liquid_tag_test.rb
248
+ - test/integration/tags/increment_tag_test.rb
249
+ - test/integration/hash_ordering_test.rb
206
250
  - test/integration/variable_test.rb
207
- - test/test_helper.rb
208
- - test/unit/block_unit_test.rb
209
- - test/unit/condition_unit_test.rb
210
- - test/unit/context_unit_test.rb
211
- - test/unit/file_system_unit_test.rb
212
- - test/unit/i18n_unit_test.rb
213
- - test/unit/lexer_unit_test.rb
214
- - test/unit/parser_unit_test.rb
215
- - test/unit/regexp_unit_test.rb
216
- - test/unit/strainer_unit_test.rb
217
- - test/unit/tag_unit_test.rb
218
- - test/unit/tags/case_tag_unit_test.rb
219
- - test/unit/tags/for_tag_unit_test.rb
220
- - test/unit/tags/if_tag_unit_test.rb
221
- - test/unit/template_unit_test.rb
222
- - test/unit/tokenizer_unit_test.rb
223
- - test/unit/variable_unit_test.rb
251
+ - test/fixtures/en_locale.yml
@@ -1,66 +0,0 @@
1
- require 'set'
2
-
3
- module Liquid
4
- # Strainer is the parent class for the filters system.
5
- # New filters are mixed into the strainer class which is then instantiated for each liquid template render run.
6
- #
7
- # The Strainer only allows method calls defined in filters given to it via Strainer.global_filter,
8
- # Context#add_filters or Template.register_filter
9
- class Strainer #:nodoc:
10
- @@global_strainer = Class.new(Strainer) do
11
- @filter_methods = Set.new
12
- end
13
- @@strainer_class_cache = Hash.new do |hash, filters|
14
- hash[filters] = Class.new(@@global_strainer) do
15
- @filter_methods = @@global_strainer.filter_methods.dup
16
- filters.each { |f| add_filter(f) }
17
- end
18
- end
19
-
20
- def initialize(context)
21
- @context = context
22
- end
23
-
24
- class << self
25
- attr_reader :filter_methods
26
- end
27
-
28
- def self.add_filter(filter)
29
- raise ArgumentError, "Expected module but got: #{filter.class}" unless filter.is_a?(Module)
30
- unless self.include?(filter)
31
- invokable_non_public_methods = (filter.private_instance_methods + filter.protected_instance_methods).select { |m| invokable?(m) }
32
- if invokable_non_public_methods.any?
33
- raise MethodOverrideError, "Filter overrides registered public methods as non public: #{invokable_non_public_methods.join(', ')}"
34
- else
35
- send(:include, filter)
36
- @filter_methods.merge(filter.public_instance_methods.map(&:to_s))
37
- end
38
- end
39
- end
40
-
41
- def self.global_filter(filter)
42
- @@strainer_class_cache.clear
43
- @@global_strainer.add_filter(filter)
44
- end
45
-
46
- def self.invokable?(method)
47
- @filter_methods.include?(method.to_s)
48
- end
49
-
50
- def self.create(context, filters = [])
51
- @@strainer_class_cache[filters].new(context)
52
- end
53
-
54
- def invoke(method, *args)
55
- if self.class.invokable?(method)
56
- send(method, *args)
57
- elsif @context && @context.strict_filters
58
- raise Liquid::UndefinedFilter, "undefined filter #{method}"
59
- else
60
- args.first
61
- end
62
- rescue ::ArgumentError => e
63
- raise Liquid::ArgumentError, e.message, e.backtrace
64
- end
65
- end
66
- end