map 2.3.0 → 2.4.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/map.rb +54 -22
- data/lib/map/struct.rb +1 -1
- data/map.gemspec +2 -2
- data/test/map_test.rb +32 -0
- metadata +4 -5
- data/a.rb +0 -9
data/lib/map.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
class Map < Hash
|
|
2
|
-
Version = '2.
|
|
2
|
+
Version = '2.4.0' unless defined?(Version)
|
|
3
3
|
Load = Kernel.method(:load) unless defined?(Load)
|
|
4
4
|
|
|
5
5
|
class << Map
|
|
@@ -85,25 +85,46 @@ class Map < Hash
|
|
|
85
85
|
|
|
86
86
|
# iterate over arguments in pairs smartly.
|
|
87
87
|
#
|
|
88
|
-
def each_pair(*args)
|
|
88
|
+
def each_pair(*args, &block)
|
|
89
89
|
size = args.size
|
|
90
90
|
parity = size % 2 == 0 ? :even : :odd
|
|
91
91
|
first = args.first
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
if block.nil?
|
|
94
|
+
result = []
|
|
95
|
+
block = lambda{|*kv| result.push(kv)}
|
|
96
|
+
else
|
|
97
|
+
result = args
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
return result if size == 0
|
|
94
101
|
|
|
95
|
-
if size == 1
|
|
96
|
-
first.each_pair
|
|
97
|
-
|
|
102
|
+
if size == 1
|
|
103
|
+
if first.respond_to?(:each_pair)
|
|
104
|
+
first.each_pair do |key, val|
|
|
105
|
+
block.call(key, val)
|
|
106
|
+
end
|
|
107
|
+
return result
|
|
98
108
|
end
|
|
99
|
-
return args
|
|
100
|
-
end
|
|
101
109
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
110
|
+
if first.respond_to?(:each_slice)
|
|
111
|
+
first.each_slice(2) do |key, val|
|
|
112
|
+
block.call(key, val)
|
|
113
|
+
end
|
|
114
|
+
return result
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
conversion_methods.each do |method|
|
|
118
|
+
if first.respond_to?(method)
|
|
119
|
+
first = first.send(method)
|
|
120
|
+
first.each_pair do |key, val|
|
|
121
|
+
block.call(key, val)
|
|
122
|
+
end
|
|
123
|
+
return result
|
|
124
|
+
end
|
|
105
125
|
end
|
|
106
|
-
|
|
126
|
+
|
|
127
|
+
raise(ArgumentError, 'odd number of arguments for Map')
|
|
107
128
|
end
|
|
108
129
|
|
|
109
130
|
array_of_pairs = args.all?{|a| a.is_a?(Array) and a.size == 2}
|
|
@@ -111,13 +132,13 @@ class Map < Hash
|
|
|
111
132
|
if array_of_pairs
|
|
112
133
|
args.each do |pair|
|
|
113
134
|
key, val, *ignored = pair
|
|
114
|
-
|
|
135
|
+
block.call(key, val)
|
|
115
136
|
end
|
|
116
137
|
else
|
|
117
138
|
0.step(args.size - 1, 2) do |a|
|
|
118
139
|
key = args[a]
|
|
119
140
|
val = args[a + 1]
|
|
120
|
-
|
|
141
|
+
block.call(key, val)
|
|
121
142
|
end
|
|
122
143
|
end
|
|
123
144
|
|
|
@@ -127,12 +148,14 @@ class Map < Hash
|
|
|
127
148
|
alias_method '[]', 'new'
|
|
128
149
|
end
|
|
129
150
|
|
|
130
|
-
Dynamic
|
|
131
|
-
|
|
132
|
-
|
|
151
|
+
unless defined?(Dynamic)
|
|
152
|
+
Dynamic = lambda do
|
|
153
|
+
conversion_methods.reverse_each do |method|
|
|
154
|
+
add_conversion_method!(method)
|
|
155
|
+
end
|
|
133
156
|
end
|
|
157
|
+
module_eval(&Dynamic)
|
|
134
158
|
end
|
|
135
|
-
module_eval(&Dynamic)
|
|
136
159
|
|
|
137
160
|
|
|
138
161
|
# instance constructor
|
|
@@ -178,30 +201,39 @@ class Map < Hash
|
|
|
178
201
|
self.class
|
|
179
202
|
end
|
|
180
203
|
|
|
181
|
-
def map_for(hash)
|
|
204
|
+
def Map.map_for(hash)
|
|
182
205
|
map = klass.coerce(hash)
|
|
183
206
|
map.default = hash.default
|
|
184
207
|
map
|
|
185
208
|
end
|
|
209
|
+
def map_for(hash)
|
|
210
|
+
klass.map_for(hash)
|
|
211
|
+
end
|
|
186
212
|
|
|
187
|
-
def convert_key(key)
|
|
213
|
+
def Map.convert_key(key)
|
|
188
214
|
key.kind_of?(Symbol) ? key.to_s : key
|
|
189
215
|
end
|
|
216
|
+
def convert_key(key)
|
|
217
|
+
klass.convert_key(key)
|
|
218
|
+
end
|
|
190
219
|
|
|
191
|
-
def convert_value(value)
|
|
220
|
+
def Map.convert_value(value)
|
|
192
221
|
conversion_methods.each do |method|
|
|
193
222
|
return value.send(method) if value.respond_to?(method)
|
|
194
223
|
end
|
|
195
224
|
|
|
196
225
|
case value
|
|
197
226
|
when Hash
|
|
198
|
-
|
|
227
|
+
coerce(value)
|
|
199
228
|
when Array
|
|
200
229
|
value.map{|v| convert_value(v)}
|
|
201
230
|
else
|
|
202
231
|
value
|
|
203
232
|
end
|
|
204
233
|
end
|
|
234
|
+
def convert_value(value)
|
|
235
|
+
klass.convert_value(value)
|
|
236
|
+
end
|
|
205
237
|
alias_method('convert_val', 'convert_value')
|
|
206
238
|
|
|
207
239
|
def convert(key, val)
|
data/lib/map/struct.rb
CHANGED
|
@@ -23,7 +23,7 @@ class Map
|
|
|
23
23
|
value.is_a?(Map) ? value.struct : value
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
Keys = lambda{|*keys| keys.flatten!; keys.compact!; keys.map!{|key| key.to_s}}
|
|
26
|
+
Keys = lambda{|*keys| keys.flatten!; keys.compact!; keys.map!{|key| key.to_s}} unless defined?(Keys)
|
|
27
27
|
|
|
28
28
|
delegates = %w(
|
|
29
29
|
inspect
|
data/map.gemspec
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
|
|
4
4
|
Gem::Specification::new do |spec|
|
|
5
5
|
spec.name = "map"
|
|
6
|
-
spec.version = "2.
|
|
6
|
+
spec.version = "2.4.0"
|
|
7
7
|
spec.platform = Gem::Platform::RUBY
|
|
8
8
|
spec.summary = "map"
|
|
9
9
|
spec.description = "description: map kicks the ass"
|
|
10
10
|
|
|
11
|
-
spec.files = ["
|
|
11
|
+
spec.files = ["lib", "lib/map", "lib/map/options.rb", "lib/map/struct.rb", "lib/map.rb", "map.gemspec", "Rakefile", "README", "test", "test/lib", "test/lib/testing.rb", "test/map_test.rb", "TODO"]
|
|
12
12
|
spec.executables = []
|
|
13
13
|
|
|
14
14
|
spec.require_path = "lib"
|
data/test/map_test.rb
CHANGED
|
@@ -330,6 +330,38 @@ Testing Map do
|
|
|
330
330
|
end
|
|
331
331
|
end
|
|
332
332
|
|
|
333
|
+
testing 'that Map.each_pair works on arrays' do
|
|
334
|
+
array = %w( a b c )
|
|
335
|
+
each_pair = Map.each_pair(array)
|
|
336
|
+
assert{ each_pair == [['a', 'b'], ['c', nil]] }
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
testing 'that Map.each_pair works on hashes' do
|
|
340
|
+
hash = {'a' => 'b', 'c' => nil}
|
|
341
|
+
each_pair = Map.each_pair(hash)
|
|
342
|
+
assert{ each_pair == [['a', 'b'], ['c', nil]] }
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
testing 'that Map.each_pair works on things which respond_to conversion methods' do
|
|
346
|
+
object = Object.new
|
|
347
|
+
def object.to_map
|
|
348
|
+
{'a' => 'b', 'c' => nil}
|
|
349
|
+
end
|
|
350
|
+
each_pair = Map.each_pair(object)
|
|
351
|
+
assert{ each_pair == [['a', 'b'], ['c', nil]] }
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
testing 'that Map.each_pair blows up on non-hash, non-array, non-convertable objects' do
|
|
355
|
+
object = Object.new
|
|
356
|
+
result =
|
|
357
|
+
begin
|
|
358
|
+
Map.each_pair(object)
|
|
359
|
+
rescue => e
|
|
360
|
+
e
|
|
361
|
+
end
|
|
362
|
+
assert{ result.is_a?(Exception) }
|
|
363
|
+
end
|
|
364
|
+
|
|
333
365
|
protected
|
|
334
366
|
def new_int_map(n = 1024)
|
|
335
367
|
map = assert{ Map.new }
|
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: 31
|
|
5
5
|
prerelease:
|
|
6
6
|
segments:
|
|
7
7
|
- 2
|
|
8
|
-
-
|
|
8
|
+
- 4
|
|
9
9
|
- 0
|
|
10
|
-
version: 2.
|
|
10
|
+
version: 2.4.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: 2011-
|
|
18
|
+
date: 2011-02-09 00:00:00 -07:00
|
|
19
19
|
default_executable:
|
|
20
20
|
dependencies: []
|
|
21
21
|
|
|
@@ -28,7 +28,6 @@ extensions: []
|
|
|
28
28
|
extra_rdoc_files: []
|
|
29
29
|
|
|
30
30
|
files:
|
|
31
|
-
- a.rb
|
|
32
31
|
- lib/map/options.rb
|
|
33
32
|
- lib/map/struct.rb
|
|
34
33
|
- lib/map.rb
|