gorillib 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -47,3 +47,7 @@ pkg/*
47
47
 
48
48
  ## PROJECT::SPECIFIC
49
49
  *.rdb
50
+
51
+ .vendor
52
+ .bundle
53
+ Gemfile.lock
data/Rakefile CHANGED
@@ -32,7 +32,7 @@ Jeweler::Tasks.new do |gem|
32
32
  gem.files = dotfiles + Dir["**/*"].
33
33
  reject{|f| f =~ %r{^(vendor|coverage)/} }.
34
34
  reject{|f| File.directory?(f) }.
35
- reject{|f| ignores.any?{|i| File.fnmatch(i, f) || File.fnmatch(i+'/**/*', f) } }
35
+ reject{|f| ignores.any?{|i| File.fnmatch(i, f) || File.fnmatch(i+'/**/*', f) || File.fnmatch(i+'/*', f) } }
36
36
  gem.test_files = gem.files.grep(/^spec\//)
37
37
  gem.require_paths = ['lib']
38
38
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.4
1
+ 0.1.5
data/gorillib.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{gorillib}
8
- s.version = "0.1.4"
8
+ s.version = "0.1.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Infochimps"]
12
- s.date = %q{2011-07-06}
11
+ s.authors = [%q{Infochimps}]
12
+ s.date = %q{2011-08-02}
13
13
  s.description = %q{Gorillib: infochimps lightweight subset of ruby convenience methods}
14
14
  s.email = %q{coders@infochimps.org}
15
15
  s.extra_rdoc_files = [
@@ -21,7 +21,6 @@ Gem::Specification.new do |s|
21
21
  ".rspec",
22
22
  "CHANGELOG.textile",
23
23
  "Gemfile",
24
- "Gemfile.lock",
25
24
  "LICENSE.textile",
26
25
  "README.textile",
27
26
  "Rakefile",
@@ -49,6 +48,7 @@ Gem::Specification.new do |s|
49
48
  "lib/gorillib/hashlike/compact.rb",
50
49
  "lib/gorillib/hashlike/deep_compact.rb",
51
50
  "lib/gorillib/hashlike/deep_dup.rb",
51
+ "lib/gorillib/hashlike/deep_hash.rb",
52
52
  "lib/gorillib/hashlike/deep_merge.rb",
53
53
  "lib/gorillib/hashlike/hashlike_via_accessors.rb",
54
54
  "lib/gorillib/hashlike/keys.rb",
@@ -98,6 +98,7 @@ Gem::Specification.new do |s|
98
98
  "spec/hash/slice_spec.rb",
99
99
  "spec/hash/zip_spec.rb",
100
100
  "spec/hashlike/behave_same_as_hash_spec.rb",
101
+ "spec/hashlike/deep_hash_spec.rb",
101
102
  "spec/hashlike/hashlike_behavior_spec.rb",
102
103
  "spec/hashlike/hashlike_via_accessors_spec.rb",
103
104
  "spec/hashlike_spec.rb",
@@ -133,9 +134,9 @@ Gem::Specification.new do |s|
133
134
  "spec/support/matchers/evaluate_to_true.rb"
134
135
  ]
