summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Aument <saument@gmail.com>2014-05-15 15:01:05 -0500
committerStephen Aument <saument@gmail.com>2014-05-15 15:43:47 -0500
commit2c9721d49f50f2259cd2dfb9f3eb8e5c149bf795 (patch)
treea2a606fdfe61d428b8672206e0f9da175f662c54
parentedd37c7acc02efbee31470458f8c787c9c05fe9c (diff)
downloadhashie-2c9721d49f50f2259cd2dfb9f3eb8e5c149bf795.tar.gz
Handle nil intermediate object on deep fetch
-rw-r--r--lib/hashie/extensions/deep_fetch.rb2
-rw-r--r--spec/hashie/extensions/deep_fetch_spec.rb14
2 files changed, 15 insertions, 1 deletions
diff --git a/lib/hashie/extensions/deep_fetch.rb b/lib/hashie/extensions/deep_fetch.rb
index d8746cb..a441934 100644
--- a/lib/hashie/extensions/deep_fetch.rb
+++ b/lib/hashie/extensions/deep_fetch.rb
@@ -18,7 +18,7 @@ module Hashie
begin
arg = Integer(arg) if obj.kind_of? Array
obj.fetch(arg)
- rescue ArgumentError, IndexError => e
+ rescue ArgumentError, IndexError, NoMethodError => e
break block.call(arg) if block
raise UndefinedPathError, "Could not fetch path (#{args.join(' > ')}) at #{arg}", e.backtrace
end
diff --git a/spec/hashie/extensions/deep_fetch_spec.rb b/spec/hashie/extensions/deep_fetch_spec.rb
index 3459042..3fd4b1d 100644
--- a/spec/hashie/extensions/deep_fetch_spec.rb
+++ b/spec/hashie/extensions/deep_fetch_spec.rb
@@ -11,6 +11,7 @@ module Hashie
{ title: 'Call of the Wild' },
{ title: 'Moby Dick' }
],
+ shelves: nil,
location: {
address: '123 Library St.'
}
@@ -62,6 +63,19 @@ module Hashie
)
end
end
+
+ context 'when the nested object is nil' do
+ it 'raises an UndefinedPathError' do
+ expect do
+ instance.deep_fetch(:library, :shelves, :address)
+ end.to(
+ raise_error(
+ DeepFetch::UndefinedPathError,
+ 'Could not fetch path (library > shelves > address) at address'
+ )
+ )
+ end
+ end
end
end
end