motion-map 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +1 -1
- data/lib/motion-map/map.rb +779 -805
- data/lib/motion-map/version.rb +1 -1
- data/spec/helpers/map_helper.rb +1 -1
- data/spec/map/map_spec.rb +71 -72
- metadata +2 -2
data/lib/motion-map/version.rb
CHANGED
data/spec/helpers/map_helper.rb
CHANGED
data/spec/map/map_spec.rb
CHANGED
@@ -1,29 +1,29 @@
|
|
1
|
-
describe Map do
|
1
|
+
describe MotionMap::Map do
|
2
2
|
extend MapHelper
|
3
3
|
|
4
4
|
describe 'constructor' do
|
5
5
|
it 'supports bare constructor' do
|
6
|
-
map = Map.new
|
6
|
+
map = MotionMap::Map.new
|
7
7
|
map .count.should == 0
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
it 'can take a hash' do
|
11
|
-
map = Map.new( {} )
|
11
|
+
map = MotionMap::Map.new( {} )
|
12
12
|
map.count.should == 0
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'can take an empty array' do
|
16
16
|
array = []
|
17
|
-
map = Map.new( array )
|
17
|
+
map = MotionMap::Map.new( array )
|
18
18
|
map.count.should == 0
|
19
|
-
map = Map.new( *array )
|
19
|
+
map = MotionMap::Map.new( *array )
|
20
20
|
map.count.should == 0
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'deals with nil correctly' do
|
24
|
-
map = Map.new( nil )
|
24
|
+
map = MotionMap::Map.new( nil )
|
25
25
|
map.count.should == 0
|
26
|
-
map = Map.new( false )
|
26
|
+
map = MotionMap::Map.new( false )
|
27
27
|
map.count.should == 0
|
28
28
|
end
|
29
29
|
|
@@ -36,9 +36,9 @@ describe Map do
|
|
36
36
|
expectations = [1, 2, 2]
|
37
37
|
i = 0
|
38
38
|
arrays.each do |array|
|
39
|
-
map = Map.new(array)
|
39
|
+
map = MotionMap::Map.new(array)
|
40
40
|
map.count.should == expectations[i]
|
41
|
-
map = Map.new(*array)
|
41
|
+
map = MotionMap::Map.new(*array)
|
42
42
|
map.count.should == expectations[i]
|
43
43
|
i += 1
|
44
44
|
end
|
@@ -52,9 +52,9 @@ describe Map do
|
|
52
52
|
[:key, :val]
|
53
53
|
]
|
54
54
|
list.each do |args|
|
55
|
-
map = Map[*args]
|
56
|
-
map.class.should == Map
|
57
|
-
Map.new(*args).should == map
|
55
|
+
map = MotionMap::Map[*args]
|
56
|
+
map.class.should == MotionMap::Map
|
57
|
+
MotionMap::Map.new(*args).should == map
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
@@ -82,7 +82,7 @@ describe Map do
|
|
82
82
|
|
83
83
|
describe 'accessors' do
|
84
84
|
it 'Maps string/symbol indifferent for simple look-ups' do
|
85
|
-
map = Map.new
|
85
|
+
map = MotionMap::Map.new
|
86
86
|
map[:k] = :v
|
87
87
|
map['a'] = 'b'
|
88
88
|
map[:k].should == :v
|
@@ -92,8 +92,7 @@ describe Map do
|
|
92
92
|
end
|
93
93
|
|
94
94
|
it 'Maps string/symbol indifferent for recursive look-ups' do
|
95
|
-
map = Map
|
96
|
-
|
95
|
+
map = MotionMap::Map[:a => {:b => {:c => 42}}]
|
97
96
|
map[:a].should == {:b => {:c => 42}}
|
98
97
|
map[:a][:b][:c].should == 42
|
99
98
|
map['a'][:b][:c].should == 42
|
@@ -103,15 +102,15 @@ describe Map do
|
|
103
102
|
map[:a]['b']['c'].should == 42
|
104
103
|
map[:a][:b]['c'].should == 42
|
105
104
|
map['a'][:b]['c'].should == 42
|
106
|
-
|
107
|
-
map = Map[:a => [{:b => 42}]]
|
105
|
+
|
106
|
+
map = MotionMap::Map[:a => [{:b => 42}]]
|
108
107
|
map['a'].class.should == Array
|
109
|
-
map['a'][0].class.should == Map
|
108
|
+
map['a'][0].class.should == MotionMap::Map
|
110
109
|
map['a'][0]['b'].should == 42
|
111
|
-
|
112
|
-
map = Map
|
110
|
+
|
111
|
+
map = MotionMap::Map[:a => [ {:b => 42}, [{:c => 'forty-two'}] ]]
|
113
112
|
map['a'].class.should == Array
|
114
|
-
map['a'][0].class.should == Map
|
113
|
+
map['a'][0].class.should == MotionMap::Map
|
115
114
|
map['a'][1].class.should == Array
|
116
115
|
map['a'][0]['b'].should == 42
|
117
116
|
map['a'][1][0]['c'].should == 'forty-two'
|
@@ -120,7 +119,7 @@ describe Map do
|
|
120
119
|
|
121
120
|
describe 'shift' do
|
122
121
|
it 'supports shift like a good ordered container' do
|
123
|
-
map = Map.new
|
122
|
+
map = MotionMap::Map.new
|
124
123
|
10.times do |i|
|
125
124
|
key, val = i.to_s, i
|
126
125
|
map.unshift(key, val)
|
@@ -129,7 +128,7 @@ describe Map do
|
|
129
128
|
map.values.first.to_s.should == val.to_s
|
130
129
|
end
|
131
130
|
|
132
|
-
map = Map.new
|
131
|
+
map = MotionMap::Map.new
|
133
132
|
args = []
|
134
133
|
10.times do |i|
|
135
134
|
key, val = i.to_s, i
|
@@ -153,14 +152,14 @@ describe Map do
|
|
153
152
|
end
|
154
153
|
|
155
154
|
it 'supports inheritence without cycles' do
|
156
|
-
c = Class.new(Map){}
|
155
|
+
c = Class.new(MotionMap::Map){}
|
157
156
|
o = c.new
|
158
|
-
Map.should === o
|
157
|
+
MotionMap::Map.should === o
|
159
158
|
end
|
160
159
|
|
161
160
|
it 'captures equality correctly' do
|
162
|
-
a = Map.new
|
163
|
-
b = Map.new
|
161
|
+
a = MotionMap::Map.new
|
162
|
+
b = MotionMap::Map.new
|
164
163
|
a.should == b
|
165
164
|
a.should != 42
|
166
165
|
b[:k] = :v
|
@@ -170,19 +169,19 @@ describe Map do
|
|
170
169
|
|
171
170
|
describe 'keys as methods' do
|
172
171
|
it 'works with simple usage' do
|
173
|
-
a = Map.new( k: :v)
|
172
|
+
a = MotionMap::Map.new( k: :v)
|
174
173
|
a.k.should == :v
|
175
174
|
end
|
176
175
|
|
177
176
|
it 'works with complexusage' do
|
178
|
-
a = Map.new( k: {a: {b: 10}} )
|
177
|
+
a = MotionMap::Map.new( k: {a: {b: 10}} )
|
179
178
|
a.k.a.b.should == 10
|
180
179
|
end
|
181
180
|
end
|
182
181
|
|
183
182
|
describe 'subclassing' do
|
184
183
|
it 'insures subclassing and clobbering initialize does not kill nested coersion' do
|
185
|
-
c = Class.new(Map){ def initialize(arg) end }
|
184
|
+
c = Class.new(MotionMap::Map){ def initialize(arg) end }
|
186
185
|
o = c.new(42)
|
187
186
|
o.class.should == c
|
188
187
|
o.update(:k => {:a => :b})
|
@@ -190,26 +189,26 @@ describe Map do
|
|
190
189
|
end
|
191
190
|
|
192
191
|
it 'ensures that subclassing does not kill class level coersion' do
|
193
|
-
c = Class.new(Map){ }
|
194
|
-
o = c.for(Map.new)
|
192
|
+
c = Class.new(MotionMap::Map){ }
|
193
|
+
o = c.for(MotionMap::Map.new)
|
195
194
|
o.class.should == c
|
196
195
|
|
197
196
|
d = Class.new(c)
|
198
|
-
o = d.for(Map.new)
|
197
|
+
o = d.for(MotionMap::Map.new)
|
199
198
|
o.class.should == d
|
200
199
|
end
|
201
200
|
end
|
202
201
|
|
203
202
|
describe '#to_list' do
|
204
203
|
it 'insures Maps can be converted to lists with numeric indexes' do
|
205
|
-
m = Map[0, :a, 1, :b, 2, :c]
|
204
|
+
m = MotionMap::Map[0, :a, 1, :b, 2, :c]
|
206
205
|
m.to_list.should == [:a, :b, :c]
|
207
206
|
end
|
208
207
|
end
|
209
208
|
|
210
209
|
describe 'method_missing' do
|
211
210
|
it 'ensures method_missing hacks allow setting values, but not getting them until they are set' do
|
212
|
-
m = Map.new
|
211
|
+
m = MotionMap::Map.new
|
213
212
|
(m.missing rescue $!).class.should == NoMethodError
|
214
213
|
m.missing = :val
|
215
214
|
m[:missing].should == :val
|
@@ -217,7 +216,7 @@ describe Map do
|
|
217
216
|
end
|
218
217
|
|
219
218
|
it 'ensures method_missing hacks have sane respond_to? semantics' do
|
220
|
-
m = Map.new
|
219
|
+
m = MotionMap::Map.new
|
221
220
|
m.respond_to?(:missing).should == false
|
222
221
|
m.respond_to?(:missing=).should == true
|
223
222
|
m.missing = :val
|
@@ -226,7 +225,7 @@ describe Map do
|
|
226
225
|
end
|
227
226
|
|
228
227
|
it 'ensures method missing with a block delegatets to fetch' do
|
229
|
-
m = Map.new
|
228
|
+
m = MotionMap::Map.new
|
230
229
|
m.missing{ :val }.should == :val
|
231
230
|
m.has_key?(:key).should == false
|
232
231
|
end
|
@@ -234,34 +233,34 @@ describe Map do
|
|
234
233
|
|
235
234
|
describe 'compound keys' do
|
236
235
|
it 'Maps support compound key/val setting' do
|
237
|
-
m = Map.new
|
236
|
+
m = MotionMap::Map.new
|
238
237
|
m.set(:a, :b, :c, 42)
|
239
238
|
m.get(:a, :b, :c).should == 42
|
240
239
|
|
241
|
-
m = Map.new
|
240
|
+
m = MotionMap::Map.new
|
242
241
|
m.set([:a, :b, :c], 42)
|
243
242
|
m.get(:a, :b, :c) == 42
|
244
243
|
|
245
|
-
m = Map.new
|
244
|
+
m = MotionMap::Map.new
|
246
245
|
m.set([:a, :b, :c] => 42)
|
247
246
|
m.get(:a, :b, :c) == 42
|
248
247
|
|
249
|
-
m = Map.new
|
248
|
+
m = MotionMap::Map.new
|
250
249
|
m.set([:x, :y, :z] => 42.0, [:A, 2] => 'forty-two')
|
251
250
|
m[:A].class.should == Array
|
252
251
|
m[:A].size.should == 3
|
253
252
|
m[:A][2].should == 'forty-two'
|
254
|
-
m[:x][:y].class.should == Map
|
253
|
+
m[:x][:y].class.should == MotionMap::Map
|
255
254
|
m[:x][:y][:z].should == 42.0
|
256
255
|
|
257
|
-
Map.new.tap{|m| m.set}.should =~ {}
|
258
|
-
Map.new.tap{|m| m.set({})} =~ {}
|
256
|
+
MotionMap::Map.new.tap{|m| m.set}.should =~ {}
|
257
|
+
MotionMap::Map.new.tap{|m| m.set({})} =~ {}
|
259
258
|
end
|
260
259
|
end
|
261
260
|
|
262
261
|
describe '#get' do
|
263
262
|
it 'supports providing a default value in a block' do
|
264
|
-
m = Map.new
|
263
|
+
m = MotionMap::Map.new
|
265
264
|
m.set(:a, :b, :c, 42)
|
266
265
|
m.set(:z, 1)
|
267
266
|
|
@@ -269,12 +268,12 @@ describe Map do
|
|
269
268
|
m.get(:z){2}.should == 1
|
270
269
|
m.get(:a, :b, :d){1}.should == 1
|
271
270
|
m.get(:a, :b, :c){1}.should == 42
|
272
|
-
m.get(:a, :b){1}.should == Map
|
271
|
+
m.get(:a, :b){1}.should == MotionMap::Map[{:c => 42}]
|
273
272
|
m.get(:a, :aa){1}.should == 1
|
274
273
|
end
|
275
274
|
|
276
275
|
it 'ensures setting a sub-container does not eff up the container values' do
|
277
|
-
m = Map.new
|
276
|
+
m = MotionMap::Map.new
|
278
277
|
m.set(:array => [0,1,2])
|
279
278
|
m.get(:array, 0).should == 0
|
280
279
|
m.get(:array, 1).should == 1
|
@@ -289,21 +288,21 @@ describe Map do
|
|
289
288
|
|
290
289
|
describe 'merging' do
|
291
290
|
it 'ensures #apply selectively merges non-nil values' do
|
292
|
-
m = Map.new(:array => [0, 1], :hash => {:a => false, :b => nil, :c => 42})
|
293
|
-
defaults = Map.new(:array => [nil, nil, 2], :hash => {:b => true})
|
291
|
+
m = MotionMap::Map.new(:array => [0, 1], :hash => {:a => false, :b => nil, :c => 42})
|
292
|
+
defaults = MotionMap::Map.new(:array => [nil, nil, 2], :hash => {:b => true})
|
294
293
|
|
295
294
|
m.apply(defaults)
|
296
295
|
m[:array].should == [0,1,2]
|
297
296
|
m[:hash].should =~ {:a => false, :b => true, :c => 42}
|
298
297
|
|
299
|
-
m = Map.new
|
298
|
+
m = MotionMap::Map.new
|
300
299
|
m.apply :key => [{:key => :val}]
|
301
300
|
m[:key].class.should == Array
|
302
|
-
m[:key][0].class.should == Map
|
301
|
+
m[:key][0].class.should == MotionMap::Map
|
303
302
|
end
|
304
303
|
|
305
304
|
it 'ensures #add overlays the leaves of one hash onto another without nuking branches' do
|
306
|
-
m = Map.new
|
305
|
+
m = MotionMap::Map.new
|
307
306
|
|
308
307
|
m.add(
|
309
308
|
:comments => [
|
@@ -319,15 +318,15 @@ describe Map do
|
|
319
318
|
[{"body"=>"a", "title"=>"teh title", "description"=>"description"},
|
320
319
|
{"body"=>"b", "description"=>"description"}]}
|
321
320
|
|
322
|
-
m = Map.new
|
321
|
+
m = MotionMap::Map.new
|
323
322
|
m.add(
|
324
323
|
[:a, :b, :c] => 42,
|
325
324
|
[:a, :b] => {:d => 42.0}
|
326
325
|
)
|
327
326
|
m.should =~ {"a"=>{"b"=>{"c"=>42, "d"=>42.0}}}
|
328
327
|
|
329
|
-
Map.new.tap{|m| m.add}.should =~ {}
|
330
|
-
Map.new.tap{|m| m.add({})}.should =~ {}
|
328
|
+
MotionMap::Map.new.tap{|m| m.add}.should =~ {}
|
329
|
+
MotionMap::Map.new.tap{|m| m.add({})}.should =~ {}
|
331
330
|
end
|
332
331
|
|
333
332
|
it 'ensures that Map.combine is teh sweet' do
|
@@ -336,14 +335,14 @@ describe Map do
|
|
336
335
|
[{:a => {:b => 42}}, {:a => {:c => 42.0, :d => [1]}}] => {"a"=>{"b"=>42, "d"=>[1], "c"=>42.0}},
|
337
336
|
[{:a => {:b => 42}}, {:a => {:c => 42.0, :d => {0=>1}}}] => {"a"=>{"b"=>42, "d"=>{0=>1}, "c"=>42.0}}
|
338
337
|
}.each do |args, expected|
|
339
|
-
Map.combine(*args).should =~ expected
|
338
|
+
MotionMap::Map.combine(*args).should =~ expected
|
340
339
|
end
|
341
340
|
end
|
342
341
|
end
|
343
342
|
|
344
343
|
describe 'traversal' do
|
345
344
|
it 'supports depth_first_each' do
|
346
|
-
m = Map.new
|
345
|
+
m = MotionMap::Map.new
|
347
346
|
prefix = %w[ a b c ]
|
348
347
|
keys = []
|
349
348
|
n = 0.42
|
@@ -355,8 +354,8 @@ describe Map do
|
|
355
354
|
m.set(key => val)
|
356
355
|
n *= 10
|
357
356
|
end
|
358
|
-
m.get(:a).class.should == Map
|
359
|
-
m.get(:a, :b).class.should == Map
|
357
|
+
m.get(:a).class.should == MotionMap::Map
|
358
|
+
m.get(:a, :b).class.should == MotionMap::Map
|
360
359
|
m.get(:a, :b, :c).class.should == Array
|
361
360
|
|
362
361
|
n = 0.42
|
@@ -370,12 +369,12 @@ describe Map do
|
|
370
369
|
it 'ensures #each_pair works on arrays' do
|
371
370
|
each = []
|
372
371
|
array = %w( a b c )
|
373
|
-
Map.each_pair(array){|k,v| each.push(k,v)}
|
372
|
+
MotionMap::Map.each_pair(array){|k,v| each.push(k,v)}
|
374
373
|
each.should == ['a', 'b', 'c', nil]
|
375
374
|
end
|
376
375
|
|
377
376
|
it 'supports breath_first_each' do
|
378
|
-
m = Map[
|
377
|
+
m = MotionMap::Map[
|
379
378
|
'hash' , {'x' => 'y'},
|
380
379
|
'nested hash' , {'nested' => {'a' => 'b'}},
|
381
380
|
'array' , [0, 1, 2],
|
@@ -384,7 +383,7 @@ describe Map do
|
|
384
383
|
]
|
385
384
|
|
386
385
|
accum = []
|
387
|
-
m.breadth_first_each(Map){|k, v| accum.push([k, v])}
|
386
|
+
m.breadth_first_each(MotionMap::Map){|k, v| accum.push([k, v])}
|
388
387
|
expected =
|
389
388
|
[
|
390
389
|
[["hash"], {"x"=>"y"}],
|
@@ -413,7 +412,7 @@ describe Map do
|
|
413
412
|
|
414
413
|
describe '#contains' do
|
415
414
|
it 'handles needle-in-a-haystack like #contains? method' do
|
416
|
-
haystack = Map[
|
415
|
+
haystack = MotionMap::Map[
|
417
416
|
'hash' , {'x' => 'y'},
|
418
417
|
'nested hash' , {'nested' => {'a' => 'b'}},
|
419
418
|
'array' , [0, 1, 2],
|
@@ -442,21 +441,21 @@ describe Map do
|
|
442
441
|
end
|
443
442
|
|
444
443
|
it 'ensures #blank? method that is sane' do
|
445
|
-
m = Map.new(:a => 0, :b => ' ', :c => '', :d => {}, :e => [], :f => false)
|
444
|
+
m = MotionMap::Map.new(:a => 0, :b => ' ', :c => '', :d => {}, :e => [], :f => false)
|
446
445
|
m.each do |key, val|
|
447
446
|
m.blank?(key).should == true
|
448
447
|
end
|
449
448
|
|
450
|
-
m = Map.new(:a => 1, :b => '_', :d => {:k=>:v}, :e => [42], :f => true)
|
449
|
+
m = MotionMap::Map.new(:a => 1, :b => '_', :d => {:k=>:v}, :e => [42], :f => true)
|
451
450
|
m.each do |key, val|
|
452
451
|
m.blank?(key).should == false
|
453
452
|
end
|
454
|
-
Map.new.blank?.should == true
|
453
|
+
MotionMap::Map.new.blank?.should == true
|
455
454
|
end
|
456
455
|
|
457
456
|
it 'ensures self referential Maps do not make #inspect puke' do
|
458
|
-
a = Map.new
|
459
|
-
b = Map.new
|
457
|
+
a = MotionMap::Map.new
|
458
|
+
b = MotionMap::Map.new
|
460
459
|
|
461
460
|
b[:a] = a
|
462
461
|
a[:b] = b
|
@@ -471,7 +470,7 @@ describe Map do
|
|
471
470
|
end
|
472
471
|
|
473
472
|
it 'has a clever little rm operator' do
|
474
|
-
m = Map.new
|
473
|
+
m = MotionMap::Map.new
|
475
474
|
m.set :a, :b, 42
|
476
475
|
m.set :x, :y, 42
|
477
476
|
m.set :x, :z, 42
|
@@ -501,7 +500,7 @@ describe Map do
|
|
501
500
|
end
|
502
501
|
|
503
502
|
it 'Maps a clever little question method' do
|
504
|
-
m = Map.new
|
503
|
+
m = MotionMap::Map.new
|
505
504
|
m.set(:a, :b, :c, 42)
|
506
505
|
m.set([:x, :y, :z] => 42.0, [:A, 2] => 'forty-two')
|
507
506
|
|
@@ -517,5 +516,5 @@ describe Map do
|
|
517
516
|
m.y?.should == false
|
518
517
|
|
519
518
|
m.A?.should == true
|
520
|
-
|
519
|
+
end
|
521
520
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-map
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fernand Galiana
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-04-
|
11
|
+
date: 2013-04-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
prerelease: false
|