55 lines
1.1 KiB
Ruby
55 lines
1.1 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module ReleaseHighlights
|
||
|
class Validator
|
||
|
attr_reader :errors, :file
|
||
|
|
||
|
def initialize(file:)
|
||
|
@file = file
|
||
|
@errors = []
|
||
|
end
|
||
|
|
||
|
def valid?
|
||
|
document = YAML.parse(File.read(file))
|
||
|
|
||
|
document.root.children.each do |entry|
|
||
|
entry = ReleaseHighlights::Validator::Entry.new(entry)
|
||
|
|
||
|
errors.push(entry.errors.full_messages) unless entry.valid?
|
||
|
end
|
||
|
|
||
|
errors.none?
|
||
|
end
|
||
|
|
||
|
def self.validate_all!
|
||
|
@all_errors = []
|
||
|
|
||
|
ReleaseHighlight.file_paths.each do |file_path|
|
||
|
instance = self.new(file: file_path)
|
||
|
|
||
|
@all_errors.push([instance.errors, instance.file]) unless instance.valid?
|
||
|
end
|
||
|
|
||
|
@all_errors.none?
|
||
|
end
|
||
|
|
||
|
def self.error_message
|
||
|
io = StringIO.new
|
||
|
|
||
|
@all_errors.each do |errors, file|
|
||
|
message = "Validation failed for #{file}"
|
||
|
line = -> { io.puts "-" * message.length }
|
||
|
|
||
|
line.call
|
||
|
io.puts message
|
||
|
line.call
|
||
|
|
||
|
errors.flatten.each { |error| io.puts "* #{error}" }
|
||
|
io.puts
|
||
|
end
|
||
|
|
||
|
io.string
|
||
|
end
|
||
|
end
|
||
|
end
|