From b6f4ab33a934aa47bbe1a90f6115e5a70222bea3 Mon Sep 17 00:00:00 2001 From: Romain Beauxis Date: Fri, 3 Jan 2014 16:43:36 -0600 Subject: [PATCH 1/3] Add a test for zero being empty and force-bail before calling construct when data is empty on a one parser call. --- lib/mediator/parser.rb | 4 ++++ test/mediator_parser_test.rb | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/mediator/parser.rb b/lib/mediator/parser.rb index 937cc82..6b8a8e9 100644 --- a/lib/mediator/parser.rb +++ b/lib/mediator/parser.rb @@ -72,6 +72,10 @@ def one name, options = {}, &block options = {construct: true}.merge options data = get name, options + # mediator.get below may create an empty object + # so we need to bail out now.. + return if data.nil? and !options[:empty] + subj = options[:subject] || mediator.get(name, options) sub subj, data, options, &block diff --git a/test/mediator_parser_test.rb b/test/mediator_parser_test.rb index 1f784bc..13b80a8 100644 --- a/test/mediator_parser_test.rb +++ b/test/mediator_parser_test.rb @@ -42,6 +42,14 @@ p.id :foo, empty: true assert_equal "", @subject.foo_id end + + it "Does not consider 0 empty" do + p = Mediator::Parser.new @mediator, foo: 0 + @subject.foo_id = 42 + + p.id :foo + assert_equal 0, @subject.foo_id + end end describe "ids" do From c1660672aec3a3939b9d62eac75978eebed61334 Mon Sep 17 00:00:00 2001 From: Romain Beauxis Date: Mon, 6 Jan 2014 10:36:36 -0600 Subject: [PATCH 2/3] Fine-tune one and many parser's behaviour wrt. empty: true and empty data.. --- lib/mediator/parser.rb | 16 +++++++--- mediator.gemspec | 2 +- test/mediator_parser_test.rb | 61 +++++++++++++++++++++++++++++++++--- 3 files changed, 68 insertions(+), 11 deletions(-) diff --git a/lib/mediator/parser.rb b/lib/mediator/parser.rb index 6b8a8e9..efe82a8 100644 --- a/lib/mediator/parser.rb +++ b/lib/mediator/parser.rb @@ -55,7 +55,11 @@ def many name, options = {}, &block options = {construct: true}.merge options data = get(name, options) - return if data.nil? and !options[:empty] # Can't use main empty? call here as [] does not count as empty.. + + if data.nil? + mediator.set name, nil if has?(name) and options[:empty] + return + end mediator.set name, [] unless options[:merge] @@ -72,10 +76,12 @@ def one name, options = {}, &block options = {construct: true}.merge options data = get name, options - # mediator.get below may create an empty object - # so we need to bail out now.. - return if data.nil? and !options[:empty] + if data.nil? + mediator.set name, nil if has?(name) and options[:empty] + return + end + subj = options[:subject] || mediator.get(name, options) sub subj, data, options, &block @@ -113,7 +119,7 @@ def hash name, options = {}, &block private def sub subj, data, options, &block - return if empty? data, options or subj.nil? + return if (empty?(data, options) and !options[:empty]) or subj.nil? Mediator[subj, context: mediator].parse data block[subj] if block diff --git a/mediator.gemspec b/mediator.gemspec index bd46de9..3a5afdc 100644 --- a/mediator.gemspec +++ b/mediator.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |gem| gem.test_files = `git ls-files -- test/*`.split "\n" gem.name = "mediator" gem.require_paths = ["lib"] - gem.version = "0.5.2" + gem.version = "0.5.3" gem.required_ruby_version = ">= 1.9.2" diff --git a/test/mediator_parser_test.rb b/test/mediator_parser_test.rb index 13b80a8..da9c848 100644 --- a/test/mediator_parser_test.rb +++ b/test/mediator_parser_test.rb @@ -167,8 +167,8 @@ describe "one" do before do - Top = Class.new OpenStruct - Nest = Class.new OpenStruct + Top ||= Class.new OpenStruct + Nest ||= Class.new OpenStruct Class.new Mediator do accept Top @@ -176,6 +176,7 @@ def parse! p p.key :foo p.one :nest + p.one :may_be_empty, empty: true end end @@ -202,6 +203,31 @@ def parse! p assert_equal d[:nest][:baz], s.nest.baz assert_equal d[:nest][:quux], s.nest.quux end + + it "sets to nil when empty: true is used and a value is passed" do + s = Top.new + s.may_be_empty = Nest.new bla: :blo + + m = Mediator[s] + d = { may_be_empty: nil } + + m.parse d + + assert_nil s.may_be_empty + end + + it "does nothing when empty: true is used but no value is passed" do + s = Top.new + may_be_empty = Nest.new bla: :blo + s.may_be_empty = may_be_empty + + m = Mediator[s] + d = { foo: "bar" } + + m.parse d + + assert_equal may_be_empty, s.may_be_empty + end end describe "many" do @@ -215,11 +241,12 @@ def parse! p def parse! p p.many :foos p.many :merge_foos, merge: true + p.many :may_be_empty, empty: true end def construct name # name is either foo, replace_foo, replace_foos or foos.. - subject.foos ||= [] + subject.foos ||= [] subject.merge_foos ||= [] return subject.send(name) if subject.respond_to?(name) @@ -276,6 +303,30 @@ def parse! p assert_equal ["bar"], s.foos.map(&:baz) end + it "sets to nil when empty: true is used and a value is passed" do + s = Bar.new may_be_empty: [ Foo.new(baz: "bar") ] + + m = Mediator[s] + d = { may_be_empty: nil } + + m.parse d + + assert_nil s.may_be_empty + end + + it "does nothing when empty: true is used but no value is passed" do + s = Bar.new + may_be_empty = [ Foo.new(baz: "bar") ] + s.may_be_empty = may_be_empty + + m = Mediator[s] + d = { foos: [ { baz: "bar" } ] } + + m.parse d + + assert_equal may_be_empty, s.may_be_empty + end + it "does something with []" do s = Bar.new foos: [ Foo.new(baz: "bar") ] @@ -363,7 +414,7 @@ def parse! p describe "hash" do it "should parse hash with no exclude" do - Hashie = Class.new OpenStruct + Hashie ||= Class.new OpenStruct Class.new Mediator do accept Hashie @@ -382,7 +433,7 @@ def parse! p end it "should parse hash with exclude" do - Hashie = Class.new OpenStruct + Hashie ||= Class.new OpenStruct Class.new Mediator do accept Hashie From fa0ccbfc5fc1a9b42a71eb48a6f86e199a7731b2 Mon Sep 17 00:00:00 2001 From: Romain Beauxis Date: Mon, 6 Jan 2014 10:43:33 -0600 Subject: [PATCH 3/3] This should not have changed.. --- lib/mediator/parser.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mediator/parser.rb b/lib/mediator/parser.rb index efe82a8..b89af62 100644 --- a/lib/mediator/parser.rb +++ b/lib/mediator/parser.rb @@ -119,7 +119,7 @@ def hash name, options = {}, &block private def sub subj, data, options, &block - return if (empty?(data, options) and !options[:empty]) or subj.nil? + return if empty? data, options or subj.nil? Mediator[subj, context: mediator].parse data block[subj] if block