mongoid 0.6.3 → 0.6.4

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.3
1
+ 0.6.4
@@ -1,87 +1,104 @@
1
1
  require "mongoid/associations/decorator"
2
- require "mongoid/associations/factory"
3
- require "mongoid/associations/belongs_to_association"
4
- require "mongoid/associations/has_many_association"
5
- require "mongoid/associations/has_one_association"
2
+ require "mongoid/associations/accessor"
3
+ require "mongoid/associations/belongs_to"
4
+ require "mongoid/associations/has_many"
5
+ require "mongoid/associations/has_one"
6
6
 
7
7
  module Mongoid # :nodoc:
8
- module Associations
9
-
10
- # Adds the association back to the parent document. This macro is
11
- # necessary to set the references from the child back to the parent
12
- # document. If a child does not define this association calling
13
- # persistence methods on the child object will cause a save to fail.
14
- #
15
- # Options:
16
- #
17
- # association_name: A +Symbol+ that matches the name of the parent class.
18
- #
19
- # Example:
20
- #
21
- # class Person < Mongoid::Document
22
- # has_many :addresses
23
- # end
24
- #
25
- # class Address < Mongoid::Document
26
- # belongs_to :person
27
- # end
28
- def belongs_to(association_name)
29
- @embedded = true
30
- add_association(:belongs_to, association_name.to_s.classify, association_name)
8
+ module Associations #:nodoc:
9
+ def self.included(base)
10
+ base.class_eval do
11
+ include InstanceMethods
12
+ extend ClassMethods
13
+ end
31
14
  end
32
15
 
33
- # Adds the association from a parent document to its children. The name
34
- # of the association needs to be a pluralized form of the child class
35
- # name.
36
- #
37
- # Options:
38
- #
39
- # association_name: A +Symbol+ that is the plural child class name.
40
- #
41
- # Example:
42
- #
43
- # class Person < Mongoid::Document
44
- # has_many :addresses
45
- # end
46
- #
47
- # class Address < Mongoid::Document
48
- # belongs_to :person
49
- # end
50
- def has_many(association_name, options = {})
51
- add_association(:has_many, association_name.to_s.classify, association_name, options)
16
+ module InstanceMethods
17
+ def associations
18
+ self.class.associations
19
+ end
52
20
  end
53
21
 
54
- # Adds the association from a parent document to its child. The name
55
- # of the association needs to be a singular form of the child class
56
- # name.
57
- #
58
- # Options:
59
- #
60
- # association_name: A +Symbol+ that is the plural child class name.
61
- #
62
- # Example:
63
- #
64
- # class Person < Mongoid::Document
65
- # has_many :addresses
66
- # end
67
- #
68
- # class Address < Mongoid::Document
69
- # belongs_to :person
70
- # end
71
- def has_one(association_name, options = {})
72
- add_association(:has_one, association_name.to_s.titleize, association_name, options)
73
- end
22
+ module ClassMethods
23
+ def associations
24
+ @associations ||= HashWithIndifferentAccess.new
25
+ end
26
+ # Adds the association back to the parent document. This macro is
27
+ # necessary to set the references from the child back to the parent
28
+ # document. If a child does not define this association calling
29
+ # persistence methods on the child object will cause a save to fail.
30
+ #
31
+ # Options:
32
+ #
33
+ # association_name: A +Symbol+ that matches the name of the parent class.
34
+ #
35
+ # Example:
36
+ #
37
+ # class Person < Mongoid::Document
38
+ # has_many :addresses
39
+ # end
40
+ #
41
+ # class Address < Mongoid::Document
42
+ # belongs_to :person
43
+ # end
44
+ def belongs_to(association_name)
45
+ @embedded = true
46
+ add_association(:belongs_to, association_name.to_s.classify, association_name)
47
+ end
48
+
49
+ # Adds the association from a parent document to its children. The name
50
+ # of the association needs to be a pluralized form of the child class
51
+ # name.
52
+ #
53
+ # Options:
54
+ #
55
+ # association_name: A +Symbol+ that is the plural child class name.
56
+ #
57
+ # Example:
58
+ #
59
+ # class Person < Mongoid::Document
60
+ # has_many :addresses
61
+ # end
62
+ #
63
+ # class Address < Mongoid::Document
64
+ # belongs_to :person
65
+ # end
66
+ def has_many(association_name, options = {})
67
+ add_association(:has_many, association_name.to_s.classify, association_name, options)
68
+ end
74
69
 
75
- private
76
- # Adds the association to the associations hash with the type as the key,
77
- # then adds the accessors for the association.
78
- def add_association(type, class_name, name, options = {})
79
- define_method(name) do
80
- Associations::Factory.create(type, name, self, options)
70
+ # Adds the association from a parent document to its child. The name
71
+ # of the association needs to be a singular form of the child class
72
+ # name.
73
+ #
74
+ # Options:
75
+ #
76
+ # association_name: A +Symbol+ that is the plural child class name.
77
+ #
78
+ # Example:
79
+ #
80
+ # class Person < Mongoid::Document
81
+ # has_many :addresses
82
+ # end
83
+ #
84
+ # class Address < Mongoid::Document
85
+ # belongs_to :person
86
+ # end
87
+ def has_one(association_name, options = {})
88
+ add_association(:has_one, association_name.to_s.titleize, association_name, options)
81
89
  end
