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:
parent
a4ae27be89
commit
df3989a187
1 changed files with 53 additions and 7 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue