casted_hash 0.8.4 → 0.9.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.
- checksums.yaml +4 -4
- data/lib/casted_hash.rb +26 -24
- data/test/test_casted_hash.rb +14 -2
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c5c39bef30e00f8e9271c14a2f670c885b302235
|
|
4
|
+
data.tar.gz: 20954b45304a2d3b80ef2b8ed179a2759dffc192
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4c9a20a7693c337031c66de360d8975962191d1daee1677a2bb7c40d65b298a581348c87cd6c52990db938536032c829bb0c33424ccd9355e6c823ad77c31a5a
|
|
7
|
+
data.tar.gz: 082d300b4df4ebc59befe661e091f14666540136fd18a3c3b60d04df968f114caeab139baa06628e99011e73d77ccb096194604b5b5079b511ad5669bc95c409
|
data/lib/casted_hash.rb
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
class CastedHash < Hash
|
|
2
|
-
VERSION = "0.
|
|
2
|
+
VERSION = "0.9.0"
|
|
3
3
|
|
|
4
4
|
def initialize(constructor = {}, cast_proc = nil)
|
|
5
5
|
raise ArgumentError, "`cast_proc` required" unless cast_proc
|
|
6
6
|
|
|
7
7
|
@cast_proc = cast_proc
|
|
8
|
-
@casting_keys =
|
|
8
|
+
@casting_keys = Set.new
|
|
9
9
|
|
|
10
10
|
if constructor.is_a?(CastedHash)
|
|
11
11
|
@casted_keys = constructor.instance_variable_get(:@casted_keys).dup
|
|
12
12
|
super()
|
|
13
13
|
update(constructor)
|
|
14
14
|
elsif constructor.is_a?(Hash)
|
|
15
|
-
@casted_keys =
|
|
15
|
+
@casted_keys = Set.new
|
|
16
16
|
super()
|
|
17
17
|
update(constructor)
|
|
18
18
|
else
|
|
19
|
-
@casted_keys =
|
|
19
|
+
@casted_keys = Set.new
|
|
20
20
|
super(constructor)
|
|
21
21
|
end
|
|
22
22
|
end
|
|
@@ -70,7 +70,7 @@ class CastedHash < Hash
|
|
|
70
70
|
regular_writer converted_key, value
|
|
71
71
|
|
|
72
72
|
if other_hash.is_a?(CastedHash) && other_hash.casted?(key)
|
|
73
|
-
casted!(key)
|
|
73
|
+
casted!(key, true)
|
|
74
74
|
elsif casted?(key)
|
|
75
75
|
uncast!(converted_key)
|
|
76
76
|
end
|
|
@@ -81,8 +81,9 @@ class CastedHash < Hash
|
|
|
81
81
|
|
|
82
82
|
alias_method :merge!, :update
|
|
83
83
|
|
|
84
|
-
def key?(key)
|
|
85
|
-
|
|
84
|
+
def key?(key, converted = false)
|
|
85
|
+
key = convert_key(key) unless converted
|
|
86
|
+
super(key)
|
|
86
87
|
end
|
|
87
88
|
|
|
88
89
|
alias_method :include?, :key?
|
|
@@ -122,12 +123,9 @@ class CastedHash < Hash
|
|
|
122
123
|
self
|
|
123
124
|
end
|
|
124
125
|
|
|
125
|
-
def casted?(key)
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
def casting?(key)
|
|
130
|
-
@casting_keys.include?(convert_key(key))
|
|
126
|
+
def casted?(key, converted = false)
|
|
127
|
+
key = convert_key(key) unless converted
|
|
128
|
+
@casted_keys.include?(key)
|
|
131
129
|
end
|
|
132
130
|
|
|
133
131
|
def to_hash
|
|
@@ -146,15 +144,11 @@ class CastedHash < Hash
|
|
|
146
144
|
end
|
|
147
145
|
end
|
|
148
146
|
|
|
149
|
-
def casted!(
|
|
147
|
+
def casted!(keys, converted = false)
|
|
148
|
+
keys = [keys] unless keys.is_a?(Array)
|
|
150
149
|
keys.each do |key|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
def casting!(*keys)
|
|
156
|
-
keys.each do |key|
|
|
157
|
-
@casting_keys << convert_key(key) if key?(key)
|
|
150
|
+
key = convert_key(key) unless converted
|
|
151
|
+
@casted_keys << key if key?(key, converted)
|
|
158
152
|
end
|
|
159
153
|
end
|
|
160
154
|
|
|
@@ -165,8 +159,8 @@ protected
|
|
|
165
159
|
end
|
|
166
160
|
|
|
167
161
|
def cast!(key)
|
|
168
|
-
return unless key?(key)
|
|
169
|
-
return regular_reader(key) if casted?(key)
|
|
162
|
+
return unless key?(key, true)
|
|
163
|
+
return regular_reader(key) if casted?(key, true)
|
|
170
164
|
raise SystemStackError, "already casting #{key}" if casting?(key)
|
|
171
165
|
|
|
172
166
|
casting! key
|
|
@@ -183,13 +177,21 @@ protected
|
|
|
183
177
|
|
|
184
178
|
value = regular_writer(key, value)
|
|
185
179
|
|
|
186
|
-
casted! key
|
|
180
|
+
casted! key, true
|
|
187
181
|
|
|
188
182
|
value
|
|
189
183
|
ensure
|
|
190
184
|
@casting_keys.delete key
|
|
191
185
|
end
|
|
192
186
|
|
|
187
|
+
def casting!(key)
|
|
188
|
+
@casting_keys << key
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def casting?(key)
|
|
192
|
+
@casting_keys.include?(key)
|
|
193
|
+
end
|
|
194
|
+
|
|
193
195
|
def cast_all!
|
|
194
196
|
keys.each{|key| cast! key}
|
|
195
197
|
end
|
data/test/test_casted_hash.rb
CHANGED
|
@@ -32,6 +32,18 @@ describe CastedHash do
|
|
|
32
32
|
assert_equal "3", hash[:bar]
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
+
it "does not mark key multiple times as casted" do
|
|
36
|
+
hash = CastedHash.new({:a => 1, :b => 2}, lambda {|x| x + 10 })
|
|
37
|
+
assert_equal [], hash.instance_variable_get(:@casted_keys).to_a
|
|
38
|
+
assert_equal 11, hash[:a]
|
|
39
|
+
assert_equal ["a"], hash.instance_variable_get(:@casted_keys).to_a
|
|
40
|
+
hash.casted! :a
|
|
41
|
+
hash.casted! :b
|
|
42
|
+
hash.casted! :b
|
|
43
|
+
hash.casted! :c
|
|
44
|
+
assert_equal ["a", "b"], hash.instance_variable_get(:@casted_keys).to_a
|
|
45
|
+
end
|
|
46
|
+
|
|
35
47
|
it "does not loop when refering to itself" do
|
|
36
48
|
@hash = CastedHash.new({:a => 1}, lambda {|x| @hash[:a] + 1 })
|
|
37
49
|
error = assert_raises(SystemStackError) do
|
|
@@ -40,7 +52,7 @@ describe CastedHash do
|
|
|
40
52
|
assert_equal "already casting a", error.message
|
|
41
53
|
assert_empty @hash.casted
|
|
42
54
|
assert !@hash.casted?(:a)
|
|
43
|
-
|
|
55
|
+
assert_equal [], @hash.instance_variable_get(:@casting_keys).to_a
|
|
44
56
|
end
|
|
45
57
|
|
|
46
58
|
it "can check size without casting" do
|
|
@@ -277,7 +289,7 @@ describe CastedHash do
|
|
|
277
289
|
|
|
278
290
|
it "allows bypassing of casting" do
|
|
279
291
|
hash = CastedHash.new({:a => 1, :b => 2, :c => 3}, lambda {|x|x + 1})
|
|
280
|
-
hash.casted! "a", :b
|
|
292
|
+
hash.casted! ["a", :b]
|
|
281
293
|
assert_equal 1, hash[:a]
|
|
282
294
|
assert_equal 2, hash[:b]
|
|
283
295
|
assert_equal 4, hash[:c]
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: casted_hash
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.9.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Stephan Kaag
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-06-
|
|
11
|
+
date: 2016-06-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|