44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
# File 'lib/shellfie/cassette.rb', line 44
def self.validate!(raw)
raise ParseError, "Cassette must be a JSON object" unless raw.is_a?(Hash)
raise ParseError, "Unsupported cassette version" unless raw[:version] == 1
raise ParseError, "Unknown cassette key" unless (raw.keys - TOP_LEVEL_KEYS).empty?
raise ParseError, "Cassette title must be a string" unless raw[:title].is_a?(String)
unless raw[:columns].is_a?(Integer) && raw[:columns].between?(1, 500) &&
raw[:rows].is_a?(Integer) && raw[:rows].between?(1, 200)
raise ParseError, "Invalid cassette dimensions"
end
events = raw[:events] || []
raise ParseError, "Cassette events must be an array" unless events.is_a?(Array)
raise ParseError, "Cassette has too many events" if events.size > MAX_EVENTS
events.each_with_index do |event, index|
unless event.is_a?(Hash) && (event.keys - EVENT_KEYS).empty? && event[:text].is_a?(String) &&
event[:delay].is_a?(Numeric) && event[:delay].finite? && event[:delay] >= 0 &&
[true, false].include?(event.fetch(:visible, true)) &&
(!event.key?(:screen) || event[:screen].is_a?(Array) && event[:screen].all?(String)) &&
(event[:status].nil? || event[:status].is_a?(Integer) && event[:status].between?(0, 255))
raise ParseError, "Invalid cassette event at index #{index}"
end
end
captures = raw[:captures] || {}
unless captures.is_a?(Hash) && captures.all? { |name, lines| name.is_a?(Symbol) && lines.is_a?(Array) && lines.all?(String) }
raise ParseError, "Cassette captures must map names to arrays of strings"
end
unless raw[:exit_status].nil? || raw[:exit_status].is_a?(Integer) && raw[:exit_status].between?(0, 255)
raise ParseError, "Invalid cassette exit status"
end
end
|