optimizacion: solo leer el contenido de los docs cuando se los necesite

This commit is contained in:
f 2020-01-02 20:20:41 -03:00
parent 7467356659
commit 0437444247
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
4 changed files with 27 additions and 12 deletions

View file

@ -1,7 +1,5 @@
# frozen_string_literal: true
require 'jekyll/utils'
# Esta clase representa un post en un sitio jekyll e incluye métodos
# para modificarlos y crear nuevos.
#
@ -15,6 +13,15 @@ class Post < OpenStruct
PRIVATE_ATTRIBUTES = %i[path slug attributes errors].freeze
PUBLIC_ATTRIBUTES = %i[lang date].freeze
class << self
# Obtiene el layout sin leer el Document
def find_layout(doc)
SafeYAML.load(IO.foreach(doc.path).lazy.grep(/^layout: /).take(1).first)
.try(:[], 'layout')
.try(:to_sym)
end
end
# Redefinir el inicializador de OpenStruct
#
# @param site: [Site] el sitio en Sutty
@ -33,6 +40,10 @@ class Post < OpenStruct
# MetadataFactory devuelve un tipo de campo por cada campo. A
# partir de ahí se pueden obtener los valores actuales y una lista
# de valores por defecto.
#
# XXX: En el primer intento de hacerlo más óptimo, movimos esta
# lógica a instanciación bajo demanda, pero no solo no logramos
# optimizar sino que aumentamos el tiempo de carga :/
layout.metadata.each_pair do |name, template|
send "#{name}=".to_sym,
MetadataFactory.build(document: document,
@ -47,13 +58,15 @@ class Post < OpenStruct
required: template['required'])
end
# TODO: Llamar dinámicamente
load_lang!
load_slug!
load_date!
load_path!
# Leer el documento
read
# XXX: No usamos Post#read porque a esta altura todavía no sabemos
# nada del Document
document.read! if File.exist? document.path
end
def id
@ -172,7 +185,7 @@ class Post < OpenStruct
return unless written?
document.path = path.absolute
document.read
document.read!
end
def new?

View file

@ -176,14 +176,10 @@ class Site < ApplicationRecord
@posts[lang] = PostRelation.new site: self
# Jekyll lee los documentos en orden cronológico pero los invierte
# durante la renderización. Usamos el orden cronológico inverso por
# defecto para mostrar los artículos más nuevos primero.
docs = collections[lang.to_s].try(:docs).try(:sort) { |a, b| b <=> a }
# No fallar si no existe colección para este idioma
# XXX: queremos fallar silenciosamente?
(docs || []).each do |doc|
layout = layouts[doc.data['layout'].to_sym]
(collections[lang.to_s].try(:docs) || []).each do |doc|
layout = layouts[Post.find_layout(doc)]
@posts[lang].build(document: doc, layout: layout, lang: lang)
end

View file

@ -27,4 +27,10 @@ module Jekyll
ThemeAssetsReader.class_eval do
def read; end
end
# Prevenir la lectura del documento
Document.class_eval do
alias_method :read!, :read
def read; end
end
end

View file

@ -82,7 +82,7 @@ class PostTest < ActiveSupport::TestCase
document = Jekyll::Document.new(@post.path.value,
site: @site.jekyll,
collection: collection)
document.read
document.read!
assert document.data['categories'].include?(title)
assert_equal title, document.data['title']