sutty/app/models/site/config.rb

63 lines
1.5 KiB
Ruby

# frozen_string_literal: true
class Site
# Representa la configuración del sitio de forma que podamos leer y
# escribir en el archivo _config.yml
class Config < OpenStruct
def initialize(site)
# Iniciar el OpenStruct con el sitio
super(site: site)
@saved = File.exist? path
read if @saved
end
# Obtener un valor por defecto a partir de la configuración
def fetch(key, default)
send(:[], key) || default
end
# Leer el archivo de configuración y setear los atributos en el
# objeto actual, creando los metodos de ostruct
def read
data = YAML.safe_load(File.read(path))
@hash = data.hash
data.each do |key, value|
send("#{key}=".to_sym, value)
end
end
# Escribe los cambios en el repositorio
def write
return if persisted?
@saved = Site::Writer.new(site: site, file: path,
content: content.to_yaml).save
# Actualizar el hash para no escribir dos veces
@hash = content.hash
end
alias save write
# Detecta si la configuración cambió comparando con el valor inicial
def persisted?
(@hash == content.hash) && @saved
end
# Obtener el contenido de la configuración como un hash, sin el
# sitio correspondiente.
def content
h = to_h.stringify_keys
h.delete 'site'
h
end
# Obtener la ruta donde se encuentra la configuración.
def path
File.join site.path, '_config.yml'
end
end
end