map 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +26 -0
- data/a.rb +6 -0
- data/lib/map.rb +10 -7
- data/test/{map.rb → map_test.rb} +24 -4
- metadata +9 -7
data/README
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
m = Map.new
|
3
|
+
|
4
|
+
m[:a] = :b
|
5
|
+
m[:b] = :b
|
6
|
+
m[:c] = :c
|
7
|
+
|
8
|
+
p m.keys #=> [:a, :b, :c] ### always ordered!
|
9
|
+
|
10
|
+
|
11
|
+
p m[:a] #=> :a
|
12
|
+
p m["a"] #=> :a
|
13
|
+
|
14
|
+
|
15
|
+
m = Map[:k, :v, :key, :val]
|
16
|
+
m = Map[[:k, :v], [:key, :val]]
|
17
|
+
m = Map[{:k => :v, :key => :val}]
|
18
|
+
|
19
|
+
m = Map(:k, :v, :key, :val)
|
20
|
+
m = Map([:k, :v], [:key, :val])
|
21
|
+
m = Map(:k => :v, :key => :val)
|
22
|
+
|
23
|
+
|
24
|
+
m.update(:k2, :v2)
|
25
|
+
m.update(:k2 => :v2)
|
26
|
+
|
data/a.rb
ADDED
data/lib/map.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class Map < Hash
|
2
|
-
Version = '1.
|
2
|
+
Version = '1.1.0' unless defined?(Version)
|
3
3
|
Load = Kernel.method(:load) unless defined?(Load)
|
4
4
|
|
5
5
|
class << Map
|
@@ -32,6 +32,7 @@ class Map < Hash
|
|
32
32
|
def new_from_hash(hash)
|
33
33
|
map = new
|
34
34
|
map.update(hash)
|
35
|
+
map.default = hash.default
|
35
36
|
map
|
36
37
|
end
|
37
38
|
|
@@ -121,19 +122,21 @@ class Map < Hash
|
|
121
122
|
key.kind_of?(Symbol) ? key.to_s : key
|
122
123
|
end
|
123
124
|
|
124
|
-
def
|
125
|
-
|
125
|
+
def convert_value(value)
|
126
|
+
return value.to_map if value.respond_to?(:to_map)
|
127
|
+
case value
|
126
128
|
when Hash
|
127
|
-
|
129
|
+
Map.for(value)
|
128
130
|
when Array
|
129
|
-
|
131
|
+
value.map{|v| convert_value(v)}
|
130
132
|
else
|
131
|
-
|
133
|
+
value
|
132
134
|
end
|
133
135
|
end
|
136
|
+
alias_method('convert_val', 'convert_value')
|
134
137
|
|
135
138
|
def convert(key, val)
|
136
|
-
[convert_key(key),
|
139
|
+
[convert_key(key), convert_value(val)]
|
137
140
|
end
|
138
141
|
|
139
142
|
# maps are aggressive with copy operations. they are all deep copies. make a
|
data/test/{map.rb → map_test.rb}
RENAMED
@@ -10,6 +10,14 @@ Testing Map do
|
|
10
10
|
assert{ Map.new(hash = {}) }
|
11
11
|
end
|
12
12
|
|
13
|
+
testing 'that the contructor accepts a hash and preserves the default value' do
|
14
|
+
hash = {}
|
15
|
+
hash.default = 42
|
16
|
+
assert{ hash[:missing] == 42 }
|
17
|
+
map = assert{ Map.new(hash) }
|
18
|
+
assert{ map[:missing] == 42 }
|
19
|
+
end
|
20
|
+
|
13
21
|
testing 'that the constructor accepts the empty array' do
|
14
22
|
array = []
|
15
23
|
assert{ Map.new(array) }
|
@@ -97,9 +105,8 @@ Testing Map do
|
|
97
105
|
end
|
98
106
|
|
99
107
|
testing 'that maps are string/symbol indifferent for recursive look-ups' do
|
100
|
-
map = Map
|
101
|
-
assert{ map[:a] =
|
102
|
-
assert{ map[:a][:b] = Map[:c, 42] }
|
108
|
+
map = assert{ Map(:a => {:b => {:c => 42}}) }
|
109
|
+
assert{ map[:a] = {:b => {:c, 42}} }
|
103
110
|
assert{ map[:a][:b][:c] == 42 }
|
104
111
|
assert{ map['a'][:b][:c] == 42 }
|
105
112
|
assert{ map['a']['b'][:c] == 42 }
|
@@ -108,6 +115,18 @@ Testing Map do
|
|
108
115
|
assert{ map[:a]['b']['c'] == 42 }
|
109
116
|
assert{ map[:a][:b]['c'] == 42 }
|
110
117
|
assert{ map['a'][:b]['c'] == 42 }
|
118
|
+
|
119
|
+
map = assert{ Map(:a => [{:b => 42}]) }
|
120
|
+
assert{ map['a'].is_a?(Array) }
|
121
|
+
assert{ map['a'][0].is_a?(Map) }
|
122
|
+
assert{ map['a'][0]['b'] == 42 }
|
123
|
+
|
124
|
+
map = assert{ Map(:a => [ {:b => 42}, [{:c => 'forty-two'}] ]) }
|
125
|
+
assert{ map['a'].is_a?(Array) }
|
126
|
+
assert{ map['a'][0].is_a?(Map) }
|
127
|
+
assert{ map['a'][1].is_a?(Array) }
|
128
|
+
assert{ map['a'][0]['b'] == 42 }
|
129
|
+
assert{ map['a'][1][0]['c'] == 'forty-two' }
|
111
130
|
end
|
112
131
|
|
113
132
|
testing 'that maps support shift like a good ordered container' do
|
@@ -146,12 +165,13 @@ end
|
|
146
165
|
|
147
166
|
|
148
167
|
|
168
|
+
|
169
|
+
|
149
170
|
BEGIN {
|
150
171
|
testdir = File.dirname(File.expand_path(__FILE__))
|
151
172
|
testlibdir = File.join(testdir, 'lib')
|
152
173
|
rootdir = File.dirname(testdir)
|
153
174
|
libdir = File.join(rootdir, 'lib')
|
154
|
-
|
155
175
|
$LOAD_PATH.push(libdir)
|
156
176
|
$LOAD_PATH.push(testlibdir)
|
157
177
|
}
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: map
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 1.0.0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ara T. Howard
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-10-
|
18
|
+
date: 2010-10-05 00:00:00 -06:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -28,10 +28,12 @@ extensions: []
|
|
28
28
|
extra_rdoc_files: []
|
29
29
|
|
30
30
|
files:
|
31
|
+
- a.rb
|
31
32
|
- lib/map.rb
|
32
33
|
- Rakefile
|
34
|
+
- README
|
33
35
|
- test/lib/testing.rb
|
34
|
-
- test/
|
36
|
+
- test/map_test.rb
|
35
37
|
has_rdoc: true
|
36
38
|
homepage: http://github.com/ahoward/map/tree/master
|
37
39
|
licenses: []
|
@@ -66,5 +68,5 @@ rubygems_version: 1.3.7
|
|
66
68
|
signing_key:
|
67
69
|
specification_version: 3
|
68
70
|
summary: map
|
69
|
-
test_files:
|
70
|
-
|
71
|
+
test_files: []
|
72
|
+
|