insensitive_hash 0.2.4 → 0.3.0

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/CHANGELOG.markdown CHANGED
@@ -1,3 +1,23 @@
1
+ ### 0.3.0
2
+ * "Inherited insensitivity" had been a great source of confusion,
3
+ as it stores transformed version of the given Array of Hash.
4
+ From 0.3.0, Hash values and descendant Hashes are converted to be insensitive
5
+ only on the initialization of InsensitiveHash or on `underscore=` call.
6
+ Refer to the following code
7
+ * Now allowing underscores for spaces is by default on, and cannot be turned off.
8
+
9
+ ```ruby
10
+ ih = {}.insensitive
11
+ ih[:a] = { :b => :c }
12
+
13
+ ih[:a]['B'] # nil
14
+
15
+ # Initialize another InsensitiveHash
16
+ ih2 = ih.insensitive
17
+ ih2[:a]['B'] # :c
18
+ ```
19
+ * `:underscore` option is on by default
20
+
1
21
  ### 0.2.4
2
22
  * Bug fix: Invalid `dup`, `clone` behavior
3
23
  * :safe setting from `Hash#insensitive`
data/README.markdown CHANGED
@@ -17,9 +17,11 @@ Examples
17
17
  require 'insensitive_hash'
18
18
 
19
19
  ih = {}.insensitive
20
- ih = { 'abc' => 1, :def => 2 }.insensitive
21
- ih = { 'hello world' => true }.insensitive(:underscore => true)
22
- # :underscore option allows ih[:hello_world]
20
+
21
+ ih = { :abc => 1, 'hello world' => true }.insensitive
22
+
23
+ ih['ABC'] # 1
24
+ ih[:Hello_World] # true
23
25
  ```
24
26
 
25
27
  ### Instantiation without monkey-patching Hash
@@ -31,13 +33,13 @@ require 'insensitive_hash/minimal'
31
33
 
32
34
  ih = InsensitiveHash.new
33
35
  ih = InsensitiveHash.new(:default_value)
34
- ih = InsensitiveHash.new { |h, k| :default_value_from_block }
36
+ ih = InsensitiveHash.new { |ih, k| ih[k] = InsensitiveHash.new }
35
37
 
36
38
  ih = InsensitiveHash[ 'abc' => 1, :def => 2 ]
37
39
  ih = InsensitiveHash[ 'abc', 1, :def, 2 ]
38
40
  ih = InsensitiveHash[ [['abc', 1], [:def, 2]] ]
39
41
 
40
- ih = InsensitiveHash[ 'hello world' => true ].tap { |ih| ih.underscore = true }
42
+ ih = InsensitiveHash[ 'hello world' => true ]
41
43
  ```
42
44
 
43
45
  ### Revert to normal Hash
@@ -49,7 +51,7 @@ h = ih.to_hash
49
51
 
50
52
  ### Basic usage
51
53
  ```ruby
52
- ih = InsensitiveHash[:abc => 1, 'DEF' => 2]
54
+ ih = {:abc => 1, 'DEF' => 2}.insensitive
53
55
 
54
56
  # Case-insensitive, Symbol/String-indifferent access.
55
57
  ih['Abc'] # 1
@@ -70,17 +72,33 @@ ih.keys # ['DEF']
70
72
  ```
71
73
 
72
74
  ### "Inherited insensitivity"
75
+
76
+ When InsensitiveHash is built from another Hash,
77
+ descendant Hash values are recursively converted to be insensitive
78
+ (Useful when processing YAML inputs)
79
+
73
80
  ```ruby
74
- # Hash values are recursively converted to be insensitive
75
- # (Useful when processing YAML inputs)
76
- ih = InsensitiveHash.new
77
- ih['kids'] = { :hello => [ { :world => '!!!' } ] }
81
+
82
+ ih = { 'kids' => { :hello => [ { :world => '!!!' } ] } }.insensitive
78
83
  ih[:kids]['Hello'].first['WORLD'] # !!!
79
84
 
80
- ih['one'] = [ [ [ { :a => { :b => { :c => 'd' } } } ] ] ]
85
+ ih = {:one => [ [ [ { :a => { :b => { :c => 'd' } } } ] ] ]}.insensitive
81
86
  ih['one'].first.first.first['A']['b'][:C] # 'd'
82
87
  ```