82
- define_method("#{name}=") do |object|
83
- object.parentize(self, name)
84
- @attributes[name] = object.mongoidize
90
+
91
+ private
92
+ # Adds the association to the associations hash with the type as the key,
93
+ # then adds the accessors for the association.
94
+ def add_association(type, class_name, name, options = {})
95
+ associations[name] = type
96
+ define_method(name) do
97
+ Associations::Accessor.get(type, name, self, options)
98
+ end
99
+ define_method("#{name}=") do |object|
100
+ Associations::Accessor.set(type, name, self, object, options)
101
+ end
85
102
  end
86
103
  end
87
104
  end
@@ -0,0 +1,41 @@
1
+ module Mongoid #:nodoc:
2
+ module Associations #:nodoc:
3
+ class Accessor #:nodoc:
4
+ class << self
5
+ # Gets an association, based on the type provided and
6
+ # passes the name and document into the newly instantiated
7
+ # association.
8
+ #
9
+ # If the type is invalid a InvalidAssociationError will be thrown.
10
+ def get(type, name, document, options = {})
11
+ case type
12
+ when :belongs_to then BelongsTo.new(document)
13
+ when :has_many then HasMany.new(name, document, options)
14
+ when :has_one then HasOne.new(name, document, options)
15
+ else raise InvalidAssociationError
16
+ end
17
+ end
18
+
19
+ # Set an object association. This is used to set the parent reference
20
+ # in a +BelongsTo+, a child reference in a +HasOne+, or many child
21
+ # references in a +HasMany+.
22
+ #
23
+ # Options:
24
+ #
25
+ # type: The association type
26
+ # name: The name of the association
27
+ # document: The base document to handle the access for.
28
+ # object: The object that was passed in to the setter method.
29
+ # options: optional options.
30
+ def set(type, name, document, object, options ={})
31
+ case type
32
+ when :belongs_to then BelongsTo.update(document, object)
33
+ when :has_many then HasMany.update(object, document, name)
34
+ when :has_one then HasOne.update(object, document, name)
35
+ else raise InvalidAssociationError
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,6 +1,6 @@
1
1
  module Mongoid #:nodoc:
2
2
  module Associations #:nodoc:
3
- class BelongsToAssociation #:nodoc:
3
+ class BelongsTo #:nodoc:
4
4
  include Decorator
5
5
 
6
6
  # Creates the new association by setting the internal
@@ -21,6 +21,20 @@ module Mongoid #:nodoc:
21
21
  @document
22
22
  end
23
23
 
24
+ class << self
25
+ # Perform an update of the relationship of the parent and child. This
26
+ # is initialized by setting a parent object as the association on the
27
+ # +Document+. Will properly set a has_one or a has_many.
28
+ def update(child, parent)
29
+ name = child.class.name.demodulize.downcase
30
+ if parent.associations[name]
31
+ child.parentize(parent, name)
32
+ else
33
+ child.parentize(parent, name.tableize)
34
+ end
35
+ child.notify
36
+ end
37
+ end
24
38
  end
25
39
  end
26
40
  end
@@ -1,6 +1,6 @@
1
1
  module Mongoid #:nodoc:
2
2
  module Associations #:nodoc:
3
- class HasManyAssociation < DelegateClass(Array) #:nodoc:
3
+ class HasMany < DelegateClass(Array) #:nodoc:
4
4
 
5
5
  attr_accessor :association_name
6
6
 
@@ -12,6 +12,14 @@ module Mongoid #:nodoc:
12
12
  object.is_a?(Array) ? object.each(&:notify) : object.notify
13
13
  end
14
14
 
15
+ # Clears the association, and notifies the parents of the removal.
16
+ def clear
17
+ object = @documents.first
18
+ object.changed(true)
19
+ object.notify_observers(object, true)
20
+ super
21
+ end
22
+
15
23
  # Appends the object to the +Array+, setting its parent in
16
24
  # the process.
17
25
  def push(object)
@@ -65,6 +73,19 @@ module Mongoid #:nodoc:
65
73
  super(@documents)
66
74
  end
67
75
 
76
+ class << self
77
+ # Perform an update of the relationship of the parent and child. This
78
+ # is initialized by setting the has_many to the supplied +Enumerable+
79
+ # and setting up the parentization.
80
+ def update(children, parent, name)
81
+ parent.attributes.delete(name)
82
+ children.each do |child|
83
+ child.parentize(parent, name)
84
+ child.notify
85
+ end
86
+ end
87
+ end
88
+
68
89
  end
69
90
  end
70
91
  end
