sutty/app/models/site/config.rb

66 lines
1.5 KiB
Ruby
Raw Normal View History

# 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