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 CHANGED
@@ -1 +1 @@
1
- 0.2.3
1
+ 0.2.4
data/lib/mongoid.rb CHANGED
@@ -22,7 +22,7 @@ require "rubygems"
22
22
 
23
23
  gem "activesupport", "2.3.4"
24
24
  gem "mongodb-mongo", "0.14.1"
25
- gem "hashrocket-validatable", "1.7.4"
25
+ gem "durran-validatable", "1.7.5"
26
26
 
27
27
  require "validatable"
28
28
  require "active_support/callbacks"
@@ -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
- # All calls to this association will be delegated straight
19
- # to the encapsulated document.
20
- def method_missing(method, *args)
21
- @document.send(method, *args)
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
@@ -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 = nil, params = {})
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.3"
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-23}
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
@@ -12,6 +12,7 @@ Mongoid.connect_to("mongoid_test")
12
12
 
13
13
  Spec::Runner.configure do |config|
14
14
  config.mock_with :mocha
15
+ Mocha::Configuration.prevent(:stubbing_non_existent_method)
15
16
  end
16
17
 
17
18
  class Person < Mongoid::Document
@@ -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
- after do
476
- Person.validations.clear
477
- end
475
+ context "when defining using macros" do
476
+
477
+ after do
478
+ Person.validations.clear
479
+ end
478
480
 
479
- describe "#validates_acceptance_of" do
481
+ describe "#validates_acceptance_of" do
480
482
 
481
- it "adds the acceptance validation" do
482
- Person.class_eval do
483
- validates_acceptance_of :terms
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
- Person.validations.first.should be_a_kind_of(Validatable::ValidatesAcceptanceOf)
489
+
486
490
  end
487
491
 
488
- end
492
+ describe "#validates_associated" do
489
493
 
490
- describe "#validates_associated" do
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
- it "adds the associated validation" do
493
- Person.class_eval do
494
- validates_associated :name
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
- Person.validations.first.should be_a_kind_of(Validatable::ValidatesAssociated)
511
+
497
512
  end
498
513
 
499
- end
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
- describe "#validates_format_of" do
525
+ describe "#validates_numericality_of" do
502
526
 
503
- it "adds the format validation" do
504
- Person.class_eval do
505
- validates_format_of :title, :with => /[A-Za-z]/
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
- Person.validations.first.should be_a_kind_of(Validatable::ValidatesFormatOf)
533
+
508
534
  end
509
535
 
510
- end
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
- describe "#validates_length_of" do
547
+ describe "#validates_true_for" do
513
548
 
514
- it "adds the length validation" do
515
- Person.class_eval do
516
- validates_length_of :title, :minimum => 10
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
- Person.validations.first.should be_a_kind_of(Validatable::ValidatesLengthOf)
555
+
519
556
  end
520
557
 
521
558
  end
522
559
 
523
- describe "#validates_numericality_of" do
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
- it "adds the numericality validation" do
526
- Person.class_eval do
527
- validates_numericality_of :age
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
- Person.validations.first.should be_a_kind_of(Validatable::ValidatesNumericalityOf)
579
+
530
580
  end
531
581
 
532
- end
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
- describe "#validates_presence_of" do
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
- Person.validations.first.should be_a_kind_of(Validatable::ValidatesPresenceOf)
605
+
541
606
  end
542
607
 
543
- end
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
- describe "#validates_true_for" do
619
+ end
546
620
 
547
- it "adds the true validation" do
548
- Person.class_eval do
549
- validates_true_for :title, :logic => lambda { title == "Esquire" }
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
- Person.validations.first.should be_a_kind_of(Validatable::ValidatesTrueFor)
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.3
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-23 00:00:00 -07:00
12
+ date: 2009-09-27 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency