spec/support/schema_file.rb (24 lines of code) (raw):

# frozen_string_literal: true require 'json_schemer' module SchemaFile def load_schema(schema_path) schema_content = File.read(File.join(__dir__, '..', '..', schema_path)) json = JSON.parse(schema_content) # replaces the schemas with draft-04 so that json schemer can validate json['$schema'] = 'http://json-schema.org/draft-04/schema#' # ensures that the schema is correct according to Snowplow # http://iglucentral.com/schemas/com.snowplowanalytics.self-desc/schema/jsonschema/1-0-0# validate_field(json, %w(self vendor), /^[a-zA-Z0-9\\-_.]+$/) validate_field(json, %w(self name), /^[a-zA-Z0-9\-_.]+$/) validate_field(json, %w(self format), /^[a-zA-Z0-9\-_.]+$/) validate_field(json, %w(self version), /^[0-9]+-[0-9]+-[0-9]+$/) JSONSchemer.schema(json) end def validate_schema(schema_path, data) schema = load_schema(schema_path) normalized_data = data.transform_keys(&:to_s) schema.validate(normalized_data).map { |error| JSONSchemer::Errors.pretty(error) } end def validate_field(data, fields, regex) value = data.dig(*fields) if !value or !value.match(regex) raise "schema field #{fields.join('.')} is not present or does not satisfy regex #{regex}" end end end