# 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