Skip to content

Commit ad3eea4

Browse files
authored
Merge pull request #1219 from rubysec/date-validator
Add date validator.
2 parents ba637fb + e199b09 commit ad3eea4

1 file changed

Lines changed: 45 additions & 2 deletions

File tree

spec/schema_validation_spec.rb

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,30 @@ def raw_yaml_field_checks(data)
5050
errors
5151
end
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+
5377
def 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
78105
end
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+
80123
describe 'JSON Schema validation' do
81124
describe 'for gems' do
82125
include_examples 'conforming schema',

0 commit comments

Comments
 (0)