Include Memoizable in ActionView::Template

This commit is contained in:
Joshua Peek
2008-07-14 19:51:43 -05:00
parent 8a9934a9d9
commit dd41f66af5
3 changed files with 27 additions and 43 deletions

View File

@@ -7,20 +7,17 @@ module ActionView
@@mutex = Mutex.new
end
include ActiveSupport::Memoizable
def handler
@handler ||= Template.handler_class_for_extension(extension)
Template.handler_class_for_extension(extension)
end
memorize :handler
def compiled_source
@compiled_source ||= handler.new(nil).compile(self) if handler.compilable?
end
def freeze
# Eager load and freeze memoized methods
handler.freeze
compiled_source.freeze
super
handler.new(nil).compile(self) if handler.compilable?
end
memorize :compiled_source
def render(view, local_assigns = {})
view._first_render ||= self

View File

@@ -3,20 +3,17 @@ module ActionView
# NOTE: The template that this mixin is beening include into is frozen
# So you can not set or modify any instance variables
include ActiveSupport::Memoizable
def variable_name
@variable_name ||= name.sub(/\A_/, '').to_sym
name.sub(/\A_/, '').to_sym
end
memorize :variable_name
def counter_name
@counter_name ||= "#{variable_name}_counter".to_sym
end
def freeze
# Eager load and freeze memoized methods
variable_name.freeze
counter_name.freeze
super
"#{variable_name}_counter".to_sym
end
memorize :counter_name
def render(view, local_assigns = {})
ActionController::Base.benchmark("Rendered #{path_without_format_and_extension}", Logger::DEBUG, false) do

View File

@@ -1,6 +1,7 @@
module ActionView #:nodoc:
class Template
extend TemplateHandlers
include ActiveSupport::Memoizable
include Renderable
attr_accessor :filename, :load_path, :base_path, :name, :format, :extension
@@ -16,48 +17,37 @@ module ActionView #:nodoc:
extend RenderablePartial if @name =~ /^_/
end
def freeze
# Eager load and freeze memoized methods
format_and_extension.freeze
path.freeze
path_without_extension.freeze
path_without_format_and_extension.freeze
source.freeze
method_segment.freeze
super
end
def format_and_extension
@format_and_extension ||= (extensions = [format, extension].compact.join(".")).blank? ? nil : extensions
(extensions = [format, extension].compact.join(".")).blank? ? nil : extensions
end
memorize :format_and_extension
def path
@path ||= [base_path, [name, format, extension].compact.join('.')].compact.join('/')
[base_path, [name, format, extension].compact.join('.')].compact.join('/')
end
memorize :path
def path_without_extension
@path_without_extension ||= [base_path, [name, format].compact.join('.')].compact.join('/')
[base_path, [name, format].compact.join('.')].compact.join('/')
end
memorize :path_without_extension
def path_without_format_and_extension
@path_without_format_and_extension ||= [base_path, name].compact.join('/')
[base_path, name].compact.join('/')
end
memorize :path_without_format_and_extension
def source
@source ||= File.read(filename)
File.read(filename)
end
memorize :source
def method_segment
unless @method_segment
segment = File.expand_path(filename)
segment.sub!(/^#{Regexp.escape(File.expand_path(RAILS_ROOT))}/, '') if defined?(RAILS_ROOT)
segment.gsub!(/([^a-zA-Z0-9_])/) { $1.ord }
@method_segment = segment
end
@method_segment
segment = File.expand_path(filename)
segment.sub!(/^#{Regexp.escape(File.expand_path(RAILS_ROOT))}/, '') if defined?(RAILS_ROOT)
segment.gsub!(/([^a-zA-Z0-9_])/) { $1.ord }
end
memorize :method_segment
def render_template(view, local_assigns = {})
render(view, local_assigns)