dm-ambition 1.0.0 → 1.1.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +77 -0
- data/LICENSE +1 -1
- data/README.rdoc +15 -6
- data/Rakefile +3 -9
- data/TODO +13 -0
- data/dm-ambition.gemspec +70 -56
- data/lib/dm-ambition/collection.rb +18 -48
- data/lib/dm-ambition/model.rb +1 -0
- data/lib/dm-ambition/query/filter_processor.rb +149 -255
- data/lib/dm-ambition/query.rb +4 -5
- data/lib/dm-ambition/version.rb +1 -1
- data/lib/dm-ambition.rb +7 -0
- data/spec/public/collection_spec.rb +102 -68
- data/spec/public/model_spec.rb +8 -11
- data/spec/public/shared/filter_shared_spec.rb +45 -9
- data/spec/semipublic/query_spec.rb +283 -67
- data/spec/spec_helper.rb +9 -41
- data/tasks/local_gemfile.rake +16 -0
- data/tasks/spec.rake +0 -3
- metadata +82 -63
- data/.gitignore +0 -35
@@ -11,6 +11,13 @@ describe DataMapper::Ambition::Query do
|
|
11
11
|
property :admin, Boolean
|
12
12
|
end
|
13
13
|
|
14
|
+
class ::Person
|
15
|
+
include DataMapper::Resource
|
16
|
+
|
17
|
+
property :first_name, String, :key => true
|
18
|
+
property :last_name, String, :key => true
|
19
|
+
end
|
20
|
+
|
14
21
|
if DataMapper.respond_to?(:auto_migrate!)
|
15
22
|
DataMapper.auto_migrate!
|
16
23
|
end
|
@@ -27,8 +34,8 @@ describe DataMapper::Ambition::Query do
|
|
27
34
|
it { @subject.should respond_to(:filter) }
|
28
35
|
|
29
36
|
describe '#filter' do
|
30
|
-
|
31
|
-
|
37
|
+
context 'with operator' do
|
38
|
+
context '==' do
|
32
39
|
before :all do
|
33
40
|
@return = @subject.filter { |u| u.name == 'Dan Kubb' }
|
34
41
|
end
|
@@ -48,7 +55,7 @@ describe DataMapper::Ambition::Query do
|
|
48
55
|
end
|
49
56
|
end
|
50
57
|
|
51
|
-
|
58
|
+
context '=~' do
|
52
59
|
before :all do
|
53
60
|
@return = @subject.filter { |u| u.name =~ /Dan Kubb/ }
|
54
61
|
end
|
@@ -68,7 +75,7 @@ describe DataMapper::Ambition::Query do
|
|
68
75
|
end
|
69
76
|
end
|
70
77
|
|
71
|
-
|
78
|
+
context '>' do
|
72
79
|
before :all do
|
73
80
|
@return = @subject.filter { |u| u.id > 1 }
|
74
81
|
end
|
@@ -88,7 +95,7 @@ describe DataMapper::Ambition::Query do
|
|
88
95
|
end
|
89
96
|
end
|
90
97
|
|
91
|
-
|
98
|
+
context '>=' do
|
92
99
|
before :all do
|
93
100
|
@return = @subject.filter { |u| u.id >= 1 }
|
94
101
|
end
|
@@ -108,7 +115,7 @@ describe DataMapper::Ambition::Query do
|
|
108
115
|
end
|
109
116
|
end
|
110
117
|
|
111
|
-
|
118
|
+
context '<' do
|
112
119
|
before :all do
|
113
120
|
@return = @subject.filter { |u| u.id < 1 }
|
114
121
|
end
|
@@ -128,7 +135,7 @@ describe DataMapper::Ambition::Query do
|
|
128
135
|
end
|
129
136
|
end
|
130
137
|
|
131
|
-
|
138
|
+
context '<=' do
|
132
139
|
before :all do
|
133
140
|
@return = @subject.filter { |u| u.id <= 1 }
|
134
141
|
end
|
@@ -149,7 +156,7 @@ describe DataMapper::Ambition::Query do
|
|
149
156
|
end
|
150
157
|
|
151
158
|
[ :include?, :member? ].each do |method|
|
152
|
-
|
159
|
+
context "Array##{method}" do
|
153
160
|
before :all do
|
154
161
|
@return = @subject.filter { |u| [ 1, 2 ].send(method, u.id) }
|
155
162
|
end
|
@@ -171,7 +178,7 @@ describe DataMapper::Ambition::Query do
|
|
171
178
|
end
|
172
179
|
|
173
180
|
[ :include?, :member?, :=== ].each do |method|
|
174
|
-
|
181
|
+
context "Range##{method} (inclusive)" do
|
175
182
|
before :all do
|
176
183
|
@return = @subject.filter { |u| (1..2).send(method, u.id) }
|
177
184
|
end
|
@@ -191,7 +198,7 @@ describe DataMapper::Ambition::Query do
|
|
191
198
|
end
|
192
199
|
end
|
193
200
|
|
194
|
-
|
201
|
+
context "Range##{method} (exclusive)" do
|
195
202
|
before :all do
|
196
203
|
@return = @subject.filter { |u| (1...3).send(method, u.id) }
|
197
204
|
end
|
@@ -213,7 +220,7 @@ describe DataMapper::Ambition::Query do
|
|
213
220
|
end
|
214
221
|
|
215
222
|
[ :key?, :has_key?, :include?, :member? ].each do |method|
|
216
|
-
|
223
|
+
context "Hash##{method}" do
|
217
224
|
before :all do
|
218
225
|
@return = @subject.filter { |u| { 1 => '1', 2 => '2' }.send(method, u.id) }
|
219
226
|
end
|
@@ -235,9 +242,9 @@ describe DataMapper::Ambition::Query do
|
|
235
242
|
end
|
236
243
|
|
237
244
|
[ :value?, :has_value? ].each do |method|
|
238
|
-
|
245
|
+
context "Hash##{method}" do
|
239
246
|
before :all do
|
240
|
-
@return = @subject.filter { |u| { '1' => 1, '2' => 2 }.
|
247
|
+
@return = @subject.filter { |u| { '1' => 1, '2' => 2 }.send(method, u.id) }
|
241
248
|
end
|
242
249
|
|
243
250
|
it 'should return a Query' do
|
@@ -256,7 +263,7 @@ describe DataMapper::Ambition::Query do
|
|
256
263
|
end
|
257
264
|
end
|
258
265
|
|
259
|
-
|
266
|
+
context 'receiver.method.nil?' do
|
260
267
|
before :all do
|
261
268
|
@return = @subject.filter { |u| u.id.nil? }
|
262
269
|
end
|
@@ -277,8 +284,8 @@ describe DataMapper::Ambition::Query do
|
|
277
284
|
end
|
278
285
|
end
|
279
286
|
|
280
|
-
|
281
|
-
|
287
|
+
context 'with bind value' do
|
288
|
+
context 'nil' do
|
282
289
|
before :all do
|
283
290
|
@return = @subject.filter { |u| u.name == nil }
|
284
291
|
end
|
@@ -298,7 +305,7 @@ describe DataMapper::Ambition::Query do
|
|
298
305
|
end
|
299
306
|
end
|
300
307
|
|
301
|
-
|
308
|
+
context 'true' do
|
302
309
|
before :all do
|
303
310
|
@return = @subject.filter { |u| u.admin == true }
|
304
311
|
end
|
@@ -318,7 +325,7 @@ describe DataMapper::Ambition::Query do
|
|
318
325
|
end
|
319
326
|
end
|
320
327
|
|
321
|
-
|
328
|
+
context 'false' do
|
322
329
|
before :all do
|
323
330
|
@return = @subject.filter { |u| u.admin == false }
|
324
331
|
end
|
@@ -339,8 +346,8 @@ describe DataMapper::Ambition::Query do
|
|
339
346
|
end
|
340
347
|
end
|
341
348
|
|
342
|
-
|
343
|
-
|
349
|
+
context 'with conditions' do
|
350
|
+
context 'ANDed' do
|
344
351
|
before :all do
|
345
352
|
@return = @subject.filter { |u| u.id == 1 && u.name == 'Dan Kubb' }
|
346
353
|
end
|
@@ -361,7 +368,7 @@ describe DataMapper::Ambition::Query do
|
|
361
368
|
end
|
362
369
|
end
|
363
370
|
|
364
|
-
|
371
|
+
context 'ORed' do
|
365
372
|
before :all do
|
366
373
|
@return = @subject.filter { |u| u.id == 1 || u.name == 'Dan Kubb' }
|
367
374
|
end
|
@@ -384,7 +391,7 @@ describe DataMapper::Ambition::Query do
|
|
384
391
|
end
|
385
392
|
end
|
386
393
|
|
387
|
-
|
394
|
+
context 'negated' do
|
388
395
|
before :all do
|
389
396
|
@return = @subject.filter { |u| !(u.id == 1) }
|
390
397
|
end
|
@@ -406,7 +413,7 @@ describe DataMapper::Ambition::Query do
|
|
406
413
|
end
|
407
414
|
end
|
408
415
|
|
409
|
-
|
416
|
+
context 'double-negated' do
|
410
417
|
before :all do
|
411
418
|
@return = @subject.filter { |u| !(!(u.id == 1)) }
|
412
419
|
end
|
@@ -421,18 +428,14 @@ describe DataMapper::Ambition::Query do
|
|
421
428
|
|
422
429
|
it 'should set conditions' do
|
423
430
|
@return.conditions.should == DataMapper::Query::Conditions::Operation.new(:and,
|
424
|
-
DataMapper::Query::Conditions::
|
425
|
-
DataMapper::Query::Conditions::Operation.new(:not,
|
426
|
-
DataMapper::Query::Conditions::Comparison.new(:eql, @model.properties[:id], 1)
|
427
|
-
)
|
428
|
-
)
|
431
|
+
DataMapper::Query::Conditions::Comparison.new(:eql, @model.properties[:id], 1)
|
429
432
|
)
|
430
433
|
end
|
431
434
|
end
|
432
435
|
|
433
|
-
|
436
|
+
context 'receiver matching a resource' do
|
434
437
|
before :all do
|
435
|
-
resource =
|
438
|
+
resource = @model.new(:id => 1)
|
436
439
|
|
437
440
|
@return = @subject.filter { |u| u == resource }
|
438
441
|
end
|
@@ -452,12 +455,75 @@ describe DataMapper::Ambition::Query do
|
|
452
455
|
end
|
453
456
|
end
|
454
457
|
|
458
|
+
context 'resource matching a receiver' do
|
459
|
+
before :all do
|
460
|
+
resource = @model.new(:id => 1)
|
461
|
+
|
462
|
+
@return = @subject.filter { |u| resource == u }
|
463
|
+
end
|
464
|
+
|
465
|
+
it 'should return a Query' do
|
466
|
+
@return.should be_kind_of(DataMapper::Query)
|
467
|
+
end
|
468
|
+
|
469
|
+
it 'should not return self' do
|
470
|
+
@return.should_not equal(@subject)
|
471
|
+
end
|
472
|
+
|
473
|
+
it 'should set conditions' do
|
474
|
+
@return.conditions.should == DataMapper::Query::Conditions::Operation.new(:and,
|
475
|
+
DataMapper::Query::Conditions::Comparison.new(:eql, @model.properties[:id], 1)
|
476
|
+
)
|
477
|
+
end
|
478
|
+
end
|
479
|
+
|
480
|
+
context 'receiver matching a non-resource' do
|
481
|
+
before :all do
|
482
|
+
@return = @subject.filter { |u| u == nil }
|
483
|
+
end
|
484
|
+
|
485
|
+
it 'should return a Query' do
|
486
|
+
@return.should be_kind_of(DataMapper::Query)
|
487
|
+
end
|
488
|
+
|
489
|
+
it 'should not return self' do
|
490
|
+
@return.should_not equal(@subject)
|
491
|
+
end
|
492
|
+
|
493
|
+
it 'should set conditions' do
|
494
|
+
@return.conditions.should == DataMapper::Query::Conditions::Operation.new(:and,
|
495
|
+
DataMapper::Query::Conditions::Comparison.new(:in, @model.properties[:id], [])
|
496
|
+
)
|
497
|
+
end
|
498
|
+
end
|
499
|
+
|
500
|
+
context 'non-resource matching a receiver' do
|
501
|
+
before :all do
|
502
|
+
@return = @subject.filter { |u| nil == u }
|
503
|
+
end
|
504
|
+
|
505
|
+
it 'should return a Query' do
|
506
|
+
@return.should be_kind_of(DataMapper::Query)
|
507
|
+
end
|
508
|
+
|
509
|
+
it 'should not return self' do
|
510
|
+
@return.should_not equal(@subject)
|
511
|
+
end
|
512
|
+
|
513
|
+
it 'should set conditions' do
|
514
|
+
@return.conditions.should == DataMapper::Query::Conditions::Operation.new(:and,
|
515
|
+
DataMapper::Query::Conditions::Comparison.new(:in, @model.properties[:id], [])
|
516
|
+
)
|
517
|
+
end
|
518
|
+
end
|
519
|
+
|
455
520
|
[ :include?, :member? ].each do |method|
|
456
|
-
|
521
|
+
context "receiver matching a resource using Array##{method}" do
|
457
522
|
before :all do
|
458
|
-
|
523
|
+
one = @model.new(:id => 1)
|
524
|
+
two = @model.new(:id => 2)
|
459
525
|
|
460
|
-
@return = @subject.filter { |u| [
|
526
|
+
@return = @subject.filter { |u| [ one, two ].send(method, u) }
|
461
527
|
end
|
462
528
|
|
463
529
|
it 'should return a Query' do
|
@@ -470,17 +536,52 @@ describe DataMapper::Ambition::Query do
|
|
470
536
|
|
471
537
|
it 'should set conditions' do
|
472
538
|
@return.conditions.should == DataMapper::Query::Conditions::Operation.new(:and,
|
473
|
-
DataMapper::Query::Conditions::Comparison.new(:in, @model.properties[:id], [ 1 ])
|
539
|
+
DataMapper::Query::Conditions::Comparison.new(:in, @model.properties[:id], [ 1, 2 ])
|
540
|
+
)
|
541
|
+
end
|
542
|
+
end
|
543
|
+
|
544
|
+
context "receiver matching a resource (with a CPK) using Array##{method}" do
|
545
|
+
before :all do
|
546
|
+
@model = Person
|
547
|
+
@subject = DataMapper::Query.new(@repository, @model)
|
548
|
+
|
549
|
+
@one = @model.new(:first_name => 'Dan', :last_name => 'Kubb')
|
550
|
+
@two = @model.new(:first_name => 'John', :last_name => 'Doe')
|
551
|
+
|
552
|
+
@return = @subject.filter { |p| [ @one, @two ].send(method, p) }
|
553
|
+
end
|
554
|
+
|
555
|
+
it 'should return a Query' do
|
556
|
+
@return.should be_kind_of(DataMapper::Query)
|
557
|
+
end
|
558
|
+
|
559
|
+
it 'should not return self' do
|
560
|
+
@return.should_not equal(@subject)
|
561
|
+
end
|
562
|
+
|
563
|
+
it 'should set conditions' do
|
564
|
+
@return.conditions.should == DataMapper::Query::Conditions::Operation.new(:and,
|
565
|
+
DataMapper::Query::Conditions::Operation.new(:or,
|
566
|
+
DataMapper::Query::Conditions::Operation.new(:and,
|
567
|
+
DataMapper::Query::Conditions::Comparison.new(:eql, @model.properties[:first_name], 'Dan'),
|
568
|
+
DataMapper::Query::Conditions::Comparison.new(:eql, @model.properties[:last_name], 'Kubb')
|
569
|
+
),
|
570
|
+
DataMapper::Query::Conditions::Operation.new(:and,
|
571
|
+
DataMapper::Query::Conditions::Comparison.new(:eql, @model.properties[:first_name], 'John'),
|
572
|
+
DataMapper::Query::Conditions::Comparison.new(:eql, @model.properties[:last_name], 'Doe')
|
573
|
+
)
|
574
|
+
)
|
474
575
|
)
|
475
576
|
end
|
476
577
|
end
|
477
578
|
end
|
478
579
|
|
479
580
|
[ :key?, :has_key?, :include?, :member? ].each do |method|
|
480
|
-
|
581
|
+
context "receiver matching a resource using Hash##{method}" do
|
481
582
|
before :all do
|
482
|
-
one =
|
483
|
-
two =
|
583
|
+
one = @model.new(:id => 1)
|
584
|
+
two = @model.new(:id => 2)
|
484
585
|
|
485
586
|
@return = @subject.filter { |u| { one => '1', two => '2' }.send(method, u) }
|
486
587
|
end
|
@@ -502,10 +603,10 @@ describe DataMapper::Ambition::Query do
|
|
502
603
|
end
|
503
604
|
|
504
605
|
[ :value?, :has_value? ].each do |method|
|
505
|
-
|
606
|
+
context "receiver matching a resource using Hash##{method}" do
|
506
607
|
before :all do
|
507
|
-
one =
|
508
|
-
two =
|
608
|
+
one = @model.new(:id => 1)
|
609
|
+
two = @model.new(:id => 2)
|
509
610
|
|
510
611
|
@return = @subject.filter { |u| { '1' => one, '2' => two }.send(method, u) }
|
511
612
|
end
|
@@ -526,29 +627,31 @@ describe DataMapper::Ambition::Query do
|
|
526
627
|
end
|
527
628
|
end
|
528
629
|
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
630
|
+
[ :send, :__send__ ].each do |method|
|
631
|
+
context 'using send on receiver' do
|
632
|
+
before :all do
|
633
|
+
@return = @subject.filter { |u| u.send(method, :name) == 'Dan Kubb' }
|
634
|
+
end
|
533
635
|
|
534
|
-
|
535
|
-
|
536
|
-
|
636
|
+
it 'should return a Query' do
|
637
|
+
@return.should be_kind_of(DataMapper::Query)
|
638
|
+
end
|
537
639
|
|
538
|
-
|
539
|
-
|
540
|
-
|
640
|
+
it 'should not return self' do
|
641
|
+
@return.should_not equal(@subject)
|
642
|
+
end
|
541
643
|
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
644
|
+
it 'should set conditions' do
|
645
|
+
@return.conditions.should == DataMapper::Query::Conditions::Operation.new(:and,
|
646
|
+
DataMapper::Query::Conditions::Comparison.new(:eql, @model.properties[:name], 'Dan Kubb')
|
647
|
+
)
|
648
|
+
end
|
546
649
|
end
|
547
650
|
end
|
548
651
|
end
|
549
652
|
|
550
|
-
|
551
|
-
|
653
|
+
context 'with external value' do
|
654
|
+
context 'local variable' do
|
552
655
|
before :all do
|
553
656
|
name = 'Dan Kubb'
|
554
657
|
|
@@ -570,7 +673,7 @@ describe DataMapper::Ambition::Query do
|
|
570
673
|
end
|
571
674
|
end
|
572
675
|
|
573
|
-
|
676
|
+
context 'instance variable' do
|
574
677
|
before :all do
|
575
678
|
@name = 'Dan Kubb'
|
576
679
|
|
@@ -592,7 +695,7 @@ describe DataMapper::Ambition::Query do
|
|
592
695
|
end
|
593
696
|
end
|
594
697
|
|
595
|
-
|
698
|
+
context 'global variable' do
|
596
699
|
before :all do
|
597
700
|
$name = 'Dan Kubb'
|
598
701
|
|
@@ -614,7 +717,7 @@ describe DataMapper::Ambition::Query do
|
|
614
717
|
end
|
615
718
|
end
|
616
719
|
|
617
|
-
|
720
|
+
context 'method' do
|
618
721
|
def name
|
619
722
|
'Dan Kubb'
|
620
723
|
end
|
@@ -632,15 +735,37 @@ describe DataMapper::Ambition::Query do
|
|
632
735
|
end
|
633
736
|
|
634
737
|
it 'should set conditions' do
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
)
|
639
|
-
end
|
738
|
+
@return.conditions.should == DataMapper::Query::Conditions::Operation.new(:and,
|
739
|
+
DataMapper::Query::Conditions::Comparison.new(:eql, @model.properties[:name], 'Dan Kubb')
|
740
|
+
)
|
640
741
|
end
|
641
742
|
end
|
642
743
|
|
643
|
-
|
744
|
+
context 'method with arguments' do
|
745
|
+
def name(first_name, last_name)
|
746
|
+
"#{first_name} #{last_name}"
|
747
|
+
end
|
748
|
+
|
749
|
+
before :all do
|
750
|
+
@return = @subject.filter { |u| u.name == name('Dan', 'Kubb') }
|
751
|
+
end
|
752
|
+
|
753
|
+
it 'should return a Query' do
|
754
|
+
@return.should be_kind_of(DataMapper::Query)
|
755
|
+
end
|
756
|
+
|
757
|
+
it 'should not return self' do
|
758
|
+
@return.should_not equal(@subject)
|
759
|
+
end
|
760
|
+
|
761
|
+
it 'should set conditions' do
|
762
|
+
@return.conditions.should == DataMapper::Query::Conditions::Operation.new(:and,
|
763
|
+
DataMapper::Query::Conditions::Comparison.new(:eql, @model.properties[:name], 'Dan Kubb')
|
764
|
+
)
|
765
|
+
end
|
766
|
+
end
|
767
|
+
|
768
|
+
context 'constant' do
|
644
769
|
NAME = 'Dan Kubb'
|
645
770
|
|
646
771
|
before :all do
|
@@ -662,7 +787,7 @@ describe DataMapper::Ambition::Query do
|
|
662
787
|
end
|
663
788
|
end
|
664
789
|
|
665
|
-
|
790
|
+
context 'namespaced constant' do
|
666
791
|
before :all do
|
667
792
|
Object.send(:remove_const, :Condition) if defined?(::Condition)
|
668
793
|
module ::Condition
|
@@ -687,7 +812,7 @@ describe DataMapper::Ambition::Query do
|
|
687
812
|
end
|
688
813
|
end
|
689
814
|
|
690
|
-
|
815
|
+
context 'namespaced method' do
|
691
816
|
before :all do
|
692
817
|
Object.send(:remove_const, :Condition) if defined?(::Condition)
|
693
818
|
module ::Condition
|
@@ -714,5 +839,96 @@ describe DataMapper::Ambition::Query do
|
|
714
839
|
end
|
715
840
|
end
|
716
841
|
end
|
842
|
+
|
843
|
+
context 'with literal' do
|
844
|
+
context 'true' do
|
845
|
+
before :all do
|
846
|
+
@return = @subject.filter { |u| true }
|
847
|
+
end
|
848
|
+
|
849
|
+
it 'should return a Query' do
|
850
|
+
@return.should be_kind_of(DataMapper::Query)
|
851
|
+
end
|
852
|
+
|
853
|
+
it 'should not return self' do
|
854
|
+
@return.should_not equal(@subject)
|
855
|
+
end
|
856
|
+
|
857
|
+
it 'should set conditions' do
|
858
|
+
pending do
|
859
|
+
@return.conditions.should == DataMapper::Query::Conditions::Operation.new(:null)
|
860
|
+
end
|
861
|
+
end
|
862
|
+
end
|
863
|
+
|
864
|
+
[ nil, false ].each do |literal|
|
865
|
+
context literal.inspect do
|
866
|
+
before :all do
|
867
|
+
@return = @subject.filter { |u| literal }
|
868
|
+
end
|
869
|
+
|
870
|
+
it 'should return a Query' do
|
871
|
+
@return.should be_kind_of(DataMapper::Query)
|
872
|
+
end
|
873
|
+
|
874
|
+
it 'should not return self' do
|
875
|
+
@return.should_not equal(@subject)
|
876
|
+
end
|
877
|
+
|
878
|
+
it 'should set conditions' do
|
879
|
+
pending 'TODO: figure out a way to represent that nothing matches'
|
880
|
+
end
|
881
|
+
end
|
882
|
+
end
|
883
|
+
end
|
884
|
+
|
885
|
+
context 'with single local variable assignment' do
|
886
|
+
before do
|
887
|
+
@return = @subject.filter { |u| name = 'Dan Kubb'; u.name == name }
|
888
|
+
end
|
889
|
+
|
890
|
+
it 'should return a Query' do
|
891
|
+
@return.should be_kind_of(DataMapper::Query)
|
892
|
+
end
|
893
|
+
|
894
|
+
it 'should not return self' do
|
895
|
+
@return.should_not equal(@subject)
|
896
|
+
end
|
897
|
+
|
898
|
+
it 'should set conditions' do
|
899
|
+
@return.conditions.should == DataMapper::Query::Conditions::Operation.new(:and,
|
900
|
+
DataMapper::Query::Conditions::Comparison.new(:eql, @model.properties[:name], 'Dan Kubb')
|
901
|
+
)
|
902
|
+
end
|
903
|
+
end
|
904
|
+
|
905
|
+
context 'with multiple local variable assignment' do
|
906
|
+
before do
|
907
|
+
@return = @subject.filter { |u| name1, name2 = 'Dan Kubb', 'John Doe'; [ name1, name2 ].include?(u.name) }
|
908
|
+
end
|
909
|
+
|
910
|
+
it 'should return a Query' do
|
911
|
+
@return.should be_kind_of(DataMapper::Query)
|
912
|
+
end
|
913
|
+
|
914
|
+
it 'should not return self' do
|
915
|
+
@return.should_not equal(@subject)
|
916
|
+
end
|
917
|
+
|
918
|
+
it 'should set conditions' do
|
919
|
+
@return.conditions.should == DataMapper::Query::Conditions::Operation.new(:and,
|
920
|
+
DataMapper::Query::Conditions::Comparison.new(:in, @model.properties[:name], [ 'Dan Kubb', 'John Doe' ])
|
921
|
+
)
|
922
|
+
end
|
923
|
+
end
|
924
|
+
|
925
|
+
context 'with an invalid block' do
|
926
|
+
specify do
|
927
|
+
expect {
|
928
|
+
# global assignment will not be allowed within the block
|
929
|
+
@subject.filter { |u| $name = 'Dan Kubb'; u.name == $name }
|
930
|
+
}.to raise_error(ArgumentError, 'calling process_gasgn with s(:$name, s(:str, "Dan Kubb"))')
|
931
|
+
end
|
932
|
+
end
|
717
933
|
end
|
718
934
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,49 +1,17 @@
|
|
1
|
-
require '
|
2
|
-
require 'rubygems'
|
3
|
-
require 'spec'
|
1
|
+
require 'dm-ambition'
|
4
2
|
|
5
|
-
require 'dm-core'
|
6
|
-
require 'dm-
|
3
|
+
require 'dm-core/spec/setup'
|
4
|
+
require 'dm-core/spec/lib/adapter_helpers'
|
5
|
+
require 'dm-core/spec/lib/spec_helper'
|
7
6
|
|
8
|
-
|
9
|
-
require SPEC_ROOT.parent / 'lib' / 'dm-ambition'
|
10
|
-
Pathname.glob((SPEC_ROOT / '{lib,*/shared}/**/*.rb').to_s).each { |f| require f }
|
11
|
-
|
12
|
-
def load_driver(name, default_uri)
|
13
|
-
return false if ENV['ADAPTER'] != name.to_s
|
14
|
-
|
15
|
-
begin
|
16
|
-
DataMapper.setup(name, ENV["#{name.to_s.upcase}_SPEC_URI"] || default_uri)
|
17
|
-
DataMapper::Repository.adapters[:default] = DataMapper::Repository.adapters[name]
|
18
|
-
true
|
19
|
-
rescue LoadError => e
|
20
|
-
warn "Could not load do_#{name}: #{e}"
|
21
|
-
false
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
ENV['ADAPTER'] ||= 'sqlite3'
|
26
|
-
|
27
|
-
HAS_SQLITE3 = load_driver(:sqlite3, 'sqlite3::memory:')
|
28
|
-
HAS_MYSQL = load_driver(:mysql, 'mysql://localhost/dm_core_test')
|
29
|
-
HAS_POSTGRES = load_driver(:postgres, 'postgres://postgres@localhost/dm_core_test')
|
7
|
+
Dir['spec/*/shared/**/*.rb'].each { |file| require File.expand_path(file) }
|
30
8
|
|
31
9
|
Spec::Runner.configure do |config|
|
32
|
-
config.after :all do
|
33
|
-
# global model cleanup
|
34
|
-
descendants = DataMapper::Model.descendants.to_a
|
35
|
-
while model = descendants.shift
|
36
|
-
descendants.concat(model.descendants.to_a - [ model ])
|
37
|
-
|
38
|
-
parts = model.name.split('::')
|
39
|
-
constant_name = parts.pop.to_sym
|
40
|
-
base = parts.empty? ? Object : Object.full_const_get(parts.join('::'))
|
41
10
|
|
42
|
-
|
43
|
-
base.send(:remove_const, constant_name)
|
44
|
-
end
|
11
|
+
config.extend(DataMapper::Spec::Adapters::Helpers)
|
45
12
|
|
46
|
-
|
47
|
-
|
13
|
+
config.after :all do
|
14
|
+
DataMapper::Spec.cleanup_models
|
48
15
|
end
|
16
|
+
|
49
17
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
desc "Support bundling from local source code (allows BUNDLE_GEMFILE=Gemfile.local bundle foo)"
|
2
|
+
task :local_gemfile do |t|
|
3
|
+
|
4
|
+
root = Pathname(__FILE__).dirname.parent
|
5
|
+
datamapper = root.parent
|
6
|
+
|
7
|
+
root.join('Gemfile.local').open('w') do |f|
|
8
|
+
root.join('Gemfile').open.each do |line|
|
9
|
+
line.sub!(/DATAMAPPER = 'git:\/\/github.com\/datamapper'/, "DATAMAPPER = '#{datamapper}'")
|
10
|
+
line.sub!(/:git => \"#\{DATAMAPPER\}\/(.+?)(?:\.git)?\"/, ':path => "#{DATAMAPPER}/\1"')
|
11
|
+
line.sub!(/do_options\[:git\] = \"#\{DATAMAPPER\}\/(.+?)(?:\.git)?\"/, 'do_options[:path] = "#{DATAMAPPER}/\1"')
|
12
|
+
f.puts line
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|