mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-26 09:16:22 +00:00
optimizacion: solo leer el contenido de los docs cuando se los necesite
This commit is contained in:
parent
7467356659
commit
0437444247
4 changed files with 27 additions and 12 deletions
|
@ -1,7 +1,5 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require 'jekyll/utils'
|
|
||||||
|
|
||||||
# Esta clase representa un post en un sitio jekyll e incluye métodos
|
# Esta clase representa un post en un sitio jekyll e incluye métodos
|
||||||
# para modificarlos y crear nuevos.
|
# para modificarlos y crear nuevos.
|
||||||
#
|
#
|
||||||
|
@ -15,6 +13,15 @@ class Post < OpenStruct
|
||||||
PRIVATE_ATTRIBUTES = %i[path slug attributes errors].freeze
|
PRIVATE_ATTRIBUTES = %i[path slug attributes errors].freeze
|
||||||
PUBLIC_ATTRIBUTES = %i[lang date].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
|
# Redefinir el inicializador de OpenStruct
|
||||||
#
|
#
|
||||||
# @param site: [Site] el sitio en Sutty
|
# @param site: [Site] el sitio en Sutty
|
||||||
|
@ -33,6 +40,10 @@ class Post < OpenStruct
|
||||||
# MetadataFactory devuelve un tipo de campo por cada campo. A
|
# MetadataFactory devuelve un tipo de campo por cada campo. A
|
||||||
# partir de ahí se pueden obtener los valores actuales y una lista
|
# partir de ahí se pueden obtener los valores actuales y una lista
|
||||||
# de valores por defecto.
|
# 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|
|
layout.metadata.each_pair do |name, template|
|
||||||
send "#{name}=".to_sym,
|
send "#{name}=".to_sym,
|
||||||
MetadataFactory.build(document: document,
|
MetadataFactory.build(document: document,
|
||||||
|
@ -47,13 +58,15 @@ class Post < OpenStruct
|
||||||
required: template['required'])
|
required: template['required'])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# TODO: Llamar dinámicamente
|
||||||
load_lang!
|
load_lang!
|
||||||
load_slug!
|
load_slug!
|
||||||
load_date!
|
load_date!
|
||||||
load_path!
|
load_path!
|
||||||
|
|
||||||
# Leer el documento
|
# XXX: No usamos Post#read porque a esta altura todavía no sabemos
|
||||||
read
|
# nada del Document
|
||||||
|
document.read! if File.exist? document.path
|
||||||
end
|
end
|
||||||
|
|
||||||
def id
|
def id
|
||||||
|
@ -172,7 +185,7 @@ class Post < OpenStruct
|
||||||
return unless written?
|
return unless written?
|
||||||
|
|
||||||
document.path = path.absolute
|
document.path = path.absolute
|
||||||
document.read
|
document.read!
|
||||||
end
|
end
|
||||||
|
|
||||||
def new?
|
def new?
|
||||||
|
|
|
@ -176,14 +176,10 @@ class Site < ApplicationRecord
|
||||||
|
|
||||||
@posts[lang] = PostRelation.new site: self
|
@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
|
# No fallar si no existe colección para este idioma
|
||||||
# XXX: queremos fallar silenciosamente?
|
# XXX: queremos fallar silenciosamente?
|
||||||
(docs || []).each do |doc|
|
(collections[lang.to_s].try(:docs) || []).each do |doc|
|
||||||
layout = layouts[doc.data['layout'].to_sym]
|
layout = layouts[Post.find_layout(doc)]
|
||||||
|
|
||||||
@posts[lang].build(document: doc, layout: layout, lang: lang)
|
@posts[lang].build(document: doc, layout: layout, lang: lang)
|
||||||
end
|
end
|
||||||
|
|
|
@ -27,4 +27,10 @@ module Jekyll
|
||||||
ThemeAssetsReader.class_eval do
|
ThemeAssetsReader.class_eval do
|
||||||
def read; end
|
def read; end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Prevenir la lectura del documento
|
||||||
|
Document.class_eval do
|
||||||
|
alias_method :read!, :read
|
||||||
|
def read; end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -82,7 +82,7 @@ class PostTest < ActiveSupport::TestCase
|
||||||
document = Jekyll::Document.new(@post.path.value,
|
document = Jekyll::Document.new(@post.path.value,
|
||||||
site: @site.jekyll,
|
site: @site.jekyll,
|
||||||
collection: collection)
|
collection: collection)
|
||||||
document.read
|
document.read!
|
||||||
|
|
||||||
assert document.data['categories'].include?(title)
|
assert document.data['categories'].include?(title)
|
||||||
assert_equal title, document.data['title']
|
assert_equal title, document.data['title']
|
||||||
|
|
Loading…
Reference in a new issue