insensitive_hash 0.2.3 → 0.2.4

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,12 +1,16 @@
1
+ ### 0.2.4
2
+ * Bug fix: Invalid `dup`, `clone` behavior
3
+ * :safe setting from `Hash#insensitive`
4
+
1
5
  ### 0.2.3 / 2012/02/18
2
- * Key-clash detection made optional with `Insensitive#safe=`
6
+ * Key-clash detection made optional with `InsensitiveHash#safe=`
3
7
  * Ruby 1.8 compatibility
4
8
 
5
9
  ### 0.2.2 / 2012/02/13
6
10
  * :underscore option added
7
- * `Insensitive::KeyClashError` added for safer operations
11
+ * `InsensitiveHash::KeyClashError` added for safer operations
8
12
  * Bug fix: Preserve default/default_proc on merge/replace/insensitive
9
- * Subtle behavioral change in `Insensitive#replace` when called with an ordinary Hash
13
+ * Subtle behavioral change in `InsensitiveHash#replace` when called with an ordinary Hash
10
14
 
11
15
  ### 0.2.1 / 2012/02/10
12
16
  * Bug fix: Insensitive `fetch`
data/README.markdown CHANGED
@@ -12,23 +12,41 @@ Examples
12
12
  --------
13
13
 
14
14
  ### Instantiation
15
+
15
16
  ```ruby
16
17
  require 'insensitive_hash'
17
18
 
18
- # Monkey-patched Hash#insensitive method
19
- ih = {'abc' => 1, :def => 2}.insensitive
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]
23
+ ```
24
+
25
+ ### Instantiation without monkey-patching Hash
26
+
27
+ If you don't like to have Hash#insensitive method, `require 'insensitive_hash/minimal'`
28
+
29
+ ```ruby
30
+ require 'insensitive_hash/minimal'
31
+
32
+ ih = InsensitiveHash.new
33
+ ih = InsensitiveHash.new(:default_value)
34
+ ih = InsensitiveHash.new { |h, k| :default_value_from_block }
35
+
36
+ ih = InsensitiveHash[ 'abc' => 1, :def => 2 ]
37
+ ih = InsensitiveHash[ 'abc', 1, :def, 2 ]
38
+ ih = InsensitiveHash[ [['abc', 1], [:def, 2]] ]
20
39
 
21
- # Or,
22
- ih = InsensitiveHash[ :abc => 1, 'DEF' => 2 ]
23
- ih = InsensitiveHash[ :abc, 1, 'DEF', 2 ]
40
+ ih = InsensitiveHash[ 'hello world' => true ].tap { |ih| ih.underscore = true }
41
+ ```
42
+
43
+ ### Revert to normal Hash
24
44
 
25
- # Revert to normal Hash
45
+ ```ruby
26
46
  h = ih.sensitive
27
47
  h = ih.to_hash
28
48
  ```
29
49
 
30
- If you don't like to have Hash#insensitive method, `require 'insensitive_hash/minimal'`
31
-
32
50
  ### Basic usage
33
51
  ```ruby
34
52
  ih = InsensitiveHash[:abc => 1, 'DEF' => 2]
@@ -76,16 +94,29 @@ db[:production][:adapter]
76
94
  ```ruby
77
95
  h = { 'A key with spaces' => true }
78
96
 
79
- ih = h.insensitive :underscore => true
97
+ ih = h.insensitive(:underscore => true)
80
98
  ih[:a_key_with_spaces] # true
81
99
 
82
- # Or,
83
- ih = InsensitiveHash[ h ]
84
- ih.underscore = true
100
+ # Or without Hash#insensitive,
101
+ ih = InsensitiveHash[ h ].tap { |ih| ih.underscore = true }
85
102
  ih.underscore? # true
86
103
  ih[:a_key_with_spaces] # true