83
88
 
89
+ Once InsensitiveHash is initialized, you can convert its descendant Hash values by
90
+ building a new InsensitiveHash from it.
91
+
92
+ ```ruby
93
+ ih = {}.insensitive
94
+ ih[:abc] = { :def => true }
95
+
96
+ ih['ABC']['DEF'] # nil
97
+
98
+ ih2 = ih.insensitive
99
+ ih2['ABC']['DEF'] # true
100
+ ```
101
+
84
102
  ### Processing case-insensitive YAML input
85
103
  ```ruby
86
104
  db = YAML.load(File.read 'database.yml').insensitive
@@ -90,23 +108,10 @@ db['Development']['ADAPTER']
90
108
  db[:production][:adapter]
91
109
  ```
92
110
 
93
- ### Replacing spaces in String keys to underscores
111
+ ### Enabling key-clash detection (Safe mode)
94
112
  ```ruby
95
- h = { 'A key with spaces' => true }
96
-
97
- ih = h.insensitive(:underscore => true)
98
- ih[:a_key_with_spaces] # true
99
-
100
- # Or without Hash#insensitive,
101
- ih = InsensitiveHash[ h ].tap { |ih| ih.underscore = true }
102
- ih.underscore? # true
103
- ih[:a_key_with_spaces] # true
104
- ```
105
-
106
- ### Enabling key-clash detection
107
- ```ruby
108
- ih = InsensitiveHash.new.tap { |ih| ih.safe = true }
109
- ih.safe? # true
113
+ ih = InsensitiveHash.new
114
+ ih.safe = true
110
115
 
111
116
  # Will raise InsensitiveHash::KeyClashError
112
117
  h.merge!('hello world' => 1, :hello_world => 2)
@@ -4,10 +4,10 @@ require 'insensitive_hash/insensitive_hash'
4
4
  class Hash
5
5
  # @return [InsensitiveHash]
6
6
  def insensitive options = {}
7
- InsensitiveHash.new.tap do |ih|
8
- ih.replace self
9
- ih.underscore = options[:underscore] if options.has_key?(:underscore)
10
- ih.safe = options[:safe] if options.has_key?(:safe)
7
+ InsensitiveHash[self].tap do |ih|
8
+ ih.safe = options[:safe] if options.has_key?(:safe)
9
+ ih.default = self.default
10
+ ih.default_proc = self.default_proc if self.default_proc
11
11
  end
12
12
  end
13
13
  end
@@ -11,33 +11,9 @@ class InsensitiveHash < Hash
11
11
  end
12
12
 
13
13
  @key_map = {}
14
- @underscore = false
15
14
  @safe = false
16
15
  end
17
16
 
18
- # Sets whether to replace spaces in String keys to underscores
19
- # @param [Boolean] us
20
- # @return [Boolean]
21
- def underscore= us
22
- raise ArgumentError.new("Not true or false") unless [true, false].include?(us)
23
-
24
- # Check key clash
25
- detect_clash self, us
26
-
27
- @underscore = us
28
- @key_map = {}
29
- self.keys.each do |k|
30
- self[k] = self.delete(k)
31
- end
32
-
33
- us
34
- end
35
-
36
- # @return [Boolean] Whether to replace spaces in String keys to underscores
37
- def underscore?
38
- @underscore
39
- end
40
-
41
17
  # Sets whether to detect key clashes
42
18
  # @param [Boolean]
43
19
  # @return [Boolean]
@@ -61,9 +37,7 @@ class InsensitiveHash < Hash
61
37
  def self.[] *init
62
38
  h = Hash[*init]
63
39
  InsensitiveHash.new.tap do |ih|
64
- h.each do |key, value|
65
- ih[key] = value
66
- end
40
+ ih.merge! h
67
41
  end
68
42
  end
69
43
 
@@ -77,16 +51,16 @@ class InsensitiveHash < Hash
77
51
 
78
52
  def []= key, value
79
53
  delete key
80
- ekey = encode key, @underscore
54
+ ekey = encode key
81
55
  @key_map[ekey] = key
82
- super key, wrap(value, underscore?)
56
+ super key, value
83
57
  end
84
58
  alias store []=
85
59
 
86
60
  def merge! other_hash
87
- detect_clash other_hash, underscore?
61
+ detect_clash other_hash
88
62
  other_hash.each do |key, value|
89
- self[key] = value
63
+ deep_set key, value
90
64
  end
91
65
  self
92
66
  end
@@ -112,15 +86,11 @@ class InsensitiveHash < Hash
112
86
  def replace other
113
87
  super other
114
88
 
115
- # TODO
116
- # What is the correct behavior of replace when the other hash is not an InsensitiveHash?
117
- # underscore property precedence: other => self (FIXME)
118
- self.underscore = other.respond_to?(:underscore?) ? other.underscore? : self.underscore?
119
- self.safe = other.safe? if other.respond_to?(:safe?)
89
+ self.safe = other.respond_to?(:safe?) ? other.safe? : safe?
120
90
 
121
91
  @key_map.clear
122
92
  self.each do |k, v|
123
- ekey = encode k, @underscore
93
+ ekey = encode k
124
94
  @key_map[ekey] = k
125
95
  end
126
96
  end
@@ -153,21 +123,26 @@ class InsensitiveHash < Hash
153
123
  end
154
124
 
155
125
  private
156
- def wrap value, us
126
+ def deep_set key, value
127
+ wv = wrap value
128
+ self[key] = wv
129
+ end
130
+
131
+ def wrap value
157
132
  case value
158
133
  when InsensitiveHash
159
- value.tap { |ih| ih.underscore = us || ih.underscore? }
134
+ value
160
135
  when Hash
161
- InsensitiveHash[value].tap { |ih| ih.underscore = us }
136
+ InsensitiveHash[value]
162
137
  when Array
163
- value.map { |v| wrap v, us }
138
+ value.map { |v| wrap v }
164
139
  else
165
140
  value
166
141
  end
167
142
  end
168
143
 
169
144
  def lookup_key key, delete = false
170
- ekey = encode key, @underscore
145
+ ekey = encode key
171
146
  if @key_map.has_key?(ekey)
172
147
  delete ? @key_map.delete(ekey) : @key_map[ekey]
173
148
  else
@@ -175,22 +150,17 @@ private
175
150
  end
176
151
  end
177
152
 
178
- def encode key, us
153
+ def encode key
179
154
  case key
180
155
  when String, Symbol
181
- key = key.to_s.downcase
182
- if us
183
- key.gsub(' ', '_')
184
- else
185
- key
186
- end
156
+ key.to_s.downcase.gsub(' ', '_')
187
157
  else
188
158
  key
189
159
  end
190
160
  end
191
161
 
192
- def detect_clash hash, us
193
- hash.keys.map { |k| encode k, us }.tap { |ekeys|
162
+ def detect_clash hash
163
+ hash.keys.map { |k| encode k }.tap { |ekeys|
194
164
  raise KeyClashError.new("Key clash detected") if ekeys != ekeys.uniq
195
165
  } if @safe
196
166
  end
@@ -1,3 +1,3 @@
1
1
  class InsensitiveHash < Hash
2
- VERSION = "0.2.4"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -3,7 +3,7 @@ require 'bundler'
3
3
  Bundler.setup(:default, :development)
4
4
  require 'test/unit'
5
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
- require 'insensitive_hash/minimal'
6
+ require 'insensitive_hash'
7
7
 
8
8
  class TestInsensitiveHash < Test::Unit::TestCase
9
9
  def eight?
@@ -44,18 +44,27 @@ class TestInsensitiveHash < Test::Unit::TestCase
44
44
  assert ih.keys.include?(:b)
45
45
  assert_equal 2, ih.keys.length
46
46
  assert_equal({ :c => 5 }, ih['B'])
47
- assert_equal 5, ih['B']['C']
47
+ assert_equal 5, ih['B'][:c]
48
+ assert_equal nil, ih['B']['C']
48
49
 
49
50
  ih['c'] = [ { 'x' => 1 }, { :y => 2 } ]
50
51
  assert ih.keys.include?('c')
51
52
  assert_equal 3, ih.keys.length
53
+
54
+ assert_equal nil, ih[:c].first[:x]
55
+ assert_equal nil, ih[:c].last['Y']
56
+
57
+ ih = ih.insensitive
52
58
  assert_equal 1, ih[:c].first[:x]
53
59
  assert_equal 2, ih[:c].last['Y']
54
60
 
55
61
  # Deeeeeper nesting
56
62
  ih['c'] = [ [ [ { 'x' => 1 }, { :y => 2 } ] ] ]
63
+ assert_equal nil, ih[:c].first.first.last[:Y]
64
+ ih = ih.insensitive
57
65
  assert_equal 2, ih[:c].first.first.last[:Y]
58
- ih['c'] = { 'a' => { 'a' => { 'a' => 100 } } }
66
+
67
+ ih['c'] = { 'a' => { 'a' => { 'a' => 100 } } }.insensitive
59
68
  assert_equal 100, ih[:C][:a][:A]['A']
60
69
 
61
70
  ih[5] = 50
@@ -69,11 +78,12 @@ class TestInsensitiveHash < Test::Unit::TestCase
69
78
  :c => { :D => [ { 'e' => 3 } ] }
70
79
  }
71
80
 
72
- assert_raise(NoMethodError) {
73
- hash.insensitive
74
- }
81
+ pend("TODO") do
82
+ assert_raise(NoMethodError) {
83
+ hash.insensitive
84
+ }
85
+ end
75
86
 
76
- require 'insensitive_hash'
77
87
  [hash.insensitive, InsensitiveHash[hash]].each do |ih|
78
88
  assert ih.is_a?(Hash)
79
89
  assert_equal InsensitiveHash, ih.class
@@ -86,15 +96,20 @@ class TestInsensitiveHash < Test::Unit::TestCase
86
96
  end
87
97
  end
88
98
 
99
+ # Changelog 0.3.0
100
+ ih = {}.insensitive
101
+ ih[:a] = { :b => :c }
102
+ assert_nil ih[:a]['B']
103
+ ih2 = ih.insensitive
104
+ assert_equal :c, ih2[:a]['B']
105
+
89
106
  # InsensitiveHash#insensitive
90
107
  ihash1 = hash.insensitive
91
108
  ihash1.default = :default
92
- ihash1.underscore = true
93
109
  ihash2 = ihash1.insensitive.insensitive.insensitive
94
110
 
95
111
  assert_equal InsensitiveHash, ihash2.class
96
112
  assert_equal :default, ihash2.default
97
- assert_equal true, ihash2.underscore?
98
113
 
99
114
  # Preserving default
100
115
  [:default, nil].each do |d|
@@ -116,31 +131,23 @@ class TestInsensitiveHash < Test::Unit::TestCase
116
131
 
117
132
  # FIXME: test insensitive call with encoder
118
133
  h = InsensitiveHash[{'Key with spaces' => 1}]
119
- h2 = h.insensitive :underscore => true
120
- h3 = h.insensitive :underscore => false
121
- assert_raise(ArgumentError) { h.insensitive :underscore => :wat }
134
+ h2 = h.insensitive
122
135
 
123
136
  assert_equal 1, h['key with spaces']
124
- assert_nil h[:key_with_spaces]
125
- assert_equal 1, h3['key with spaces']
126
- assert_nil h3[:key_with_spaces]
137
+ assert_equal 1, h[:key_with_spaces]
127
138
  assert_equal 1, h2[:KEY_WITH_SPACES]
128
139
  assert_equal 1, h2[:Key_with_spaces]
129
140
 
130
141
  assert_equal ['Key with spaces'], h.keys
131
142
  assert_equal ['Key with spaces'], h2.keys
132
- assert_equal ['Key with spaces'], h3.keys
133
143
 
134
144
  h = { 'A key with spaces' => true }
135
- ih = h.insensitive :underscore => true
145
+ ih = h.insensitive
136
146
  assert ih[:a_key_with_spaces]
137
- assert ih.underscore?
138
147
 
139
148
  # FIXME: from README
140
149
  ih = InsensitiveHash[ h ]
141
- ih.underscore = true
142
150
  assert ih[:a_key_with_spaces]
143
- assert ih.underscore?
144
151
 
145
152
  # :safe
146
153
  ih = {}.insensitive
@@ -176,17 +183,9 @@ class TestInsensitiveHash < Test::Unit::TestCase
176
183
  assert_keys [:a, 'hello world', :b], ih2.keys
177
184
  assert ih2.has_key?('B'), 'correctly merged another hash'
178
185
 
179
- assert_nil ih[:hello_world]
180
- assert_nil ih2[:hello_world]
181
-
182
- ih.underscore = true
183
186
  assert_equal 2, ih[:hello_world]
184
187
  assert_equal 2, ih.send(method, :b => 2)[:hello_world]
185
188
 
186
- ih.underscore = false
187
- assert_nil ih[:hello_world]
188
- assert_nil ih.send(method, :b => 2)[:hello_world]
189
-
190
189
  ih.default = 10
191
190
  assert_equal 10, ih.send(method, :b => 2)[:anything]
192
191
 
@@ -232,7 +231,6 @@ class TestInsensitiveHash < Test::Unit::TestCase
232
231
  assert_equal 1, ih.length
233
232
 
234
233
  ih = InsensitiveHash.new
235
- ih.underscore = true
236
234
  ih.merge!(:hello_world => 1, 'hello world' =>2)
237
235
  unless eight?
238
236
  assert_equal 2, ih.values.first
@@ -244,13 +242,9 @@ class TestInsensitiveHash < Test::Unit::TestCase
244
242
  def test_merge_clash
245
243
  ih = InsensitiveHash.new
246
244
  ih2 = InsensitiveHash.new
247
- ih2.underscore = true
248
245
 
249
246
  sih = InsensitiveHash.new
250
247
  sih.safe = true
251
- sih2 = InsensitiveHash.new
252
- sih2.safe = true
253
- sih2.underscore = true
254
248
 
255
249
  [:merge, :merge!, :update, :update!].each do |method|
256
250
  # No problem
@@ -259,18 +253,15 @@ class TestInsensitiveHash < Test::Unit::TestCase
259
253
  h.send(method, { 'a' => 1, 'A' => 1 })
260
254
  end
261
255
 
262
- [sih, sih2].each do |h|
263
- assert_raise(InsensitiveHash::KeyClashError) {
264
- h.send(method, { :a => 1, :A => 1, 'A' => 1})
265
- }
266
- assert_raise(InsensitiveHash::KeyClashError) {
267
- h.send(method, { 'a' => 1, 'A' => 1 })
268
- }
269
- end
256
+ assert_raise(InsensitiveHash::KeyClashError) {
257
+ sih.send(method, { :a => 1, :A => 1, 'A' => 1})
258
+ }
259
+ assert_raise(InsensitiveHash::KeyClashError) {
260
+ sih.send(method, { 'a' => 1, 'A' => 1 })
261
+ }
270
262
 
271
- sih.send(method, { :hello_world => 1, 'hello world' => 2})
272
263
  assert_raise(InsensitiveHash::KeyClashError) {
273
- sih2.send(method, { :hello_world => 1, 'hello world' => 2})
264
+ sih.send(method, { :hello_world => 1, 'hello world' => 2})
274
265
  }
275
266
  ih2.send(method, { :hello_world => 1, 'hello world' => 2})
276
267
  end
@@ -370,6 +361,30 @@ class TestInsensitiveHash < Test::Unit::TestCase
370
361
  assert_equal :ok, h.default(:right)
371
362
  end
372
363
 
364
+ def test_default_proc_patch
365
+ h = InsensitiveHash.new { |h, k| k }
366
+ assert_equal 1, h[1]
367
+ assert_equal 2, h[2]
368
+
369
+ h = InsensitiveHash.new { |h, k| h[k] = [] }
370
+ h[:abc] << 1
371
+ h[:abc] << 2
372
+ h[:abc] << 3
373
+ assert_equal [1, 2, 3], h[:abc]
374
+
375
+ h = InsensitiveHash.new { |h, k| h[k] = {} }
376
+ h[:abc][:def] = 1
377
+ h[:abc][:ghi] = { :xyz => true }
378
+ assert_equal 1, h[:abc][:def]
379
+ assert_equal true, h[:abc][:ghi][:xyz]
380
+ assert_equal nil, h[:abc][:ghi][:XYZ] # This shouldn't work anymore from 0.3.0
381
+
382
+ h = InsensitiveHash.new
383
+ h[:abc] = arr = [1, 2, 3]
384
+ arr << 4
385
+ assert_equal [1, 2, 3, 4], h[:ABC]
386
+ end
387
+
373
388
  def test_delete_if
374
389
  # FIXME: Test passes, but key_map not updated
375
390
  h = InsensitiveHash[ :a => 100, :tmp_a => 200, :c => 300 ]
@@ -427,26 +442,6 @@ class TestInsensitiveHash < Test::Unit::TestCase
427
442
  h.replace(Hash.new { |h, k| h[k] = :default })
428
443
  assert_equal :default, h[:anything]
429
444
  assert_equal [:anything], h.keys
430
-
431
- # underscore property of self
432
- assert !h.underscore?
433
- h.replace(InsensitiveHash['hello world' => 1].tap { |ih| ih.underscore = true })
434
- assert h.underscore?
435
- assert_equal 1, h[:hello_world]
436
-
437
- # TODO: FIXME
438
- # underscore property of other
439
- h = InsensitiveHash.new
440
- oh = InsensitiveHash[ 'hello world' => 1 ]
441
- oh.underscore = true
442
- assert !h.underscore?
443
- h.replace(oh)
444
- assert h.underscore?
445
-
446
- oh.underscore = false
447
- oh[:hello_world => 2]
448
- h.replace(oh)
449
- assert !h.underscore?
450
445
  end
451
446
 
452
447
  def test_rassoc
@@ -480,121 +475,28 @@ class TestInsensitiveHash < Test::Unit::TestCase
480
475
  assert_raise(eight? ? IndexError : KeyError) { h.fetch('D') }
481
476
  end
482
477
 
483
- def test_underscore
484
- h = InsensitiveHash[{'Key with spaces' => 1}]
485
-
486
- assert_equal 1, h['key with spaces']
487
- assert_nil h[:key_with_spaces]
488
-
489
- test_keys = [
490
- :KEY_WITH_SPACES,
491
- :Key_with_spaces,
492
- :key_with_spaces,
493
- 'key with_spaces',
494
- 'KEY_WITH spaces'
495
- ]
496
-
497
- 10.times do
498
- assert_raise(ArgumentError) { h.underscore = 'wat' }
499
- assert !h.underscore?
500
- h.underscore = true
501
- assert h.underscore?
502
-
503
-
504
- test_keys.each do |k|
505
- assert_equal 1, h[k]
506
- end
507
- assert_equal ['Key with spaces'], h.keys
508
-
509
- h.underscore = false
510
- assert !h.underscore?
511
- assert_equal 1, h['KEY WITH SPACES']
512
- test_keys.each do |k|
513
- assert_nil h[k]
514
- end
515
- assert_equal ['Key with spaces'], h.keys
516
- end
517
-
518
- h.underscore = true
519
- test_keys.each do |tk|
520
- h[tk] = 1
521
- end
522
-
523
- assert_equal [test_keys.last], h.keys
524
- end
525
-
526
478
  def test_underscore_inheritance
527
- h = InsensitiveHash[
479
+ h =
528
480
  {
529
481
  'Key with spaces' => {
530
482
  'Another key with spaces' => 1
531
483
  },
532
484
  'Key 2 with spaces' =>
533
- InsensitiveHash['Yet another key with spaces' => 2].tap { |ih| ih.underscore = true },
485
+ InsensitiveHash['Yet another key with spaces' => 2],
534
486
  'Key 3 with spaces' =>
535
487
  InsensitiveHash['Yet another key with spaces' => 3]
536
- }
537
- ]
488
+ }.insensitive
538
489
 
539
490
  assert_equal 1, h['key with spaces']['another key with spaces']
540
- assert_equal false, h['key with spaces'].underscore?
541
- assert_nil h['key with spaces'][:another_key_with_spaces]
542
- assert_nil h[:key_with_spaces]
543
491
 
544
492
  assert_equal 2, h['key 2 with spaces']['yet another key with spaces']
545
493
  assert_equal 2, h['key 2 with spaces'][:yet_another_key_with_spaces]
546
- assert_nil h[:key_2_with_spaces]
547
494
 
548
495
  assert_equal 3, h['key 3 with spaces']['yet another key with spaces']
549
- assert_nil h['key 3 with spaces'][:yet_another_key_with_spaces]
550
- assert_nil h[:key_3_with_spaces]
551
496
 
552
- h.underscore = true
553
- assert_equal true, h[:key_with_spaces].underscore?
554
497
  assert_equal 1, h[:key_with_spaces][:another_key_with_spaces]
555
- assert_equal true, h[:key_2_with_spaces].underscore?
556
498
  assert_equal 2, h[:key_2_with_spaces][:yet_another_key_with_spaces]
557
- assert_equal true, h[:key_3_with_spaces].underscore?
558
499
  assert_equal 3, h[:key_3_with_spaces][:yet_another_key_with_spaces]
559
-
560
- h.underscore = false
561
- assert_nil h[:key_with_spaces]
562
- assert_nil h[:key_2_with_spaces]
563
- assert_nil h[:key_3_with_spaces]
564
-
565
- assert_equal false, h.underscore?
566
- assert_equal true, h['key 2 with spaces'].underscore?
567
- assert_equal true, h['key 3 with spaces'].underscore?
568
- end
569
-
570
- def test_underscore_clash
571
- h = InsensitiveHash.new
572
- h.safe = true
573
-
574
- h['hello world'] = 1
575
- h['HELLO_world'] = 2
576
- assert_equal 1, h['HELLO WORLD']
577
- assert_equal 2, h['HELLO_WORLD']
578
- assert_equal ['hello world', 'HELLO_world'], h.keys unless eight? # Not order-preserving
579
-
580
- assert_raise(InsensitiveHash::KeyClashError) { h.underscore = true }
581
- h.delete('hello world')
582
- h.underscore = true
583
-
584
- assert_equal ['HELLO_world'], h.keys
585
- assert_equal 2, h['HELLO WORLD']
586
- assert_equal 2, h[:HELLO_WORLD]
587
- end
588
-
589
- def test_unset_underscore
590
- h = InsensitiveHash.new
591
- h.underscore = true
592
- h[:hello_world] = 1
593
- h.underscore = false
594
- h['hello world'] = 2
595
-
596
- assert_keys [:hello_world, 'hello world'], h.keys
597
- assert_equal 2, h['Hello World']
598
500
  end
599
501
 
600
502
  def test_constructor_default
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: insensitive_hash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-12 00:00:00.000000000 Z
12
+ date: 2012-07-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: test-unit