From e3bbd2765adf7508d71e58fc7905bad398cb3ae1 Mon Sep 17 00:00:00 2001 From: John Foley Date: Wed, 27 Nov 2013 16:25:45 -0700 Subject: [PATCH] Only raise missing key errors when strict checking This is to remain backwards compatible --- lib/membrane/schemas/record.rb | 11 +++++---- spec/schemas/record_spec.rb | 41 +++++++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/lib/membrane/schemas/record.rb b/lib/membrane/schemas/record.rb index dbcd207..49403ed 100644 --- a/lib/membrane/schemas/record.rb +++ b/lib/membrane/schemas/record.rb @@ -12,9 +12,10 @@ class Membrane::Schemas::Record < Membrane::Schemas::Base attr_reader :schemas attr_reader :optional_keys - def initialize(schemas, optional_keys = []) + def initialize(schemas, optional_keys = [], strict_checking = false) @optional_keys = Set.new(optional_keys) @schemas = schemas + @strict_checking = strict_checking end def validate(object) @@ -39,9 +40,11 @@ def validate(object) end end - extra_keys = object.keys - schema_keys - extra_keys.each do |k| - key_errors[k] = "was not specified in the schema" + if @strict_checking + extra_keys = object.keys - schema_keys + extra_keys.each do |k| + key_errors[k] = "was not specified in the schema" + end end if key_errors.size > 0 diff --git a/spec/schemas/record_spec.rb b/spec/schemas/record_spec.rb index c95a99c..8a9e94b 100644 --- a/spec/schemas/record_spec.rb +++ b/spec/schemas/record_spec.rb @@ -53,19 +53,38 @@ errors.should match(/bar/) end - it "raises an error if there are extra keys that are not matched in the schema" do - data = { - "key" => "value", - "other_key" => 2, - } + context "when strict checking" do + it "raises an error if there are extra keys that are not matched in the schema" do + data = { + "key" => "value", + "other_key" => 2, + } + + rec_schema = Membrane::Schemas::Record.new({ + "key" => Membrane::Schemas::Class.new(String) + }, [], true) + + expect { + rec_schema.validate(data) + }.to raise_error(/other_key .* was not specified/) + end + end + + context "when not strict checking" do + it "doesnt raise an error" do + data = { + "key" => "value", + "other_key" => 2, + } - rec_schema = Membrane::Schemas::Record.new({ - "key" => Membrane::Schemas::Class.new(String) - }) + rec_schema = Membrane::Schemas::Record.new({ + "key" => Membrane::Schemas::Class.new(String) + }) - expect { - rec_schema.validate(data) - }.to raise_error(/other_key .* was not specified/) + expect { + rec_schema.validate(data) + }.to_not raise_error + end end end