From e15f68f0169cd2c760f47461a071262ea70dd54f Mon Sep 17 00:00:00 2001 From: Alessandro Desantis Date: Sun, 28 Aug 2016 20:44:03 +0300 Subject: [PATCH 1/6] Pass options to getters --- lib/representable/serializer.rb | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/representable/serializer.rb b/lib/representable/serializer.rb index 5178544d..55c490fd 100644 --- a/lib/representable/serializer.rb +++ b/lib/representable/serializer.rb @@ -3,7 +3,18 @@ module Representable options[:binding].evaluate_option(:getter, input, options) end - GetValue = ->(input, options) { options[:binding].send(:exec_context, options).send(options[:binding].getter) } + GetValue = ->(input, options) do + exec_context = options[:binding].send(:exec_context, options) + getter_method = exec_context.method(options[:binding].getter) + + if getter_method.arity > 0 + arguments = [{ options: options[:options] }] + else + arguments = [] + end + + exec_context.send(options[:binding].getter, *arguments) + end Writer = ->(input, options) do options[:binding].evaluate_option(:writer, input, options) @@ -51,4 +62,4 @@ module Representable # Warning: don't rely on AssignAs/AssignName, i am not sure if i leave that as functions. AssignAs = ->(input, options) { options[:as] = As.(input, options); input } AssignName = ->(input, options) { options[:as] = options[:binding].name; input } -end \ No newline at end of file +end From e0dbb9a52f42ec5e26bdaeb7525af6dce64fcc99 Mon Sep 17 00:00:00 2001 From: Alessandro Desantis Date: Mon, 29 Aug 2016 11:22:52 +0300 Subject: [PATCH 2/6] Finalize passing options to getters and setters --- lib/representable/deserializer.rb | 14 ++++++++++++-- lib/representable/serializer.rb | 15 +++++++-------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/representable/deserializer.rb b/lib/representable/deserializer.rb index e67d4100..0b3a3e48 100644 --- a/lib/representable/deserializer.rb +++ b/lib/representable/deserializer.rb @@ -88,8 +88,18 @@ module CreateObject end Setter = ->(input, options) { options[:binding].evaluate_option(:setter, input, options) } - SetValue = ->(input, options) { options[:binding].send(:exec_context, options).send(options[:binding].setter, input) } + SetValue = ->(input, options) do + context = options[:binding].send(:exec_context, options) + + arguments = [input] + arguments << { + options: options[:options], + user_options: options[:options][:user_options] + } if context.method(options[:binding].setter).arity == 2 + + context.send(options[:binding].setter, *arguments) + end Stop = ->(*) { Pipeline::Stop } @@ -105,4 +115,4 @@ module CreateObject return input if options[:options][:exclude]&&!res Pipeline::Stop end -end \ No newline at end of file +end diff --git a/lib/representable/serializer.rb b/lib/representable/serializer.rb index 55c490fd..24736002 100644 --- a/lib/representable/serializer.rb +++ b/lib/representable/serializer.rb @@ -4,16 +4,15 @@ module Representable end GetValue = ->(input, options) do - exec_context = options[:binding].send(:exec_context, options) - getter_method = exec_context.method(options[:binding].getter) + context = options[:binding].send(:exec_context, options) - if getter_method.arity > 0 - arguments = [{ options: options[:options] }] - else - arguments = [] - end + arguments = [] + arguments << { + options: options[:options], + user_options: options[:options][:user_options] + } if context.method(options[:binding].getter).arity == 1 - exec_context.send(options[:binding].getter, *arguments) + context.send(options[:binding].getter, *arguments) end Writer = ->(input, options) do From 652ab0feb7e29268a2ceb6dd001a0918b71c08a0 Mon Sep 17 00:00:00 2001 From: Alessandro Desantis Date: Mon, 29 Aug 2016 12:03:42 +0300 Subject: [PATCH 3/6] Fix Deserializer::SetValue and Serializer::GetValue for OpenStructs --- lib/representable/deserializer.rb | 2 +- lib/representable/serializer.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/representable/deserializer.rb b/lib/representable/deserializer.rb index 0b3a3e48..744f1d48 100644 --- a/lib/representable/deserializer.rb +++ b/lib/representable/deserializer.rb @@ -96,7 +96,7 @@ module CreateObject arguments << { options: options[:options], user_options: options[:options][:user_options] - } if context.method(options[:binding].setter).arity == 2 + } if !context.is_a?(OpenStruct) && context.method(options[:binding].setter).arity == 2 context.send(options[:binding].setter, *arguments) end diff --git a/lib/representable/serializer.rb b/lib/representable/serializer.rb index 24736002..66a21380 100644 --- a/lib/representable/serializer.rb +++ b/lib/representable/serializer.rb @@ -10,7 +10,7 @@ module Representable arguments << { options: options[:options], user_options: options[:options][:user_options] - } if context.method(options[:binding].getter).arity == 1 + } if !context.is_a?(OpenStruct) && context.method(options[:binding].getter).arity == 1 context.send(options[:binding].getter, *arguments) end From d5ff1a0eae9bede79c17e699bd3c02f4412ae626 Mon Sep 17 00:00:00 2001 From: Alessandro Desantis Date: Fri, 2 Sep 2016 17:40:46 +0300 Subject: [PATCH 4/6] Check that context responds to getter and setter --- lib/representable/deserializer.rb | 2 +- lib/representable/serializer.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/representable/deserializer.rb b/lib/representable/deserializer.rb index 744f1d48..a3692fe9 100644 --- a/lib/representable/deserializer.rb +++ b/lib/representable/deserializer.rb @@ -96,7 +96,7 @@ module CreateObject arguments << { options: options[:options], user_options: options[:options][:user_options] - } if !context.is_a?(OpenStruct) && context.method(options[:binding].setter).arity == 2 + } if context.respond_to?(method) && !context.is_a?(OpenStruct) && context.method(options[:binding].setter).arity == 2 context.send(options[:binding].setter, *arguments) end diff --git a/lib/representable/serializer.rb b/lib/representable/serializer.rb index 66a21380..a4b145c5 100644 --- a/lib/representable/serializer.rb +++ b/lib/representable/serializer.rb @@ -10,7 +10,7 @@ module Representable arguments << { options: options[:options], user_options: options[:options][:user_options] - } if !context.is_a?(OpenStruct) && context.method(options[:binding].getter).arity == 1 + } if context.respond_to?(method) && !context.is_a?(OpenStruct) && context.method(options[:binding].getter).arity == 1 context.send(options[:binding].getter, *arguments) end From 67de16557a4f691b9dd699d2d0d594face9aae13 Mon Sep 17 00:00:00 2001 From: Alessandro Desantis Date: Fri, 2 Sep 2016 17:42:47 +0300 Subject: [PATCH 5/6] Fix respond_to? check in Deserializer and Serializer --- lib/representable/deserializer.rb | 2 +- lib/representable/serializer.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/representable/deserializer.rb b/lib/representable/deserializer.rb index a3692fe9..2dbf330c 100644 --- a/lib/representable/deserializer.rb +++ b/lib/representable/deserializer.rb @@ -96,7 +96,7 @@ module CreateObject arguments << { options: options[:options], user_options: options[:options][:user_options] - } if context.respond_to?(method) && !context.is_a?(OpenStruct) && context.method(options[:binding].setter).arity == 2 + } if !context.is_a?(OpenStruct) && context.respond_to?(options[:binding].getter) && context.method(options[:binding].setter).arity == 2 context.send(options[:binding].setter, *arguments) end diff --git a/lib/representable/serializer.rb b/lib/representable/serializer.rb index a4b145c5..6eb3a10d 100644 --- a/lib/representable/serializer.rb +++ b/lib/representable/serializer.rb @@ -10,7 +10,7 @@ module Representable arguments << { options: options[:options], user_options: options[:options][:user_options] - } if context.respond_to?(method) && !context.is_a?(OpenStruct) && context.method(options[:binding].getter).arity == 1 + } if !context.is_a?(OpenStruct) && context.respond_to?(options[:binding].getter) && context.method(options[:binding].getter).arity == 1 context.send(options[:binding].getter, *arguments) end From dafd7270a2348eb048d1c22fdc22cd9e83353159 Mon Sep 17 00:00:00 2001 From: Alessandro Desantis Date: Fri, 2 Sep 2016 21:59:36 +0300 Subject: [PATCH 6/6] Remove #respond_to? check --- lib/representable/deserializer.rb | 2 +- lib/representable/serializer.rb | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/representable/deserializer.rb b/lib/representable/deserializer.rb index 2dbf330c..744f1d48 100644 --- a/lib/representable/deserializer.rb +++ b/lib/representable/deserializer.rb @@ -96,7 +96,7 @@ module CreateObject arguments << { options: options[:options], user_options: options[:options][:user_options] - } if !context.is_a?(OpenStruct) && context.respond_to?(options[:binding].getter) && context.method(options[:binding].setter).arity == 2 + } if !context.is_a?(OpenStruct) && context.method(options[:binding].setter).arity == 2 context.send(options[:binding].setter, *arguments) end diff --git a/lib/representable/serializer.rb b/lib/representable/serializer.rb index 6eb3a10d..52c39603 100644 --- a/lib/representable/serializer.rb +++ b/lib/representable/serializer.rb @@ -5,12 +5,13 @@ module Representable GetValue = ->(input, options) do context = options[:binding].send(:exec_context, options) + return options[:binding].send(:exec_context, options).send(options[:binding].getter) unless context arguments = [] arguments << { options: options[:options], user_options: options[:options][:user_options] - } if !context.is_a?(OpenStruct) && context.respond_to?(options[:binding].getter) && context.method(options[:binding].getter).arity == 1 + } if !context.is_a?(OpenStruct) && context.method(options[:binding].getter).arity == 1 context.send(options[:binding].getter, *arguments) end