summaryrefslogtreecommitdiff
path: root/lib/hashie/extensions/deep_locate.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/hashie/extensions/deep_locate.rb')
-rw-r--r--lib/hashie/extensions/deep_locate.rb23
1 files changed, 16 insertions, 7 deletions
diff --git a/lib/hashie/extensions/deep_locate.rb b/lib/hashie/extensions/deep_locate.rb
index 62e1be2..2b33b23 100644
--- a/lib/hashie/extensions/deep_locate.rb
+++ b/lib/hashie/extensions/deep_locate.rb
@@ -14,10 +14,12 @@ module Hashie
# ...
# ]
#
- # Hashie::Extensions::DeepLocate.deep_locate -> (key, value, object) { key == :title }, books
+ # DeepLocate.deep_locate -> (key, value, object) { key == :title }, books
# # => [{:title=>"Ruby for beginners", :pages=>120}, ...]
def self.deep_locate(comparator, object)
- comparator = _construct_key_comparator(comparator, object) unless comparator.respond_to?(:call)
+ unless comparator.respond_to?(:call)
+ comparator = _construct_key_comparator(comparator, object)
+ end
_deep_locate(comparator, object)
end
@@ -53,17 +55,21 @@ module Hashie
# # http://ruby-journal.com/becareful-with-space-in-lambda-hash-rocket-syntax-between-ruby-1-dot-9-and-2-dot-0/
#
# books.deep_locate -> (key, value, object) { key == :title && value.include?("Ruby") }
- # # => [{:title=>"Ruby for beginners", :pages=>120}, {:title=>"Ruby for the rest of us", :pages=>576}]
+ # # => [{:title=>"Ruby for beginners", :pages=>120},
+ # # {:title=>"Ruby for the rest of us", :pages=>576}]
#
# books.deep_locate -> (key, value, object) { key == :pages && value <= 120 }
- # # => [{:title=>"Ruby for beginners", :pages=>120}, {:title=>"CSS for intermediates", :pages=>80}]
+ # # => [{:title=>"Ruby for beginners", :pages=>120},
+ # # {:title=>"CSS for intermediates", :pages=>80}]
def deep_locate(comparator)
Hashie::Extensions::DeepLocate.deep_locate(comparator, self)
end
def self._construct_key_comparator(search_key, object)
- search_key = search_key.to_s if activesupport_indifferent?(object)
- search_key = search_key.to_s if object.respond_to?(:indifferent_access?) && object.indifferent_access?
+ if object.respond_to?(:indifferent_access?) && object.indifferent_access? ||
+ activesupport_indifferent?(object)
+ search_key = search_key.to_s
+ end
lambda do |non_callable_object|
->(key, _, _) { key == non_callable_object }
@@ -73,7 +79,10 @@ module Hashie
def self._deep_locate(comparator, object, result = [])
if object.is_a?(::Enumerable)
- result.push object if object.any? { |value| _match_comparator?(value, comparator, object) }
+ if object.any? { |value| _match_comparator?(value, comparator, object) }
+ result.push object
+ end
+
(object.respond_to?(:values) ? object.values : object.entries).each do |value|
_deep_locate(comparator, value, result)
end