5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-28 14:26:21 +00:00

docs: yard para MetadataTemplate

This commit is contained in:
f 2023-10-06 17:38:40 -03:00
parent a4ae27be89
commit df3989a187
No known key found for this signature in database

View file

@ -3,18 +3,22 @@
# Representa la plantilla de un campo en los metadatos del artículo # Representa la plantilla de un campo en los metadatos del artículo
# #
# TODO: Validar el tipo de valor pasado a value= según el :type # TODO: Validar el tipo de valor pasado a value= según el :type
# # @todo ¿Es necesario pasar :type, :label, :help, :required si se pueden
# obtener del layout a través de :name?
MetadataTemplate = Struct.new(:site, :document, :name, :label, :type, MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
:value, :help, :required, :errors, :post, :value, :help, :required, :errors, :post,
:layout, keyword_init: true) do :layout, keyword_init: true) do
include Metadata::FrontMatterConcern include Metadata::FrontMatterConcern
# @return [String]
def inspect def inspect
"#<#{self.class} site=#{site.name.inspect} post=#{post.id.inspect} value=#{value.inspect}>" "#<#{self.class} site=#{site.name.inspect} post=#{post.id.inspect} value=#{value.inspect}>"
end end
# Queremos que los artículos nuevos siempre cacheen, si usamos el UUID # Queremos que los artículos nuevos siempre cacheen, si usamos el UUID
# siempre vamos a obtener un item nuevo. # siempre vamos a obtener un item nuevo.
#
# @return [String]
def cache_key def cache_key
return "#{layout.value}/#{name}" if post.new? return "#{layout.value}/#{name}" if post.new?
@ -25,6 +29,7 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
# Post, el valor actual y los valores posibles, de forma que cualquier # Post, el valor actual y los valores posibles, de forma que cualquier
# cambio permita renovar la caché. # cambio permita renovar la caché.
# #
# @todo no será demasiado traer #values acá
# @return [String] # @return [String]
def cache_version def cache_version
post.cache_version + value.hash.to_s + values.hash.to_s post.cache_version + value.hash.to_s + values.hash.to_s
@ -35,7 +40,7 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
"#{cache_key}-#{cache_version}" "#{cache_key}-#{cache_version}"
end end
# XXX: Deberíamos sanitizar durante la asignación? # @todo: Deberíamos sanitizar durante la asignación?
def value=(new_value) def value=(new_value)
@value_was = value @value_was = value
self[:value] = new_value self[:value] = new_value
@ -43,17 +48,24 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
# Siempre obtener el valor actual y solo obtenerlo del documento una # Siempre obtener el valor actual y solo obtenerlo del documento una
# vez. # vez.
#
# @return [any]
def value_was def value_was
return @value_was if instance_variable_defined? '@value_was' return @value_was if instance_variable_defined? '@value_was'
@value_was = document_value @value_was = document_value
end end
# ¿Cambió?
#
# @return [Boolean]
def changed? def changed?
value_was != value value_was != value
end end
# Obtiene el valor del JekyllDocument # Obtiene el valor del JekyllDocument
#
# @return [any]
def document_value def document_value
document.data[name.to_s] document.data[name.to_s]
end end
@ -81,22 +93,33 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
# usando otros métodos que el de asignación. # usando otros métodos que el de asignación.
def value def value
self[:value] ||= if (data = document_value).present? self[:value] ||= if (data = document_value).present?
private? ? decrypt(data) : data if private?
decrypt(data)
else
data
end
else else
default_value default_value
end end
end end
# Detecta si el valor está vacío # Detecta si el valor está vacío
#
# @return [Boolean]
def empty? def empty?
value.blank? value.blank?
end end
# Comprueba si el metadato es válido # Comprueba si el metadato es válido
#
# @return [Boolean]
def valid? def valid?
validate validate
end end
# Ejecuta validaciones
#
# @return [Boolean]
def validate def validate
self.errors = [] self.errors = []
@ -117,12 +140,17 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
end end
end end
# Convierte el valor a String
#
# @return [String]
def to_s def to_s
value.to_s value.to_s
end end
# En caso de que algún campo necesite realizar acciones antes de ser # En caso de que algún campo necesite realizar acciones antes de ser
# guardado # guardado
#
# @return [Boolean]
def save def save
if !changed? if !changed?
self[:value] = document_value if private? self[:value] = document_value if private?
@ -140,16 +168,23 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
false false
end end
# Métodos relacionados
#
# @return [Array]
def related_methods def related_methods
@related_methods ||= [].freeze @related_methods ||= [].freeze
end end
# Determina si el campo es privado y debería ser cifrado # Determina si el campo es privado y debería ser cifrado
#
# @return [Boolean]
def private? def private?
layout.metadata.dig(name, 'private').present? layout.metadata.dig(name, 'private').present?
end end
# Determina si el campo debería estar deshabilitado # Determina si el campo debería estar deshabilitado
#
# @return [Boolean]
def disabled? def disabled?
layout.metadata.dig(name, 'disabled') || !writable? layout.metadata.dig(name, 'disabled') || !writable?
end end
@ -157,6 +192,8 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
# Determina si el campo es de solo lectura # Determina si el campo es de solo lectura
# #
# once => el campo solo se puede modificar si estaba vacío # once => el campo solo se puede modificar si estaba vacío
#
# @return [Boolean]
def writable? def writable?
case layout.metadata.dig(name, 'writable') case layout.metadata.dig(name, 'writable')
when 'once' then value.blank? when 'once' then value.blank?
@ -167,6 +204,8 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
private private
# Si es obligatorio no puede estar vacío # Si es obligatorio no puede estar vacío
#
# @return [Boolean]
def can_be_empty? def can_be_empty?
true unless required && empty? true unless required && empty?
end end
@ -174,6 +213,9 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
# No usamos sanitize_action_text_content porque espera un ActionText # No usamos sanitize_action_text_content porque espera un ActionText
# #
# Ver ActionText::ContentHelper#sanitize_action_text_content # Ver ActionText::ContentHelper#sanitize_action_text_content
#
# @param :string [String]
# @return [String,nil]
def sanitize(string) def sanitize(string)
return if string.nil? return if string.nil?
return string unless string.is_a? String return string unless string.is_a? String
@ -186,6 +228,7 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
.html_safe .html_safe
end end
# @return [Rails::Html::Sanitizer]
def sanitizer def sanitizer
@sanitizer ||= Rails::Html::Sanitizer.safe_list_sanitizer.new @sanitizer ||= Rails::Html::Sanitizer.safe_list_sanitizer.new
end end
@ -202,8 +245,10 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
# Decifra el valor # Decifra el valor
# #
# XXX: Otros tipos de valores necesitan implementar su propio método # @todo Agregar el error de decifrado en self.errors
# de decifrado (Array). # @todo Mover a su propio Concern
# @param :value [String]
# @return [String,nil]
def decrypt(value) def decrypt(value)
return value if value.blank? return value if value.blank?
@ -220,8 +265,9 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
# Cifra el valor. # Cifra el valor.
# #
# XXX: Otros tipos de valores necesitan implementar su propio método # @todo serializar como JSON
# de cifrado (Array). # @param :value [String]
# @return [String]
def encrypt(value) def encrypt(value)
box.encrypt value.to_s box.encrypt value.to_s
end end