durran-mongoid 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/mongoid.rb +1 -1
- data/lib/mongoid/associations/has_many_association.rb +5 -5
- data/lib/mongoid/associations/has_one_association.rb +13 -4
- data/lib/mongoid/document.rb +4 -5
- data/mongoid.gemspec +2 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/mongoid/document_spec.rb +165 -48
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.4
|
data/lib/mongoid.rb
CHANGED
@@ -2,17 +2,17 @@ module Mongoid #:nodoc:
|
|
2
2
|
module Associations #:nodoc:
|
3
3
|
class HasManyAssociation < DelegateClass(Array) #:nodoc:
|
4
4
|
|
5
|
-
# Creates the new association by finding the attributes in
|
6
|
-
# the parent document with its name, and instantiating a
|
7
|
-
# new document for each one found. These will then be put in an
|
5
|
+
# Creates the new association by finding the attributes in
|
6
|
+
# the parent document with its name, and instantiating a
|
7
|
+
# new document for each one found. These will then be put in an
|
8
8
|
# internal array.
|
9
9
|
#
|
10
|
-
# This then delegated all methods to the array class since this is
|
10
|
+
# This then delegated all methods to the array class since this is
|
11
11
|
# essentially a proxy to an array itself.
|
12
12
|
def initialize(association_name, document)
|
13
13
|
@klass = association_name.to_s.classify.constantize
|
14
14
|
attributes = document.attributes[association_name]
|
15
|
-
@documents = attributes ? attributes.collect do |attribute|
|
15
|
+
@documents = attributes ? attributes.collect do |attribute|
|
16
16
|
child = @klass.new(attribute)
|
17
17
|
child.parent = document
|
18
18
|
child
|
@@ -2,6 +2,9 @@ module Mongoid #:nodoc:
|
|
2
2
|
module Associations #:nodoc:
|
3
3
|
class HasOneAssociation #:nodoc:
|
4
4
|
|
5
|
+
attr_reader :document
|
6
|
+
delegate :valid?, :to => :document
|
7
|
+
|
5
8
|
# Creates the new association by finding the attributes in
|
6
9
|
# the parent document with its name, and instantiating a
|
7
10
|
# new document for it.
|
@@ -13,12 +16,18 @@ module Mongoid #:nodoc:
|
|
13
16
|
attributes = document.attributes[association_name]
|
14
17
|
@document = klass.new(attributes)
|
15
18
|
@document.parent = document
|
19
|
+
decorate!
|
16
20
|
end
|
17
21
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
+
private
|
23
|
+
def decorate!
|
24
|
+
@document.public_methods(false).each do |method|
|
25
|
+
(class << self; self; end).class_eval do
|
26
|
+
define_method method do |*args|
|
27
|
+
@document.send method, *args
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
22
31
|
end
|
23
32
|
|
24
33
|
end
|
data/lib/mongoid/document.rb
CHANGED
@@ -56,8 +56,8 @@ module Mongoid #:nodoc:
|
|
56
56
|
def find(*args)
|
57
57
|
type, selector = args[0], args[1]
|
58
58
|
case type
|
59
|
-
when :all then find_all(selector)
|
60
|
-
when :first then find_first(selector)
|
59
|
+
when :all then find_all(selector[:conditions])
|
60
|
+
when :first then find_first(selector[:conditions])
|
61
61
|
else find_first(Mongo::ObjectID.from_string(type.to_s))
|
62
62
|
end
|
63
63
|
end
|
@@ -100,8 +100,8 @@ module Mongoid #:nodoc:
|
|
100
100
|
|
101
101
|
# Find all documents in paginated fashion given the supplied arguments.
|
102
102
|
# If no parameters are passed just default to offset 0 and limit 20.
|
103
|
-
def paginate(selector =
|
104
|
-
collection.find(selector, Mongoid::Paginator.new(params).options).collect { |doc| new(doc) }
|
103
|
+
def paginate(selector = {}, params = {})
|
104
|
+
collection.find(selector[:conditions], Mongoid::Paginator.new(params).options).collect { |doc| new(doc) }
|
105
105
|
end
|
106
106
|
|
107
107
|
end
|
@@ -181,7 +181,6 @@ module Mongoid #:nodoc:
|
|
181
181
|
|
182
182
|
# Takes the supplied raw grouping of documents and alters it to a
|
183
183
|
# grouping of actual document objects.
|
184
|
-
# TODO: Me no likey this...
|
185
184
|
def group!(docs)
|
186
185
|
docs["group"] = docs["group"].collect { |attrs| new(attrs) }; docs
|
187
186
|
end
|
data/mongoid.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mongoid}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Durran Jordan"]
|
12
|
-
s.date = %q{2009-09-
|
12
|
+
s.date = %q{2009-09-27}
|
13
13
|
s.email = %q{durran@gmail.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"README.textile"
|
data/spec/spec_helper.rb
CHANGED
@@ -120,8 +120,8 @@ describe Mongoid::Document do
|
|
120
120
|
context "when finding first" do
|
121
121
|
|
122
122
|
it "delegates to find_first" do
|
123
|
-
@collection.expects(:find_one).with(:test => "Test").returns(@attributes)
|
124
|
-
Person.find(:first, :test => "Test")
|
123
|
+
@collection.expects(:find_one).with(:test => "Test" ).returns(@attributes)
|
124
|
+
Person.find(:first, :conditions => { :test => "Test" })
|
125
125
|
end
|
126
126
|
|
127
127
|
end
|
@@ -136,7 +136,7 @@ describe Mongoid::Document do
|
|
136
136
|
it "delegates to find_all" do
|
137
137
|
@collection.expects(:find).with(:test => "Test").returns(@cursor)
|
138
138
|
@cursor.expects(:collect).returns(@people)
|
139
|
-
Person.find(:all, :test => "Test")
|
139
|
+
Person.find(:all, :conditions => { :test => "Test" })
|
140
140
|
end
|
141
141
|
|
142
142
|
end
|
@@ -368,7 +368,7 @@ describe Mongoid::Document do
|
|
368
368
|
|
369
369
|
it "delegates offset and limit to find_all" do
|
370
370
|
@collection.expects(:find).with({ :test => "Test" }, {:limit => 20, :offset => 20}).returns([])
|
371
|
-
Person.paginate({ :test => "Test" }, { :page => 2, :per_page => 20 })
|
371
|
+
Person.paginate({ :conditions => { :test => "Test" } }, { :page => 2, :per_page => 20 })
|
372
372
|
end
|
373
373
|
|
374
374
|
end
|
@@ -377,7 +377,7 @@ describe Mongoid::Document do
|
|
377
377
|
|
378
378
|
it "passes the default offset and limit to find_all" do
|
379
379
|
@collection.expects(:find).with({ :test => "Test" }, {:limit => 20, :offset => 0}).returns([])
|
380
|
-
Person.paginate({ :test => "Test" })
|
380
|
+
Person.paginate(:conditions => { :test => "Test" })
|
381
381
|
end
|
382
382
|
|
383
383
|
end
|
@@ -472,83 +472,200 @@ describe Mongoid::Document do
|
|
472
472
|
|
473
473
|
context "validations" do
|
474
474
|
|
475
|
-
|
476
|
-
|
477
|
-
|
475
|
+
context "when defining using macros" do
|
476
|
+
|
477
|
+
after do
|
478
|
+
Person.validations.clear
|
479
|
+
end
|
478
480
|
|
479
|
-
|
481
|
+
describe "#validates_acceptance_of" do
|
480
482
|
|
481
|
-
|
482
|
-
|
483
|
-
|
483
|
+
it "adds the acceptance validation" do
|
484
|
+
Person.class_eval do
|
485
|
+
validates_acceptance_of :terms
|
486
|
+
end
|
487
|
+
Person.validations.first.should be_a_kind_of(Validatable::ValidatesAcceptanceOf)
|
484
488
|
end
|
485
|
-
|
489
|
+
|
486
490
|
end
|
487
491
|
|
488
|
-
|
492
|
+
describe "#validates_associated" do
|
489
493
|
|
490
|
-
|
494
|
+
it "adds the associated validation" do
|
495
|
+
Person.class_eval do
|
496
|
+
validates_associated :name
|
497
|
+
end
|
498
|
+
Person.validations.first.should be_a_kind_of(Validatable::ValidatesAssociated)
|
499
|
+
end
|
491
500
|
|
492
|
-
|
493
|
-
|
494
|
-
|
501
|
+
end
|
502
|
+
|
503
|
+
describe "#validates_format_of" do
|
504
|
+
|
505
|
+
it "adds the format validation" do
|
506
|
+
Person.class_eval do
|
507
|
+
validates_format_of :title, :with => /[A-Za-z]/
|
508
|
+
end
|
509
|
+
Person.validations.first.should be_a_kind_of(Validatable::ValidatesFormatOf)
|
495
510
|
end
|
496
|
-
|
511
|
+
|
497
512
|
end
|
498
513
|
|
499
|
-
|
514
|
+
describe "#validates_length_of" do
|
515
|
+
|
516
|
+
it "adds the length validation" do
|
517
|
+
Person.class_eval do
|
518
|
+
validates_length_of :title, :minimum => 10
|
519
|
+
end
|
520
|
+
Person.validations.first.should be_a_kind_of(Validatable::ValidatesLengthOf)
|
521
|
+
end
|
522
|
+
|
523
|
+
end
|
500
524
|
|
501
|
-
|
525
|
+
describe "#validates_numericality_of" do
|
502
526
|
|
503
|
-
|
504
|
-
|
505
|
-
|
527
|
+
it "adds the numericality validation" do
|
528
|
+
Person.class_eval do
|
529
|
+
validates_numericality_of :age
|
530
|
+
end
|
531
|
+
Person.validations.first.should be_a_kind_of(Validatable::ValidatesNumericalityOf)
|
506
532
|
end
|
507
|
-
|
533
|
+
|
508
534
|
end
|
509
535
|
|
510
|
-
|
536
|
+
describe "#validates_presence_of" do
|
537
|
+
|
538
|
+
it "adds the presence validation" do
|
539
|
+
Person.class_eval do
|
540
|
+
validates_presence_of :title
|
541
|
+
end
|
542
|
+
Person.validations.first.should be_a_kind_of(Validatable::ValidatesPresenceOf)
|
543
|
+
end
|
544
|
+
|
545
|
+
end
|
511
546
|
|
512
|
-
|
547
|
+
describe "#validates_true_for" do
|
513
548
|
|
514
|
-
|
515
|
-
|
516
|
-
|
549
|
+
it "adds the true validation" do
|
550
|
+
Person.class_eval do
|
551
|
+
validates_true_for :title, :logic => lambda { title == "Esquire" }
|
552
|
+
end
|
553
|
+
Person.validations.first.should be_a_kind_of(Validatable::ValidatesTrueFor)
|
517
554
|
end
|
518
|
-
|
555
|
+
|
519
556
|
end
|
520
557
|
|
521
558
|
end
|
522
559
|
|
523
|
-
|
560
|
+
context "when running validations" do
|
561
|
+
|
562
|
+
before do
|
563
|
+
@person = Person.new
|
564
|
+
end
|
565
|
+
|
566
|
+
after do
|
567
|
+
Person.validations.clear
|
568
|
+
end
|
569
|
+
|
570
|
+
describe "#validates_acceptance_of" do
|
524
571
|
|
525
|
-
|
526
|
-
|
527
|
-
|
572
|
+
it "fails if field not accepted" do
|
573
|
+
Person.class_eval do
|
574
|
+
validates_acceptance_of :terms
|
575
|
+
end
|
576
|
+
@person.valid?.should be_false
|
577
|
+
@person.errors.on(:terms).should_not be_nil
|
528
578
|
end
|
529
|
-
|
579
|
+
|
530
580
|
end
|
531
581
|
|
532
|
-
|
582
|
+
describe "#validates_associated" do
|
583
|
+
|
584
|
+
context "when association is a has_many" do
|
585
|
+
|
586
|
+
it "fails when any association fails validation"
|
533
587
|
|
534
|
-
|
588
|
+
end
|
589
|
+
|
590
|
+
context "when association is a has_one" do
|
591
|
+
|
592
|
+
it "fails when the association fails validation" do
|
593
|
+
Person.class_eval do
|
594
|
+
validates_associated :name
|
595
|
+
end
|
596
|
+
Name.class_eval do
|
597
|
+
validates_presence_of :first_name
|
598
|
+
end
|
599
|
+
@person.name = Name.new
|
600
|
+
@person.valid?.should be_false
|
601
|
+
@person.errors.on(:name).should_not be_nil
|
602
|
+
end
|
535
603
|
|
536
|
-
it "adds the presence validation" do
|
537
|
-
Person.class_eval do
|
538
|
-
validates_presence_of :title
|
539
604
|
end
|
540
|
-
|
605
|
+
|
541
606
|
end
|
542
607
|
|
543
|
-
|
608
|
+
describe "#validates_format_of" do
|
609
|
+
|
610
|
+
it "fails if the field is in the wrong format" do
|
611
|
+
Person.class_eval do
|
612
|
+
validates_format_of :title, :with => /[A-Za-z]/
|
613
|
+
end
|
614
|
+
@person.title = 10
|
615
|
+
@person.valid?.should be_false
|
616
|
+
@person.errors.on(:title).should_not be_nil
|
617
|
+
end
|
544
618
|
|
545
|
-
|
619
|
+
end
|
546
620
|
|
547
|
-
|
548
|
-
|
549
|
-
|
621
|
+
describe "#validates_length_of" do
|
622
|
+
|
623
|
+
it "fails if the field is the wrong length" do
|
624
|
+
Person.class_eval do
|
625
|
+
validates_length_of :title, :minimum => 10
|
626
|
+
end
|
627
|
+
@person.title = "Testing"
|
628
|
+
@person.valid?.should be_false
|
629
|
+
@person.errors.on(:title).should_not be_nil
|
550
630
|
end
|
551
|
-
|
631
|
+
|
632
|
+
end
|
633
|
+
|
634
|
+
describe "#validates_numericality_of" do
|
635
|
+
|
636
|
+
it "fails if the field is not a number" do
|
637
|
+
Person.class_eval do
|
638
|
+
validates_numericality_of :age
|
639
|
+
end
|
640
|
+
@person.age = "foo"
|
641
|
+
@person.valid?.should be_false
|
642
|
+
@person.errors.on(:age).should_not be_nil
|
643
|
+
end
|
644
|
+
|
645
|
+
end
|
646
|
+
|
647
|
+
describe "#validates_presence_of" do
|
648
|
+
|
649
|
+
it "fails if the field is nil" do
|
650
|
+
Person.class_eval do
|
651
|
+
validates_presence_of :title
|
652
|
+
end
|
653
|
+
@person.valid?.should be_false
|
654
|
+
@person.errors.on(:title).should_not be_nil
|
655
|
+
end
|
656
|
+
|
657
|
+
end
|
658
|
+
|
659
|
+
describe "#validates_true_for" do
|
660
|
+
|
661
|
+
it "fails if the logic returns false" do
|
662
|
+
Person.class_eval do
|
663
|
+
validates_true_for :title, :logic => lambda { title == "Esquire" }
|
664
|
+
end
|
665
|
+
@person.valid?.should be_false
|
666
|
+
@person.errors.on(:title).should_not be_nil
|
667
|
+
end
|
668
|
+
|
552
669
|
end
|
553
670
|
|
554
671
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: durran-mongoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Durran Jordan
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-27 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|