11# frozen_string_literal: true
22
3+ require 'date'
4+
35# A UC Berkeley-specific validator for Jekyll sites
46# This class validates the following options:
57# 1) Ensures required attributes are present in the config file.
@@ -44,7 +46,9 @@ class ConfigValidator
4446 url : :validate_clean_url ,
4547 baseurl : :validate_semester_format ,
4648 course_department : :inclusion_validator ,
47- color_scheme : :inclusion_validator
49+ color_scheme : :inclusion_validator ,
50+ semester_start_date : :validate_iso8601_date ,
51+ semester_end_date : :validate_iso8601_date
4852 } . freeze
4953
5054 attr_accessor :config , :errors
@@ -61,13 +65,15 @@ def validate
6165 send ( validator , key , config [ key . to_s ] ) if @config . key? ( key . to_s )
6266 end
6367
68+ validate_semester_date_range
69+
6470 raise ConfigValidationError , errors if errors . length . positive?
6571
6672 puts 'Passed Berkeley YAML Config Validations'
6773 end
6874
6975 def validate_keys!
70- required_keys = %i[ baseurl course_department ]
76+ required_keys = %i[ baseurl course_department semester_start_date semester_end_date ]
7177 required_keys . each do |key |
7278 errors << "#{ key } is missing from site config" unless @config . key? ( key . to_s )
7379 end
@@ -95,6 +101,27 @@ def inclusion_validator(key, value)
95101 allowed = self . class . const_get ( "VALID_#{ key . upcase } " )
96102 errors << "`#{ key } ` must be one of #{ allowed } (not '#{ value } ')" unless allowed . include? ( value )
97103 end
104+
105+ def validate_iso8601_date ( key , value )
106+ return if parse_iso8601_date ( value )
107+
108+ errors << "`#{ key } ` must be a valid ISO-8601 date string (YYYY-MM-DD), not '#{ value } '"
109+ end
110+
111+ def validate_semester_date_range
112+ start_date = parse_iso8601_date ( config [ 'semester_start_date' ] )
113+ end_date = parse_iso8601_date ( config [ 'semester_end_date' ] )
114+ return unless start_date && end_date
115+ return unless start_date > end_date
116+
117+ errors << '`semester_start_date` must be on or before `semester_end_date`'
118+ end
119+
120+ def parse_iso8601_date ( value )
121+ Date . iso8601 ( value . to_s )
122+ rescue Date ::Error
123+ nil
124+ end
98125 end
99126end
100127
0 commit comments