62 lines
1.5 KiB
Ruby
62 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
|