right_support 2.8.30 → 2.8.31

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 53cf993f219e3cdd938198bbef08b75918018725
4
- data.tar.gz: 817b7327c955cc5e97fc8ba0c93907ec81d32088
3
+ metadata.gz: 54dcd26e6d8094ac8b3f8ad42dae62aaf9287a7c
4
+ data.tar.gz: aa1a58306c4222a41daa45cc30626723065615a1
5
5
  SHA512:
6
- metadata.gz: bde0080e629764e6d4dddaaeb96fb8ca4f3179f4a977f426832ad1f509859bb9fda26c81b159bb3008956ee57516e3d5ded87802d7e96dee25aea923669fb7a4
7
- data.tar.gz: f6bc80c8f3a9a63da136ea59d25688a0240a6df5323f4859047fd72eb2f03912ddab43cb7c06ca7e073d93b932e11cab5c817e0d386b23ba490abd057046c1fa
6
+ metadata.gz: 97f3b74d83992e636fbc6d09926503db59a427f4907ea1679754dd916be7fee3764d88202be9aead0f484c878efe69d4bf77bfb0d580596a5009e74ad5d76e47
7
+ data.tar.gz: 6192c632633ef97f57ac37fc8159fe40b22a1eebe269608efb560615e138e69118c8b81702f853bfb7042819777225ffda197dfe8b93de21320e2789075532b4
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009-2012 RightScale, Inc.
1
+ Copyright (c) 2009-2014 RightScale, Inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -18,3 +18,59 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
18
  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
19
  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
20
  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ ---
23
+ ---
24
+
25
+ Some portions of lib/right_support/data/mash.rb and spec/data/mash_spec.rb
26
+ are modified versions of the extlib library, which is licensed under the
27
+ MIT license. That license, plus the license of the code from which extlib
28
+ was derived, is included below:
29
+
30
+ Copyright (c) 2010 Dan Kubb
31
+
32
+ Permission is hereby granted, free of charge, to any person obtaining
33
+ a copy of this software and associated documentation files (the
34
+ "Software"), to deal in the Software without restriction, including
35
+ without limitation the rights to use, copy, modify, merge, publish,
36
+ distribute, sublicense, and/or sell copies of the Software, and to
37
+ permit persons to whom the Software is furnished to do so, subject to
38
+ the following conditions:
39
+
40
+ The above copyright notice and this permission notice shall be
41
+ included in all copies or substantial portions of the Software.
42
+
43
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
44
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
45
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
46
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
47
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
48
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
49
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
50
+
51
+ ---
52
+ ---
53
+
54
+ Some portions of blank.rb and mash.rb are verbatim copies of software
55
+ licensed under the MIT license. That license is included below:
56
+
57
+ Copyright (c) 2005-2008 David Heinemeier Hansson
58
+
59
+ Permission is hereby granted, free of charge, to any person obtaining
60
+ a copy of this software and associated documentation files (the
61
+ "Software"), to deal in the Software without restriction, including
62
+ without limitation the rights to use, copy, modify, merge, publish,
63
+ distribute, sublicense, and/or sell copies of the Software, and to
64
+ permit persons to whom the Software is furnished to do so, subject to
65
+ the following conditions:
66
+
67
+ The above copyright notice and this permission notice shall be
68
+ included in all copies or substantial portions of the Software.
69
+
70
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
71
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
72
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
73
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
74
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
75
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
76
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.8.30
1
+ 2.8.31
@@ -33,3 +33,4 @@ require 'right_support/data/unknown_type'
33
33
  require 'right_support/data/serializer'
34
34
  require 'right_support/data/hash_tools'
35
35
  require 'right_support/data/uuid'
36
+ require 'right_support/data/mash'
@@ -26,11 +26,9 @@ module RightSupport::Data
26
26
  module HashTools
27
27
 
28
28
  # require checks
29
- HAS_EXTLIB = require_succeeds?('extlib/mash')
30
29
  HAS_JSON = require_succeeds?('json')
31
30
 
32
31
  # exceptions