135
136
  s.homepage = %q{http://infochimps.com/labs}
136
- s.licenses = ["MIT"]
137
- s.require_paths = ["lib"]
138
- s.rubygems_version = %q{1.3.7}
137
+ s.licenses = [%q{MIT}]
138
+ s.require_paths = [%q{lib}]
139
+ s.rubygems_version = %q{1.8.6}
139
140
  s.summary = %q{include only what you need. No dependencies, no creep}
140
141
  s.test_files = [
141
142
  "spec/array/compact_blank_spec.rb",
@@ -152,6 +153,7 @@ Gem::Specification.new do |s|
152
153
  "spec/hash/slice_spec.rb",
153
154
  "spec/hash/zip_spec.rb",
154
155
  "spec/hashlike/behave_same_as_hash_spec.rb",
156
+ "spec/hashlike/deep_hash_spec.rb",
155
157
  "spec/hashlike/hashlike_behavior_spec.rb",
156
158
  "spec/hashlike/hashlike_via_accessors_spec.rb",
157
159
  "spec/hashlike_spec.rb",
@@ -188,7 +190,6 @@ Gem::Specification.new do |s|
188
190
  ]
189
191
 
190
192
  if s.respond_to? :specification_version then
191
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
192
193
  s.specification_version = 3
193
194
 
194
195
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
@@ -0,0 +1,156 @@
1
+ require 'gorillib/hashlike/deep_merge'
2
+ require 'gorillib/hashlike/deep_compact'
3
+ require 'gorillib/hashlike/deep_dup'
4
+
5
+ module Gorillib
6
+ module Hashlike
7
+ module DeepHash
8
+
9
+ include Gorillib::Hashlike::DeepMerge
10
+ include Gorillib::Hashlike::DeepCompact
11
+ include Gorillib::Hashlike::DeepDup
12
+
13
+ # @param constructor<Object>
14
+ # The default value for the DeepHash. Defaults to an empty hash.
15
+ # If constructor is a Hash, adopt its values.
16
+ def initialize(constructor = {})
17
+ if constructor.is_a?(Hash)
18
+ super()
19
+ deep_merge!(constructor) unless constructor.empty?
20
+ else
21
+ super(constructor)
22
+ end
23
+ end
24
+
25
+ def self.included(base)
26
+ base.class_eval do
27
+ unless method_defined?(:regular_writer) then alias_method :regular_writer, :[]= ; end
28
+ unless method_defined?(:regular_update) then alias_method :regular_update, :update ; end
29
+ end
30
+ end
31
+
32
+ # Sets a member value.
33
+ #
34
+ # Given a deep key (one that contains '.'), uses it as a chain of hash
35
+ # memberships. Otherwise calls the normal hash member setter
36
+ #
37
+ # @example
38
+ # foo = DeepHash.new :hi => 'there'
39
+ # foo['howdy.doody'] = 3
40
+ # foo # => { :hi => 'there', :howdy => { :doody => 3 } }
41
+ #
42
+ def []= attr, val
43
+ attr = convert_key(attr)
44
+ val = convert_value(val)
45
+ attr.is_a?(Array) ? deep_set(*(attr | [val])) : super(attr, val)
46
+ end
47
+
48
+
49
+ # Gets a member value.
50
+ #
51
+ # Given a deep key (one that contains '.'), uses it as a chain of hash
52
+ # memberships. Otherwise calls the normal hash member getter
53
+ #
54
+ # @example
55
+ # foo = DeepHash.new({ :hi => 'there', :howdy => { :doody => 3 } })
56
+ # foo['howdy.doody'] # => 3
57
+ # foo['hi'] # => 'there'
58
+ # foo[:hi] # => 'there'
59
+ #
60
+ def [] attr
61
+ attr = convert_key(attr)
62
+ attr.is_a?(Array) ? deep_get(*attr) : super(attr)
63
+ end
64
+
65
+ #
66
+ # Treat hash as tree of hashes:
67
+ #
68
+ # x = { :a => :val, :subhash => { :b => :val_b } }
69
+ # x.deep_set(:subhash, :cat, :hat)
70
+ # # => { :a => :val, :subhash => { :b => :val_b, :cat => :hat } }
71
+ # x.deep_set(:subhash, :b, :newval)
72
+ # # => { :a => :val, :subhash => { :b => :newval, :cat => :hat } }
73
+ #
74
+ #
75
+ def deep_set *args
76
+ val = args.pop
77
+ last_key = args.pop
78
+ # dig down to last subtree (building out if necessary)
79
+ hsh = self
80
+ args.each do |key|
81
+ hsh.regular_writer(key, self.class.new) unless hsh.has_key?(key)
82
+ hsh = hsh[key]
83
+ end
84
+ # set leaf value
85
+ hsh[last_key] = val
86
+ end
87
+
88
+ #
89
+ # Treat hash as tree of hashes:
90
+ #
91
+ # x = { :a => :val_a, :subhash => { :b => :val_b } }
92
+ # x.deep_get(:a)
93
+ # # => :val_a
94
+ # x.deep_get(:subhash, :c)
95
+ # # => nil
96
+ # x.deep_get(:subhash, :c, :f)
97
+ # # => nil
98
+ # x.deep_get(:subhash, :b)
99
+ # # => nil
100
+ #
101
+ def deep_get *args
102
+ last_key = args.pop
103
+ # dig down to last subtree (building out if necessary)
104
+ hsh = args.inject(self){|h, k| h[k] || self.class.new }
105
+ # get leaf value
106
+ hsh[last_key]
107
+ end
108
+
109
+ #
110
+ # Treat hash as tree of hashes:
111
+ #
112
+ # x = { :a => :val, :subhash => { :a => :val1, :b => :val2 } }
113
+ # x.deep_delete(:subhash, :a)
114
+ # #=> :val
115
+ # x
116
+ # #=> { :a => :val, :subhash => { :b => :val2 } }
117
+ #
118
+ def deep_delete *args
119
+ last_key = args.pop # key to delete
120
+ last_hsh = args.empty? ? self : (deep_get(*args)||{}) # hsh containing that key
121
+ last_hsh.delete(last_key)
122
+ end
123
+
124
+ protected
125
+ # @attr key<Object> The key to convert.
126
+ #
127
+ # @attr [Object]
128
+ # The converted key. A dotted attr ('moon.cheese.type') becomes
129
+ # an array of sequential keys for deep_set and deep_get
130
+ #
131
+ # @private
132
+ def convert_key(attr)
133
+ case
134
+ when attr.to_s.include?('.') then attr.to_s.split(".").map{|sub_attr| sub_attr.to_sym }
135
+ when attr.is_a?(Array) then attr.map{|sub_attr| sub_attr.to_sym }
136
+ else attr.to_sym
137
+ end
138
+ end
139
+
140
+ # @param value<Object> The value to convert.
141
+ #
142
+ # @return [Object]
143
+ # The converted value. A Hash or an Array of hashes, will be converted to
144
+ # their DeepHash equivalents.
145
+ #
146
+ # @private
147
+ def convert_value(value)
148
+ if value.class == Hash then self.class.new(value)
149
+ elsif value.is_a?(Array) then value.collect{|e| convert_value(e) }
150
+ else value
151
+ end
152
+ end
153
+ end
154
+
155
+ end
156
+ end
@@ -9,9 +9,10 @@ module Gorillib
9
9
  # Returns a new hash with +self+ and +other_hash+ merged recursively.
10
10
  # Modifies the receiver in place.
11
11
  def deep_merge!(other_hash)
12
- other_hash.each_pair do |k,v|
13
- tv = self[k]
14
- self[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? tv.deep_merge(v) : v
12
+ other_hash.each_pair do |ok, ov|
13
+ ov = convert_value(ov) if respond_to?(:convert_value)
14
+ sv = self[ok]
15
+ self[ok] = sv.is_a?(Hash) && ov.is_a?(Hash) ? sv.deep_merge(ov) : ov
15
16
  end
16
17
  self
17
18
  end unless method_defined?(:deep_merge!)
@@ -1,6 +1,7 @@
1
1
  require 'gorillib/object/blank'
2
2
  require 'gorillib/object/try'
3
3
  require 'gorillib/array/extract_options'
4
+ require 'gorillib/metaprogramming/class_attribute'
4
5
 
5
6
  # dummy type for receiving True or False
6
7
  class Boolean ; end unless defined?(Boolean)
@@ -126,7 +127,7 @@ module Receiver
126
127
  #
127
128
  def receive! hsh={}
128
129
  raise ArgumentError, "Can't receive (it isn't hashlike): {#{hsh.inspect}}" unless hsh.respond_to?(:[]) && hsh.respond_to?(:has_key?)
129
- self.class.receiver_attr_names.each do |attr|
130
+ _receiver_fields.each do |attr|
130
131
  if hsh.has_key?(attr.to_sym) then val = hsh[attr.to_sym]
131
132
  elsif hsh.has_key?(attr.to_s) then val = hsh[attr.to_s]
132
133
  else next ; end
@@ -153,8 +154,20 @@ protected
153
154
  self.send("receive_#{attr}", val)
154
155
  end
155
156
 
157
+ def _receiver_fields
158
+ self.class.receiver_attr_names
159
+ end
160
+
161
+ def _receiver_defaults
162
+ self.class.receiver_defaults
163
+ end
164
+
165
+ def _after_receivers
166
+ self.class.after_receivers
167
+ end
168
+
156
169
  def impose_defaults!(hsh)
157
- self.class.receiver_defaults.each do |attr, val|
170
+ _receiver_defaults.each do |attr, val|
158
171
  next if attr_set?(attr)
159
172
  self.instance_variable_set "@#{attr}", val
160
173
  end
@@ -180,7 +193,7 @@ protected
180
193
 
181
194
 
182
195
  def run_after_receivers(hsh)
183
- self.class.after_receivers.each do |after_receiver|
196
+ _after_receivers.each do |after_receiver|
184
197
  self.instance_exec(hsh, &after_receiver)
185
198
  end
186
199
  end
@@ -192,13 +205,14 @@ public
192
205
  #
193
206
  # Returns a new instance with the given hash used to set all rcvrs.
194
207
  #
195
- # All args after the first are passed to the initializer.
208
+ # All args up to the last one are passed to the initializer.
209
+ # The last arg must be a hash -- its attributes are set on the newly-created object
196
210
  #
197
- # @param hsh [Hash] attr-value pairs to set on the newly created object
211
+ # @param hsh [Hash] attr-value pairs to set on the newly created object.
198
212
  # @param *args [Array] arguments to pass to the constructor
199
213
  # @return [Object] a new instance
200
214
  def receive *args
201
- hsh = args.extract_options!
215
+ hsh = args.pop
202
216
  raise ArgumentError, "Can't receive (it isn't hashlike): {#{hsh.inspect}} -- the hsh should be the *last* arg" unless hsh.respond_to?(:[]) && hsh.respond_to?(:has_key?)
203
217
  obj = self.new(*args)
204
218
  obj.receive!(hsh)
@@ -384,4 +398,5 @@ public
384
398
  end
385
399
  end
386
400
  end
401
+
387
402
  end
@@ -0,0 +1,579 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'gorillib/receiver_model'
3
+ require 'gorillib/hashlike/deep_hash'
4
+
5
+
6
+ class AwesomeHash < Hash
7
+ # include Gorillib::ReceiverModel
8
+ include Gorillib::Hashlike::DeepHash
9
+ end
10
+ class AwesomeHashSubclass < AwesomeHash ; end
11
+
12
+ describe Gorillib::Hashlike::DeepHash do
13
+
14
+ before(:each) do
15
+ @deep_hash = AwesomeHash.new({ :nested_1 => { :nested_2 => { :leaf_3 => "val3" }, :leaf_2 => ['arr'] }, :leaf_at_top => 'val1b' })
16
+ @hash = { "str_key" => "strk_val", :sym_key => "symk_val"}
17
+ @sub = AwesomeHashSubclass.new("str_key" => "strk_val", :sym_key => "symk_val")
18
+ end
19
+
20
+ describe "examples" do
21
+ it 'merges with a nested dotted nested hash' do
22
+ y = {"a.b.c"=>{"d"=>3, "f.g"=>7}, "p"=>9}
23
+ x = AwesomeHash.new({ :a => { :b => { :c => { :d => 7, :e => 99 } } }, :p => 5, 'z' => 7, :z => 7 })
24
+ x.deep_merge(y).should == {:a=>{:b=>{:c=>{:d=>3, :e=>99, :f=>{:g=>7}}}}, :p=>9, :z=>7}
25
+ end
26
+
27
+ it 'breaks if the structures are incommensurate, so do not do that' do
28
+ y = { 'a.b.c' => 7 }
29
+ x = AwesomeHash.new({ :a => { :b => 69 }})
30
+ lambda{ x.deep_merge(y) }.should raise_error(TypeError, /Symbol into Integer/)
31
+ end
32
+ end
33
+
34
+ # describe "#initialize" do
35
+ # it 'adopts a Hash when given' do
36
+ # deep_hash = AwesomeHash.new(@hash)
37
+ # @hash.each{|k,v| deep_hash[k].should == v }
38
+ # deep_hash.keys.any?{|key| key.is_a?(String) }.should be_false
39
+ # end
40
+ #
41
+ # it 'converts all pure Hash values into AwesomeHashes if param is a Hash' do
42
+ # deep_hash = AwesomeHash.new :sym_key => @hash
43
+ # deep_hash[:sym_key].should be_an_instance_of(AwesomeHash)
44
+ # # sanity check
45
+ # deep_hash[:sym_key][:sym_key].should == "symk_val"
46
+ # end
47
+ #
48
+ # it 'does not convert Hash subclass values into AwesomeHashes' do
49
+ # deep_hash = AwesomeHash.new :sub => @sub
50
+ # deep_hash[:sub].should be_an_instance_of(AwesomeHashSubclass)
51
+ # end
52
+ #
53
+ # it 'converts all value items if value is an Array' do
54
+ # deep_hash = AwesomeHash.new :arry => { :sym_key => [@hash] }
55
+ # deep_hash[:arry].should be_an_instance_of(AwesomeHash)
56
+ # # sanity check
57
+ # deep_hash[:arry][:sym_key].first[:sym_key].should == "symk_val"
58
+ # end
59
+ #
60
+ # it 'delegates to superclass constructor if param is not a Hash' do
61
+ # deep_hash = AwesomeHash.new("dash berlin")
62
+ #
63
+ # deep_hash["unexisting key"].should == "dash berlin"
64
+ # end
65
+ # end # describe "#initialize"
66
+ #
67
+ # describe "#update" do
68
+ # it 'converts all keys into symbols when param is a Hash' do
69
+ # deep_hash = AwesomeHash.new(@hash)
70
+ # deep_hash.update("starry" => "night")
71
+ #
72
+ # deep_hash.keys.any?{|key| key.is_a?(String) }.should be_false
73
+ # end
74
+ #
75
+ # it 'converts all Hash values into AwesomeHashes if param is a Hash' do
76
+ # deep_hash = AwesomeHash.new :hash => @hash
77
+ # deep_hash.update(:hash => { :sym_key => "is buggy in Ruby 1.8.6" })
78
+ #
79
+ # deep_hash[:hash].should be_an_instance_of(AwesomeHash)
80
+ # end
81
+ # end # describe "#update"
82
+ #
83
+ # describe '#[]=' do
84
+ # it 'symbolizes keys' do
85
+ # @deep_hash['leaf_at_top'] = :fedora
86
+ # @deep_hash['new'] = :unseen
87
+ # @deep_hash.should == {:nested_1 => {:nested_2 => {:leaf_3 => "val3"}, :leaf_2 => ['arr']}, :leaf_at_top => :fedora, :new => :unseen}
88
+ # end
89
+ # it 'deep-sets dotted vals, replacing values' do
90
+ # @deep_hash['moon.man'] = :cheesy
91
+ # @deep_hash[:moon][:man].should == :cheesy
92
+ # end
93
+ # it 'deep-sets dotted vals, creating new values' do
94
+ # @deep_hash['moon.cheese.type'] = :tilsit
95
+ # @deep_hash[:moon][:cheese][:type].should == :tilsit
96
+ # end
97
+ # it 'deep-sets dotted vals, auto-vivifying intermediate hashes' do
98
+ # @deep_hash['this.that.the_other'] = :fuhgeddaboudit
99
+ # @deep_hash[:this][:that][:the_other].should == :fuhgeddaboudit
100
+ # end
101
+ # it 'converts all Hash value into AwesomeHash' do
102
+ # deep_hash = AwesomeHash.new :hash => @hash
103
+ # deep_hash[:hash] = { :sym_key => "is buggy in Ruby 1.8.6" }
104
+ # deep_hash[:hash].should be_an_instance_of(AwesomeHash)
105
+ # end
106
+ #
107
+ # it "only accepts #to_sym'bolizable things as keys" do
108
+ # lambda{ @deep_hash[1] = 'hi' }.should raise_error(NoMethodError, /undefined method `to_sym'/)
109
+ # lambda{ @deep_hash[{ :a => :b }] = 'hi' }.should raise_error(NoMethodError, /undefined method `to_sym'/)
110
+ # lambda{ @deep_hash[Object.new] = 'hi' }.should raise_error(NoMethodError, /undefined method `to_sym'/)
111
+ # lambda{ @deep_hash[:a] = 'hi' }.should_not raise_error
112
+ # end
113
+ # end
114
+ #
115
+ # describe '#[]' do
116
+ # it 'deep-gets dotted vals' do
117
+ # hsh = { :hat => :cat, :basket => :lotion, :moon => { :man => :smiling, :cheese => {:type => :tilsit} } }
118
+ # @deep_hash = Configliere::Param.new hsh.dup
119
+ # @deep_hash['moon.man'].should == :smiling
120
+ # @deep_hash['moon.cheese.type'].should == :tilsit
121
+ # @deep_hash['moon.cheese.smell'].should be_nil
122
+ # @deep_hash['moon.non.existent.interim.values'].should be_nil
123
+ # @deep_hash['moon.non'].should be_nil
124
+ # if (RUBY_VERSION >= '1.9') then lambda{ @deep_hash['hat.cat'] }.should raise_error(TypeError)
125
+ # else lambda{ @deep_hash['hat.cat'] }.should raise_error(NoMethodError, 'undefined method `[]\' for :cat:Symbol') end
126
+ # @deep_hash.should == hsh # shouldn't change from reading (specifically, shouldn't autovivify)
127
+ # end
128
+ #
129
+ # it "only accepts #to_sym'bolizable things as keys" do
130
+ # lambda{ @deep_hash[1] }.should raise_error(NoMethodError, /undefined method `to_sym'/)
131
+ # lambda{ @deep_hash[{ :a => :b }] }.should raise_error(NoMethodError, /undefined method `to_sym'/)
132
+ # lambda{ @deep_hash[Object.new] }.should raise_error(NoMethodError, /undefined method `to_sym'/)
133
+ # end
134
+ # end
135
+ #
136
+ # def arrays_should_be_equal arr1, arr2
137
+ # arr1.sort_by{|s| s.to_s }.should == arr2.sort_by{|s| s.to_s }
138
+ # end
139
+ #
140
+ # describe "#to_hash" do
141
+ # it 'returns instance of Hash' do
142
+ # AwesomeHash.new(@hash).to_hash.should be_an_instance_of(Hash)
143
+ # end
144
+ #
145
+ # it 'preserves keys' do
146
+ # deep_hash = AwesomeHash.new(@hash)
147
+ # converted = deep_hash.to_hash
148
+ # arrays_should_be_equal deep_hash.keys, converted.keys
149
+ # end
150
+ #
151
+ # it 'preserves value' do
152
+ # deep_hash = AwesomeHash.new(@hash)
153
+ # converted = deep_hash.to_hash
154
+ # arrays_should_be_equal deep_hash.values, converted.values
155
+ # end
156
+ # end
157
+ #
158
+ # describe '#compact' do
159
+ # it 'removes nils but not empties or falsehoods' do
160
+ # AwesomeHash.new({ :a => nil }).compact.should == {}
161
+ # AwesomeHash.new({ :a => nil, :b => false, :c => {}, :d => "", :remains => true }).compact.should == { :b => false, :c => {}, :d => "", :remains => true }
162
+ # end
163
+ #
164
+ # it 'leaves original alone' do
165
+ # deep_hash = AwesomeHash.new({ :a => nil, :remains => true })
166
+ # deep_hash.compact.should == { :remains => true }
167
+ # deep_hash.should == { :a => nil, :remains => true }
168
+ # end
169
+ # end
170
+ #
171
+ # describe '#compact!' do
172
+ # it 'removes nils but not empties or falsehoods' do
173
+ # AwesomeHash.new({ :a => nil}).compact!.should == {}
174
+ # AwesomeHash.new({ :a => nil, :b => false, :c => {}, :d => "", :remains => true }).compact!.should == { :b => false, :c => {}, :d => "", :remains => true }
175
+ # end
176
+ #
177
+ # it 'modifies in-place' do
178
+ # deep_hash = AwesomeHash.new({ :a => nil, :remains => true })
179
+ # deep_hash.compact!.should == { :remains => true }
180
+ # deep_hash.should == { :remains => true }
181
+ # end
182
+ # end
183
+ #
184
+ # describe '#slice' do
185
+ # before do
186
+ # @deep_hash = AwesomeHash.new({ :a => 'x', :b => 'y', :c => 10 })
187
+ # end
188
+ #
189
+ # it 'returns a new hash with only the given keys' do
190
+ # @deep_hash.slice(:a, :b).should == { :a => 'x', :b => 'y' }
191
+ # @deep_hash.should == { :a => 'x', :b => 'y', :c => 10 }
192
+ # end
193
+ #
194
+ # it 'with bang replaces the hash with only the given keys' do
195
+ # @deep_hash.slice!(:a, :b).should == { :c => 10 }
196
+ # @deep_hash.should == { :a => 'x', :b => 'y' }
197
+ # end
198
+ #
199
+ # it 'ignores an array key' do
200
+ # @deep_hash.slice([:a, :b], :c).should == { :c => 10 }
201
+ # @deep_hash.should == { :a => 'x', :b => 'y', :c => 10 }
202
+ # end
203
+ #
204
+ # it 'with bang ignores an array key' do
205
+ # @deep_hash.slice!([:a, :b], :c).should == { :a => 'x', :b => 'y' }
206
+ # @deep_hash.should == { :c => 10 }
207
+ # end
208
+ #
209
+ # it 'uses splatted keys individually' do
210
+ # @deep_hash.slice(*[:a, :b]).should == { :a => 'x', :b => 'y' }
211
+ # @deep_hash.should == { :a => 'x', :b => 'y', :c => 10 }
212
+ # end
213
+ #
214
+ # it 'with bank uses splatted keys individually' do
215
+ # @deep_hash.slice!(*[:a, :b]).should == { :c => 10 }
216
+ # @deep_hash.should == { :a => 'x', :b => 'y' }
217
+ # end
218
+ # end
219
+ #
220
+ # describe '#extract' do
221
+ # before do
222
+ # @deep_hash = AwesomeHash.new({ :a => 'x', :b => 'y', :c => 10 })
223
+ # end
224
+ #
225
+ # it 'replaces the hash with only the given keys' do
226
+ # @deep_hash.extract!(:a, :b).should == { :a => 'x', :b => 'y' }
227
+ # @deep_hash.should == { :c => 10 }
228
+ # end
229
+ #
230
+ # it 'leaves the hash empty if all keys are gone' do
231
+ # @deep_hash.extract!(:a, :b, :c).should == { :a => 'x', :b => 'y', :c => 10 }
232
+ # @deep_hash.should == {}
233
+ # end
234
+ #
235
+ # it 'gets values for all given keys even if missing' do
236
+ # @deep_hash.extract!(:bob, :c).should == { :bob => nil, :c => 10 }
237
+ # @deep_hash.should == { :a => 'x', :b => 'y' }
238
+ # end
239
+ #
240
+ # it 'is OK when empty' do
241
+ # AwesomeHash.new.slice!(:a, :b, :c).should == {}
242
+ # end
243
+ #
244
+ # it 'returns an instance of the same class' do
245
+ # @deep_hash.slice(:a).should be_a(AwesomeHash)
246
+ # end
247
+ # end
248
+ #
249
+ # describe "#delete" do
250
+ # it 'converts Symbol key into String before deleting' do
251
+ # deep_hash = AwesomeHash.new(@hash)
252
+ #
253
+ # deep_hash.delete(:sym_key)
254
+ # deep_hash.key?("hash").should be_false
255
+ # end
256
+ #
257
+ # it 'works with String keys as well' do
258
+ # deep_hash = AwesomeHash.new(@hash)
259
+ #
260
+ # deep_hash.delete("str_key")
261
+ # deep_hash.key?("str_key").should be_false
262
+ # end
263
+ # end
264
+ #
265
+ # describe "#fetch" do
266
+ # before(:each) do
267
+ # @deep_hash = AwesomeHash.new(:no => "in between")
268
+ # end
269
+ #
270
+ # it 'converts key before fetching' do
271
+ # @deep_hash.fetch("no").should == "in between"
272
+ # end
273
+ #
274
+ # it 'returns alternative value if key lookup fails' do
275
+ # @deep_hash.fetch("flying", "screwdriver").should == "screwdriver"
276
+ # end
277
+ # end
278
+ #
279
+ # describe "#values_at" do
280
+ # before(:each) do
281
+ # @deep_hash = AwesomeHash.new(@hash).merge(:no => "in between")
282
+ # end
283
+ #
284
+ # it 'is indifferent to whether keys are strings or symbols' do
285
+ # @deep_hash.values_at("sym_key", :str_key, :no).should == ["symk_val", "strk_val", "in between"]
286
+ # end
287
+ # end
288
+ #
289
+ # it 'responds to #symbolize_keys, #symbolize_keys! and #stringify_keys but not #stringify_keys!' do
290
+ # AwesomeHash.new.should respond_to(:symbolize_keys )
291
+ # AwesomeHash.new.should respond_to(:symbolize_keys!)
292
+ # AwesomeHash.new.should respond_to(:stringify_keys )
293
+ # AwesomeHash.new.should_not respond_to(:stringify_keys!)
294
+ # end
295
+ #
296
+ # describe '#symbolize_keys' do
297
+ # it 'returns a dup of itself' do
298
+ # deep_hash = AwesomeHash.new(@hash)
299
+ # deep_hash.symbolize_keys.should == deep_hash
300
+ # end
301
+ # end
302
+ #
303
+ # describe '#symbolize_keys!' do
304
+ # it 'with bang returns the deep_hash itself' do
305
+ # deep_hash = AwesomeHash.new(@hash)
306
+ # deep_hash.symbolize_keys!.object_id.should == deep_hash.object_id
307
+ # end
308
+ # end
309
+ #
310
+ # describe '#stringify_keys' do
311
+ # it 'converts keys that are all symbols' do
312
+ # @deep_hash.stringify_keys.should ==
313
+ # { 'nested_1' => { :nested_2 => { :leaf_3 => "val3" }, :leaf_2 => ['arr'] }, 'leaf_at_top' => 'val1b' }
314
+ # end
315
+ #
316
+ # it 'returns a Hash, not a AwesomeHash' do
317
+ # @deep_hash.stringify_keys.class.should == Hash
318
+ # @deep_hash.stringify_keys.should_not be_a(AwesomeHash)
319
+ # end
320
+ #
321
+ # it 'only stringifies and hashifies the top level' do
322
+ # stringified = @deep_hash.stringify_keys
323
+ # stringified.should == { 'nested_1' => { :nested_2 => { :leaf_3 => "val3" }, :leaf_2 => ['arr'] }, 'leaf_at_top' => 'val1b' }
324
+ # stringified['nested_1'].should be_a(AwesomeHash)
325
+ # end
326
+ # end
327
+ #
328
+ # describe '#assert_valid_keys' do
329
+ # before do
330
+ # @deep_hash = AwesomeHash.new({ :failure => "stuff", :funny => "business" })
331
+ # end
332
+ #
333
+ # it 'is true and does not raise when valid' do
334
+ # @deep_hash.assert_valid_keys([ :failure, :funny ]).should be_nil
335
+ # @deep_hash.assert_valid_keys(:failure, :funny).should be_nil
336
+ # end
337
+ #
338
+ # it 'fails when invalid' do
339
+ # @deep_hash[:failore] = @deep_hash.delete(:failure)
340
+ # lambda{ @deep_hash.assert_valid_keys([ :failure, :funny ]) }.should raise_error(ArgumentError, "Unknown key(s): failore")
341
+ # lambda{ @deep_hash.assert_valid_keys(:failure, :funny) }.should raise_error(ArgumentError, "Unknown key(s): failore")
342
+ # end
343
+ # end
344
+ #
345
+ # describe "#merge" do
346
+ # it 'merges given Hash' do
347
+ # merged = @deep_hash.merge(:no => "in between")
348
+ # merged.should == { :nested_1 => { :nested_2 => { :leaf_3 => "val3" }, :leaf_2 => ['arr'] }, :leaf_at_top => 'val1b', :no => 'in between' }
349
+ # end
350
+ #
351
+ # it 'returns a new instance' do
352
+ # merged = @deep_hash.merge(:no => "in between")
353
+ # merged.should_not equal(@deep_hash)
354
+ # end
355
+ #
356
+ # it 'returns instance of AwesomeHash' do
357
+ # merged = @deep_hash.merge(:no => "in between")
358
+ # merged.should be_an_instance_of(AwesomeHash)
359
+ # merged[:no].should == "in between"
360
+ # merged["no"].should == "in between"
361
+ # end
362
+ #
363
+ # it "converts all Hash values into AwesomeHashes" do
364
+ # merged = @deep_hash.merge({ :nested_1 => { 'nested_2' => { :leaf_3_also => "val3a" } }, :other1 => { "other2" => "other_val2" }})
365
+ # merged[:nested_1].should be_an_instance_of(AwesomeHash)
366
+ # merged[:nested_1][:nested_2].should be_an_instance_of(AwesomeHash)
367
+ # merged[:other1].should be_an_instance_of(AwesomeHash)
368
+ # end
369
+ #
370
+ # it "converts string keys to symbol keys even if they occur deep in the given hash" do
371
+ # merged = @deep_hash.merge({ 'a' => { 'b' => { 'c' => { :d => :e }}}})
372
+ # merged[:a].should == { :b => { :c => { :d => :e }}}
373
+ # merged[:a].should_not == { 'b' => { 'c' => { :d => :e }}}
374
+ # end
375
+ #
376
+ # it "DOES merge values where given hash has nil value" do
377
+ # merged = @deep_hash.merge(:a => { :b => nil }, :c => nil, :leaf_3_also => nil)
378
+ # merged[:a][:b].should be_nil
379
+ # merged[:c].should be_nil
380
+ # merged[:leaf_3_also].should be_nil
381
+ # end
382
+ #
383
+ # it "replaces child hashes, and does not merge them" do
384
+ # merged = @deep_hash.merge({ :nested_1 => { 'nested_2' => { :leaf_3_also => "val3a" } }, :other1 => { "other2" => "other_val2" }})
385
+ # merged.should == { :nested_1 => { :nested_2 => { :leaf_3_also => "val3a" } }, :other1 => { :other2 => "other_val2" }, :leaf_at_top => 'val1b' }
386
+ # end
387
+ # end
388
+ #
389
+ # describe "#merge!" do
390
+ # it 'merges given Hash' do
391
+ # @deep_hash.merge!(:no => "in between")
392
+ # @deep_hash.should == { :nested_1 => { :nested_2 => { :leaf_3 => "val3" }, :leaf_2 => ['arr'] }, :leaf_at_top => 'val1b', :no => 'in between' }
393
+ # end
394
+ #
395
+ # it 'returns a new instance' do
396
+ # @deep_hash.merge!(:no => "in between")
397
+ # @deep_hash.should equal(@deep_hash)
398
+ # end
399
+ #
400
+ # it 'returns instance of AwesomeHash' do
401
+ # @deep_hash.merge!(:no => "in between")
402
+ # @deep_hash.should be_an_instance_of(AwesomeHash)
403
+ # @deep_hash[:no].should == "in between"
404
+ # @deep_hash["no"].should == "in between"
405
+ # end
406
+ #
407
+ # it "converts all Hash values into AwesomeHashes" do
408
+ # @deep_hash.merge!({ :nested_1 => { 'nested_2' => { :leaf_3_also => "val3a" } }, :other1 => { "other2" => "other_val2" }})
409
+ # @deep_hash[:nested_1].should be_an_instance_of(AwesomeHash)
410
+ # @deep_hash[:nested_1][:nested_2].should be_an_instance_of(AwesomeHash)
411
+ # @deep_hash[:other1].should be_an_instance_of(AwesomeHash)
412
+ # end
413
+ #
414
+ # it "converts string keys to symbol keys even if they occur deep in the given hash" do
415
+ # @deep_hash.merge!({ 'a' => { 'b' => { 'c' => { :d => :e }}}})
416
+ # @deep_hash[:a].should == { :b => { :c => { :d => :e }}}
417
+ # @deep_hash[:a].should_not == { 'b' => { 'c' => { :d => :e }}}
418
+ # end
419
+ #
420
+ # it "DOES merge values where given hash has nil value" do
421
+ # @deep_hash.merge!(:a => { :b => nil }, :c => nil, :leaf_3_also => nil)
422
+ # @deep_hash[:a][:b].should be_nil
423
+ # @deep_hash[:c].should be_nil
424
+ # @deep_hash[:leaf_3_also].should be_nil
425
+ # end
426
+ #
427
+ # it "replaces child hashes, and does not merge them" do
428
+ # @deep_hash = @deep_hash.merge!({ :nested_1 => { 'nested_2' => { :leaf_3_also => "val3a" } }, :other1 => { "other2" => "other_val2" }})
429
+ # @deep_hash.should == { :nested_1 => { :nested_2 => { :leaf_3_also => "val3a" } }, :other1 => { :other2 => "other_val2" }, :leaf_at_top => 'val1b' }
430
+ # @deep_hash.should_not == { :nested_1 => { 'nested_2' => { :leaf_3_also => "val3a" } }, :other1 => { "other2" => "other_val2" }, :leaf_at_top => 'val1b' }
431
+ # end
432
+ # end
433
+ #
434
+ # describe "#reverse_merge" do
435
+ # it 'merges given Hash' do
436
+ # @deep_hash.reverse_merge!(:no => "in between", :leaf_at_top => 'NOT_USED')
437
+ # @deep_hash.should == { :nested_1 => { :nested_2 => { :leaf_3 => "val3" }, :leaf_2 => ['arr'] }, :leaf_at_top => 'val1b', :no => 'in between' }
438
+ # end
439
+ #
440
+ # it 'returns a new instance' do
441
+ # @deep_hash.reverse_merge!(:no => "in between")
442
+ # @deep_hash.should equal(@deep_hash)
443
+ # end
444
+ #
445
+ # it 'returns instance of AwesomeHash' do
446
+ # @deep_hash.reverse_merge!(:no => "in between")
447
+ # @deep_hash.should be_an_instance_of(AwesomeHash)
448
+ # @deep_hash[:no].should == "in between"
449
+ # @deep_hash["no"].should == "in between"
450
+ # end
451
+ #
452
+ # it "converts all Hash values into AwesomeHashes" do
453
+ # @deep_hash.reverse_merge!({ :nested_1 => { 'nested_2' => { :leaf_3_also => "val3a" } }, :other1 => { "other2" => "other_val2" }})
454
+ # @deep_hash[:nested_1].should be_an_instance_of(AwesomeHash)
455
+ # @deep_hash[:nested_1][:nested_2].should be_an_instance_of(AwesomeHash)
456
+ # @deep_hash[:other1].should be_an_instance_of(AwesomeHash)
457
+ # end
458
+ #
459
+ # it "converts string keys to symbol keys even if they occur deep in the given hash" do
460
+ # merged = @deep_hash.reverse_merge({ 'a' => { 'b' => { 'c' => { :d => :e }}}})
461
+ # merged[:a].should == { :b => { :c => { :d => :e }}}
462
+ # merged[:a].should_not == { 'b' => { 'c' => { :d => :e }}}
463
+ # end
464
+ #
465
+ # it "DOES merge values where given hash has nil value" do
466
+ # @deep_hash.reverse_merge!(:a => { :b => nil }, :c => nil)
467
+ # @deep_hash[:a][:b].should be_nil
468
+ # @deep_hash[:c].should be_nil
469
+ # end
470
+ #
471
+ # it "replaces child hashes, and does not merge them" do
472
+ # @deep_hash = @deep_hash.reverse_merge!({ :nested_1 => { 'nested_2' => { :leaf_3_also => "val3a" } }, :other1 => { "other2" => "other_val2" }})
473
+ # @deep_hash.should == { :nested_1 => { :nested_2 => { :leaf_3 => "val3" }, :leaf_2 => ['arr'] }, :other1 => { :other2 => "other_val2" }, :leaf_at_top => 'val1b' }
474
+ # end
475
+ # end
476
+ #
477
+ # describe "#deep_merge!" do
478
+ # it "merges two subhashes when they share a key" do
479
+ # @deep_hash.deep_merge!(:nested_1 => { :nested_2 => { :leaf_3_also => "val3a" } })
480
+ # @deep_hash.should == { :nested_1 => { :nested_2 => { :leaf_3_also => "val3a", :leaf_3 => "val3" }, :leaf_2 => ['arr'] }, :leaf_at_top => 'val1b' }
481
+ # end
482
+ #
483
+ # it "merges two subhashes when they share a symbolized key" do
484
+ # @deep_hash.deep_merge!(:nested_1 => { "nested_2" => { "leaf_3_also" => "val3a" } })
485
+ # @deep_hash.should == { :nested_1 => { :nested_2 => { :leaf_3_also => "val3a", :leaf_3 => "val3" }, :leaf_2 => ['arr'] }, :leaf_at_top => "val1b" }
486
+ # end
487
+ #
488
+ # it "preserves values in the original" do
489
+ # @deep_hash.deep_merge! :other_key => "other_val"
490
+ # @deep_hash[:nested_1][:leaf_2].should == ['arr']
491
+ # @deep_hash[:other_key].should == "other_val"
492
+ # end
493
+ #
494
+ # it "converts all Hash values into AwesomeHashes" do
495
+ # @deep_hash.deep_merge!({:nested_1 => { :nested_2 => { :leaf_3_also => "val3a" } }, :other1 => { "other2" => "other_val2" }})
496
+ # @deep_hash[:nested_1].should be_an_instance_of(AwesomeHash)
497
+ # @deep_hash[:nested_1][:nested_2].should be_an_instance_of(AwesomeHash)
498
+ # @deep_hash[:other1].should be_an_instance_of(AwesomeHash)
499
+ # end
500
+ #
501
+ # it "converts string keys to symbol keys even if they occur deep in the given hash" do
502
+ # @deep_hash.deep_merge!({ 'a' => { 'b' => { 'c' => { :d => :e }}}})
503
+ # @deep_hash[:a].should == { :b => { :c => { :d => :e }}}
504
+ # @deep_hash[:a].should_not == { 'b' => { 'c' => { :d => :e }}}
505
+ # end
506
+ #
507
+ # it "replaces values from the given hash" do
508
+ # @deep_hash.deep_merge!(:nested_1 => { :nested_2 => { :leaf_3 => "new_val3" }, :leaf_2 => { "other2" => "other_val2" }})
509
+ # @deep_hash[:nested_1][:nested_2][:leaf_3].should == 'new_val3'
510
+ # @deep_hash[:nested_1][:leaf_2].should == { :other2 => "other_val2" }
511
+ # end
512
+ #
513
+ # it "replaces arrays and does not append to them" do
514
+ # @deep_hash.deep_merge!(:nested_1 => { :nested_2 => { :leaf_3 => [] }, :leaf_2 => ['val2'] })
515
+ # @deep_hash[:nested_1][:nested_2][:leaf_3].should == []
516
+ # @deep_hash[:nested_1][:leaf_2].should == ['val2']
517
+ # end
518
+ #
519
+ # it "does not replaces values where given hash has nil value" do
520
+ # @deep_hash.deep_merge!(:nested_1 => { :leaf_2 => nil }, :leaf_at_top => '')
521
+ # @deep_hash[:nested_1][:leaf_2].should == ['arr']
522
+ # @deep_hash[:leaf_at_top].should == ""
523
+ # end
524
+ # end
525
+ #
526
+ #
527
+ # describe "#deep_set" do
528
+ # it 'should set a new value (single arg)' do
529
+ # @deep_hash.deep_set :new_key, 'new_val'
530
+ # @deep_hash[:new_key].should == 'new_val'
531
+ # end
532
+ # it 'should set a new value (multiple args)' do
533
+ # @deep_hash.deep_set :nested_1, :nested_2, :new_key, 'new_val'
534
+ # @deep_hash[:nested_1][:nested_2][:new_key].should == 'new_val'
535
+ # end
536
+ # it 'should replace an existing value (single arg)' do
537
+ # @deep_hash.deep_set :leaf_at_top, 'new_val'
538
+ # @deep_hash[:leaf_at_top].should == 'new_val'
539
+ # end
540
+ # it 'should replace an existing value (multiple args)' do
541
+ # @deep_hash.deep_set :nested_1, :nested_2, 'new_val'
542
+ # @deep_hash[:nested_1][:nested_2].should == 'new_val'
543
+ # end
544
+ # it 'should auto-vivify intermediate hashes' do
545
+ # @deep_hash.deep_set :one, :two, :three, :four, 'new_val'
546
+ # @deep_hash[:one][:two][:three][:four].should == 'new_val'
547
+ # end
548
+ # end
549
+ #
550
+ # describe "#deep_delete" do
551
+ # it 'should remove the key from the array (multiple args)' do
552
+ # @deep_hash.deep_delete(:nested_1)
553
+ # @deep_hash[:nested_1].should be_nil
554
+ # @deep_hash.should == { :leaf_at_top => 'val1b'}
555
+ # end
556
+ # it 'should remove the key from the array (multiple args)' do
557
+ # @deep_hash.deep_delete(:nested_1, :nested_2, :leaf_3)
558
+ # @deep_hash[:nested_1][:nested_2][:leaf_3].should be_nil
559
+ # @deep_hash.should == {:leaf_at_top => "val1b", :nested_1 => {:leaf_2 => ['arr'], :nested_2 => {}}}
560
+ # end
561
+ # it 'should return the value if present (single args)' do
562
+ # returned_val = @deep_hash.deep_delete(:leaf_at_top)
563
+ # returned_val.should == 'val1b'
564
+ # end
565
+ # it 'should return the value if present (multiple args)' do
566
+ # returned_val = @deep_hash.deep_delete(:nested_1, :nested_2, :leaf_3)
567
+ # returned_val.should == 'val3'
568
+ # end
569
+ # it 'should return nil if the key is absent (single arg)' do
570
+ # returned_val = @deep_hash.deep_delete(:nested_1, :nested_2, :missing_key)
571
+ # returned_val.should be_nil
572
+ # end
573
+ # it 'should return nil if the key is absent (multiple args)' do
574
+ # returned_val = @deep_hash.deep_delete(:missing_key)
575
+ # returned_val.should be_nil
576
+ # end
577
+ # end
578
+
579
+ end
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gorillib
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 1
9
- - 4
10
- version: 0.1.4
4
+ prerelease:
5
+ version: 0.1.5
11
6
  platform: ruby
12
7
  authors:
13
8
  - Infochimps
@@ -15,243 +10,171 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2011-07-06 00:00:00 -05:00
19
- default_executable:
13
+ date: 2011-08-02 00:00:00 Z
20
14
  dependencies:
21
15
  - !ruby/object:Gem::Dependency
16
+ name: bundler
22
17
  requirement: &id001 !ruby/object:Gem::Requirement
23
18
  none: false
24
19
  requirements:
25
20
  - - ~>
26
21
  - !ruby/object:Gem::Version
27
- hash: 15
28
- segments:
29
- - 1
30
- - 0
31
- - 12
32
22
  version: 1.0.12
33
23
  type: :development
34
- name: bundler
35
24
  prerelease: false
36
25
  version_requirements: *id001
37
26
  - !ruby/object:Gem::Dependency
27
+ name: yard
38
28
  requirement: &id002 !ruby/object:Gem::Requirement
39
29
  none: false
40
30
  requirements:
41
31
  - - ~>
42
32
  - !ruby/object:Gem::Version
43
- hash: 9
44
- segments:
45
- - 0
46
- - 6
47
- - 7
48
33
  version: 0.6.7
49
34
  type: :development
50
- name: yard
51
35
  prerelease: false
52
36
  version_requirements: *id002
53
37
  - !ruby/object:Gem::Dependency
38
+ name: jeweler
54
39
  requirement: &id003 !ruby/object:Gem::Requirement
55
40
  none: false
56
41
  requirements:
57
42
  - - ~>
58
43
  - !ruby/object:Gem::Version
59
- hash: 7
60
- segments:
61
- - 1
62
- - 5
63
- - 2
64
44
  version: 1.5.2
65
45
  type: :development
66
- name: jeweler
67
46
  prerelease: false
68
47
  version_requirements: *id003
69
48
  - !ruby/object:Gem::Dependency
49
+ name: rspec
70
50
  requirement: &id004 !ruby/object:Gem::Requirement
71
51
  none: false
72
52
  requirements:
73
53
  - - ~>
74
54
  - !ruby/object:Gem::Version
75
- hash: 27
76
- segments:
77
- - 2
78
- - 5
79
- - 0
80
55
  version: 2.5.0
81
56
  type: :development
82
- name: rspec
83
57
  prerelease: false
84
58
  version_requirements: *id004
85
59
  - !ruby/object:Gem::Dependency
60
+ name: spork
86
61
  requirement: &id005 !ruby/object:Gem::Requirement
87
62
  none: false
88
63
  requirements:
89
64
  - - ~>
90
65
  - !ruby/object:Gem::Version
91
- hash: 977940482
92
- segments:
93
- - 0
94
- - 9
95
- - 0
96
- - rc5
97
66
  version: 0.9.0.rc5
98
67
  type: :development
99
- name: spork
100
68
  prerelease: false
101
69
  version_requirements: *id005
102
70
  - !ruby/object:Gem::Dependency
71
+ name: RedCloth
103
72
  requirement: &id006 !ruby/object:Gem::Requirement
104
73
  none: false
105
74
  requirements:
106
75
  - - ">="
107
76
  - !ruby/object:Gem::Version
108
- hash: 3
109
- segments:
110
- - 0
111
77
  version: "0"
112
78
  type: :development
113
- name: RedCloth
114
79
  prerelease: false
115
80
  version_requirements: *id006
116
81
  - !ruby/object:Gem::Dependency
82
+ name: rcov
117
83
  requirement: &id007 !ruby/object:Gem::Requirement
118
84
  none: false
119
85
  requirements:
120
86
  - - ">="
121
87
  - !ruby/object:Gem::Version
122
- hash: 41
123
- segments:
124
- - 0
125
- - 9
126
- - 9
127
88
  version: 0.9.9
128
89
  type: :development
129
- name: rcov
130
90
  prerelease: false
131
91
  version_requirements: *id007
132
92
  - !ruby/object:Gem::Dependency
93
+ name: watchr
133
94
  requirement: &id008 !ruby/object:Gem::Requirement
134
95
  none: false
135
96
  requirements:
136
97
  - - ">="
137
98
  - !ruby/object:Gem::Version
138
- hash: 3
139
- segments:
140
- - 0
141
99
  version: "0"
142
100
  type: :development
143
- name: watchr
144
101
  prerelease: false
145
102
  version_requirements: *id008
146
103
  - !ruby/object:Gem::Dependency
104
+ name: bundler
147
105
  requirement: &id009 !ruby/object:Gem::Requirement
148
106
  none: false
149
107
  requirements:
150
108
  - - ~>
151
109
  - !ruby/object:Gem::Version
152
- hash: 15
153
- segments:
154
- - 1
155
- - 0
156
- - 12
157
110
  version: 1.0.12
158
111
  type: :development
159
- name: bundler
160
112
  prerelease: false
161
113
  version_requirements: *id009
162
114
  - !ruby/object:Gem::Dependency
115
+ name: yard
163
116
  requirement: &id010 !ruby/object:Gem::Requirement
164
117
  none: false
165
118
  requirements:
166
119
  - - ~>
167
120
  - !ruby/object:Gem::Version
168
- hash: 9
169
- segments:
170
- - 0
171
- - 6
172
- - 7
173
121
  version: 0.6.7
174
122
  type: :development
175
- name: yard
176
123
  prerelease: false
177
124
  version_requirements: *id010
178
125
  - !ruby/object:Gem::Dependency
126
+ name: jeweler
179
127
  requirement: &id011 !ruby/object:Gem::Requirement
180
128
  none: false
181
129
  requirements:
182
130
  - - ~>
183
131
  - !ruby/object:Gem::Version
184
- hash: 7
185
- segments:
186
- - 1
187
- - 5
188
- - 2
189
132
  version: 1.5.2
190
133
  type: :development
191
- name: jeweler
192
134
  prerelease: false
193
135
  version_requirements: *id011
194
136
  - !ruby/object:Gem::Dependency
137
+ name: rspec
195
138
  requirement: &id012 !ruby/object:Gem::Requirement
196
139
  none: false
197
140
  requirements:
198
141
  - - ~>
199
142
  - !ruby/object:Gem::Version
200
- hash: 27
201
- segments:
202
- - 2
203
- - 5
204
- - 0
205
143
  version: 2.5.0
206
144
  type: :development
207
- name: rspec
208
145
  prerelease: false
209
146
  version_requirements: *id012
210
147
  - !ruby/object:Gem::Dependency
148
+ name: rcov
211
149
  requirement: &id013 !ruby/object:Gem::Requirement
212
150
  none: false
213
151
  requirements:
214
152
  - - ">="
215
153
  - !ruby/object:Gem::Version
216
- hash: 41
217
- segments:
218
- - 0
219
- - 9
220
- - 9
221
154
  version: 0.9.9
222
155
  type: :development
223
- name: rcov
224
156
  prerelease: false
225
157
  version_requirements: *id013
226
158
  - !ruby/object:Gem::Dependency
159
+ name: spork
227
160
  requirement: &id014 !ruby/object:Gem::Requirement
228
161
  none: false
229
162
  requirements:
230
163
  - - ~>
231
164
  - !ruby/object:Gem::Version
232
- hash: 977940482
233
- segments:
234
- - 0
235
- - 9
236
- - 0
237
- - rc5
238
165
  version: 0.9.0.rc5
239
166
  type: :development
240
- name: spork
241
167
  prerelease: false
242
168
  version_requirements: *id014
243
169
  - !ruby/object:Gem::Dependency
170
+ name: watchr
244
171
  requirement: &id015 !ruby/object:Gem::Requirement
245
172
  none: false
246
173
  requirements:
247
174
  - - ">="
248
175
  - !ruby/object:Gem::Version
249
- hash: 3
250
- segments:
251
- - 0
252
176
  version: "0"
253
177
  type: :development
254
- name: watchr
255
178
  prerelease: false
256
179
  version_requirements: *id015
257
180
  description: "Gorillib: infochimps lightweight subset of ruby convenience methods"
@@ -268,7 +191,6 @@ files:
268
191
  - .rspec
269
192
  - CHANGELOG.textile
270
193
  - Gemfile
271
- - Gemfile.lock
272
194
  - LICENSE.textile
273
195
  - README.textile
274
196
  - Rakefile
@@ -296,6 +218,7 @@ files:
296
218
  - lib/gorillib/hashlike/compact.rb
297
219
  - lib/gorillib/hashlike/deep_compact.rb
298
220
  - lib/gorillib/hashlike/deep_dup.rb
221
+ - lib/gorillib/hashlike/deep_hash.rb
299
222
  - lib/gorillib/hashlike/deep_merge.rb
300
223
  - lib/gorillib/hashlike/hashlike_via_accessors.rb
301
224
  - lib/gorillib/hashlike/keys.rb
@@ -345,6 +268,7 @@ files:
345
268
  - spec/hash/slice_spec.rb
346
269
  - spec/hash/zip_spec.rb
347
270
  - spec/hashlike/behave_same_as_hash_spec.rb
271
+ - spec/hashlike/deep_hash_spec.rb
348
272
  - spec/hashlike/hashlike_behavior_spec.rb
349
273
  - spec/hashlike/hashlike_via_accessors_spec.rb
350
274
  - spec/hashlike_spec.rb
@@ -378,7 +302,6 @@ files:
378
302
  - spec/support/matchers/be_hash_eql.rb
379
303
  - spec/support/matchers/enumerate_method.rb
380
304
  - spec/support/matchers/evaluate_to_true.rb
381
- has_rdoc: true
382
305
  homepage: http://infochimps.com/labs
383
306
  licenses:
384
307
  - MIT
@@ -392,7 +315,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
392
315
  requirements:
393
316
  - - ">="
394
317
  - !ruby/object:Gem::Version
395
- hash: 3
318
+ hash: 168082518924887953
396
319
  segments:
397
320
  - 0
398
321
  version: "0"
@@ -401,14 +324,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
401
324
  requirements:
402
325
  - - ">="
403
326
  - !ruby/object:Gem::Version
404
- hash: 3
405
- segments:
406
- - 0
407
327
  version: "0"
408
328
  requirements: []
409
329
 
410
330
  rubyforge_project:
411
- rubygems_version: 1.3.7
331
+ rubygems_version: 1.8.6
412
332
  signing_key:
413
333
  specification_version: 3
414
334
  summary: include only what you need. No dependencies, no creep
@@ -427,6 +347,7 @@ test_files:
427
347
  - spec/hash/slice_spec.rb
428
348
  - spec/hash/zip_spec.rb
429
349
  - spec/hashlike/behave_same_as_hash_spec.rb
350
+ - spec/hashlike/deep_hash_spec.rb
430
351
  - spec/hashlike/hashlike_behavior_spec.rb
431
352
  - spec/hashlike/hashlike_via_accessors_spec.rb
432
353
  - spec/hashlike_spec.rb
data/Gemfile.lock DELETED
@@ -1,36 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- RedCloth (4.2.7)
5
- diff-lcs (1.1.2)
6
- git (1.2.5)
7
- jeweler (1.5.2)
8
- bundler (~> 1.0.0)
9
- git (>= 1.2.5)
10
- rake
11
- rake (0.8.7)
12
- rcov (0.9.9)
13
- rspec (2.5.0)
14
- rspec-core (~> 2.5.0)
15
- rspec-expectations (~> 2.5.0)
16
- rspec-mocks (~> 2.5.0)
17
- rspec-core (2.5.2)
18
- rspec-expectations (2.5.0)
19
- diff-lcs (~> 1.1.2)
20
- rspec-mocks (2.5.0)
21
- spork (0.9.0.rc7)
22
- watchr (0.7)
23
- yard (0.6.8)
24
-
25
- PLATFORMS
26
- ruby
27
-
28
- DEPENDENCIES
29
- RedCloth
30
- bundler (~> 1.0.12)
31
- jeweler (~> 1.5.2)
32
- rcov (>= 0.9.9)
33
- rspec (~> 2.5.0)
34
- spork (~> 0.9.0.rc5)
35
- watchr
36
- yard (~> 0.6.7)