This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Jekyll
|
||||
class LiquidRenderer
|
||||
class File
|
||||
def initialize(renderer, filename)
|
||||
@renderer = renderer
|
||||
@filename = filename
|
||||
end
|
||||
|
||||
def parse(content)
|
||||
measure_time do
|
||||
@renderer.cache[@filename] ||= Liquid::Template.parse(content, :line_numbers => true)
|
||||
end
|
||||
@template = @renderer.cache[@filename]
|
||||
|
||||
self
|
||||
end
|
||||
|
||||
def render(*args)
|
||||
reset_template_assigns
|
||||
|
||||
measure_time do
|
||||
measure_bytes do
|
||||
measure_counts do
|
||||
@template.render(*args)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# This method simply 'rethrows any error' before attempting to render the template.
|
||||
def render!(*args)
|
||||
reset_template_assigns
|
||||
|
||||
measure_time do
|
||||
measure_bytes do
|
||||
measure_counts do
|
||||
@template.render!(*args)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def warnings
|
||||
@template.warnings
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# clear assigns to `Liquid::Template` instance prior to rendering since
|
||||
# `Liquid::Template` instances are cached in Jekyll 4.
|
||||
def reset_template_assigns
|
||||
@template.instance_assigns.clear
|
||||
end
|
||||
|
||||
def measure_counts
|
||||
@renderer.increment_count(@filename)
|
||||
yield
|
||||
end
|
||||
|
||||
def measure_bytes
|
||||
yield.tap do |str|
|
||||
@renderer.increment_bytes(@filename, str.bytesize)
|
||||
end
|
||||
end
|
||||
|
||||
def measure_time
|
||||
before = Time.now
|
||||
yield
|
||||
ensure
|
||||
after = Time.now
|
||||
@renderer.increment_time(@filename, after - before)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,45 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Jekyll
|
||||
class LiquidRenderer
|
||||
class Table
|
||||
GAUGES = [:count, :bytes, :time].freeze
|
||||
|
||||
def initialize(stats)
|
||||
@stats = stats
|
||||
end
|
||||
|
||||
def to_s(num_of_rows = 50)
|
||||
Jekyll::Profiler.tabulate(data_for_table(num_of_rows))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def data_for_table(num_of_rows)
|
||||
sorted = @stats.sort_by { |_, file_stats| -file_stats[:time] }
|
||||
sorted = sorted.slice(0, num_of_rows)
|
||||
|
||||
table = [header_labels]
|
||||
sorted.each do |filename, file_stats|
|
||||
row = []
|
||||
row << filename
|
||||
row << file_stats[:count].to_s
|
||||
row << format_bytes(file_stats[:bytes])
|
||||
row << format("%.3f", file_stats[:time])
|
||||
table << row
|
||||
end
|
||||
|
||||
table
|
||||
end
|
||||
|
||||
def header_labels
|
||||
GAUGES.map { |gauge| gauge.to_s.capitalize }.unshift("Filename")
|
||||
end
|
||||
|
||||
def format_bytes(bytes)
|
||||
bytes /= 1024.0
|
||||
format("%.2fK", bytes)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user