liquid 4.0.3 → 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 (125) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +33 -0
  3. data/README.md +6 -0
  4. data/lib/liquid.rb +17 -5
  5. data/lib/liquid/block.rb +31 -14
  6. data/lib/liquid/block_body.rb +164 -54
  7. data/lib/liquid/condition.rb +39 -18
  8. data/lib/liquid/context.rb +106 -51
  9. data/lib/liquid/document.rb +47 -9
  10. data/lib/liquid/drop.rb +4 -2
  11. data/lib/liquid/errors.rb +20 -18
  12. data/lib/liquid/expression.rb +29 -34
  13. data/lib/liquid/extensions.rb +2 -0
  14. data/lib/liquid/file_system.rb +6 -4
  15. data/lib/liquid/forloop_drop.rb +11 -4
  16. data/lib/liquid/i18n.rb +5 -3
  17. data/lib/liquid/interrupts.rb +3 -1
  18. data/lib/liquid/lexer.rb +30 -23
  19. data/lib/liquid/locales/en.yml +3 -1
  20. data/lib/liquid/parse_context.rb +16 -4
  21. data/lib/liquid/parse_tree_visitor.rb +2 -2
  22. data/lib/liquid/parser.rb +30 -18
  23. data/lib/liquid/parser_switching.rb +17 -3
  24. data/lib/liquid/partial_cache.rb +24 -0
  25. data/lib/liquid/profiler.rb +67 -86
  26. data/lib/liquid/profiler/hooks.rb +26 -14
  27. data/lib/liquid/range_lookup.rb +5 -3
  28. data/lib/liquid/register.rb +6 -0
  29. data/lib/liquid/resource_limits.rb +47 -8
  30. data/lib/liquid/standardfilters.rb +63 -44
  31. data/lib/liquid/static_registers.rb +44 -0
  32. data/lib/liquid/strainer_factory.rb +36 -0
  33. data/lib/liquid/strainer_template.rb +53 -0
  34. data/lib/liquid/tablerowloop_drop.rb +6 -4
  35. data/lib/liquid/tag.rb +28 -6
  36. data/lib/liquid/tag/disableable.rb +22 -0
  37. data/lib/liquid/tag/disabler.rb +21 -0
  38. data/lib/liquid/tags/assign.rb +24 -10
  39. data/lib/liquid/tags/break.rb +8 -3
  40. data/lib/liquid/tags/capture.rb +11 -8
  41. data/lib/liquid/tags/case.rb +33 -27
  42. data/lib/liquid/tags/comment.rb +5 -3
  43. data/lib/liquid/tags/continue.rb +8 -3
  44. data/lib/liquid/tags/cycle.rb +25 -14
  45. data/lib/liquid/tags/decrement.rb +6 -3
  46. data/lib/liquid/tags/echo.rb +26 -0
  47. data/lib/liquid/tags/for.rb +68 -44
  48. data/lib/liquid/tags/if.rb +35 -23
  49. data/lib/liquid/tags/ifchanged.rb +11 -10
  50. data/lib/liquid/tags/include.rb +34 -47
  51. data/lib/liquid/tags/increment.rb +7 -3
  52. data/lib/liquid/tags/raw.rb +14 -11
  53. data/lib/liquid/tags/render.rb +84 -0
  54. data/lib/liquid/tags/table_row.rb +23 -19
  55. data/lib/liquid/tags/unless.rb +15 -15
  56. data/lib/liquid/template.rb +55 -71
  57. data/lib/liquid/template_factory.rb +9 -0
  58. data/lib/liquid/tokenizer.rb +17 -9
  59. data/lib/liquid/usage.rb +8 -0
  60. data/lib/liquid/utils.rb +5 -3
  61. data/lib/liquid/variable.rb +46 -41
  62. data/lib/liquid/variable_lookup.rb +8 -6
  63. data/lib/liquid/version.rb +2 -1
  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 -83
  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 -22
  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 +2 -2
  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 +73 -47
  121. data/lib/liquid/strainer.rb +0 -66
  122. data/lib/liquid/truffle.rb +0 -5
  123. data/test/truffle/truffle_test.rb +0 -9
  124. data/test/unit/context_unit_test.rb +0 -489
  125. data/test/unit/strainer_unit_test.rb +0 -164
