From 8a5e965e617142250debe2a0ae3bf04a223e54e8 Mon Sep 17 00:00:00 2001 From: f Date: Thu, 13 May 2021 11:44:09 -0300 Subject: [PATCH 1/2] validar la fecha MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit una fecha en el futuro como 20213-01-01 es válida para ruby, pero jekyll valida las fechas con cuatro digitos nada mas (issue pendiente :P), así que tomaba el archivo con fecha en el futurísimo como un archivo sin fecha. fixes #1573 fixes #1572 --- app/models/metadata_document_date.rb | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/app/models/metadata_document_date.rb b/app/models/metadata_document_date.rb index 39e68735..f6ad7d0d 100644 --- a/app/models/metadata_document_date.rb +++ b/app/models/metadata_document_date.rb @@ -13,11 +13,25 @@ class MetadataDocumentDate < MetadataTemplate # El valor puede ser un Date, Time o una String en el formato # "yyyy-mm-dd" + # + # XXX: Date.iso8601 acepta fechas en el futuro lejano, como 20000, + # pero Jekyll las limita a cuatro cifras, así que vamos a mantener + # eso. + # + # @see {https://github.com/jekyll/jekyll/blob/master/lib/jekyll/document.rb#L15} def value - return (self[:value] = value_from_document || default_value) if self[:value].nil? + self[:value] = + case self[:value] + when String + begin + raise Date::Error unless /\A\d{2,4}-\d{1,2}-\d{1,2}\z/ ~= self[:value] - self[:value] = Date.iso8601(self[:value]).to_time if self[:value].is_a? String - - self[:value] + Date.iso8601(self[:value]).to_time + rescue Date::Error + value_from_document || default_value + end + else + value_from_document || default_value + end end end From f5834b5c1bbd647530b7ca160343832aeeedcb4e Mon Sep 17 00:00:00 2001 From: f Date: Thu, 13 May 2021 12:52:49 -0300 Subject: [PATCH 2/2] en lugar de asumir un valor, informar el error --- app/models/metadata_document_date.rb | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/app/models/metadata_document_date.rb b/app/models/metadata_document_date.rb index f6ad7d0d..82126ba3 100644 --- a/app/models/metadata_document_date.rb +++ b/app/models/metadata_document_date.rb @@ -11,6 +11,19 @@ class MetadataDocumentDate < MetadataTemplate document.date end + # Siempre es obligatorio + def required + true + end + + def validate + super + + errors << I18n.t('metadata.date.invalid_format') unless valid_format? + + errors.empty? + end + # El valor puede ser un Date, Time o una String en el formato # "yyyy-mm-dd" # @@ -24,8 +37,6 @@ class MetadataDocumentDate < MetadataTemplate case self[:value] when String begin - raise Date::Error unless /\A\d{2,4}-\d{1,2}-\d{1,2}\z/ ~= self[:value] - Date.iso8601(self[:value]).to_time rescue Date::Error value_from_document || default_value @@ -34,4 +45,13 @@ class MetadataDocumentDate < MetadataTemplate value_from_document || default_value end end + + private + + def valid_format? + return true if self[:value].is_a?(Time) + + @valid_format_re ||= /\A\d{2,4}-\d{1,2}-\d{1,2}\z/ + @valid_format_re =~ self[:value].to_s + end end