@@ -50,6 +50,30 @@ def raw_yaml_field_checks(data)
5050 errors
5151end
5252
53+ def raw_yaml_date_checks ( yaml )
54+ mapping = Psych . parse ( yaml ) . root
55+ date_node = mapping . children . each_slice ( 2 ) . find do |key , _value |
56+ key . value == 'date'
57+ end &.last
58+ return [ ] unless date_node
59+
60+ value = date_node . value
61+ valid = value . match? ( /\A \d {4}-\d {2}-\d {2}\z / )
62+
63+ begin
64+ Date . iso8601 ( value )
65+ rescue Date ::Error
66+ valid = false
67+ end
68+
69+ return [ ] if valid
70+
71+ [ {
72+ 'data_pointer' => '/date' ,
73+ 'error' => 'value must be a valid date in YYYY-MM-DD format'
74+ } ]
75+ end
76+
5377def format_errors ( errors )
5478 errors . map do |e |
5579 pointer = e [ 'data_pointer' ] . to_s . empty? ? '<root>' : e [ 'data_pointer' ]
@@ -66,9 +90,12 @@ def format_errors(errors)
6690 filename = path . split ( '/' ) [ -2 ..] . join ( '/' )
6791
6892 it "#{ filename } conforms to schema" do
69- raw_data = YAML . safe_load_file ( path , permitted_classes : [ Date ] )
93+ yaml = File . read ( path )
94+ raw_data = YAML . safe_load ( yaml , permitted_classes : [ Date ] )
7095 data = normalize_for_json ( raw_data )
71- errors = raw_yaml_field_checks ( raw_data ) + schemer . validate ( data ) . to_a
96+ errors = raw_yaml_date_checks ( yaml ) +
97+ raw_yaml_field_checks ( raw_data ) +
98+ schemer . validate ( data ) . to_a
7299
73100 expect ( errors ) . to be_empty , lambda {
74101 "#{ filename } \n #{ format_errors ( errors ) } "
@@ -77,6 +104,22 @@ def format_errors(errors)
77104 end
78105end
79106
107+ describe 'raw YAML date validation' do
108+ it 'accepts a valid YYYY-MM-DD date' do
109+ expect ( raw_yaml_date_checks ( "date: 2026-06-03\n " ) ) . to be_empty
110+ end
111+
112+ it 'rejects dates without leading zeroes' do
113+ %w[ 2026-06-3 2026-6-03 2026-6-3 ] . each do |date |
114+ expect ( raw_yaml_date_checks ( "date: #{ date } \n " ) ) . not_to be_empty
115+ end
116+ end
117+
118+ it 'rejects an impossible date' do
119+ expect ( raw_yaml_date_checks ( "date: 2026-02-30\n " ) ) . not_to be_empty
120+ end
121+ end
122+
80123describe 'JSON Schema validation' do
81124 describe 'for gems' do
82125 include_examples 'conforming schema' ,
0 commit comments