@@ -1,6 +1,6 @@
1
1
  module Mongoid #:nodoc:
2
2
  module Associations #:nodoc:
3
- class HasOneAssociation #:nodoc:
3
+ class HasOne #:nodoc:
4
4
  include Decorator
5
5
 
6
6
  delegate :valid?, :to => :document
@@ -16,10 +16,19 @@ module Mongoid #:nodoc:
16
16
  klass = class_name ? class_name.constantize : name.to_s.camelize.constantize
17
17
  attributes = document.attributes[name]
18
18
  @document = klass.new(attributes)
19
- @document.parent = document
19
+ @document.parentize(document, name)
20
20
  decorate!
21
21
  end
22
22
 
23
+ class << self
24
+ # Perform an update of the relationship of the parent and child. This
25
+ # is initialized by setting the has_one to the supplied child.
26
+ def update(child, parent, name)
27
+ child.parentize(parent, name)
28
+ child.notify
29
+ end
30
+ end
31
+
23
32
  end
24
33
  end
25
34
  end
@@ -1,8 +1,7 @@
1
1
  module Mongoid #:nodoc:
2
2
  class Document
3
3
  include ActiveSupport::Callbacks
4
- include Attributes, Commands, Observable, Validatable
5
- extend Associations
4
+ include Associations, Attributes, Commands, Observable, Validatable
6
5
 
7
6
  attr_accessor :association_name, :parent
8
7
  attr_reader :attributes, :new_record
@@ -199,6 +198,10 @@ module Mongoid #:nodoc:
199
198
  generate_key
200
199
  end
201
200
 
201
+ def inspect
202
+ "Class: #{self.class.name} | Attributes: #{@attributes.inspect} | Parent: #{@parent.class.name}"
203
+ end
204
+
202
205
  # Return the +Document+ primary key.
203
206
  def primary_key
204
207
  self.class.primary_key
@@ -231,8 +234,9 @@ module Mongoid #:nodoc:
231
234
  end
232
235
 
233
236
  # Update the document based on notify from child
234
- def update(child)
235
- @attributes.insert(child.association_name, child.attributes)
237
+ def update(child, clear = false)
238
+ @attributes.insert(child.association_name, child.attributes) unless clear
239
+ @attributes.delete(child.association_name) if clear
236
240
  notify
237
241
  end
