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.
- data/lib/tainted_hash.rb +24 -15
- data/lib/tainted_hash/rails.rb +0 -4
- data/tainted_hash.gemspec +2 -2
- data/test/tainted_hash_test.rb +7 -1
- metadata +2 -2
data/lib/tainted_hash.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'set'
|
2
2
|
|
3
3
|
class TaintedHash < Hash
|
4
|
-
VERSION = "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
|
-
|
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
|
-
|
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,
|
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
|
data/lib/tainted_hash/rails.rb
CHANGED
data/tainted_hash.gemspec
CHANGED
@@ -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.
|
16
|
-
s.date = '2013-
|
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
|
data/test/tainted_hash_test.rb
CHANGED
@@ -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.
|
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-
|
12
|
+
date: 2013-07-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: test-unit
|