87
104
  ```
88
105
 
106
+ ### Enabling key-clash detection
107
+ ```ruby
108
+ ih = InsensitiveHash.new.tap { |ih| ih.safe = true }
109
+ ih.safe? # true
110
+
111
+ # Will raise InsensitiveHash::KeyClashError
112
+ h.merge!('hello world' => 1, :hello_world => 2)
113
+
114
+ # Disables key-clash detection
115
+ h.safe = false
116
+ h.merge!('hello world' => 1, :hello_world => 2)
117
+ h['Hello World'] # 2
118
+ ```
119
+
89
120
  ## Contributing to insensitive_hash
90
121
 
91
122
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
@@ -98,6 +129,6 @@ ih[:a_key_with_spaces] # true
98
129
 
99
130
  ## Copyright
100
131
 
101
- Copyright (c) 2011 Junegunn Choi. See LICENSE.txt for
132
+ Copyright (c) 2012 Junegunn Choi. See LICENSE.txt for
102
133
  further details.
103
134
 
@@ -7,6 +7,7 @@ class Hash
7
7
  InsensitiveHash.new.tap do |ih|
8
8
  ih.replace self
9
9
  ih.underscore = options[:underscore] if options.has_key?(:underscore)
10
+ ih.safe = options[:safe] if options.has_key?(:safe)
10
11
  end
11
12
  end
12
13
  end
@@ -4,6 +4,7 @@ class InsensitiveHash < Hash
4
4
 
5
5
  def initialize default = nil, &block
6
6
  if block_given?
7
+ raise ArgumentError.new('wrong number of arguments') unless default.nil?
7
8
  super &block
8
9
  else
9
10
  super
@@ -41,7 +42,7 @@ class InsensitiveHash < Hash
41
42
  # @param [Boolean]
42
43
  # @return [Boolean]
43
44
  def safe= s
44
- raise ArgumentError.new("Not true or false") unless [true, false].include?(s)
45
+ raise ArgumentError.new("Neither true nor false") unless [true, false].include?(s)
45
46
  @safe = s
46
47
  end
47
48
 
@@ -139,6 +140,18 @@ class InsensitiveHash < Hash
139
140
  super *args, &block
140
141
  end
141
142
 
143
+ def dup
144
+ super.tap { |copy|
145
+ copy.instance_variable_set :@key_map, @key_map.dup
146
+ }
147
+ end
148
+
149
+ def clone
150
+ super.tap { |copy|
151
+ copy.instance_variable_set :@key_map, @key_map.dup
152
+ }
153
+ end
154
+
142
155
  private
143
156
  def wrap value, us
144
157
  case value
@@ -1,3 +1,3 @@
1
1
  class InsensitiveHash < Hash
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
@@ -17,7 +17,6 @@ class TestInsensitiveHash < Test::Unit::TestCase
17
17
  else
18
18
  assert_equal set1, set2
19
19
  end
20
-
21
20
  end
22
21
 
23
22
  def test_has_key_set
@@ -142,6 +141,19 @@ class TestInsensitiveHash < Test::Unit::TestCase
142
141
  ih.underscore = true
143
142
  assert ih[:a_key_with_spaces]
144
143
  assert ih.underscore?
144
+
145
+ # :safe
146
+ ih = {}.insensitive
147
+ assert_raise(ArgumentError) {
148
+ ihs = {'a' => 1}.insensitive(:safe => 1)
149
+ }
150
+ ihs = {'a' => 1}.insensitive(:safe => true)
151
+ assert !ih.safe?
152
+ assert ihs.safe?
153
+
154
+ assert_raise(InsensitiveHash::KeyClashError) {
155
+ ihs.merge(:a => 2, 'A' => 3)
156
+ }
145
157
  end
146
158
 
147
159
  def test_delete
@@ -563,7 +575,7 @@ class TestInsensitiveHash < Test::Unit::TestCase
563
575
  h['HELLO_world'] = 2
564
576
  assert_equal 1, h['HELLO WORLD']
565
577
  assert_equal 2, h['HELLO_WORLD']
566
- assert_equal ['hello world', 'HELLO_world'], h.keys
578
+ assert_equal ['hello world', 'HELLO_world'], h.keys unless eight? # Not order-preserving
567
579
 
568
580
  assert_raise(InsensitiveHash::KeyClashError) { h.underscore = true }
569
581
  h.delete('hello world')
@@ -584,5 +596,35 @@ class TestInsensitiveHash < Test::Unit::TestCase
584
596
  assert_keys [:hello_world, 'hello world'], h.keys
585
597
  assert_equal 2, h['Hello World']
586
598
  end
599
+
600
+ def test_constructor_default
601
+ h = InsensitiveHash.new :default
602
+ assert_equal :default, h[:xxx]
603
+
604
+ h = InsensitiveHash.new { :default_from_block }
605
+ assert_equal :default_from_block, h[:xxx]
606
+
607
+ # But not both!
608
+ assert_raise(ArgumentError) {
609
+ InsensitiveHash.new(:default) { :default_from_block }
610
+ }
611
+ end
612
+
613
+ def test_dup_clone
614
+ a = InsensitiveHash.new
615
+ a[:key] = :value
616
+
617
+ b = a.dup
618
+ b.delete 'key'
619
+ assert_nil b[:key]
620
+
621
+ assert_equal :value, a[:key]
622
+
623
+ c = a.clone
624
+ c.delete 'KEY'
625
+ assert_nil c[:key]
626
+
627
+ assert_equal :value, a[:key]
628
+ end
587
629
  end
588
630
 
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.3
4
+ version: 0.2.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-17 00:00:00.000000000 Z
12
+ date: 2012-06-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: test-unit
16
- requirement: &2160341260 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,12 @@ dependencies:
21
21
  version: 2.3.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2160341260
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.3.0
25
30
  description: Hash with case-insensitive, Symbol/String-indifferent key access
26
31
  email:
27
32
  - junegunn.c@gmail.com
@@ -61,10 +66,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
66
  version: '0'
62
67
  requirements: []
63
68
  rubyforge_project: insensitive_hash
64
- rubygems_version: 1.8.15
69
+ rubygems_version: 1.8.24
65
70
  signing_key:
66
71
  specification_version: 3
67
72
  summary: Case-insensitive Ruby Hash
68
73
  test_files:
69
74
  - test/test_insensitive_hash.rb
70
- has_rdoc: