nested_value 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -10,32 +10,45 @@ class MyClass
10
10
  include NestedValue
11
11
 
12
12
  def initialize
13
- @my_hash = {:come_out => {:come_out => {:wherever => {:you_are => "Found ME!!!"}}}}
13
+ @my_data = {:come_out => [{:come_out => {:wherever =>
14
+ ["wrong turn", {:you_are => "Found ME!!!"}]}}, "some_value", 0]}
14
15
  end
15
16
 
16
17
  def correct
17
- nested_value(@my_hash, [:come_out, :come_out, :wherever, :you_are])
18
+ nested_value(@my_data, :come_out, 0, :come_out, :wherever, 1, :you_are)
18
19
  end
19
20
 
20
21
  def incorrect
21
- nested_value(@my_hash, [:come_out, :wherever, :you_are])
22
+ nested_value(@my_data, :come_out, 0, :wherever, 0, :you_are)
22
23
  end
23
24
 
24
25
  def not_even_close
25
- nested_value(@my_hash, [:where, :are, :you])
26
+ nested_value(@my_data, :where, :are, :you, 99)
26
27
  end
27
28
 
28
29
  def going_halfway
29
- nested_value(@my_hash, [:come_out, :come_out])
30
+ nested_value(@my_data, :come_out, 0, :come_out)
30
31
  end
31
32
  end
32
33
 
33
34
  MyClass.new.correct #=> "Found Me!!!"
34
35
  MyClass.new.incorrect #=> nil
35
36
  MyClass.new.not_even_close #=> nil
36
- MyClass.new.going_halfway #=> {:wherever => {:you_are => "Found ME!!!"}}
37
+ MyClass.new.going_halfway #=> {:wherever=>["wrong turn", {:you_are=>"Found ME!!!"}]}
37
38
  ```
38
39
 
39
40
  You could also extend the NestedValue module if you prefer.
40
41
 
42
+ In versions 0.0.2 and above, you can patch nested_value_for on Array and Hash with ease. All you have to do is require the patch_nested_value file.
43
+
44
+ ```ruby
45
+ require "patch_nested_value"
46
+
47
+ my_array = [5,3,4,5,6,{some: "value"}]
48
+ my_array.nested_value_for(5, :some) #=> "value"
49
+
50
+ my_hash = {I: {can: {has: [:moneyz]}}}
51
+ my_hash.nested_value_for(:I, :can, :has, 0) #=> :moneyz
52
+ ```
53
+
41
54
  Enjoy!
@@ -1,8 +1,24 @@
1
1
  module NestedValue
2
- def nested_value(some_nested_hash, ordered_list_of_keys)
3
- ordered_list_of_keys.inject(some_nested_hash.dup) do |acc, key|
4
- return unless acc && acc.class == Hash
5
- acc = acc[key]
2
+ def nested_value(nested_data_structure, *ordered_list_of_keys)
3
+ ordered_list_of_keys.inject(nested_data_structure) do |remaining_value, key|
4
+ return unless can_be_read?(remaining_value)
5
+ remaining_value = access_value(remaining_value, key)
6
6
  end
7
7
  end
8
+
9
+ private
10
+
11
+ def can_be_read?(remaining_value)
12
+ remaining_value && (remaining_value.kind_of?(Hash) || remaining_value.kind_of?(Array))
13
+ end
14
+
15
+ def access_value(remaining_value, key)
16
+ return if remaining_value.kind_of?(Array) && !key.kind_of?(Integer)
17
+ remaining_value[key] ||
18
+ if key.kind_of?(String)
19
+ remaining_value[key.to_sym]
20
+ else
21
+ remaining_value[key.to_s]
22
+ end
23
+ end
8
24
  end
@@ -0,0 +1,17 @@
1
+ require "nested_value"
2
+
3
+ class Hash
4
+ include NestedValue
5
+
6
+ def nested_value_for(*access_chain)
7
+ nested_value(self, *access_chain)
8
+ end
9
+ end
10
+
11
+ class Array
12
+ include NestedValue
13
+
14
+ def nested_value_for(*access_chain)
15
+ nested_value(self, *access_chain)
16
+ end
17
+ end
metadata CHANGED
@@ -1,11 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nested_value
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Dave Moore
9
+ - Trace Wax
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
@@ -13,7 +14,7 @@ date: 2013-06-28 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: bundler
16
- requirement: &70272053066740 !ruby/object:Gem::Requirement
17
+ requirement: &70097721570320 !ruby/object:Gem::Requirement
17
18
  none: false
18
19
  requirements:
19
20
  - - ! '>='
@@ -21,10 +22,10 @@ dependencies:
21
22
  version: '0'
22
23
  type: :development
23
24
  prerelease: false
24
- version_requirements: *70272053066740
25
+ version_requirements: *70097721570320
25
26
  - !ruby/object:Gem::Dependency
26
27
  name: rspec
27
- requirement: &70272053066180 !ruby/object:Gem::Requirement
28
+ requirement: &70097721569100 !ruby/object:Gem::Requirement
28
29
  none: false
29
30
  requirements:
30
31
  - - ! '>='
@@ -32,7 +33,7 @@ dependencies:
32
33
  version: 1.2.0
33
34
  type: :development
34
35
  prerelease: false
35
- version_requirements: *70272053066180
36
+ version_requirements: *70097721569100
36
37
  description: Access values hidden in deeply nested data structures with ease and without
37
38
  fear.
38
39
  email: cuvuligio@gmail.com
@@ -41,6 +42,7 @@ extensions: []
41
42
  extra_rdoc_files: []
42
43
  files:
43
44
  - lib/nested_value.rb
45
+ - lib/patch_nested_value.rb
44
46
  - LICENSE
45
47
  - README.md
46
48
  homepage: https://github.com/dcmoore/nested_value