From 2f128a82e66f181577ff77d83d4ca02659aa8a8d Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Mon, 25 Feb 2019 11:53:55 -0800 Subject: Always pass a format to the ActionView::Template constructor This means we can eliminate nil checks and remove some mutations from the `decorate` method. --- actionpack/test/dispatch/debug_exceptions_test.rb | 2 +- actionview/lib/action_view/template.rb | 7 +++++-- actionview/lib/action_view/template/resolver.rb | 18 +++++++++++++----- actionview/lib/action_view/testing/resolvers.rb | 4 ++-- actionview/test/abstract_unit.rb | 2 +- actionview/test/template/template_test.rb | 6 ++++-- 6 files changed, 26 insertions(+), 13 deletions(-) diff --git a/actionpack/test/dispatch/debug_exceptions_test.rb b/actionpack/test/dispatch/debug_exceptions_test.rb index 6914fb66f9..c33b0e1c14 100644 --- a/actionpack/test/dispatch/debug_exceptions_test.rb +++ b/actionpack/test/dispatch/debug_exceptions_test.rb @@ -39,7 +39,7 @@ class DebugExceptionsTest < ActionDispatch::IntegrationTest def call(env) env["action_dispatch.show_detailed_exceptions"] = @detailed req = ActionDispatch::Request.new(env) - template = ActionView::Template.new(File.read(__FILE__), __FILE__, ActionView::Template::Handlers::Raw.new, {}) + template = ActionView::Template.new(File.read(__FILE__), __FILE__, ActionView::Template::Handlers::Raw.new, format: :html) case req.path when "/pass" diff --git a/actionview/lib/action_view/template.rb b/actionview/lib/action_view/template.rb index 133a316405..9e8f17d746 100644 --- a/actionview/lib/action_view/template.rb +++ b/actionview/lib/action_view/template.rb @@ -128,8 +128,11 @@ module ActionView attr_reader :variable - def initialize(source, identifier, handler, details) - format = details[:format] || (handler.default_format if handler.respond_to?(:default_format)) + def initialize(source, identifier, handler, format: nil, **details) + unless format + ActiveSupport::Deprecation.warn "ActionView::Template#initialize requires a format parameter" + format = :html + end @source = source @identifier = identifier diff --git a/actionview/lib/action_view/template/resolver.rb b/actionview/lib/action_view/template/resolver.rb index 3b4594942b..8232494746 100644 --- a/actionview/lib/action_view/template/resolver.rb +++ b/actionview/lib/action_view/template/resolver.rb @@ -196,7 +196,6 @@ module ActionView cached = nil templates.each do |t| t.locals = locals - t.formats = details[:formats] || [:html] if t.formats.empty? t.variants = details[:variants] || [] if t.variants.empty? t.virtual_path ||= (cached ||= build_path(*path_info)) end @@ -225,7 +224,7 @@ module ActionView template_paths = reject_files_external_to_app(template_paths) unless outside_app_allowed template_paths.map do |template| - handler, format, variant = extract_handler_and_format_and_variant(template) + handler, format, variant = extract_handler_and_format_and_variant(template, formats.first) FileTemplate.new(File.expand_path(template), handler, virtual_path: path.virtual, @@ -292,7 +291,7 @@ module ActionView # Extract handler, formats and variant from path. If a format cannot be found neither # from the path, or the handler, we should return the array of formats given # to the resolver. - def extract_handler_and_format_and_variant(path) + def extract_handler_and_format_and_variant(path, query_format) pieces = File.basename(path).split(".") pieces.shift @@ -300,9 +299,18 @@ module ActionView handler = Template.handler_for_extension(extension) format, variant = pieces.last.split(EXTENSIONS[:variants], 2) if pieces.last - format &&= Template::Types[format] + format = if format + Template::Types[format] + else + if handler.respond_to?(:default_format) # default_format can return nil + handler.default_format + else + query_format + end + end - [handler, format, variant] + # Template::Types[format] and handler.default_format can return nil + [handler, format || query_format, variant] end end diff --git a/actionview/lib/action_view/testing/resolvers.rb b/actionview/lib/action_view/testing/resolvers.rb index d6203b95c5..275e2e9182 100644 --- a/actionview/lib/action_view/testing/resolvers.rb +++ b/actionview/lib/action_view/testing/resolvers.rb @@ -34,7 +34,7 @@ module ActionView #:nodoc: @hash.each do |_path, array| source, updated_at = array next unless query.match?(_path) - handler, format, variant = extract_handler_and_format_and_variant(_path) + handler, format, variant = extract_handler_and_format_and_variant(_path, :html) templates << Template.new(source, _path, handler, virtual_path: path.virtual, format: format, @@ -49,7 +49,7 @@ module ActionView #:nodoc: class NullResolver < PathResolver def query(path, exts, _, _) - handler, format, variant = extract_handler_and_format_and_variant(path) + handler, format, variant = extract_handler_and_format_and_variant(path, :html) [ActionView::Template.new("Template generated by Null Resolver", path.virtual, handler, virtual_path: path.virtual, format: format, variant: variant)] end end diff --git a/actionview/test/abstract_unit.rb b/actionview/test/abstract_unit.rb index b649b3c9dd..e0a1f59755 100644 --- a/actionview/test/abstract_unit.rb +++ b/actionview/test/abstract_unit.rb @@ -60,7 +60,7 @@ module RenderERBUtils string.strip, "test template", ActionView::Template.handler_for_extension(:erb), - {}) + format: :html) view = ActionView::Base.with_empty_template_cache template.render(view.empty, {}).strip diff --git a/actionview/test/template/template_test.rb b/actionview/test/template/template_test.rb index a069c8f2d0..36caef28c2 100644 --- a/actionview/test/template/template_test.rb +++ b/actionview/test/template/template_test.rb @@ -38,7 +38,8 @@ class TestERBTemplate < ActiveSupport::TestCase "<%= @virtual_path %>", "partial", ERBHandler, - virtual_path: "partial" + virtual_path: "partial", + format: :html ) end @@ -55,7 +56,8 @@ class TestERBTemplate < ActiveSupport::TestCase end end - def new_template(body = "<%= hello %>", details = { format: :html }) + def new_template(body = "<%= hello %>", details = {}) + details = { format: :html }.merge details ActionView::Template.new(body.dup, "hello template", details.fetch(:handler) { ERBHandler }, { virtual_path: "hello" }.merge!(details)) end -- cgit v1.2.3