mirror of
https://github.com/kemko/liquid.git
synced 2026-01-01 15:55:40 +03:00
render_to_output_buffer
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -7,3 +7,4 @@ pkg
|
|||||||
.ruby-version
|
.ruby-version
|
||||||
Gemfile.lock
|
Gemfile.lock
|
||||||
.bundle
|
.bundle
|
||||||
|
.byebug_history
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# This configuration was generated by
|
# This configuration was generated by
|
||||||
# `rubocop --auto-gen-config`
|
# `rubocop --auto-gen-config`
|
||||||
# on 2019-03-19 11:04:37 -0400 using RuboCop version 0.53.0.
|
# on 2019-04-22 19:11:24 -0400 using RuboCop version 0.53.0.
|
||||||
# The point is for the user to remove these configuration records
|
# The point is for the user to remove these configuration records
|
||||||
# one by one as the offenses are removed from the code base.
|
# one by one as the offenses are removed from the code base.
|
||||||
# Note that changes in the inspected code, or installation of new
|
# Note that changes in the inspected code, or installation of new
|
||||||
@@ -46,18 +46,18 @@ Lint/Void:
|
|||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/liquid/parse_context.rb'
|
- 'lib/liquid/parse_context.rb'
|
||||||
|
|
||||||
# Offense count: 54
|
# Offense count: 53
|
||||||
Metrics/AbcSize:
|
Metrics/AbcSize:
|
||||||
Max: 56
|
Max: 56
|
||||||
|
|
||||||
# Offense count: 12
|
# Offense count: 12
|
||||||
Metrics/CyclomaticComplexity:
|
Metrics/CyclomaticComplexity:
|
||||||
Max: 12
|
Max: 13
|
||||||
|
|
||||||
# Offense count: 112
|
# Offense count: 112
|
||||||
# Configuration parameters: CountComments.
|
# Configuration parameters: CountComments.
|
||||||
Metrics/MethodLength:
|
Metrics/MethodLength:
|
||||||
Max: 37
|
Max: 38
|
||||||
|
|
||||||
# Offense count: 8
|
# Offense count: 8
|
||||||
Metrics/PerceivedComplexity:
|
Metrics/PerceivedComplexity:
|
||||||
@@ -90,7 +90,7 @@ Naming/UncommunicativeMethodParamName:
|
|||||||
- 'test/integration/template_test.rb'
|
- 'test/integration/template_test.rb'
|
||||||
- 'test/unit/condition_unit_test.rb'
|
- 'test/unit/condition_unit_test.rb'
|
||||||
|
|
||||||
# Offense count: 10
|
# Offense count: 12
|
||||||
# Cop supports --auto-correct.
|
# Cop supports --auto-correct.
|
||||||
# Configuration parameters: EnforcedStyle.
|
# Configuration parameters: EnforcedStyle.
|
||||||
# SupportedStyles: prefer_alias, prefer_alias_method
|
# SupportedStyles: prefer_alias, prefer_alias_method
|
||||||
@@ -253,7 +253,7 @@ Style/WhileUntilModifier:
|
|||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/liquid/tags/case.rb'
|
- 'lib/liquid/tags/case.rb'
|
||||||
|
|
||||||
# Offense count: 640
|
# Offense count: 648
|
||||||
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
||||||
# URISchemes: http, https
|
# URISchemes: http, https
|
||||||
Metrics/LineLength:
|
Metrics/LineLength:
|
||||||
|
|||||||
@@ -13,8 +13,9 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
# For backwards compatibility
|
||||||
@body.render(context, output)
|
def render(context)
|
||||||
|
@body.render(context)
|
||||||
end
|
end
|
||||||
|
|
||||||
def blank?
|
def blank?
|
||||||
|
|||||||
@@ -66,14 +66,19 @@ module Liquid
|
|||||||
@blank
|
@blank
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render(context)
|
||||||
|
render_to_output_buffer(context, '')
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_to_output_buffer(context, output)
|
||||||
context.resource_limits.render_score += @nodelist.length
|
context.resource_limits.render_score += @nodelist.length
|
||||||
|
|
||||||
idx = 0
|
idx = 0
|
||||||
while node = @nodelist[idx]
|
while node = @nodelist[idx]
|
||||||
|
previous_output_size = output.bytesize
|
||||||
|
|
||||||
case node
|
case node
|
||||||
when String
|
when String
|
||||||
check_resources(context, node)
|
|
||||||
output << node
|
output << node
|
||||||
when Variable
|
when Variable
|
||||||
render_node(context, output, node)
|
render_node(context, output, node)
|
||||||
@@ -91,6 +96,8 @@ module Liquid
|
|||||||
break if context.interrupt? # might have happened through an include
|
break if context.interrupt? # might have happened through an include
|
||||||
end
|
end
|
||||||
idx += 1
|
idx += 1
|
||||||
|
|
||||||
|
raise_if_resource_limits_reached(context, output.bytesize - previous_output_size)
|
||||||
end
|
end
|
||||||
|
|
||||||
output
|
output
|
||||||
@@ -99,10 +106,7 @@ module Liquid
|
|||||||
private
|
private
|
||||||
|
|
||||||
def render_node(context, output, node)
|
def render_node(context, output, node)
|
||||||
node.render(context, output)
|
node.render_to_output_buffer(context, output)
|
||||||
check_resources(context, output)
|
|
||||||
rescue MemoryError => e
|
|
||||||
raise e
|
|
||||||
rescue UndefinedVariable, UndefinedDropMethod, UndefinedFilter => e
|
rescue UndefinedVariable, UndefinedDropMethod, UndefinedFilter => e
|
||||||
context.handle_error(e, node.line_number)
|
context.handle_error(e, node.line_number)
|
||||||
rescue ::StandardError => e
|
rescue ::StandardError => e
|
||||||
@@ -110,8 +114,8 @@ module Liquid
|
|||||||
output << context.handle_error(e, line_number)
|
output << context.handle_error(e, line_number)
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_resources(context, output)
|
def raise_if_resource_limits_reached(context, length)
|
||||||
context.resource_limits.render_length = output.bytesize
|
context.resource_limits.render_length += length
|
||||||
return unless context.resource_limits.reached?
|
return unless context.resource_limits.reached?
|
||||||
raise MemoryError.new("Memory limits exceeded".freeze)
|
raise MemoryError.new("Memory limits exceeded".freeze)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -11,13 +11,13 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
class Include < Tag
|
class Include < Tag
|
||||||
def render_with_profiling(context, output)
|
def render_to_output_buffer_with_profiling(context, output)
|
||||||
Profiler.profile_children(context.evaluate(@template_name_expr).to_s) do
|
Profiler.profile_children(context.evaluate(@template_name_expr).to_s) do
|
||||||
render_without_profiling(context, output)
|
render_to_output_buffer_without_profiling(context, output)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
alias_method :render_without_profiling, :render
|
alias_method :render_to_output_buffer_without_profiling, :render_to_output_buffer
|
||||||
alias_method :render, :render_with_profiling
|
alias_method :render_to_output_buffer, :render_to_output_buffer_with_profiling
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -32,7 +32,15 @@ module Liquid
|
|||||||
self.class.name.downcase
|
self.class.name.downcase
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(_context, output = '')
|
def render(_context)
|
||||||
|
''.freeze
|
||||||
|
end
|
||||||
|
|
||||||
|
# For backwards compatibility with custom tags. In a future release, the semantics
|
||||||
|
# of the `render_to_output_buffer` method will become the default and the `render`
|
||||||
|
# method will be removed.
|
||||||
|
def render_to_output_buffer(context, output)
|
||||||
|
output << render(context)
|
||||||
output
|
output
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
val = @from.render(context, nil)
|
val = @from.render(context)
|
||||||
context.scopes.last[@to] = val
|
context.scopes.last[@to] = val
|
||||||
context.resource_limits.assign_score += assign_score_of(val)
|
context.resource_limits.assign_score += assign_score_of(val)
|
||||||
output
|
output
|
||||||
|
|||||||
@@ -22,10 +22,11 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
|
previous_output_size = output.bytesize
|
||||||
super
|
super
|
||||||
context.scopes.last[@to] = output
|
context.scopes.last[@to] = output
|
||||||
context.resource_limits.assign_score = output.bytesize
|
context.resource_limits.assign_score += (output.bytesize - previous_output_size)
|
||||||
output
|
output
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -38,16 +38,16 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
context.stack do
|
context.stack do
|
||||||
execute_else_block = true
|
execute_else_block = true
|
||||||
|
|
||||||
@blocks.each do |block|
|
@blocks.each do |block|
|
||||||
if block.else?
|
if block.else?
|
||||||
block.attachment.render(context, output) if execute_else_block
|
block.attachment.render_to_output_buffer(context, output) if execute_else_block
|
||||||
elsif block.evaluate(context)
|
elsif block.evaluate(context)
|
||||||
execute_else_block = false
|
execute_else_block = false
|
||||||
block.attachment.render(context, output)
|
block.attachment.render_to_output_buffer(context, output)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
class Comment < Block
|
class Comment < Block
|
||||||
def render(_context, output = '')
|
def render_to_output_buffer(_context, output)
|
||||||
output
|
output
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
context.registers[:cycle] ||= {}
|
context.registers[:cycle] ||= {}
|
||||||
|
|
||||||
context.stack do
|
context.stack do
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ module Liquid
|
|||||||
@variable = markup.strip
|
@variable = markup.strip
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
value = context.environments.first[@variable] ||= 0
|
value = context.environments.first[@variable] ||= 0
|
||||||
value -= 1
|
value -= 1
|
||||||
context.environments.first[@variable] = value
|
context.environments.first[@variable] = value
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ module Liquid
|
|||||||
@else_block = BlockBody.new
|
@else_block = BlockBody.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
segment = collection_segment(context)
|
segment = collection_segment(context)
|
||||||
|
|
||||||
if segment.empty?
|
if segment.empty?
|
||||||
@@ -78,6 +78,8 @@ module Liquid
|
|||||||
else
|
else
|
||||||
render_segment(context, output, segment)
|
render_segment(context, output, segment)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
output
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
@@ -155,7 +157,7 @@ module Liquid
|
|||||||
|
|
||||||
segment.each do |item|
|
segment.each do |item|
|
||||||
context[@variable_name] = item
|
context[@variable_name] = item
|
||||||
@for_block.render(context, output)
|
@for_block.render_to_output_buffer(context, output)
|
||||||
loop_vars.send(:increment!)
|
loop_vars.send(:increment!)
|
||||||
|
|
||||||
# Handle any interrupts if they exist.
|
# Handle any interrupts if they exist.
|
||||||
@@ -188,7 +190,7 @@ module Liquid
|
|||||||
|
|
||||||
def render_else(context, output)
|
def render_else(context, output)
|
||||||
if @else_block
|
if @else_block
|
||||||
@else_block.render(context, output)
|
@else_block.render_to_output_buffer(context, output)
|
||||||
else
|
else
|
||||||
output
|
output
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -39,11 +39,11 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output)
|
def render_to_output_buffer(context, output)
|
||||||
context.stack do
|
context.stack do
|
||||||
@blocks.each do |block|
|
@blocks.each do |block|
|
||||||
if block.evaluate(context)
|
if block.evaluate(context)
|
||||||
return block.attachment.render(context, output)
|
return block.attachment.render_to_output_buffer(context, output)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
class Ifchanged < Block
|
class Ifchanged < Block
|
||||||
def render(context, output)
|
def render_to_output_buffer(context, output)
|
||||||
context.stack do
|
context.stack do
|
||||||
block_output = super(context, '')
|
block_output = ''
|
||||||
|
super(context, block_output)
|
||||||
|
|
||||||
if block_output != context.registers[:ifchanged]
|
if block_output != context.registers[:ifchanged]
|
||||||
context.registers[:ifchanged] = block_output
|
context.registers[:ifchanged] = block_output
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ module Liquid
|
|||||||
def parse(_tokens)
|
def parse(_tokens)
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output)
|
def render_to_output_buffer(context, output)
|
||||||
template_name = context.evaluate(@template_name_expr)
|
template_name = context.evaluate(@template_name_expr)
|
||||||
raise ArgumentError.new(options[:locale].t("errors.argument.include")) unless template_name
|
raise ArgumentError.new(options[:locale].t("errors.argument.include")) unless template_name
|
||||||
|
|
||||||
@@ -68,11 +68,11 @@ module Liquid
|
|||||||
if variable.is_a?(Array)
|
if variable.is_a?(Array)
|
||||||
variable.each do |var|
|
variable.each do |var|
|
||||||
context[context_variable_name] = var
|
context[context_variable_name] = var
|
||||||
partial.render(context, output: output)
|
partial.render_to_output_buffer(context, output)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
context[context_variable_name] = variable
|
context[context_variable_name] = variable
|
||||||
partial.render(context, output: output)
|
partial.render_to_output_buffer(context, output)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
ensure
|
ensure
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ module Liquid
|
|||||||
@variable = markup.strip
|
@variable = markup.strip
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
value = context.environments.first[@variable] ||= 0
|
value = context.environments.first[@variable] ||= 0
|
||||||
context.environments.first[@variable] = value + 1
|
context.environments.first[@variable] = value + 1
|
||||||
output << value.to_s
|
output << value.to_s
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ module Liquid
|
|||||||
raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_never_closed".freeze, block_name: block_name))
|
raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_never_closed".freeze, block_name: block_name))
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(_context, output = '')
|
def render_to_output_buffer(_context, output)
|
||||||
output << @body
|
output << @body
|
||||||
output
|
output
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
collection = context.evaluate(@collection_name) or return ''.freeze
|
collection = context.evaluate(@collection_name) or return ''.freeze
|
||||||
|
|
||||||
from = @attributes.key?('offset'.freeze) ? context.evaluate(@attributes['offset'.freeze]).to_i : 0
|
from = @attributes.key?('offset'.freeze) ? context.evaluate(@attributes['offset'.freeze]).to_i : 0
|
||||||
|
|||||||
@@ -6,18 +6,18 @@ module Liquid
|
|||||||
# {% unless x < 0 %} x is greater than zero {% endunless %}
|
# {% unless x < 0 %} x is greater than zero {% endunless %}
|
||||||
#
|
#
|
||||||
class Unless < If
|
class Unless < If
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
context.stack do
|
context.stack do
|
||||||
# First condition is interpreted backwards ( if not )
|
# First condition is interpreted backwards ( if not )
|
||||||
first_block = @blocks.first
|
first_block = @blocks.first
|
||||||
unless first_block.evaluate(context)
|
unless first_block.evaluate(context)
|
||||||
return first_block.attachment.render(context, output)
|
return first_block.attachment.render_to_output_buffer(context, output)
|
||||||
end
|
end
|
||||||
|
|
||||||
# After the first condition unless works just like if
|
# After the first condition unless works just like if
|
||||||
@blocks[1..-1].each do |block|
|
@blocks[1..-1].each do |block|
|
||||||
if block.evaluate(context)
|
if block.evaluate(context)
|
||||||
return block.attachment.render(context, output)
|
return block.attachment.render_to_output_buffer(context, output)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -207,11 +207,9 @@ module Liquid
|
|||||||
begin
|
begin
|
||||||
# render the nodelist.
|
# render the nodelist.
|
||||||
# for performance reasons we get an array back here. join will make a string out of it.
|
# for performance reasons we get an array back here. join will make a string out of it.
|
||||||
result = with_profiling(context) do
|
with_profiling(context) do
|
||||||
output ||= self.class.output_buffer.clear
|
@root.render_to_output_buffer(context, output || '')
|
||||||
@root.render(context, output)
|
|
||||||
end
|
end
|
||||||
result.respond_to?(:join) ? result.join : result
|
|
||||||
rescue Liquid::MemoryError => e
|
rescue Liquid::MemoryError => e
|
||||||
context.handle_error(e)
|
context.handle_error(e)
|
||||||
ensure
|
ensure
|
||||||
@@ -219,15 +217,15 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.output_buffer
|
|
||||||
@output_buffer ||= String.new(capacity: 1024)
|
|
||||||
end
|
|
||||||
|
|
||||||
def render!(*args)
|
def render!(*args)
|
||||||
@rethrow_errors = true
|
@rethrow_errors = true
|
||||||
render(*args)
|
render(*args)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def render_to_output_buffer(context, output)
|
||||||
|
render(context, output: output)
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def tokenize(source)
|
def tokenize(source)
|
||||||
|
|||||||
@@ -78,30 +78,28 @@ module Liquid
|
|||||||
filterargs
|
filterargs
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render(context)
|
||||||
obj = @filters.inject(context.evaluate(@name)) do |output, (filter_name, filter_args, filter_kwargs)|
|
obj = @filters.inject(context.evaluate(@name)) do |output, (filter_name, filter_args, filter_kwargs)|
|
||||||
filter_args = evaluate_filter_expressions(context, filter_args, filter_kwargs)
|
filter_args = evaluate_filter_expressions(context, filter_args, filter_kwargs)
|
||||||
context.invoke(filter_name, output, *filter_args)
|
context.invoke(filter_name, output, *filter_args)
|
||||||
end
|
end
|
||||||
|
|
||||||
obj = context.apply_global_filter(obj)
|
obj = context.apply_global_filter(obj)
|
||||||
|
|
||||||
taint_check(context, obj)
|
taint_check(context, obj)
|
||||||
|
obj
|
||||||
|
end
|
||||||
|
|
||||||
if output
|
def render_to_output_buffer(context, output)
|
||||||
if obj.is_a?(Array)
|
obj = render(context)
|
||||||
output << obj.join
|
|
||||||
elsif obj.nil?
|
|
||||||
elsif !obj.is_a?(String)
|
|
||||||
output << obj.to_s
|
|
||||||
else
|
|
||||||
output << obj
|
|
||||||
end
|
|
||||||
|
|
||||||
output
|
if obj.is_a?(Array)
|
||||||
|
output << obj.join
|
||||||
|
elsif obj.nil?
|
||||||
else
|
else
|
||||||
obj
|
output << obj.to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
|
output
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class CommentForm < Liquid::Block
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
article = context[@variable_name]
|
article = context[@variable_name]
|
||||||
|
|
||||||
context.stack do
|
context.stack do
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class Paginate < Liquid::Block
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
@context = context
|
@context = context
|
||||||
|
|
||||||
context.stack do
|
context.stack do
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
require 'test_helper'
|
require 'test_helper'
|
||||||
|
|
||||||
class FoobarTag < Liquid::Tag
|
class FoobarTag < Liquid::Tag
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
output << ' '
|
output << ' '
|
||||||
output
|
output
|
||||||
end
|
end
|
||||||
|
|
||||||
Liquid::Template.register_tag('foobar', FoobarTag)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class BlankTestFileSystem
|
class BlankTestFileSystem
|
||||||
@@ -32,7 +30,9 @@ class BlankTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_new_tags_are_not_blank_by_default
|
def test_new_tags_are_not_blank_by_default
|
||||||
assert_template_result(" " * N, wrap_in_for("{% foobar %}"))
|
with_custom_tag('foobar', FoobarTag) do
|
||||||
|
assert_template_result(" " * N, wrap_in_for("{% foobar %}"))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_loops_are_blank
|
def test_loops_are_blank
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class CustomInclude < Liquid::Tag
|
|||||||
def parse(tokens)
|
def parse(tokens)
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context, output = '')
|
def render_to_output_buffer(context, output)
|
||||||
output << @template_name[1..-2]
|
output << @template_name[1..-2]
|
||||||
output
|
output
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -177,31 +177,31 @@ class TemplateTest < Minitest::Test
|
|||||||
|
|
||||||
def test_render_length_persists_between_blocks
|
def test_render_length_persists_between_blocks
|
||||||
t = Template.parse("{% if true %}aaaa{% endif %}")
|
t = Template.parse("{% if true %}aaaa{% endif %}")
|
||||||
t.resource_limits.render_length_limit = 3
|
t.resource_limits.render_length_limit = 7
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
t.resource_limits.render_length_limit = 4
|
t.resource_limits.render_length_limit = 8
|
||||||
assert_equal "aaaa", t.render
|
assert_equal "aaaa", t.render
|
||||||
|
|
||||||
t = Template.parse("{% if true %}aaaa{% endif %}{% if true %}bbb{% endif %}")
|
t = Template.parse("{% if true %}aaaa{% endif %}{% if true %}bbb{% endif %}")
|
||||||
t.resource_limits.render_length_limit = 6
|
t.resource_limits.render_length_limit = 13
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
t.resource_limits.render_length_limit = 7
|
t.resource_limits.render_length_limit = 14
|
||||||
assert_equal "aaaabbb", t.render
|
assert_equal "aaaabbb", t.render
|
||||||
|
|
||||||
t = Template.parse("{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}")
|
t = Template.parse("{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}")
|
||||||
t.resource_limits.render_length_limit = 4
|
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render
|
|
||||||
t.resource_limits.render_length_limit = 5
|
t.resource_limits.render_length_limit = 5
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
t.resource_limits.render_length_limit = 6
|
t.resource_limits.render_length_limit = 11
|
||||||
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
|
t.resource_limits.render_length_limit = 12
|
||||||
assert_equal "ababab", t.render
|
assert_equal "ababab", t.render
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_render_length_uses_number_of_bytes_not_characters
|
def test_render_length_uses_number_of_bytes_not_characters
|
||||||
t = Template.parse("{% if true %}すごい{% endif %}")
|
t = Template.parse("{% if true %}すごい{% endif %}")
|
||||||
t.resource_limits.render_length_limit = 8
|
t.resource_limits.render_length_limit = 10
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
t.resource_limits.render_length_limit = 9
|
t.resource_limits.render_length_limit = 18
|
||||||
assert_equal "すごい", t.render
|
assert_equal "すごい", t.render
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,13 @@ module Minitest
|
|||||||
ensure
|
ensure
|
||||||
Liquid::Template.error_mode = old_mode
|
Liquid::Template.error_mode = old_mode
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def with_custom_tag(tag_name, tag_class)
|
||||||
|
Liquid::Template.register_tag(tag_name, tag_class)
|
||||||
|
yield
|
||||||
|
ensure
|
||||||
|
Liquid::Template.tags.delete(tag_name)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -44,10 +44,47 @@ class BlockUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_with_custom_tag
|
def test_with_custom_tag
|
||||||
Liquid::Template.register_tag("testtag", Block)
|
with_custom_tag('testtag', Block) do
|
||||||
assert Liquid::Template.parse("{% testtag %} {% endtesttag %}")
|
assert Liquid::Template.parse("{% testtag %} {% endtesttag %}")
|
||||||
ensure
|
end
|
||||||
Liquid::Template.tags.delete('testtag')
|
end
|
||||||
|
|
||||||
|
def test_custom_block_tags_have_a_default_render_to_output_buffer_method_for_backwards_compatibility
|
||||||
|
klass1 = Class.new(Block) do
|
||||||
|
def render(*)
|
||||||
|
'hello'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
with_custom_tag('blabla', klass1) do
|
||||||
|
template = Liquid::Template.parse("{% blabla %} bla {% endblabla %}")
|
||||||
|
|
||||||
|
assert_equal 'hello', template.render
|
||||||
|
|
||||||
|
buf = ''
|
||||||
|
output = template.render({}, output: buf)
|
||||||
|
assert_equal 'hello', output
|
||||||
|
assert_equal 'hello', buf
|
||||||
|
assert_equal buf.object_id, output.object_id
|
||||||
|
end
|
||||||
|
|
||||||
|
klass2 = Class.new(klass1) do
|
||||||
|
def render(*)
|
||||||
|
'foo' + super + 'bar'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
with_custom_tag('blabla', klass2) do
|
||||||
|
template = Liquid::Template.parse("{% blabla %} foo {% endblabla %}")
|
||||||
|
|
||||||
|
assert_equal 'foohellobar', template.render
|
||||||
|
|
||||||
|
buf = ''
|
||||||
|
output = template.render({}, output: buf)
|
||||||
|
assert_equal 'foohellobar', output
|
||||||
|
assert_equal 'foohellobar', buf
|
||||||
|
assert_equal buf.object_id, output.object_id
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@@ -18,4 +18,42 @@ class TagUnitTest < Minitest::Test
|
|||||||
tag = Tag.parse("some_tag", "", Tokenizer.new(""), ParseContext.new)
|
tag = Tag.parse("some_tag", "", Tokenizer.new(""), ParseContext.new)
|
||||||
assert_equal 'some_tag', tag.tag_name
|
assert_equal 'some_tag', tag.tag_name
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_custom_tags_have_a_default_render_to_output_buffer_method_for_backwards_compatibility
|
||||||
|
klass1 = Class.new(Tag) do
|
||||||
|
def render(*)
|
||||||
|
'hello'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
with_custom_tag('blabla', klass1) do
|
||||||
|
template = Liquid::Template.parse("{% blabla %}")
|
||||||
|
|
||||||
|
assert_equal 'hello', template.render
|
||||||
|
|
||||||
|
buf = ''
|
||||||
|
output = template.render({}, output: buf)
|
||||||
|
assert_equal 'hello', output
|
||||||
|
assert_equal 'hello', buf
|
||||||
|
assert_equal buf.object_id, output.object_id
|
||||||
|
end
|
||||||
|
|
||||||
|
klass2 = Class.new(klass1) do
|
||||||
|
def render(*)
|
||||||
|
'foo' + super + 'bar'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
with_custom_tag('blabla', klass2) do
|
||||||
|
template = Liquid::Template.parse("{% blabla %}")
|
||||||
|
|
||||||
|
assert_equal 'foohellobar', template.render
|
||||||
|
|
||||||
|
buf = ''
|
||||||
|
output = template.render({}, output: buf)
|
||||||
|
assert_equal 'foohellobar', output
|
||||||
|
assert_equal 'foohellobar', buf
|
||||||
|
assert_equal buf.object_id, output.object_id
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user