diff --git a/lib/liquid/tags/include.rb b/lib/liquid/tags/include.rb index 5b3ad8e0..d451a636 100644 --- a/lib/liquid/tags/include.rb +++ b/lib/liquid/tags/include.rb @@ -70,9 +70,15 @@ module Liquid old_template_name = context.template_name old_partial = context.partial + begin - context.template_name = template_name - context.partial = true + context.template_name = if Template.file_system.respond_to?(:actual_template_name) + Template.file_system.actual_template_name(template_name).delete_suffix('.liquid') + else + template_name + end + + context.partial = true context.stack do @attributes.each do |key, value| context[key] = context.evaluate(value) diff --git a/lib/liquid/tags/render.rb b/lib/liquid/tags/render.rb index 0dc7215d..a29c3622 100644 --- a/lib/liquid/tags/render.rb +++ b/lib/liquid/tags/render.rb @@ -76,7 +76,13 @@ module Liquid render_partial_func = ->(var, forloop) { inner_context = context.new_isolated_subcontext - inner_context.template_name = template_name + + inner_context.template_name = if Template.file_system.respond_to?(:actual_template_name) + Template.file_system.actual_template_name(template_name).delete_suffix('.liquid') + else + template_name + end + inner_context.partial = true inner_context['forloop'] = forloop if forloop diff --git a/test/integration/tags/include_tag_test.rb b/test/integration/tags/include_tag_test.rb index 442ab395..245acf0f 100644 --- a/test/integration/tags/include_tag_test.rb +++ b/test/integration/tags/include_tag_test.rb @@ -356,4 +356,17 @@ class IncludeTagTest < Minitest::Test partials: { 'break' => "{% break %}" }, ) end + + def test_include_tag_renders_actual_template_name_for_error + original_file_system = Liquid::Template.file_system + + Liquid::Template.file_system = MemoryFileSystem.new( + '/some/path/snippets/foo.liquid' => "{{ foo.standard_error }}", + ) + + template = Liquid::Template.parse("{% include 'foo' with errors %}", line_numbers: true) + assert_equal('Liquid error (/some/path/snippets/foo line 1): standard error', template.render('errors' => ErrorDrop.new)) + ensure + Liquid::Template.file_system = original_file_system + end end # IncludeTagTest diff --git a/test/integration/tags/render_tag_test.rb b/test/integration/tags/render_tag_test.rb index f9ffc2f3..c26d2258 100644 --- a/test/integration/tags/render_tag_test.rb +++ b/test/integration/tags/render_tag_test.rb @@ -264,4 +264,17 @@ class RenderTagTest < Minitest::Test }, ) end + + def test_render_tag_renders_actual_template_name_for_error + original_file_system = Liquid::Template.file_system + + Liquid::Template.file_system = MemoryFileSystem.new( + '/some/path/snippets/foo.liquid' => "{{ foo.standard_error }}", + ) + + template = Liquid::Template.parse("{% render 'foo' with errors %}", line_numbers: true) + assert_equal('Liquid error (/some/path/snippets/foo line 1): standard error', template.render('errors' => ErrorDrop.new)) + ensure + Liquid::Template.file_system = original_file_system + end end diff --git a/test/test_helper.rb b/test/test_helper.rb index c1514bb3..ed55ec40 100755 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -214,3 +214,25 @@ class StubTemplateFactory Liquid::Template.new end end + +class MemoryFileSystem + def initialize(values) + # values is a hash of template_path => template_source + @snippets = {} + values.each do |file_path, source| + key = file_path.split('/').last.delete_suffix(".liquid") + @snippets[key] = { + source: source, + actual_template_name: file_path, + } + end + end + + def read_template_file(template_name) + @snippets[template_name][:source] + end + + def actual_template_name(template_name) + @snippets[template_name][:actual_template_name] + end +end