Skip to content

Commit c990360

Browse files
aswamyclaude
andcommitted
Add strict2_parse to increment and decrement tags
Both tags previously accepted any string as a variable name via `markup.strip`. Now they use `parse_with_selected_parser` and validate the variable name with `p.consume(:id)` in strict2 mode. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 0d5c15a commit c990360

4 files changed

Lines changed: 82 additions & 4 deletions

File tree

lib/liquid/tags/decrement.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,29 @@ module Liquid
2323
# {% decrement variable_name %}
2424
# @liquid_syntax_keyword variable_name The name of the variable being decremented.
2525
class Decrement < Tag
26+
include ParserSwitching
27+
2628
attr_reader :variable_name
2729

2830
def initialize(tag_name, markup, options)
2931
super
32+
parse_with_selected_parser(markup)
33+
end
34+
35+
def lax_parse(markup)
3036
@variable_name = markup.strip
3137
end
3238

39+
def strict_parse(markup)
40+
lax_parse(markup)
41+
end
42+
43+
def strict2_parse(markup)
44+
p = @parse_context.new_parser(markup.strip)
45+
@variable_name = p.consume(:id)
46+
p.consume(:end_of_string)
47+
end
48+
3349
def render_to_output_buffer(context, output)
3450
counter_environment = context.environments.first
3551
value = counter_environment[@variable_name] || 0

lib/liquid/tags/increment.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,29 @@ module Liquid
2323
# {% increment variable_name %}
2424
# @liquid_syntax_keyword variable_name The name of the variable being incremented.
2525
class Increment < Tag
26+
include ParserSwitching
27+
2628
attr_reader :variable_name
2729

2830
def initialize(tag_name, markup, options)
2931
super
32+
parse_with_selected_parser(markup)
33+
end
34+
35+
def lax_parse(markup)
3036
@variable_name = markup.strip
3137
end
3238

39+
def strict_parse(markup)
40+
lax_parse(markup)
41+
end
42+
43+
def strict2_parse(markup)
44+
p = @parse_context.new_parser(markup.strip)
45+
@variable_name = p.consume(:id)
46+
p.consume(:end_of_string)
47+
end
48+
3349
def render_to_output_buffer(context, output)
3450
counter_environment = context.environments.first
3551
value = counter_environment[@variable_name] || 0

test/integration/tags/increment_tag_test.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,50 @@ def test_dec
2727
'{%decrement starboard %}',
2828
)
2929
end
30+
31+
def test_increment_strict2_rejects_invalid_variable_name
32+
assert_raises(Liquid::SyntaxError) do
33+
Template.parse('{% increment foo bar %}', error_mode: :strict2)
34+
end
35+
end
36+
37+
def test_increment_strict2_rejects_variable_starting_with_number
38+
assert_raises(Liquid::SyntaxError) do
39+
Template.parse('{% increment 11aa %}', error_mode: :strict2)
40+
end
41+
end
42+
43+
def test_increment_strict2_accepts_valid_variable_name
44+
template = Template.parse('{% increment my-var %}', error_mode: :strict2)
45+
assert_equal('0', template.render)
46+
end
47+
48+
def test_decrement_strict2_rejects_invalid_variable_name
49+
assert_raises(Liquid::SyntaxError) do
50+
Template.parse('{% decrement foo bar %}', error_mode: :strict2)
51+
end
52+
end
53+
54+
def test_decrement_strict2_rejects_variable_starting_with_number
55+
assert_raises(Liquid::SyntaxError) do
56+
Template.parse('{% decrement 11aa %}', error_mode: :strict2)
57+
end
58+
end
59+
60+
def test_decrement_strict2_accepts_valid_variable_name
61+
template = Template.parse('{% decrement my-var %}', error_mode: :strict2)
62+
assert_equal('-1', template.render)
63+
end
64+
65+
def test_increment_strict2_rejects_empty_variable_name
66+
assert_raises(Liquid::SyntaxError) do
67+
Template.parse('{% increment %}', error_mode: :strict2)
68+
end
69+
end
70+
71+
def test_decrement_strict2_rejects_empty_variable_name
72+
assert_raises(Liquid::SyntaxError) do
73+
Template.parse('{% decrement %}', error_mode: :strict2)
74+
end
75+
end
3076
end

test/integration/tags/render_tag_test.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,16 +174,16 @@ def test_break_through_render
174174
def test_increment_is_isolated_between_renders
175175
assert_template_result(
176176
'010',
177-
'{% increment %}{% increment %}{% render "incr" %}',
178-
partials: { 'incr' => '{% increment %}' },
177+
'{% increment port %}{% increment port %}{% render "incr" %}',
178+
partials: { 'incr' => '{% increment port %}' },
179179
)
180180
end
181181

182182
def test_decrement_is_isolated_between_renders
183183
assert_template_result(
184184
'-1-2-1',
185-
'{% decrement %}{% decrement %}{% render "decr" %}',
186-
partials: { 'decr' => '{% decrement %}' },
185+
'{% decrement port %}{% decrement port %}{% render "decr" %}',
186+
partials: { 'decr' => '{% decrement port %}' },
187187
)
188188
end
189189

0 commit comments

Comments
 (0)