diff --git a/lib/liquid/template.rb b/lib/liquid/template.rb index c0f189c9..fae8ae33 100644 --- a/lib/liquid/template.rb +++ b/lib/liquid/template.rb @@ -89,10 +89,11 @@ module Liquid when Liquid::Context args.shift when Hash - self.assigns.merge!(args.shift) - Context.new(assigns, registers, @rethrow_errors) + a = args.shift + assigns.each { |k,v| a[k] = v unless a.has_key?(k) } + Context.new(a, registers, @rethrow_errors) when nil - Context.new(assigns, registers, @rethrow_errors) + Context.new(assigns.dup, registers, @rethrow_errors) else raise ArgumentError, "Expect Hash or Liquid::Context as parameter" end diff --git a/test/variable_test.rb b/test/variable_test.rb index bc4d41a5..20968ba3 100644 --- a/test/variable_test.rb +++ b/test/variable_test.rb @@ -138,4 +138,23 @@ class VariableResolutionTest < Test::Unit::TestCase assert_equal 'worked', template.render end + def test_reuse_parsed_template + template = Template.parse(%|{{ greeting }} {{ name }}|) + template.assigns['greeting'] = 'Goodbye' + assert_equal 'Hello Tobi', template.render('greeting' => 'Hello', 'name' => 'Tobi') + assert_equal 'Hello ', template.render('greeting' => 'Hello', 'unknown' => 'Tobi') + assert_equal 'Hello Brian', template.render('greeting' => 'Hello', 'name' => 'Brian') + assert_equal 'Goodbye Brian', template.render('name' => 'Brian') + assert_equal({'greeting'=>'Goodbye'}, template.assigns) + end + + def test_assigns_not_polluted_from_template + template = Template.parse(%|{{ test }}{% assign test = 'bar' %}{{ test }}|) + template.assigns['test'] = 'baz' + assert_equal 'bazbar', template.render + assert_equal 'bazbar', template.render + assert_equal 'foobar', template.render('test' => 'foo') + assert_equal 'bazbar', template.render + end + end \ No newline at end of file