@@ -1,164 +0,0 @@
1
- require 'test_helper'
2
-
3
- class StrainerUnitTest < Minitest::Test
4
- include Liquid
5
-
6
- module AccessScopeFilters
7
- def public_filter
8
- "public"
9
- end
10
-
11
- def private_filter
12
- "private"
13
- end
14
- private :private_filter
15
- end
16
-
17
- Strainer.global_filter(AccessScopeFilters)
18
-
19
- def test_strainer
20
- strainer = Strainer.create(nil)
21
- assert_equal 5, strainer.invoke('size', 'input')
22
- assert_equal "public", strainer.invoke("public_filter")
23
- end
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
-
32
- def test_stainer_argument_error_contains_backtrace
33
- strainer = Strainer.create(nil)
34
- begin
35
- strainer.invoke("public_filter", 1)
36
- rescue Liquid::ArgumentError => e
37
- assert_match(
38
- /\ALiquid error: wrong number of arguments \((1 for 0|given 1, expected 0)\)\z/,
39
- e.message)
40
- assert_equal e.backtrace[0].split(':')[0], __FILE__
41
- end
42
- end
43
-
44
- def test_strainer_only_invokes_public_filter_methods
45
- strainer = Strainer.create(nil)
46
- assert_equal false, strainer.class.invokable?('__test__')
47
- assert_equal false, strainer.class.invokable?('test')
48
- assert_equal false, strainer.class.invokable?('instance_eval')
49
- assert_equal false, strainer.class.invokable?('__send__')
50
- assert_equal true, strainer.class.invokable?('size') # from the standard lib
51
- end
52
-
53
- def test_strainer_returns_nil_if_no_filter_method_found
54
- strainer = Strainer.create(nil)
55
- assert_nil strainer.invoke("private_filter")
56
- assert_nil strainer.invoke("undef_the_filter")
57
- end
58
-
59
- def test_strainer_returns_first_argument_if_no_method_and_arguments_given
60
- strainer = Strainer.create(nil)
61
- assert_equal "password", strainer.invoke("undef_the_method", "password")
62
- end
63
-
64
- def test_strainer_only_allows_methods_defined_in_filters
65
- strainer = Strainer.create(nil)
66
- assert_equal "1 + 1", strainer.invoke("instance_eval", "1 + 1")
67
- assert_equal "puts", strainer.invoke("__send__", "puts", "Hi Mom")
68
- assert_equal "has_method?", strainer.invoke("invoke", "has_method?", "invoke")
69
- end
70
-
71
- def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation
72
- a = Module.new
73
- b = Module.new
74
- strainer = Strainer.create(nil, [a, b])
75
- assert_kind_of Strainer, strainer
76
- assert_kind_of a, strainer
77
- assert_kind_of b, strainer
78
- assert_kind_of Liquid::StandardFilters, strainer
79
- end
80
-
81
- def test_add_filter_when_wrong_filter_class
82
- c = Context.new
83
- s = c.strainer
84
- wrong_filter = ->(v) { v.reverse }
85
-
86
- assert_raises ArgumentError do
87
- s.class.add_filter(wrong_filter)
88
- end
89
- end
90
-
91
- module PrivateMethodOverrideFilter
92
- private
93
-
94
- def public_filter
95
- "overriden as private"
96
- end
97
- end
98
-
99
- def test_add_filter_raises_when_module_privately_overrides_registered_public_methods
100
- strainer = Context.new.strainer
101
-
102
- error = assert_raises(Liquid::MethodOverrideError) do
103
- strainer.class.add_filter(PrivateMethodOverrideFilter)
104
- end
105
- assert_equal 'Liquid error: Filter overrides registered public methods as non public: public_filter', error.message
106
- end
107
-
108
- module ProtectedMethodOverrideFilter
109
- protected
110
-
111
- def public_filter
112
- "overriden as protected"
113
- end
114
- end
115
-
116
- def test_add_filter_raises_when_module_overrides_registered_public_method_as_protected
117
- strainer = Context.new.strainer
118
-
119
- error = assert_raises(Liquid::MethodOverrideError) do
120
- strainer.class.add_filter(ProtectedMethodOverrideFilter)
121
- end
122
- assert_equal 'Liquid error: Filter overrides registered public methods as non public: public_filter', error.message
123
- end
124
-
125
- module PublicMethodOverrideFilter
126
- def public_filter
127
- "public"
128
- end
129
- end
130
-
131
- def test_add_filter_does_not_raise_when_module_overrides_previously_registered_method
132
- strainer = Context.new.strainer
133
- strainer.class.add_filter(PublicMethodOverrideFilter)
134
- assert strainer.class.filter_methods.include?('public_filter')
135
- end
136
-
137
- module LateAddedFilter
138
- def late_added_filter(input)
139
- "filtered"
140
- end
141
- end
142
-
143
- def test_global_filter_clears_cache
144
- assert_equal 'input', Strainer.create(nil).invoke('late_added_filter', 'input')
145
- Strainer.global_filter(LateAddedFilter)
146
- assert_equal 'filtered', Strainer.create(nil).invoke('late_added_filter', 'input')
147
- end
148
-
149
- def test_add_filter_does_not_include_already_included_module
150
- mod = Module.new do
151
- class << self
152
- attr_accessor :include_count
153
- def included(mod)
154
- self.include_count += 1
155
- end
156
- end
157
- self.include_count = 0
158
- end
159
- strainer = Context.new.strainer
160
- strainer.class.add_filter(mod)
161
- strainer.class.add_filter(mod)
162
- assert_equal 1, mod.include_count
163
- end
164
- end # StrainerTest