From c03370c9bead0d7f1ba67888f050985a9f7abb95 Mon Sep 17 00:00:00 2001 From: jarosluv Date: Thu, 22 Sep 2016 18:13:04 +0300 Subject: [PATCH] Add undecorate_chain feature --- lib/draper/undecorate.rb | 8 ++++++++ spec/draper/undecorate_chain_spec.rb | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 spec/draper/undecorate_chain_spec.rb diff --git a/lib/draper/undecorate.rb b/lib/draper/undecorate.rb index b787286..5381065 100644 --- a/lib/draper/undecorate.rb +++ b/lib/draper/undecorate.rb @@ -6,4 +6,12 @@ module Draper object end end + + def self.undecorate_chain(object) + if object.respond_to?(:decorated?) && object.decorated? + undecorate_chain(object.object) + else + object + end + end end diff --git a/spec/draper/undecorate_chain_spec.rb b/spec/draper/undecorate_chain_spec.rb new file mode 100644 index 0000000..00e4c9a --- /dev/null +++ b/spec/draper/undecorate_chain_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' + +describe Draper, '.undecorate_chain' do + let!(:object) { Model.new } + let!(:decorated_inner) { Class.new(Draper::Decorator).new(object) } + let!(:decorated_outer) { Class.new(Draper::Decorator).new(decorated_inner) } + + it 'undecorates full chain of decorated objects' do + expect(Draper.undecorate_chain(decorated_outer)).to equal object + end + + it 'passes a non-decorated object through' do + expect(Draper.undecorate_chain(object)).to equal object + end + + it 'passes a non-decorator object through' do + object = Object.new + expect(Draper.undecorate_chain(object)).to equal object + end +end