tainted_hash 0.1.0 → 0.2.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.
@@ -1,7 +1,7 @@
1
1
  require 'set'
2
2
 
3
3
  class TaintedHash < Hash
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
 
6
6
  class UnexposedError < StandardError
7
7
  # Builds an exception when a TaintedHash has some unexposed keys. Useful
@@ -41,13 +41,14 @@ class TaintedHash < Hash
41
41
  #
42
42
  def initialize(hash = nil, new_class = nil)
43
43
  @new_class = new_class || (hash && hash.class) || self.class.default_hash_class
44
- (@original_hash = hash || @new_class.new).keys.each do |key|
44
+ @original_hash = hash || @new_class.new
45
+ @exposed_nothing = true
46
+
47
+ @original_hash.keys.each do |key|
45
48
  key_s = key.to_s
46
49
  next if key_s == key
47
50
  @original_hash[key_s] = @original_hash.delete(key)
48
51
  end
49
-
50
- @exposed_nothing = true
51
52
  end
52
53
 
53
54
  # Public: Exposes one or more keys for the hash.
@@ -102,12 +103,7 @@ class TaintedHash < Hash
102
103
  key_s = key.to_s
103
104
  return if !@original_hash.key?(key_s)
104
105
 
105
- case value = @original_hash[key_s]
106
- when TaintedHash then value
107
- when Hash
108
- value = @original_hash[key_s] = self.class.new(value, @new_class)
109
- else value
110
- end
106
+ get_original_hash_value(key_s)
111
107
  end
112
108
 
113
109
  # Public: Attempts to set the key of a frozen hash.
@@ -118,11 +114,7 @@ class TaintedHash < Hash
118
114
  # Returns nothing
119
115
  def []=(key, value)
120
116
  key_s = key.to_s
121
- super(key_s, @original_hash[key_s] = case value
122
- when TaintedHash then value
123
- when Hash then self.class.new(value, @new_class)
124
- else value
125
- end)
117
+ super(key_s, set_original_hash_value(key_s, value))
126
118
  end
127
119
 
128
120
  # Public: Deletes the value from both the internal and current Hash.
@@ -205,10 +197,27 @@ class TaintedHash < Hash
205
197
  hash
206
198
  end
207
199
 
200
+ def with_indifferent_access
201
+ self
202
+ end
203
+
208
204
  def inspect
209
205
  %(#<#{self.class}:#{object_id} @hash=#{@original_hash.inspect} @exposed=#{keys.inspect}>)
210
206
  end
211
207
 
208
+ private
209
+ def get_original_hash_value(key_s)
210
+ set_original_hash_value(key_s, @original_hash[key_s])
211
+ end
212
+
213
+ def set_original_hash_value(key_s, value)
214
+ if value.is_a?(Hash) && !value.is_a?(TaintedHash)
215
+ value = self.class.new(value, @new_class)
216
+ end
217
+
218
+ @original_hash[key_s] = value
219
+ end
220
+
212
221
  module RailsMethods
213
222
  def self.included(base)
214
223
  base.send :alias_method, :stringify_keys!, :stringify_keys
@@ -11,7 +11,3 @@ end
11
11
  if defined?(ActionController::Base)
12
12
  ActionController::Base.send :include, TaintedHash::Controller
13
13
  end
14
-
15
- if defined?(HashWithIndifferentAccess)
16
- TaintedHash.default_hash_class = HashWithIndifferentAccess
17
- end
@@ -12,8 +12,8 @@ Gem::Specification.new do |s|
12
12
  ## If your rubyforge_project name is different, then edit it and comment out
13
13
  ## the sub! line in the Rakefile
14
14
  s.name = 'tainted_hash'
15
- s.version = '0.1.0'
16
- s.date = '2013-05-21'
15
+ s.version = '0.2.0'
16
+ s.date = '2013-07-16'
17
17
  s.rubyforge_project = 'tainted_hash'
18
18
 
19
19
  ## Make sure your summary is short. The description may be as long
@@ -12,6 +12,13 @@ class TaintedHashTest < Test::Unit::TestCase
12
12
  @tainted = TaintedHash.new @hash
13
13
  end
14
14
 
15
+ def test_accessing_sub_hash_memoized_tainted_hash
16
+ c = @tainted[:c]
17
+ assert_kind_of TaintedHash, c
18
+
19
+ assert_equal @tainted[:c].object_id, c.object_id
20
+ end
21
+
15
22
  def test_exposes_no_keys_by_default
16
23
  assert !@tainted.include?('a')
17
24
  assert !@tainted.include?('b')
@@ -182,4 +189,3 @@ class TaintedHashTest < Test::Unit::TestCase
182
189
  assert_equal({'a' => 1}, slice.to_hash)
183
190
  end
184
191
  end
185
-
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tainted_hash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.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: 2013-05-21 00:00:00.000000000 Z
12
+ date: 2013-07-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: test-unit