fetch_in 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/Rakefile +1 -1
  2. data/VERSION +1 -1
  3. data/lib/fetch_in.rb +31 -17
  4. data/spec/fetch_in_spec.rb +11 -0
  5. metadata +16 -7
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ begin
10
10
  gem.email = "mccraigmccraig@googlemail.com"
11
11
  gem.homepage = "http://github.com/trampoline/fetch_in"
12
12
  gem.authors = ["mccraig mccraig of the clan mccraig"]
13
- gem.add_development_dependency "rspec", ">= 1.2.9"
13
+ gem.add_development_dependency "rspec", ">= 1.2.8"
14
14
  gem.add_development_dependency "rr", ">= 0.10.5"
15
15
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
16
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.2.0
@@ -1,29 +1,43 @@
1
1
  module FetchIn
2
- def fetch_in(*keys)
3
- keys.reduce(self) do |result,key|
4
- return nil if !result
5
- result[key]
2
+ class << self
3
+ def fetch_in(h, *keys)
4
+ keys.reduce(h) do |result,key|
5
+ return nil if !result
6
+ result[key]
7
+ end
8
+ end
9
+
10
+ # store_in stores a value in a nested associative structure
11
+ # new levels in the structure are created as required, by the supplied Proc.
12
+ # if no Proc is supplied, new levels are created with the same class as
13
+ # the previous level
14
+ def store_in(h, *keys_and_value, &proc)
15
+ proc ||= lambda{|rx_key_stack| rx_key_stack[-1][0].class.new}
16
+ keys = keys_and_value[0..-2]
17
+ value = keys_and_value[-1]
18
+
19
+ # find or create the last associative receiver in the chain to the value
20
+ last_rx = keys[0..-2].reduce([h,[]]) do |(rx,rx_key_stack),key|
21
+ rx_key_stack = rx_key_stack << [rx,key]
22
+ rx[key] = proc.call(rx_key_stack) if !rx[key]
23
+ [rx[key], rx_key_stack]
24
+ end[0]
25
+
26
+ # set the value
27
+ last_rx[keys[-1]]=value
6
28
  end
7
29
  end
8
30
 
31
+ def fetch_in(*keys)
32
+ FetchIn.fetch_in(self, *keys)
33
+ end
34
+
9
35
  # store_in stores a value in a nested associative structure
10
36
  # new levels in the structure are created as required, by the supplied Proc.
11
37
  # if no Proc is supplied, new levels are created with the same class as
12
38
  # the previous level
13
39
  def store_in(*keys_and_value, &proc)
14
- proc ||= lambda{|rx_key_stack| rx_key_stack[-1][0].class.new}
15
- keys = keys_and_value[0..-2]
16
- value = keys_and_value[-1]
17
-
18
- # find or create the last associative receiver in the chain to the value
19
- last_rx = keys[0..-2].reduce([self,[]]) do |(rx,rx_key_stack),key|
20
- rx_key_stack = rx_key_stack << [rx,key]
21
- rx[key] = proc.call(rx_key_stack) if !rx[key]
22
- [rx[key], rx_key_stack]
23
- end[0]
24
-
25
- # set the value
26
- last_rx[keys[-1]]=value
40
+ FetchIn.store_in(self, *keys_and_value, &proc)
27
41
  end
28
42
  end
29
43
 
@@ -37,6 +37,11 @@ describe "FetchIn" do
37
37
  it "should fetch from mixed array and hash nestings" do
38
38
  {:foo=>[nil,[nil,{:bar=>5}]]}.fetch_in(:foo,1,1,:bar).should == 5
39
39
  end
40
+
41
+ it "should permit direct class-method invocation" do
42
+ FetchIn.fetch_in({:foo=>[nil,[nil,{:bar=>5}]]},
43
+ :foo,1,1,:bar).should == 5
44
+ end
40
45
  end
41
46
 
42
47
  describe "store_in" do
@@ -99,5 +104,11 @@ describe "FetchIn" do
99
104
  s.store_in(1,2,3){|rx_key_stack| {}}
100
105
  s.should == [nil,{2=>3}]
101
106
  end
107
+
108
+ it "should permit direct class-method invocation" do
109
+ s=[]
110
+ FetchIn.store_in(s,1,2,3){|rx_key_stack| {}}
111
+ s.should == [nil,{2=>3}]
112
+ end
102
113
  end
103
114
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fetch_in
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 23
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 1
8
- - 1
9
- version: 0.1.1
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - mccraig mccraig of the clan mccraig
@@ -14,30 +15,34 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-04-22 00:00:00 +01:00
18
+ date: 2010-10-15 00:00:00 +01:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: rspec
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 15
27
30
  segments:
28
31
  - 1
29
32
  - 2
30
- - 9
31
- version: 1.2.9
33
+ - 8
34
+ version: 1.2.8
32
35
  type: :development
33
36
  version_requirements: *id001
34
37
  - !ruby/object:Gem::Dependency
35
38
  name: rr
36
39
  prerelease: false
37
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
38
42
  requirements:
39
43
  - - ">="
40
44
  - !ruby/object:Gem::Version
45
+ hash: 61
41
46
  segments:
42
47
  - 0
43
48
  - 10
@@ -75,23 +80,27 @@ rdoc_options:
75
80
  require_paths:
76
81
  - lib
77
82
  required_ruby_version: !ruby/object:Gem::Requirement
83
+ none: false
78
84
  requirements:
79
85
  - - ">="
80
86
  - !ruby/object:Gem::Version
87
+ hash: 3
81
88
  segments:
82
89
  - 0
83
90
  version: "0"
84
91
  required_rubygems_version: !ruby/object:Gem::Requirement
92
+ none: false
85
93
  requirements:
86
94
  - - ">="
87
95
  - !ruby/object:Gem::Version
96
+ hash: 3
88
97
  segments:
89
98
  - 0
90
99
  version: "0"
91
100
  requirements: []
92
101
 
93
102
  rubyforge_project:
94
- rubygems_version: 1.3.6
103
+ rubygems_version: 1.3.7
95
104
  signing_key:
96
105
  specification_version: 3
97
106
  summary: simple value fetching in nested associative structures