66 lines
1.5 KiB
Ruby
66 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)
|
||
|
|
||
|
read
|
||
|
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
|
||
|
YAML.safe_load(File.read(path)).each do |key, value|
|
||
|
send("#{key}=".to_sym, value)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# Escribe los cambios en el repositorio
|
||
|
#
|
||
|
# TODO: Convertir en una clase intermedia que también se encargue de
|
||
|
# guardar en git
|
||
|
def write
|
||
|
r = File.open(path, File::RDWR | File::CREAT, 0o640) do |f|
|
||
|
# Bloquear el archivo para que no sea accedido por otro
|
||
|
# proceso u otra editora
|
||
|
f.flock(File::LOCK_EX)
|
||
|
|
||
|
# Empezar por el principio
|
||
|
f.rewind
|
||
|
|
||
|
# Escribir el contenido en YAML
|
||
|
f.write(content.to_yaml)
|
||
|
|
||
|
# Eliminar el resto
|
||
|
f.flush
|
||
|
f.truncate(f.pos)
|
||
|
end
|
||
|
|
||
|
r.zero?
|
||
|
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
|