238
242
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoid}
8
- s.version = "0.6.3"
8
+ s.version = "0.6.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-11-01}
12
+ s.date = %q{2009-11-02}
13
13
  s.email = %q{durran@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.textile"
@@ -23,11 +23,11 @@ Gem::Specification.new do |s|
23
23
  "VERSION",
24
24
  "lib/mongoid.rb",
25
25
  "lib/mongoid/associations.rb",
26
- "lib/mongoid/associations/belongs_to_association.rb",
26
+ "lib/mongoid/associations/accessor.rb",
27
+ "lib/mongoid/associations/belongs_to.rb",
27
28
  "lib/mongoid/associations/decorator.rb",
28
- "lib/mongoid/associations/factory.rb",
29
- "lib/mongoid/associations/has_many_association.rb",
30
- "lib/mongoid/associations/has_one_association.rb",
29
+ "lib/mongoid/associations/has_many.rb",
30
+ "lib/mongoid/associations/has_one.rb",
31
31
  "lib/mongoid/attributes.rb",
32
32
  "lib/mongoid/commands.rb",
33
33
  "lib/mongoid/commands/create.rb",
@@ -61,11 +61,11 @@ Gem::Specification.new do |s|
61
61
  "spec/integration/mongoid/document_spec.rb",
62
62
  "spec/spec.opts",
63
63
  "spec/spec_helper.rb",
64
- "spec/unit/mongoid/associations/belongs_to_association_spec.rb",
64
+ "spec/unit/mongoid/associations/accessor_spec.rb",
65
+ "spec/unit/mongoid/associations/belongs_to_spec.rb",
65
66
  "spec/unit/mongoid/associations/decorator_spec.rb",
66
- "spec/unit/mongoid/associations/factory_spec.rb",
67
- "spec/unit/mongoid/associations/has_many_association_spec.rb",
68
- "spec/unit/mongoid/associations/has_one_association_spec.rb",
67
+ "spec/unit/mongoid/associations/has_many_spec.rb",
68
+ "spec/unit/mongoid/associations/has_one_spec.rb",
69
69
  "spec/unit/mongoid/associations_spec.rb",
70
70
  "spec/unit/mongoid/attributes_spec.rb",
71
71
  "spec/unit/mongoid/commands/create_spec.rb",
@@ -103,11 +103,11 @@ Gem::Specification.new do |s|
103
103
  s.test_files = [
104
104
  "spec/integration/mongoid/document_spec.rb",
105
105
  "spec/spec_helper.rb",
106
- "spec/unit/mongoid/associations/belongs_to_association_spec.rb",
106
+ "spec/unit/mongoid/associations/accessor_spec.rb",
107
+ "spec/unit/mongoid/associations/belongs_to_spec.rb",
107
108
  "spec/unit/mongoid/associations/decorator_spec.rb",
108
- "spec/unit/mongoid/associations/factory_spec.rb",
109
- "spec/unit/mongoid/associations/has_many_association_spec.rb",
110
- "spec/unit/mongoid/associations/has_one_association_spec.rb",
109
+ "spec/unit/mongoid/associations/has_many_spec.rb",
110
+ "spec/unit/mongoid/associations/has_one_spec.rb",
111
111
  "spec/unit/mongoid/associations_spec.rb",
112
112
  "spec/unit/mongoid/attributes_spec.rb",
113
113
  "spec/unit/mongoid/commands/create_spec.rb",
@@ -10,6 +10,23 @@ class Person < Mongoid::Document
10
10
  has_one :name
11
11
  end
12
12
 
13
+ class PetOwner < Mongoid::Document
14
+ field :title
15
+ has_one :pet
16
+ end
17
+
18
+ class Pet < Mongoid::Document
19
+ field :name
20
+ field :weight, :type => Float, :default => 0.0
21
+ has_many :vet_visits
22
+ belongs_to :pet_owner
23
+ end
24
+
25
+ class VetVisit < Mongoid::Document
26
+ field :date, :type => Date
27
+ belongs_to :pet
28
+ end
29
+
13
30
  class Address < Mongoid::Document
14
31
  field :street
15
32
  field :city
@@ -172,6 +189,24 @@ describe Mongoid::Document do
172
189
 
173
190
  end
174
191
 
192
+ context "when has many exists through a has one" do
193
+
194
+ before do
195
+ @owner = PetOwner.new(:title => "Sir")
196
+ @pet = Pet.new(:name => "Fido")
197
+ @visit = VetVisit.new(:date => Date.today)
198
+ @pet.vet_visits << @visit
199
+ @owner.pet = @pet
200
+ end
201
+
202
+ it "can clear the association" do
203
+ @owner.pet.vet_visits.size.should == 1
204
+ @owner.pet.vet_visits.clear
205
+ @owner.pet.vet_visits.size.should == 0
206
+ end
207
+
208
+ end
209
+
175
210
  context "the lot" do
176
211
 
177
212
  before do
@@ -215,6 +250,22 @@ describe Mongoid::Document do
215
250
 
216
251
  end
217
252
 
253
+ context "setting belongs_to" do
254
+
255
+ before do
256
+ @person = Person.new(:title => "Mr")
257
+ @address = Address.new(:street => "Bloomsbury Ave")
258
+ @person.save!
259
+ end
260
+
261
+ it "allows the parent reference to change" do
262
+ @address.person = @person
263
+ @address.save!
264
+ @person.addresses.first.should == @address
265
+ end
266
+
267
+ end
268
+
218
269
  context "typecasting" do
219
270
 
220
271
  before do
@@ -0,0 +1,108 @@
1
+ require File.join(File.dirname(__FILE__), "/../../../spec_helper.rb")
2
+
3
+ class Person < Mongoid::Document
4
+ field :title
5
+ has_many :addresses
6
+ has_one :name
7
+ end
8
+
9
+ class Address < Mongoid::Document
10
+ field :street
11
+ key :street
12
+ belongs_to :person
13
+ end
14
+
15
+ class Name < Mongoid::Document
16
+ field :first_name
17
+ field :last_name
18
+ key :first_name, :last_name
19
+ belongs_to :person
20
+ end
21
+
22
+ describe Mongoid::Associations::Accessor do
23
+
24
+ describe "#get" do
25
+
26
+ before do
27
+ @document = Person.new
28
+ @object = stub
29
+ end
30
+
31
+ context "when type is has_many" do
32
+
33
+ it "returns a HasMany" do
34
+ association = Mongoid::Associations::Accessor.get(:has_many, :addresses, @document)
35
+ association.should be_a_kind_of(Mongoid::Associations::HasMany)
36
+ end
37
+
38
+ end
39
+
40
+ context "when type is has_one" do
41
+
42
+ it "returns a HasOne" do
43
+ association = Mongoid::Associations::Accessor.get(:has_one, :name, @document)
44
+ association.should be_a_kind_of(Mongoid::Associations::HasOne)
45
+ end
46
+
47
+ end
48
+
49
+ context "when type is belongs_to" do
50
+
51
+ it "returns a BelongsTo" do
52
+ association = Mongoid::Associations::Accessor.get(:belongs_to, :person, @document)
53
+ association.should be_a_kind_of(Mongoid::Associations::BelongsTo)
54
+ end
55
+
56
+ end
57
+
58
+ context "when type is invalid" do
59
+
60
+ it "raises an InvalidAssociationError" do
61
+ lambda { Mongoid::Associations::Accessor.get(:something, :person, @document) }.should raise_error
62
+ end
63
+
64
+ end
65
+
66
+ end
67
+
68
+ describe "#set" do
69
+
70
+ context "when type is has_many" do
71
+
72
+ it "returns a HasMany" do
73
+ Mongoid::Associations::HasMany.expects(:update).with(@document, @object, :addresses)
74
+ Mongoid::Associations::Accessor.set(:has_many, :addresses, @document, @object)
75
+ end
76
+
77
+ end
78
+
79
+ context "when type is has_one" do
80
+
81
+ it "returns a HasOne" do
82
+ Mongoid::Associations::HasOne.expects(:update).with(@document, @object, :name)
83
+ Mongoid::Associations::Accessor.set(:has_one, :name, @document, @object)
84
+ end
85
+
86
+ end
87
+
88
+ context "when type is belongs_to" do
89
+
90
+ it "returns a BelongsTo" do
91
+ Mongoid::Associations::BelongsTo.expects(:update).with(@document, @object)
92
+ Mongoid::Associations::Accessor.set(:belongs_to, :person, @document, @object)
93
+ end
94
+
95
+ end
96
+
97
+ context "when type is invalid" do
98
+
99
+ it "raises an InvalidAssociationError" do
100
+ lambda {
101
+ Mongoid::Associations::Accessor.set(:something, :person, @document, @object)
102
+ }.should raise_error
103
+ end
104
+
105
+ end
106
+ end
107
+
108
+ end
@@ -0,0 +1,103 @@
1
+ require File.join(File.dirname(__FILE__), "/../../../spec_helper.rb")
2
+
3
+ class Person < Mongoid::Document
4
+ field :title
5
+ has_one :name
6
+ has_many :addresses
7
+ end
8
+
9
+ class Name < Mongoid::Document
10
+ field :first_name
11
+ field :last_name
12
+ key :first_name, :last_name
13
+ belongs_to :person
14
+ end
15
+
16
+ class Address < Mongoid::Document
17
+ field :street
18
+ belongs_to :person
19
+ end
20
+
21
+ describe Mongoid::Associations::BelongsTo do
22
+
23
+ describe "#update" do
24
+
25
+ context "when child is a has one" do
26
+
27
+ before do
28
+ @name = Name.new(:first_name => "Test", :last_name => "User")
29
+ @person = Person.new(:title => "Mrs")
30
+ Mongoid::Associations::BelongsTo.update(@name, @person)
31
+ end
32
+
33
+ it "updates the parent document" do
34
+ @person.name.should == @name
35
+ @person.attributes[:name].except(:_id).should ==
36
+ { "first_name" => "Test", "last_name" => "User" }
37
+ end
38
+
39
+ end
40
+
41
+ context "when child is a has many" do
42
+
43
+ before do
44
+ @address = Address.new(:street => "Broadway")
45
+ @person = Person.new(:title => "Mrs")
46
+ Mongoid::Associations::BelongsTo.update(@address, @person)
47
+ end
48
+
49
+ it "updates the parent document" do
50
+ @person.addresses.first.should == @address
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ describe "#find" do
58
+
59
+ before do
60
+ @parent = Name.new(:first_name => "Drexel")
61
+ @document = stub(:parent => @parent)
62
+ @association = Mongoid::Associations::BelongsTo.new(@document)
63
+ end
64
+
65
+ context "when finding by id" do
66
+
67
+ it "returns the document in the array with that id" do
68
+ name = @association.find(Mongo::ObjectID.new.to_s)
69
+ name.should == @parent
70
+ end
71
+
72
+ end
73
+
74
+ end
75
+
76
+ context "when decorating" do
77
+
78
+ before do
79
+ @parent = Name.new(:first_name => "Drexel")
80
+ @document = stub(:parent => @parent)
81
+ @association = Mongoid::Associations::BelongsTo.new(@document)
82
+ end
83
+
84
+ context "when getting values" do
85
+
86
+ it "delegates to the document" do
87
+ @association.first_name.should == "Drexel"
88
+ end
89
+
90
+ end
91
+
92
+ context "when setting values" do
93
+
94
+ it "delegates to the document" do
95
+ @association.first_name = "Test"
96
+ @association.first_name.should == "Test"
97
+ end
98
+
99
+ end
100
+
101
+ end
102
+
103
+ end
@@ -11,7 +11,7 @@ class Address < Mongoid::Document
11
11
  belongs_to :person
12
12
  end
13
13
 
14
- describe Mongoid::Associations::HasManyAssociation do
14
+ describe Mongoid::Associations::HasMany do
15
15
 
16
16
  before do
17
17
  @attributes = { :addresses => [
@@ -20,10 +20,29 @@ describe Mongoid::Associations::HasManyAssociation do
20
20
  @document = stub(:attributes => @attributes, :add_observer => true, :update => true)
21
21
  end
22
22
 
23
+ describe "#update" do
24
+
25
+ before do
26
+ @address = Address.new(:street => "Madison Ave")
27
+ @person = Person.new(:title => "Sir")
28
+ Mongoid::Associations::HasMany.update([@address], @person, :addresses)
29
+ end
30
+
31
+ it "parentizes the child document" do
32
+ @address.parent.should == @person
33
+ end
34
+
35
+ it "sets the attributes of the child on the parent" do
36
+ @person.attributes[:addresses].should ==
37
+ [{ "_id" => "madison-ave", "street" => "Madison Ave" }]
38
+ end
39
+
40
+ end
41
+
23
42
  describe "#[]" do
24
43
 
25
44
  before do
26
- @association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
45
+ @association = Mongoid::Associations::HasMany.new(:addresses, @document)
27
46
  end
28
47
 
29
48
  context "when the index is present in the association" do
@@ -48,7 +67,7 @@ describe Mongoid::Associations::HasManyAssociation do
48
67
  describe "#<<" do
49
68
 
50
69
  before do
51
- @association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
70
+ @association = Mongoid::Associations::HasMany.new(:addresses, @document)
52
71
  @address = Address.new
53
72
  end
54
73
 
@@ -69,7 +88,7 @@ describe Mongoid::Associations::HasManyAssociation do
69
88
  describe "#concat" do
70
89
 
71
90
  before do
72
- @association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
91
+ @association = Mongoid::Associations::HasMany.new(:addresses, @document)
73
92
  @address = Address.new
74
93
  end
75
94
 
@@ -84,7 +103,7 @@ describe Mongoid::Associations::HasManyAssociation do
84
103
  describe "#push" do
85
104
 
86
105
  before do
87
- @association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
106
+ @association = Mongoid::Associations::HasMany.new(:addresses, @document)
88
107
  @address = Address.new
89
108
  end
90
109
 
@@ -99,7 +118,7 @@ describe Mongoid::Associations::HasManyAssociation do
99
118
  describe "#build" do
100
119
 
101
120
  before do
102
- @association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
121
+ @association = Mongoid::Associations::HasMany.new(:addresses, @document)
103
122
  end
104
123
 
105
124
  it "adds a new document to the array with the suppied parameters" do
@@ -120,7 +139,7 @@ describe Mongoid::Associations::HasManyAssociation do
120
139
  describe "#find" do
121
140
 
122
141
  before do
123
- @association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
142
+ @association = Mongoid::Associations::HasMany.new(:addresses, @document)
124
143
  end
125
144
 
126
145
  context "when finding all" do
@@ -147,7 +166,7 @@ describe Mongoid::Associations::HasManyAssociation do
147
166
  context "when there are elements in the array" do
148
167
 
149
168
  before do
150
- @association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
169
+ @association = Mongoid::Associations::HasMany.new(:addresses, @document)
151
170
  end
152
171
 
153
172
  it "returns the first element" do
@@ -160,7 +179,7 @@ describe Mongoid::Associations::HasManyAssociation do
160
179
  context "when the array is empty" do
161
180
 
162
181
  before do
163
- @association = Mongoid::Associations::HasManyAssociation.new(:addresses, Person.new)
182
+ @association = Mongoid::Associations::HasMany.new(:addresses, Person.new)
164
183
  end
165
184
 
166
185
  it "returns nil" do
@@ -176,7 +195,7 @@ describe Mongoid::Associations::HasManyAssociation do
176
195
  context "#length" do
177
196
 
178
197
  it "returns the length of the delegated array" do
179
- @association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
198
+ @association = Mongoid::Associations::HasMany.new(:addresses, @document)
180
199
  @association.length.should == 2
181
200
  end
182
201
 
@@ -187,7 +206,7 @@ describe Mongoid::Associations::HasManyAssociation do
187
206
  describe "#push" do
188
207
 
189
208
  before do
190
- @association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
209
+ @association = Mongoid::Associations::HasMany.new(:addresses, @document)
191
210
  end
192
211
 
193
212
  it "appends the document to the end of the array" do
@@ -0,0 +1,69 @@
1
+ require File.join(File.dirname(__FILE__), "/../../../spec_helper.rb")
2
+
3
+ class MixedDrink < Mongoid::Document
4
+ field :name
5
+ end
6
+
7
+ class Person < Mongoid::Document
8
+ field :title
9
+ has_one :name
10
+ end
11
+
12
+ class Name < Mongoid::Document
13
+ field :first_name
14
+ key :first_name
15
+ belongs_to :person
16
+ end
17
+
18
+ describe Mongoid::Associations::HasOne do
19
+
20
+ before do
21
+ @attributes = { :mixed_drink => { :name => "Jack and Coke" } }
22
+ @document = stub(:attributes => @attributes, :update => true)
23
+ end
24
+
25
+ describe "#update" do
26
+
27
+ before do
28
+ @name = Name.new(:first_name => "Donald")
29
+ @person = Person.new(:title => "Sir")
30
+ Mongoid::Associations::HasOne.update(@name, @person, :name)
31
+ end
32
+
33
+ it "parentizes the child document" do
34
+ @name.parent.should == @person
35
+ end
36
+
37
+ it "sets the attributes of the child on the parent" do
38
+ @person.attributes[:name].should ==
39
+ { "_id" => "donald", "first_name" => "Donald" }
40
+ end
41
+
42
+ end
43
+
44
+ describe "#decorate!" do
45
+
46
+ before do
47
+ @association = Mongoid::Associations::HasOne.new(:mixed_drink, @document)
48
+ end
49
+
50
+ context "when getting values" do
51
+
52
+ it "delegates to the document" do
53
+ @association.name.should == "Jack and Coke"
54
+ end
55
+
56
+ end
57
+
58
+ context "when setting values" do
59
+
60
+ it "delegates to the document" do
61
+ @association.name = "Jack and Coke"
62
+ @association.name.should == "Jack and Coke"
63
+ end
64
+
65
+ end
66
+
67
+ end
68
+
69
+ end
@@ -79,6 +79,25 @@ describe Mongoid::Associations do
79
79
 
80
80
  end
81
81
 
82
+ context "when setting a parent" do
83
+
84
+ before do
85
+ @person = Person.new(:title => "Mr")
86
+ @address = Address.new(:street => "Picadilly Circus")
87
+ @address.person = @person
88
+ end
89
+
90
+ it "re-parentizes the association" do
91
+ @address.parent.should == @person
92
+ end
93
+
94
+ it "adds the child attributes to the parent" do
95
+ @person.attributes[:addresses].should ==
96
+ [{ "_id" => "picadilly-circus", "street" => "Picadilly Circus" }]
97
+ end
98
+
99
+ end
100
+
82
101
  end
83
102
 
84
103
  describe "#belongs_to" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.6.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-11-01 00:00:00 -04:00
12
+ date: 2009-11-02 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -79,11 +79,11 @@ files:
79
79
  - VERSION
80
80
  - lib/mongoid.rb
81
81
  - lib/mongoid/associations.rb
82
- - lib/mongoid/associations/belongs_to_association.rb
82
+ - lib/mongoid/associations/accessor.rb
83
+ - lib/mongoid/associations/belongs_to.rb
83
84
  - lib/mongoid/associations/decorator.rb
84
- - lib/mongoid/associations/factory.rb
85
- - lib/mongoid/associations/has_many_association.rb
86
- - lib/mongoid/associations/has_one_association.rb
85
+ - lib/mongoid/associations/has_many.rb
86
+ - lib/mongoid/associations/has_one.rb
87
87
  - lib/mongoid/attributes.rb
88
88
  - lib/mongoid/commands.rb
89
89
  - lib/mongoid/commands/create.rb
@@ -117,11 +117,11 @@ files:
117
117
  - spec/integration/mongoid/document_spec.rb
118
118
  - spec/spec.opts
119
119
  - spec/spec_helper.rb
120
- - spec/unit/mongoid/associations/belongs_to_association_spec.rb
120
+ - spec/unit/mongoid/associations/accessor_spec.rb
121
+ - spec/unit/mongoid/associations/belongs_to_spec.rb
121
122
  - spec/unit/mongoid/associations/decorator_spec.rb
122
- - spec/unit/mongoid/associations/factory_spec.rb
123
- - spec/unit/mongoid/associations/has_many_association_spec.rb
124
- - spec/unit/mongoid/associations/has_one_association_spec.rb
123
+ - spec/unit/mongoid/associations/has_many_spec.rb
124
+ - spec/unit/mongoid/associations/has_one_spec.rb
125
125
  - spec/unit/mongoid/associations_spec.rb
126
126
  - spec/unit/mongoid/attributes_spec.rb
127
127
  - spec/unit/mongoid/commands/create_spec.rb
@@ -181,11 +181,11 @@ summary: ODM framework for MongoDB
181
181
  test_files:
182
182
  - spec/integration/mongoid/document_spec.rb
183
183
  - spec/spec_helper.rb
184
- - spec/unit/mongoid/associations/belongs_to_association_spec.rb
184
+ - spec/unit/mongoid/associations/accessor_spec.rb
185
+ - spec/unit/mongoid/associations/belongs_to_spec.rb
185
186
  - spec/unit/mongoid/associations/decorator_spec.rb
186
- - spec/unit/mongoid/associations/factory_spec.rb
187
- - spec/unit/mongoid/associations/has_many_association_spec.rb
188
- - spec/unit/mongoid/associations/has_one_association_spec.rb
187
+ - spec/unit/mongoid/associations/has_many_spec.rb
188
+ - spec/unit/mongoid/associations/has_one_spec.rb
189
189
  - spec/unit/mongoid/associations_spec.rb
190
190
  - spec/unit/mongoid/attributes_spec.rb
191
191
  - spec/unit/mongoid/commands/create_spec.rb
@@ -1,21 +0,0 @@
1
- module Mongoid #:nodoc:
2
- module Associations #:nodoc:
3
- class Factory #:nodoc:
4
-
5
- # Creates a new association, based on the type provided and
6
- # passes the name and document into the newly instantiated
7
- # association.
8
- #
9
- # If the type is invalid a InvalidAssociationError will be thrown.
10
- def self.create(association_type, association_name, document, options = {})
11
- case association_type
12
- when :belongs_to then BelongsToAssociation.new(document)
13
- when :has_many then HasManyAssociation.new(association_name, document, options)
14
- when :has_one then HasOneAssociation.new(association_name, document, options)
15
- else raise InvalidAssociationError
16
- end
17
- end
18
-
19
- end
20
- end
21
- end
@@ -1,59 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "/../../../spec_helper.rb")
2
-
3
- class Name < Mongoid::Document
4
- field :first_name
5
- field :last_name
6
- key :first_name, :last_name
7
- belongs_to :person
8
- end
9
-
10
- describe Mongoid::Associations::BelongsToAssociation do
11
-
12
- before do
13
- @parent = Name.new(:first_name => "Drexel")
14
- @document = stub(:parent => @parent)
15
- end
16
-
17
- describe "#find" do
18
-
19
- before do
20
- @association = Mongoid::Associations::BelongsToAssociation.new(@document)
21
- end
22
-
23
- context "when finding by id" do
24
-
25
- it "returns the document in the array with that id" do
26
- name = @association.find(Mongo::ObjectID.new.to_s)
27
- name.should == @parent
28
- end
29
-
30
- end
31
-
32
- end
33
-
34
- context "when decorating" do
35
-
36
- before do
37
- @association = Mongoid::Associations::BelongsToAssociation.new(@document)
38
- end
39
-
40
- context "when getting values" do
41
-
42
- it "delegates to the document" do
43
- @association.first_name.should == "Drexel"
44
- end
45
-
46
- end
47
-
48
- context "when setting values" do
49
-
50
- it "delegates to the document" do
51
- @association.first_name = "Test"
52
- @association.first_name.should == "Test"
53
- end
54
-
55
- end
56
-
57
- end
58
-
59
- end
@@ -1,67 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "/../../../spec_helper.rb")
2
-
3
- class Person < Mongoid::Document
4
- field :title
5
- has_many :addresses
6
- has_one :name
7
- end
8
-
9
- class Address < Mongoid::Document
10
- field :street
11
- key :street
12
- belongs_to :person
13
- end
14
-
15
- class Name < Mongoid::Document
16
- field :first_name
17
- field :last_name
18
- key :first_name, :last_name
19
- belongs_to :person
20
- end
21
-
22
- describe Mongoid::Associations::Factory do
23
-
24
- describe "#create" do
25
-
26
- before do
27
- @document = Person.new
28
- end
29
-
30
- context "when type is has_many" do
31
-
32
- it "returns a HasManyAssociationProxy" do
33
- association = Mongoid::Associations::Factory.create(:has_many, :addresses, @document)
34
- association.should be_a_kind_of(Mongoid::Associations::HasManyAssociation)
35
- end
36
-
37
- end
38
-
39
- context "when type is has_one" do
40
-
41
- it "returns a HashOneAssociationProxy" do
42
- association = Mongoid::Associations::Factory.create(:has_one, :name, @document)
43
- association.should be_a_kind_of(Mongoid::Associations::HasOneAssociation)
44
- end
45
-
46
- end
47
-
48
- context "when type is belongs_to" do
49
-
50
- it "returns a BelongsToAssociationProxy" do
51
- association = Mongoid::Associations::Factory.create(:belongs_to, :person, @document)
52
- association.should be_a_kind_of(Mongoid::Associations::BelongsToAssociation)
53
- end
54
-
55
- end
56
-
57
- context "when type is invalid" do
58
-
59
- it "raises an InvalidAssociationError" do
60
- lambda { Mongoid::Associations::Factory.create(:something, :person, @document) }.should raise_error
61
- end
62
-
63
- end
64
-
65
- end
66
-
67
- end
@@ -1,39 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "/../../../spec_helper.rb")
2
-
3
- class MixedDrink < Mongoid::Document
4
- field :name
5
- end
6
-
7
- describe Mongoid::Associations::HasOneAssociation do
8
-
9
- before do
10
- @attributes = { :mixed_drink => { :name => "Jack and Coke" } }
11
- @document = stub(:attributes => @attributes)
12
- end
13
-
14
- describe "#decorate!" do
15
-
16
- before do
17
- @association = Mongoid::Associations::HasOneAssociation.new(:mixed_drink, @document)
18
- end
19
-
20
- context "when getting values" do
21
-
22
- it "delegates to the document" do
23
- @association.name.should == "Jack and Coke"
24
- end
25
-
26
- end
27
-
28
- context "when setting values" do
29
-
30
- it "delegates to the document" do
31
- @association.name = "Jack and Coke"
32
- @association.name.should == "Jack and Coke"
33
- end
34
-
35
- end
36
-
37
- end
38
-
39
- end