33
- class NoExtlib < ::StandardError; end
34
32
  class NoJson < ::StandardError; end
35
33
 
36
34
  # Determines if given object is hashable (i.e. object responds to hash methods).
@@ -219,12 +217,8 @@ module RightSupport::Data
219
217
  # === Return
220
218
  # @return [Object] depends on input type
221
219
  def self.deep_mash(any, &leaf_callback)
222
- if HAS_EXTLIB
223
- options = { :class => ::Mash }
224
- deep_clone2(any, options, &leaf_callback)
225
- else
226
- raise NoExtlib, "extlib is unavailable"
227
- end
220
+ options = { :class => RightSupport::Data::Mash }
221
+ deep_clone2(any, options, &leaf_callback)
228
222
  end
229
223
 
230
224
  # Performs a deep merge (but not a deep clone) of one hash into another.
@@ -0,0 +1,161 @@
1
+ module RightSupport::Data
2
+ # A workalike for extlib's ::Mash, but properly namespaced.
3
+ class Mash < ::Hash
4
+
5
+ # @param constructor<Object>
6
+ # The default value for the mash. Defaults to an empty hash.
7
+ #
8
+ # @details [Alternatives]
9
+ # If constructor is a Hash, a new mash will be created based on the keys of
10
+ # the hash and no default value will be set.
11
+ def initialize(constructor = {})
12
+ if constructor.is_a?(Hash)
13
+ super()
14
+ update(constructor)
15
+ else
16
+ super(constructor)
17
+ end
18
+ end
19
+
20
+ # @param key<Object> The default value for the mash. Defaults to nil.
21
+ #
22
+ # @details [Alternatives]
23
+ # If key is a Symbol and it is a key in the mash, then the default value will
24
+ # be set to the value matching the key.
25
+ def default(key = nil)
26
+ if key.is_a?(Symbol) && include?(key = key.to_s)
27
+ self[key]
28
+ else
29
+ super
30
+ end
31
+ end
32
+
33
+ alias_method :regular_writer, :[]= unless method_defined?(:regular_writer)
34
+ alias_method :regular_update, :update unless method_defined?(:regular_update)
35
+
36
+ # @param key<Object> The key to set.
37
+ # @param value<Object>
38
+ # The value to set the key to.
39
+ #
40
+ # @see Mash#convert_key
41
+ # @see Mash#convert_value
42
+ def []=(key, value)
43
+ regular_writer(convert_key(key), convert_value(value))
44
+ end
45
+
46
+ # @param other_hash<Hash>
47
+ # A hash to update values in the mash with. The keys and the values will be
48
+ # converted to Mash format.
49
+ #
50
+ # @return [Mash] The updated mash.
51
+ def update(other_hash)
52
+ other_hash.each_pair { |key, value| regular_writer(convert_key(key), convert_value(value)) }
53
+ self
54
+ end
55
+
56
+ alias_method :merge!, :update
57
+
58
+ # @param key<Object> The key to check for. This will be run through convert_key.
59
+ #
60
+ # @return [Boolean] True if the key exists in the mash.
61
+ def key?(key)
62
+ super(convert_key(key))
63
+ end
64
+
65
+ # def include? def has_key? def member?
66
+ alias_method :include?, :key?
67
+ alias_method :has_key?, :key?
68
+ alias_method :member?, :key?
69
+
70
+ # @param key<Object> The key to fetch. This will be run through convert_key.
71
+ # @param *extras<Array> Default value.
72
+ #
73
+ # @return [Object] The value at key or the default value.
74
+ def fetch(key, *extras)
75
+ super(convert_key(key), *extras)
76
+ end
77
+
78
+ # @param *indices<Array>
79
+ # The keys to retrieve values for. These will be run through +convert_key+.
80
+ #
81
+ # @return [Array] The values at each of the provided keys
82
+ def values_at(*indices)
83
+ indices.collect {|key| self[convert_key(key)]}
84
+ end
85
+
86
+ # @param hash<Hash> The hash to merge with the mash.
87
+ #
88
+ # @return [Mash] A new mash with the hash values merged in.
89
+ def merge(hash)
90
+ self.dup.update(hash)
91
+ end
92
+
93
+ # @param key<Object>
94
+ # The key to delete from the mash.\
95
+ def delete(key)
96
+ super(convert_key(key))
97
+ end
98
+
99
+ # @param *rejected<Array[(String, Symbol)] The mash keys to exclude.
100
+ #
101
+ # @return [Mash] A new mash without the selected keys.
102
+ #
103
+ # @example
104
+ # { :one => 1, :two => 2, :three => 3 }.except(:one)
105
+ # #=> { "two" => 2, "three" => 3 }
106
+ def except(*keys)
107
+ keys = keys.map { |k| convert_key(k) }
108
+ hash = self.dup
109
+ keys.each {|k| hash.delete(k) }
110
+ hash
111
+ end
112
+
113
+ # Used to provide the same interface as Hash.
114
+ #
115
+ # @return [Mash] This mash unchanged.
116
+ def stringify_keys!; self end
117
+
118
+ # @return [Hash] The mash as a Hash with symbolized keys.
119
+ def symbolize_keys
120
+ h = Hash.new(default)
121
+ each { |key, val| h[key.to_sym] = val }
122
+ h
123
+ end
124
+
125
+ # @return [Hash] The mash as a Hash with string keys.
126
+ def to_hash
127
+ Hash.new(default).merge(self)
128
+ end
129
+
130
+ protected
131
+ # @param key<Object> The key to convert.
132
+ #
133
+ # @param [Object]
134
+ # The converted key. If the key was a symbol, it will be converted to a
135
+ # string.
136
+ #
137
+ # @api private
138
+ def convert_key(key)
139
+ key.kind_of?(Symbol) ? key.to_s : key
140
+ end
141
+
142
+ # @param value<Object> The value to convert.
143
+ #
144
+ # @return [Object]
145
+ # The converted value. A Hash or an Array of hashes, will be converted to
146
+ # their Mash equivalents.
147
+ #
148
+ # @api private
149
+ def convert_value(value)
150
+ if value.class == Hash
151
+ hash = Mash.new(value)
152
+ hash.default = value.default
153
+ hash
154
+ elsif value.is_a?(Array)
155
+ value.collect { |e| convert_value(e) }
156
+ else
157
+ value
158
+ end
159
+ end
160
+ end
161
+ end
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: right_support 2.8.30 ruby lib
5
+ # stub: right_support 2.8.31 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "right_support"
9
- s.version = "2.8.30"
9
+ s.version = "2.8.31"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Tony Spataro", "Sergey Sergyenko", "Ryan Williamson", "Lee Kirchhoff", "Alexey Karpik", "Scott Messier"]
14
- s.date = "2014-09-24"
14
+ s.date = "2014-09-25"
15
15
  s.description = "A toolkit of useful, reusable foundation code created by RightScale."
16
16
  s.email = "support@rightscale.com"
17
17
  s.extra_rdoc_files = [
@@ -53,6 +53,7 @@ Gem::Specification.new do |s|
53
53
  "lib/right_support/crypto/signed_hash.rb",
54
54
  "lib/right_support/data.rb",
55
55
  "lib/right_support/data/hash_tools.rb",
56
+ "lib/right_support/data/mash.rb",
56
57
  "lib/right_support/data/serializer.rb",
57
58
  "lib/right_support/data/unknown_type.rb",
58
59
  "lib/right_support/data/uuid.rb",
@@ -100,6 +101,7 @@ Gem::Specification.new do |s|
100
101
  "spec/config/feature_set_spec.rb",
101
102
  "spec/crypto/signed_hash_spec.rb",
102
103
  "spec/data/hash_tools_spec.rb",
104
+ "spec/data/mash_spec.rb",
103
105
  "spec/data/uuid_spec.rb",
104
106
  "spec/db/cassandra_model_part1_spec.rb",
105
107
  "spec/db/cassandra_model_part2_spec.rb",
@@ -194,7 +194,7 @@ describe RightSupport::Data::HashTools do
194
194
  def deep_check_object_id(a, b, &leaf_callback)
195
195
  a.object_id.should_not == b.object_id
196
196
  if subject.hashable?(a)
197
- b.class.should == ::Mash
197
+ b.class.should == RightSupport::Data::Mash
198
198
  a.each do |k, v|
199
199
  other = b[k]
200
200
  if subject.hashable?(v)
@@ -0,0 +1,313 @@
1
+ require 'spec_helper'
2
+
3
+ class AwesomeHash < Hash
4
+ end
5
+
6
+ describe RightSupport::Data::Mash do
7
+ subject { RightSupport::Data::Mash}
8
+
9
+ before(:each) do
10
+ @hash = { "mash" => "indifferent", :hash => "different" }
11
+ @sub = AwesomeHash.new("mash" => "indifferent", :hash => "different")
12
+ end
13
+
14
+ describe "#initialize" do
15
+ it 'converts all keys into strings when param is a Hash' do
16
+ mash = subject.new(@hash)
17
+
18
+ mash.keys.any? { |key| key.is_a?(Symbol) }.should be(false)
19
+ end
20
+
21
+ it 'converts all pure Hash values into Mashes if param is a Hash' do
22
+ mash = subject.new :hash => @hash
23
+
24
+ mash["hash"].should be_an_instance_of(subject)
25
+ # sanity check
26
+ mash["hash"]["hash"].should == "different"
27
+ end
28
+
29
+ it 'doesn not convert Hash subclass values into Mashes' do
30
+ mash = subject.new :sub => @sub
31
+ mash["sub"].should be_an_instance_of(AwesomeHash)
32
+ end
33
+
34
+ it 'converts all value items if value is an Array' do
35
+ mash = subject.new :arry => { :hash => [@hash] }
36
+
37
+ mash["arry"].should be_an_instance_of(subject)
38
+ # sanity check
39
+ mash["arry"]["hash"].first["hash"].should == "different"
40
+
41
+ end
42
+
43
+ it 'delegates to superclass constructor if param is not a Hash' do
44
+ mash = subject.new("dash berlin")
45
+
46
+ mash["unexisting key"].should == "dash berlin"
47
+ end
48
+ end # describe "#initialize"
49
+
50
+
51
+
52
+ describe "#update" do
53
+ it 'converts all keys into strings when param is a Hash' do
54
+ mash = subject.new(@hash)
55
+ mash.update("starry" => "night")
56
+
57
+ mash.keys.any? { |key| key.is_a?(Symbol) }.should be(false)
58
+ end
59
+
60
+ it 'converts all Hash values into Mashes if param is a Hash' do
61
+ mash = subject.new :hash => @hash
62
+ mash.update(:hash => { :hash => "is buggy in Ruby 1.8.6" })
63
+
64
+ mash["hash"].should be_an_instance_of(subject)
65
+ end
66
+ end # describe "#update"
67
+
68
+
69
+
70
+ describe "#[]=" do
71
+ it 'converts key into string' do
72
+ mash = subject.new(@hash)
73
+ mash[:hash] = { "starry" => "night" }
74
+
75
+ mash.keys.any? { |key| key.is_a?(Symbol) }.should be(false)
76
+ end
77
+
78
+ it 'converts all Hash value into subject' do
79
+ mash = subject.new :hash => @hash
80
+ mash[:hash] = { :hash => "is buggy in Ruby 1.8.6" }
81
+
82
+ mash["hash"].should be_an_instance_of(subject)
83
+ end
84
+ end # describe "#[]="
85
+
86
+
87
+
88
+ describe "#key?" do
89
+ before(:each) do
90
+ @mash = subject.new(@hash)
91
+ end
92
+
93
+ it 'converts key before lookup' do
94
+ @mash.key?("mash").should be(true)
95
+ @mash.key?(:mash).should be(true)
96
+
97
+ @mash.key?("hash").should be(true)
98
+ @mash.key?(:hash).should be(true)
99
+
100
+ @mash.key?(:rainclouds).should be(false)
101
+ @mash.key?("rainclouds").should be(false)
102
+ end
103
+
104
+ it 'is aliased as include?' do
105
+ @mash.include?("mash").should be(true)
106
+ @mash.include?(:mash).should be(true)
107
+
108
+ @mash.include?("hash").should be(true)
109
+ @mash.include?(:hash).should be(true)
110
+
111
+ @mash.include?(:rainclouds).should be(false)
112
+ @mash.include?("rainclouds").should be(false)
113
+ end
114
+
115
+ it 'is aliased as member?' do
116
+ @mash.member?("mash").should be(true)
117
+ @mash.member?(:mash).should be(true)
118
+
119
+ @mash.member?("hash").should be(true)
120
+ @mash.member?(:hash).should be(true)
121
+
122
+ @mash.member?(:rainclouds).should be(false)
123
+ @mash.member?("rainclouds").should be(false)
124
+ end
125
+ end # describe "#key?"
126
+
127
+
128
+ describe "#dup" do
129
+ it 'returns instance of subject' do
130
+ subject.new(@hash).dup.should be_an_instance_of(subject)
131
+ end
132
+
133
+ it 'preserves keys' do
134
+ mash = subject.new(@hash)
135
+ dup = mash.dup
136
+
137
+ mash.keys.sort.should == dup.keys.sort
138
+ end
139
+
140
+ it 'preserves value' do
141
+ mash = subject.new(@hash)
142
+ dup = mash.dup
143
+
144
+ mash.values.sort.should == dup.values.sort
145
+ end
146
+ end
147
+
148
+
149
+
150
+ describe "#to_hash" do
151
+ it 'returns instance of subject' do
152
+ subject.new(@hash).to_hash.should be_an_instance_of(Hash)
153
+ end
154
+
155
+ it 'preserves keys' do
156
+ mash = subject.new(@hash)
157
+ converted = mash.to_hash
158
+
159
+ mash.keys.sort.should == converted.keys.sort
160
+ end
161
+
162
+ it 'preserves value' do
163
+ mash = subject.new(@hash)
164
+ converted = mash.to_hash
165
+
166
+ mash.values.sort.should == converted.values.sort
167
+ end
168
+ end
169
+
170
+
171
+
172
+ describe "#symbolize_keys" do
173
+ it 'returns instance of subject' do
174
+ subject.new(@hash).symbolize_keys.should be_an_instance_of(Hash)
175
+ end
176
+
177
+ it 'converts keys to symbols' do
178
+ mash = subject.new(@hash)
179
+ converted = mash.symbolize_keys
180
+
181
+ converted_keys = converted.keys.sort{|k1, k2| k1.to_s <=> k2.to_s}
182
+ orig_keys = mash.keys.map{|k| k.to_sym}.sort{|i1, i2| i1.to_s <=> i2.to_s}
183
+
184
+ converted_keys.should == orig_keys
185
+ end
186
+
187
+ it 'preserves value' do
188
+ mash = subject.new(@hash)
189
+ converted = mash.symbolize_keys
190
+
191
+ mash.values.sort.should == converted.values.sort
192
+ end
193
+ end
194
+
195
+
196
+
197
+ describe "#delete" do
198
+ it 'converts Symbol key into String before deleting' do
199
+ mash = subject.new(@hash)
200
+
201
+ mash.delete(:hash)
202
+ mash.key?("hash").should be(false)
203
+ end
204
+
205
+ it 'works with String keys as well' do
206
+ mash = subject.new(@hash)
207
+
208
+ mash.delete("mash")
209
+ mash.key?("mash").should be(false)
210
+ end
211
+ end
212
+
213
+
214
+
215
+ describe "#except" do
216
+ it "converts Symbol key into String before calling super" do
217
+ mash = subject.new(@hash)
218
+
219
+ hashless_mash = mash.except(:hash)
220
+ hashless_mash.key?("hash").should be(false)
221
+ end
222
+
223
+ it "works with String keys as well" do
224
+ mash = subject.new(@hash)
225
+
226
+ mashless_mash = mash.except("mash")
227
+ mashless_mash.key?("mash").should be(false)
228
+ end
229
+
230
+ it "works with multiple keys" do
231
+ mash = subject.new(@hash)
232
+
233
+ mashless = mash.except("hash", :mash)
234
+ mashless.key?(:hash).should be(false)
235
+ mashless.key?("mash").should be(false)
236
+ end
237
+
238
+ it "should return a mash" do
239
+ mash = subject.new(@hash)
240
+
241
+ hashless_mash = mash.except(:hash)
242
+ hashless_mash.class.should be(subject)
243
+ end
244
+ end
245
+
246
+
247
+
248
+ describe "#merge" do
249
+ before(:each) do
250
+ @mash = subject.new(@hash).merge(:no => "in between")
251
+ end
252
+
253
+ it 'returns instance of subject' do
254
+ @mash.should be_an_instance_of(subject)
255
+ end
256
+
257
+ it 'merges in give Hash' do
258
+ @mash["no"].should == "in between"
259
+ end
260
+ end
261
+
262
+
263
+
264
+ describe "#fetch" do
265
+ before(:each) do
266
+ @mash = subject.new(@hash).merge(:no => "in between")
267
+ end
268
+
269
+ it 'converts key before fetching' do
270
+ @mash.fetch("no").should == "in between"
271
+ end
272
+
273
+ it 'returns alternative value if key lookup fails' do
274
+ @mash.fetch("flying", "screwdriver").should == "screwdriver"
275
+ end
276
+ end
277
+
278
+
279
+ describe "#default" do
280
+ before(:each) do
281
+ @mash = subject.new(:yet_another_technical_revolution)
282
+ end
283
+
284
+ it 'returns default value unless key exists in mash' do
285
+ @mash.default("peak oil is now behind, baby").should == :yet_another_technical_revolution
286
+ end
287
+
288
+ it 'returns existing value if key is Symbol and exists in mash' do
289
+ @mash.update(:no => "in between")
290
+ @mash.default(:no).should == "in between"
291
+ end
292
+ end
293
+
294
+
295
+ describe "#values_at" do
296
+ before(:each) do
297
+ @mash = subject.new(@hash).merge(:no => "in between")
298
+ end
299
+
300
+ it 'is indifferent to whether keys are strings or symbols' do
301
+ @mash.values_at("hash", :mash, :no).should == ["different", "indifferent", "in between"]
302
+ end
303
+ end
304
+
305
+
306
+ describe "#stringify_keys!" do
307
+ it 'returns the mash itself' do
308
+ mash = subject.new(@hash)
309
+
310
+ mash.stringify_keys!.object_id.should == mash.object_id
311
+ end
312
+ end
313
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: right_support
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.30
4
+ version: 2.8.31
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Spataro
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2014-09-24 00:00:00.000000000 Z
16
+ date: 2014-09-25 00:00:00.000000000 Z
17
17
  dependencies: []
18
18
  description: A toolkit of useful, reusable foundation code created by RightScale.
19
19
  email: support@rightscale.com
@@ -57,6 +57,7 @@ files:
57
57
  - lib/right_support/crypto/signed_hash.rb
58
58
  - lib/right_support/data.rb
59
59
  - lib/right_support/data/hash_tools.rb
60
+ - lib/right_support/data/mash.rb
60
61
  - lib/right_support/data/serializer.rb
61
62
  - lib/right_support/data/unknown_type.rb
62
63
  - lib/right_support/data/uuid.rb
@@ -104,6 +105,7 @@ files:
104
105
  - spec/config/feature_set_spec.rb
105
106
  - spec/crypto/signed_hash_spec.rb
106
107
  - spec/data/hash_tools_spec.rb
108
+ - spec/data/mash_spec.rb
107
109
  - spec/data/uuid_spec.rb
108
110
  - spec/db/cassandra_model_part1_spec.rb
109
111
  - spec/db/cassandra_model_part2_spec.rb