Skip to content

Commit

Permalink
Templates have one format
Browse files Browse the repository at this point in the history
Templates only have one format.  Before this commit, templates would be
constructed with a single element array that contained the format.  This
commit eliminates the single element array and just implements a
`format` method.  This saves one array allocation per template.
  • Loading branch information
tenderlove committed Feb 25, 2019
1 parent d1f68b5 commit ca5e23e
Show file tree
Hide file tree
Showing 16 changed files with 43 additions and 31 deletions.
4 changes: 2 additions & 2 deletions actionmailer/lib/action_mailer/base.rb
Expand Up @@ -973,7 +973,7 @@ def collect_responses_from_templates(headers)
templates_name = headers[:template_name] || action_name

each_template(Array(templates_path), templates_name).map do |template|
self.formats = template.formats
self.formats = [template.format]
{
body: render(template: template),
content_type: template.type.to_s
Expand All @@ -986,7 +986,7 @@ def each_template(paths, name, &block)
if templates.empty?
raise ActionView::MissingTemplate.new(paths, name, paths, false, "mailer")
else
templates.uniq(&:formats).each(&block)
templates.uniq(&:format).each(&block)
end
end

Expand Down
4 changes: 2 additions & 2 deletions actionview/lib/action_view/file_template.rb
Expand Up @@ -22,11 +22,11 @@ def refresh(_)
# to ensure that references to the template object can be marshalled as well. This means forgoing
# the marshalling of the compiler mutex and instantiating that again on unmarshalling.
def marshal_dump # :nodoc:
[ @identifier, @handler, @compiled, @original_encoding, @locals, @virtual_path, @updated_at, @formats, @variants ]
[ @identifier, @handler, @compiled, @original_encoding, @locals, @virtual_path, @updated_at, @format, @variants ]
end

def marshal_load(array) # :nodoc:
@identifier, @handler, @compiled, @original_encoding, @locals, @virtual_path, @updated_at, @formats, @variants = *array
@identifier, @handler, @compiled, @original_encoding, @locals, @virtual_path, @updated_at, @format, @variants = *array
@compile_mutex = Mutex.new
end
end
Expand Down
2 changes: 1 addition & 1 deletion actionview/lib/action_view/helpers/cache_helper.rb
Expand Up @@ -217,7 +217,7 @@ def cache_fragment_name(name = {}, skip_digest: nil, virtual_path: nil, digest_p
end

def digest_path_from_template(template) # :nodoc:
digest = Digestor.digest(name: template.virtual_path, format: template.formats.first, finder: lookup_context, dependencies: view_cache_dependencies)
digest = Digestor.digest(name: template.virtual_path, format: template.format, finder: lookup_context, dependencies: view_cache_dependencies)

if digest.present?
"#{template.virtual_path}:#{digest}"
Expand Down
2 changes: 1 addition & 1 deletion actionview/lib/action_view/renderer/abstract_renderer.rb
Expand Up @@ -68,7 +68,7 @@ def initialize(body, layout, template)
end

def format
template.formats.first
template.format
end

EMPTY_SPACER = Struct.new(:body).new
Expand Down
2 changes: 1 addition & 1 deletion actionview/lib/action_view/renderer/template_renderer.rb
Expand Up @@ -8,7 +8,7 @@ def render(context, options)
@details = extract_details(options)
template = determine_template(options)

prepend_formats(template.formats)
prepend_formats(template.format)

render_template(context, template, options[:layout], options[:locals] || {})
end
Expand Down
13 changes: 7 additions & 6 deletions actionview/lib/action_view/template.rb
Expand Up @@ -125,8 +125,7 @@ def self.finalize_compiled_template_methods=(_)
attr_accessor :locals, :variants, :virtual_path

attr_reader :source, :identifier, :handler, :original_encoding, :updated_at

attr_reader :variable, :formats
attr_reader :variable, :format

def initialize(source, identifier, handler, format: nil, **details)
unless format
Expand All @@ -149,7 +148,7 @@ def initialize(source, identifier, handler, format: nil, **details)
end

@updated_at = details[:updated_at] || Time.now
@formats = Array(format)
@format = format
@variants = [details[:variant]]
@compile_mutex = Mutex.new
end
Expand All @@ -158,6 +157,8 @@ def formats=(_)
end
deprecate :formats=

deprecate def formats; Array(format); end

# Returns whether the underlying handler supports streaming. If so,
# a streaming buffer *may* be passed when it starts rendering.
def supports_streaming?
Expand All @@ -180,7 +181,7 @@ def render(view, locals, buffer = ActionView::OutputBuffer.new, &block)
end

def type
@type ||= Types[@formats.first] if @formats.first
@type ||= Types[format]
end

# Receives a view object and return a template similar to self by using @virtual_path.
Expand Down Expand Up @@ -257,11 +258,11 @@ def encode!
# to ensure that references to the template object can be marshalled as well. This means forgoing
# the marshalling of the compiler mutex and instantiating that again on unmarshalling.
def marshal_dump # :nodoc:
[ @source, @identifier, @handler, @compiled, @original_encoding, @locals, @virtual_path, @updated_at, @formats, @variants ]
[ @source, @identifier, @handler, @compiled, @original_encoding, @locals, @virtual_path, @updated_at, @format, @variants ]
end

def marshal_load(array) # :nodoc:
@source, @identifier, @handler, @compiled, @original_encoding, @locals, @virtual_path, @updated_at, @formats, @variants = *array
@source, @identifier, @handler, @compiled, @original_encoding, @locals, @virtual_path, @updated_at, @format, @variants = *array
@compile_mutex = Mutex.new
end

Expand Down
19 changes: 14 additions & 5 deletions actionview/lib/action_view/template/html.rb
@@ -1,15 +1,21 @@
# frozen_string_literal: true

require "active_support/deprecation"

module ActionView #:nodoc:
# = Action View HTML Template
class Template #:nodoc:
class HTML #:nodoc:
attr_accessor :type
attr_reader :type

def initialize(string, type = nil)
unless type
ActiveSupport::Deprecation.warn "ActionView::Template::HTML#initialize requires a type parameter"
type = :html
end

@string = string.to_s
@type = Types[type] || type if type
@type ||= Types[:html]
@type = type
end

def identifier
Expand All @@ -26,9 +32,12 @@ def render(*args)
to_str
end

def formats
[@type.respond_to?(:ref) ? @type.ref : @type.to_s]
def format
@type
end

def formats; Array(format); end
deprecate :formats
end
end
end
8 changes: 5 additions & 3 deletions actionview/lib/action_view/template/text.rb
Expand Up @@ -8,7 +8,6 @@ class Text #:nodoc:

def initialize(string)
@string = string.to_s
@type = Types[:text]
end

def identifier
Expand All @@ -25,9 +24,12 @@ def render(*args)
to_str
end

def formats
[@type.ref]
def format
:text
end

def formats; Array(format); end
deprecate :formats
end
end
end
2 changes: 1 addition & 1 deletion actionview/test/actionpack/controller/view_paths_test.rb
Expand Up @@ -144,7 +144,7 @@ def find_all(*args)
template.identifier,
template.handler,
virtual_path: template.virtual_path,
format: template.formats
format: template.format
)
end
end
Expand Down
2 changes: 1 addition & 1 deletion actionview/test/template/digestor_test.rb
Expand Up @@ -361,7 +361,7 @@ def nested_dependencies(template_name)

def tree_template_formats(template_name)
tree = ActionView::Digestor.tree(template_name, finder)
tree.flatten.map(&:template).compact.flat_map(&:formats)
tree.flatten.map(&:template).compact.map(&:format)
end

def disable_resolver_caching
Expand Down
6 changes: 3 additions & 3 deletions actionview/test/template/html_test.rb
Expand Up @@ -4,16 +4,16 @@

class HTMLTest < ActiveSupport::TestCase
test "formats returns symbol for recognized MIME type" do
assert_equal [:html], ActionView::Template::HTML.new("", :html).formats
assert_equal :html, ActionView::Template::HTML.new("", :html).format
end

test "formats returns string for recognized MIME type when MIME does not have symbol" do
foo = Mime::Type.lookup("foo")
assert_nil foo.to_sym
assert_equal ["foo"], ActionView::Template::HTML.new("", foo).formats
assert_equal "foo", ActionView::Template::HTML.new("", foo).format
end

test "formats returns string for unknown MIME type" do
assert_equal ["foo"], ActionView::Template::HTML.new("", "foo").formats
assert_equal "foo", ActionView::Template::HTML.new("", "foo").format
end
end
2 changes: 1 addition & 1 deletion actionview/test/template/lookup_context_test.rb
Expand Up @@ -125,7 +125,7 @@ def teardown
assert_called(ActionView::Template::Handlers::Builder, :default_format, returns: nil) do
@lookup_context.formats = [:text]
template = @lookup_context.find("hello", %w(test))
assert_equal [:text], template.formats
assert_equal :text, template.format
end
end

Expand Down
2 changes: 1 addition & 1 deletion actionview/test/template/resolver_patterns_test.rb
Expand Up @@ -19,7 +19,7 @@ def test_should_return_template_for_declared_path
assert_equal 1, templates.size, "expected one template"
assert_equal "Hello custom patterns!", templates.first.source
assert_equal "custom_pattern/path", templates.first.virtual_path
assert_equal [:html], templates.first.formats
assert_equal :html, templates.first.format
end

def test_should_return_all_templates_when_ambiguous_pattern
Expand Down
2 changes: 1 addition & 1 deletion actionview/test/template/testing/fixture_resolver_test.rb
Expand Up @@ -15,6 +15,6 @@ def test_should_return_template_for_declared_path
assert_equal 1, templates.size, "expected one template"
assert_equal "this text", templates.first.source
assert_equal "arbitrary/path", templates.first.virtual_path
assert_equal [:html], templates.first.formats
assert_equal :html, templates.first.format
end
end
2 changes: 1 addition & 1 deletion actionview/test/template/testing/null_resolver_test.rb
Expand Up @@ -9,6 +9,6 @@ def test_should_return_template_for_any_path
assert_equal 1, templates.size, "expected one template"
assert_equal "Template generated by Null Resolver", templates.first.source
assert_equal "arbitrary/path.erb", templates.first.virtual_path.to_s
assert_equal [:html], templates.first.formats
assert_equal :html, templates.first.format
end
end
2 changes: 1 addition & 1 deletion actionview/test/template/text_test.rb
Expand Up @@ -4,7 +4,7 @@

class TextTest < ActiveSupport::TestCase
test "formats always return :text" do
assert_equal [:text], ActionView::Template::Text.new("").formats
assert_equal :text, ActionView::Template::Text.new("").format
end

test "identifier should return 'text template'" do
Expand Down

0 comments on commit ca5e23e

Please sign in to comment.