no usar safeyaml y algunos TODOes

This commit is contained in:
f 2020-06-16 19:21:38 -03:00
parent 58a6f1aa9c
commit 793a36d9e9
2 changed files with 27 additions and 7 deletions

View file

@ -15,10 +15,12 @@ class Post < OpenStruct
class << self
# Obtiene el layout sin leer el Document
#
# TODO: Reemplazar cuando leamos el contenido del Document
# a demanda?
def find_layout(doc)
SafeYAML.load(IO.foreach(doc.path).lazy.grep(/^layout: /).take(1).first)
.try(:[], 'layout')
.try(:to_sym)
IO.foreach(doc.path).lazy.grep(/^layout: /).take(1).first
.try(:split, ' ').try(:last).try(:to_sym)
end
end
@ -70,6 +72,10 @@ class Post < OpenStruct
document.read! if File.exist? document.path
end
def inspect
"#<Post id=\"#{id}\">"
end
# Devuelve una llave para poder guardar el post en una cache
def cache_key
'posts/' + uuid.value
@ -131,9 +137,7 @@ class Post < OpenStruct
PRIVATE_ATTRIBUTES.include?(mid) ||
PUBLIC_ATTRIBUTES.include?(mid)
if !included && singleton_class.method_defined?(:attributes)
included = attributes.include? mid
end
included = attributes.include? mid if !included && singleton_class.method_defined?(:attributes)
included
end
@ -146,6 +150,8 @@ class Post < OpenStruct
end
# Genera el post con metadatos en YAML
#
# TODO: Cachear por un minuto
def full_content
body = ''
yaml = layout.metadata.keys.map(&:to_sym).map do |metadata|
@ -183,6 +189,8 @@ class Post < OpenStruct
alias destroy! destroy
# Guarda los cambios
# TODO: Agregar una forma de congelar todos los valores y solo guardar
# uno, para no incorporar modificaciones
# rubocop:disable Metrics/CyclomaticComplexity
def save(validate: true)
return false if validate && !valid?
@ -245,6 +253,10 @@ class Post < OpenStruct
end
# Verifica si hace falta escribir cambios
#
# TODO: Cachear el resultado o usar otro método, por ejemplo guardando
# la fecha de modificación al leer y compararla al hacer cambios sin
# escribirlos.
def persisted?
File.exist?(path.absolute) && full_content == File.read(path.absolute)
end

View file

@ -3,7 +3,15 @@
# Se encarga de guardar los cambios en los archivos y mantenerlos
# actualizados en git
Site::Writer = Struct.new(:site, :file, :content, keyword_init: true) do
# TODO: si el archivo está bloqueado, esperar al desbloqueo
# Realiza la escritura del archivo.
#
# **IMPORTANTE:** Usar rutas absolutas siempre y nunca confiar en una
# ruta que venga de la Internet.
#
# TODO: Usar rutas relativas al sitio y sanitizar.
#
# TODO: si el archivo está bloqueado, esperar al desbloqueo. Realizar
# asincrónicamente?
def save
mkdir_p