mongoid 2.0.0.alpha → 2.0.0.beta.5

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.
Files changed (216) hide show
  1. data/lib/mongoid.rb +11 -5
  2. data/lib/mongoid/associations.rb +112 -107
  3. data/lib/mongoid/associations/belongs_to_related.rb +2 -3
  4. data/lib/mongoid/associations/embedded_in.rb +12 -4
  5. data/lib/mongoid/associations/{embed_many.rb → embeds_many.rb} +101 -32
  6. data/lib/mongoid/associations/{embed_one.rb → embeds_one.rb} +10 -10
  7. data/lib/mongoid/associations/has_many_related.rb +51 -5
  8. data/lib/mongoid/associations/has_one_related.rb +9 -5
  9. data/lib/mongoid/associations/meta_data.rb +2 -1
  10. data/lib/mongoid/associations/options.rb +15 -6
  11. data/lib/mongoid/associations/proxy.rb +14 -21
  12. data/lib/mongoid/attributes.rb +34 -13
  13. data/lib/mongoid/callbacks.rb +1 -2
  14. data/lib/mongoid/collection.rb +4 -3
  15. data/lib/mongoid/collections.rb +41 -0
  16. data/lib/mongoid/collections/master.rb +3 -2
  17. data/lib/mongoid/collections/slaves.rb +3 -2
  18. data/lib/mongoid/components.rb +4 -1
  19. data/lib/mongoid/config.rb +163 -13
  20. data/lib/mongoid/contexts.rb +1 -2
  21. data/lib/mongoid/contexts/enumerable.rb +1 -1
  22. data/lib/mongoid/contexts/mongo.rb +1 -1
  23. data/lib/mongoid/contexts/paging.rb +10 -2
  24. data/lib/mongoid/criteria.rb +13 -22
  25. data/lib/mongoid/criterion/exclusion.rb +3 -3
  26. data/lib/mongoid/criterion/inclusion.rb +17 -0
  27. data/lib/mongoid/criterion/optional.rb +1 -1
  28. data/lib/mongoid/dirty.rb +253 -0
  29. data/lib/mongoid/document.rb +40 -85
  30. data/lib/mongoid/errors.rb +48 -1
  31. data/lib/mongoid/extensions.rb +11 -9
  32. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  33. data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
  34. data/lib/mongoid/extensions/date/conversions.rb +13 -4
  35. data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
  36. data/lib/mongoid/extensions/float/conversions.rb +5 -1
  37. data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
  38. data/lib/mongoid/extensions/hash/conversions.rb +34 -4
  39. data/lib/mongoid/extensions/integer/conversions.rb +5 -1
  40. data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
  41. data/lib/mongoid/extensions/object/conversions.rb +3 -3
  42. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  43. data/lib/mongoid/extensions/symbol/inflections.rb +5 -2
  44. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  45. data/lib/mongoid/factory.rb +2 -1
  46. data/lib/mongoid/field.rb +15 -2
  47. data/lib/mongoid/fields.rb +1 -1
  48. data/lib/mongoid/identity.rb +3 -3
  49. data/lib/mongoid/indexes.rb +3 -3
  50. data/lib/mongoid/matchers.rb +1 -2
  51. data/lib/mongoid/memoization.rb +8 -2
  52. data/lib/mongoid/named_scope.rb +0 -5
  53. data/lib/mongoid/observable.rb +1 -1
  54. data/lib/mongoid/paths.rb +30 -22
  55. data/lib/mongoid/persistence.rb +218 -0
  56. data/lib/mongoid/persistence/command.rb +39 -0
  57. data/lib/mongoid/persistence/insert.rb +47 -0
  58. data/lib/mongoid/persistence/insert_embedded.rb +38 -0
  59. data/lib/mongoid/persistence/remove.rb +39 -0
  60. data/lib/mongoid/persistence/remove_all.rb +37 -0
  61. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  62. data/lib/mongoid/persistence/update.rb +63 -0
  63. data/lib/mongoid/railtie.rb +53 -0
  64. data/lib/mongoid/railties/database.rake +37 -0
  65. data/lib/mongoid/timestamps.rb +2 -2
  66. data/lib/mongoid/validations.rb +2 -2
  67. data/lib/mongoid/validations/associated.rb +2 -2
  68. data/lib/mongoid/validations/uniqueness.rb +13 -2
  69. data/lib/mongoid/version.rb +4 -0
  70. data/lib/mongoid/versioning.rb +3 -2
  71. data/lib/rails/generators/mongoid/config/config_generator.rb +41 -0
  72. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
  73. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  74. data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
  75. data/lib/rails/generators/mongoid_generator.rb +61 -0
  76. metadata +76 -301
  77. data/.gitignore +0 -6
  78. data/.watchr +0 -29
  79. data/Rakefile +0 -52
  80. data/VERSION +0 -1
  81. data/caliper.yml +0 -4
  82. data/lib/mongoid/collections/mimic.rb +0 -46
  83. data/lib/mongoid/commands.rb +0 -161
  84. data/lib/mongoid/commands/create.rb +0 -19
  85. data/lib/mongoid/commands/delete.rb +0 -16
  86. data/lib/mongoid/commands/delete_all.rb +0 -23
  87. data/lib/mongoid/commands/deletion.rb +0 -18
  88. data/lib/mongoid/commands/destroy.rb +0 -17
  89. data/lib/mongoid/commands/destroy_all.rb +0 -23
  90. data/lib/mongoid/commands/save.rb +0 -29
  91. data/lib/mongoid/extensions/time/conversions.rb +0 -18
  92. data/mongoid.gemspec +0 -408
  93. data/perf/benchmark.rb +0 -77
  94. data/spec/integration/mongoid/associations_spec.rb +0 -340
  95. data/spec/integration/mongoid/attributes_spec.rb +0 -22
  96. data/spec/integration/mongoid/commands_spec.rb +0 -227
  97. data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
  98. data/spec/integration/mongoid/criteria_spec.rb +0 -272
  99. data/spec/integration/mongoid/document_spec.rb +0 -650
  100. data/spec/integration/mongoid/extensions_spec.rb +0 -22
  101. data/spec/integration/mongoid/finders_spec.rb +0 -119
  102. data/spec/integration/mongoid/inheritance_spec.rb +0 -137
  103. data/spec/integration/mongoid/named_scope_spec.rb +0 -46
  104. data/spec/models/address.rb +0 -39
  105. data/spec/models/animal.rb +0 -6
  106. data/spec/models/callbacks.rb +0 -18
  107. data/spec/models/comment.rb +0 -8
  108. data/spec/models/country_code.rb +0 -6
  109. data/spec/models/employer.rb +0 -5
  110. data/spec/models/game.rb +0 -7
  111. data/spec/models/inheritance.rb +0 -56
  112. data/spec/models/location.rb +0 -5
  113. data/spec/models/mixed_drink.rb +0 -4
  114. data/spec/models/name.rb +0 -13
  115. data/spec/models/namespacing.rb +0 -11
  116. data/spec/models/patient.rb +0 -4
  117. data/spec/models/person.rb +0 -99
  118. data/spec/models/pet.rb +0 -7
  119. data/spec/models/pet_owner.rb +0 -6
  120. data/spec/models/phone.rb +0 -7
  121. data/spec/models/post.rb +0 -15
  122. data/spec/models/translation.rb +0 -5
  123. data/spec/models/vet_visit.rb +0 -5
  124. data/spec/spec.opts +0 -3
  125. data/spec/spec_helper.rb +0 -31
  126. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
  127. data/spec/unit/mongoid/associations/embed_many_spec.rb +0 -516
  128. data/spec/unit/mongoid/associations/embed_one_spec.rb +0 -282
  129. data/spec/unit/mongoid/associations/embedded_in_spec.rb +0 -193
  130. data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -418
  131. data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
  132. data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
  133. data/spec/unit/mongoid/associations/options_spec.rb +0 -192
  134. data/spec/unit/mongoid/associations_spec.rb +0 -595
  135. data/spec/unit/mongoid/attributes_spec.rb +0 -507
  136. data/spec/unit/mongoid/callbacks_spec.rb +0 -55
  137. data/spec/unit/mongoid/collection_spec.rb +0 -187
  138. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
  139. data/spec/unit/mongoid/collections/master_spec.rb +0 -41
  140. data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
  141. data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
  142. data/spec/unit/mongoid/commands/create_spec.rb +0 -31
  143. data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
  144. data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
  145. data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -21
  146. data/spec/unit/mongoid/commands/destroy_spec.rb +0 -51
  147. data/spec/unit/mongoid/commands/save_spec.rb +0 -107
  148. data/spec/unit/mongoid/commands_spec.rb +0 -270
  149. data/spec/unit/mongoid/config_spec.rb +0 -172
  150. data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
  151. data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
  152. data/spec/unit/mongoid/contexts_spec.rb +0 -25
  153. data/spec/unit/mongoid/criteria_spec.rb +0 -824
  154. data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
  155. data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
  156. data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
  157. data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
  158. data/spec/unit/mongoid/cursor_spec.rb +0 -74
  159. data/spec/unit/mongoid/deprecation_spec.rb +0 -24
  160. data/spec/unit/mongoid/document_spec.rb +0 -818
  161. data/spec/unit/mongoid/errors_spec.rb +0 -103
  162. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
  163. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
  164. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
  165. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
  166. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
  167. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
  168. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
  169. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
  170. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -67
  171. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
  172. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
  173. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
  174. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
  175. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
  176. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
  177. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
  178. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
  179. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
  180. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
  181. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
  182. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
  183. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
  184. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
  185. data/spec/unit/mongoid/extras_spec.rb +0 -102
  186. data/spec/unit/mongoid/factory_spec.rb +0 -31
  187. data/spec/unit/mongoid/field_spec.rb +0 -143
  188. data/spec/unit/mongoid/fields_spec.rb +0 -181
  189. data/spec/unit/mongoid/finders_spec.rb +0 -404
  190. data/spec/unit/mongoid/identity_spec.rb +0 -109
  191. data/spec/unit/mongoid/indexes_spec.rb +0 -93
  192. data/spec/unit/mongoid/javascript_spec.rb +0 -48
  193. data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
  194. data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
  195. data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
  196. data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
  197. data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
  198. data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
  199. data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
  200. data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
  201. data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
  202. data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
  203. data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
  204. data/spec/unit/mongoid/matchers_spec.rb +0 -329
  205. data/spec/unit/mongoid/memoization_spec.rb +0 -75
  206. data/spec/unit/mongoid/named_scope_spec.rb +0 -123
  207. data/spec/unit/mongoid/observable_spec.rb +0 -46
  208. data/spec/unit/mongoid/paths_spec.rb +0 -124
  209. data/spec/unit/mongoid/scope_spec.rb +0 -240
  210. data/spec/unit/mongoid/state_spec.rb +0 -83
  211. data/spec/unit/mongoid/timestamps_spec.rb +0 -25
  212. data/spec/unit/mongoid/validations/associated_spec.rb +0 -103
  213. data/spec/unit/mongoid/validations/uniqueness_spec.rb +0 -47
  214. data/spec/unit/mongoid/validations_spec.rb +0 -190
  215. data/spec/unit/mongoid/versioning_spec.rb +0 -41
  216. data/spec/unit/mongoid_spec.rb +0 -46
@@ -1,5 +0,0 @@
1
- class Location
2
- include Mongoid::Document
3
- field :name
4
- embedded_in :address, :inverse_of => :locations
5
- end
@@ -1,4 +0,0 @@
1
- class MixedDrink
2
- include Mongoid::Document
3
- field :name
4
- end
@@ -1,13 +0,0 @@
1
- class Name
2
- include Mongoid::Document
3
- field :first_name
4
- field :last_name
5
- field :parent_title
6
- key :first_name, :last_name
7
- embed_many :translations
8
- embedded_in :person, :inverse_of => :name
9
-
10
- def set_parent=(set = false)
11
- self.parent_title = person.title if set
12
- end
13
- end
@@ -1,11 +0,0 @@
1
- module Medical
2
- class Patient
3
- include Mongoid::Document
4
- field :name
5
- embed_many :prescriptions, :class_name => "Medical::Prescription"
6
- end
7
- class Prescription
8
- include Mongoid::Document
9
- field :name
10
- end
11
- end
@@ -1,4 +0,0 @@
1
- class Patient
2
- include Mongoid::Document
3
- store_in :inpatient
4
- end
@@ -1,99 +0,0 @@
1
- class Person
2
- include Mongoid::Document
3
- include Mongoid::Timestamps
4
-
5
- field :title
6
- field :terms, :type => Boolean
7
- field :pets, :type => Boolean, :default => false
8
- field :age, :type => Integer, :default => 100
9
- field :dob, :type => Date
10
- field :mixed_drink, :type => MixedDrink
11
- field :employer_id
12
- field :lunch_time, :type => Time
13
- field :aliases, :type => Array
14
- field :map, :type => Hash
15
- field :score, :type => Integer
16
- field :blood_alcohol_content, :type => Float, :default => lambda{ 0.0 }
17
- field :ssn
18
- field :owner_id, :accessible => false, :type => Integer
19
-
20
- index :age
21
- index :addresses
22
- index :dob
23
- index :name
24
- index :title
25
- index :ssn, :unique => true
26
-
27
- attr_reader :rescored
28
-
29
- embed_many :addresses do
30
- def extension
31
- "Testing"
32
- end
33
- def find_by_street(street)
34
- @target.select { |doc| doc.street == street }
35
- end
36
- end
37
-
38
- embed_many :phone_numbers, :class_name => "Phone"
39
-
40
- embed_one :name do
41
- def extension
42
- "Testing"
43
- end
44
- def dawkins?
45
- first_name == "Richard" && last_name == "Dawkins"
46
- end
47
- end
48
-
49
- embed_one :pet, :class_name => "Animal"
50
-
51
- accepts_nested_attributes_for :addresses, :reject_if => lambda { |attrs| attrs["street"].blank? }
52
- accepts_nested_attributes_for :name
53
-
54
- has_one_related :game do
55
- def extension
56
- "Testing"
57
- end
58
- end
59
-
60
- has_many_related :posts do
61
- def extension
62
- "Testing"
63
- end
64
- end
65
-
66
- def score_with_rescoring=(score)
67
- @rescored = score.to_i + 20
68
- self.score_without_rescoring = score
69
- end
70
-
71
- alias_method_chain :score=, :rescoring
72
-
73
- def update_addresses
74
- addresses.each do |address|
75
- address.street = "Updated Address"
76
- end
77
- end
78
-
79
- def employer=(emp)
80
- self.employer_id = emp.id
81
- end
82
-
83
- class << self
84
- def accepted
85
- criteria.where(:terms => true)
86
- end
87
- def knight
88
- criteria.where(:title => "Sir")
89
- end
90
- def old
91
- criteria.where(:age => { "$gt" => 50 })
92
- end
93
- end
94
-
95
- end
96
-
97
- class Doctor < Person
98
- field :specialty
99
- end
@@ -1,7 +0,0 @@
1
- class Pet
2
- include Mongoid::Document
3
- field :name
4
- field :weight, :type => Float, :default => 0.0
5
- embed_many :vet_visits
6
- embedded_in :pet_owner, :inverse_of => :pet
7
- end
@@ -1,6 +0,0 @@
1
- class PetOwner
2
- include Mongoid::Document
3
- field :title
4
- embed_one :pet
5
- embed_one :address
6
- end
@@ -1,7 +0,0 @@
1
- class Phone
2
- include Mongoid::Document
3
- field :number
4
- key :number
5
- embed_one :country_code
6
- embedded_in :person, :inverse_of => :phone_numbers
7
- end
@@ -1,15 +0,0 @@
1
- class Post
2
- include Mongoid::Document
3
- include Mongoid::Versioning
4
- include Mongoid::Timestamps
5
- field :title
6
- belongs_to_related :person
7
-
8
- named_scope :recent, where(:created_at => { "$lt" => Time.now, "$gt" => 30.days.ago })
9
-
10
- class << self
11
- def old
12
- where(:created_at => { "$lt" => 30.days.ago })
13
- end
14
- end
15
- end
@@ -1,5 +0,0 @@
1
- class Translation
2
- include Mongoid::Document
3
- field :language
4
- embedded_in :name, :inverse_of => :translations
5
- end
@@ -1,5 +0,0 @@
1
- class VetVisit
2
- include Mongoid::Document
3
- field :date, :type => Date
4
- embedded_in :pet, :inverse_of => :vet_visits
5
- end
@@ -1,3 +0,0 @@
1
- --colour
2
- --format nested
3
- --drb
@@ -1,31 +0,0 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
-
4
- MODELS = File.join(File.dirname(__FILE__), "models")
5
- $LOAD_PATH.unshift(MODELS)
6
-
7
- require 'rubygems'
8
-
9
- gem "mocha", ">= 0.9.8"
10
-
11
- require "mongoid"
12
- require "mocha"
13
- require "spec"
14
-
15
- Mongoid.configure do |config|
16
- name = "mongoid_test"
17
- host = "localhost"
18
- config.master = Mongo::Connection.new.db(name)
19
- # config.slaves = [
20
- # Mongo::Connection.new(host, 27018, :slave_ok => true).db(name)
21
- # ]
22
- end
23
-
24
- Dir[ File.join(MODELS, "*.rb") ].sort.each { |file| require File.basename(file) }
25
-
26
- Spec::Runner.configure do |config|
27
- config.mock_with :mocha
28
- config.after :suite do
29
- Mongoid.master.collections.each(&:drop)
30
- end
31
- end
@@ -1,145 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Associations::BelongsToRelated do
4
-
5
- describe ".initialize" do
6
-
7
- context "when related id has been set" do
8
-
9
- before do
10
- @document = stub(:person_id => "5")
11
- @options = Mongoid::Associations::Options.new(:name => :person)
12
- @related = stub
13
- end
14
-
15
- it "finds the object by id" do
16
- Person.expects(:find).with(@document.person_id).returns(@related)
17
- association = Mongoid::Associations::BelongsToRelated.new(@document, "5", @options)
18
- association.should == @related
19
- end
20
-
21
- end
22
-
23
- context "when options have an extension" do
24
-
25
- before do
26
- @document = stub(:person_id => "5")
27
- @block = Proc.new {
28
- def extension
29
- "Testing"
30
- end
31
- }
32
- @options = Mongoid::Associations::Options.new(:name => :person, :extend => @block)
33
- @related = stub
34
- Person.expects(:find).with(@document.person_id).returns(@related)
35
- @association = Mongoid::Associations::BelongsToRelated.new(@document, "5", @options)
36
- end
37
-
38
- it "adds the extension module" do
39
- @association.extension.should == "Testing"
40
- end
41
-
42
- end
43
-
44
- end
45
-
46
- describe ".instantiate" do
47
-
48
- context "when foreign key is not nil" do
49
-
50
- before do
51
- @document = stub(:person_id => "5")
52
- @options = Mongoid::Associations::Options.new(:name => :person)
53
- end
54
-
55
- it "delegates to new" do
56
- Mongoid::Associations::BelongsToRelated.expects(:new).with(@document, "5", @options, nil)
57
- Mongoid::Associations::BelongsToRelated.instantiate(@document, @options)
58
- end
59
-
60
- end
61
-
62
- context "when foreign key is nil" do
63
-
64
- before do
65
- @document = stub(:person_id => nil)
66
- @options = Mongoid::Associations::Options.new(:name => :person)
67
- end
68
-
69
- it "returns nil" do
70
- Mongoid::Associations::BelongsToRelated.instantiate(@document, @options).should be_nil
71
- end
72
-
73
- end
74
-
75
- end
76
-
77
- describe "#method_missing" do
78
-
79
- before do
80
- @person = Person.new(:title => "Mr")
81
- @document = stub(:person_id => "5")
82
- @options = Mongoid::Associations::Options.new(:name => :person)
83
- Person.expects(:find).with(@document.person_id).returns(@person)
84
- @association = Mongoid::Associations::BelongsToRelated.new(@document, "5", @options)
85
- end
86
-
87
- context "when getting values" do
88
-
89
- it "delegates to the document" do
90
- @association.title.should == "Mr"
91
- end
92
-
93
- end
94
-
95
- context "when setting values" do
96
-
97
- it "delegates to the document" do
98
- @association.title = "Sir"
99
- @association.title.should == "Sir"
100
- end
101
-
102
- end
103
-
104
- end
105
-
106
- describe ".macro" do
107
-
108
- it "returns :belongs_to_related" do
109
- Mongoid::Associations::BelongsToRelated.macro.should == :belongs_to_related
110
- end
111
-
112
- end
113
-
114
- describe ".update" do
115
-
116
- before do
117
- @related = stub(:id => "5")
118
- @child = Game.new
119
- @options = Mongoid::Associations::Options.new(:name => :person)
120
- @association = Mongoid::Associations::BelongsToRelated.update(@related, @child, @options)
121
- end
122
-
123
- it "sets the related object id on the parent" do
124
- @child.person_id.should == "5"
125
- end
126
-
127
- it "returns the proxy" do
128
- @association.target.should == @related
129
- end
130
-
131
- context "when target is nil" do
132
-
133
- it "returns nil" do
134
- Mongoid::Associations::BelongsToRelated.update(nil, @child, @options).should be_nil
135
- end
136
-
137
- it "removes the association" do
138
- Mongoid::Associations::BelongsToRelated.update(nil, @child, @options)
139
- @child.person.should be_nil
140
- end
141
- end
142
-
143
- end
144
-
145
- end
@@ -1,516 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Associations::EmbedMany do
4
-
5
- before do
6
- @attributes = { "addresses" => [
7
- { "_id" => "street-1", "street" => "Street 1", "state" => "CA" },
8
- { "_id" => "street-2", "street" => "Street 2" } ] }
9
- @document = stub(:raw_attributes => @attributes, :add_observer => true, :update => true)
10
- end
11
-
12
- describe "#[]" do
13
-
14
- before do
15
- @association = Mongoid::Associations::EmbedMany.new(
16
- @document,
17
- Mongoid::Associations::Options.new(:name => :addresses)
18
- )
19
- end
20
-
21
- context "when the index is present in the association" do
22
-
23
- it "returns the document at the index" do
24
- @association[0].should be_a_kind_of(Address)
25
- @association[0].street.should == "Street 1"
26
- end
27
-
28
- end
29
-
30
- context "when the index is not present in the association" do
31
-
32
- it "returns nil" do
33
- @association[3].should be_nil
34
- end
35
-
36
- end
37
-
38
- end
39
-
40
- describe "#<<" do
41
-
42
- before do
43
- @association = Mongoid::Associations::EmbedMany.new(
44
- @document,
45
- Mongoid::Associations::Options.new(:name => :addresses)
46
- )
47
- @address = Address.new
48
- end
49
-
50
- it "adds the parent document before appending to the array" do
51
- @association << @address
52
- @association.length.should == 3
53
- @address._parent.should == @document
54
- end
55
-
56
- it "allows multiple additions" do
57
- @association << @address
58
- @association << @address
59
- @association.length.should == 4
60
- end
61
-
62
- end
63
-
64
- describe "#build" do
65
-
66
- context "setting the parent relationship" do
67
-
68
- before do
69
- @person = Person.new
70
- end
71
-
72
- it "happens before any other operation" do
73
- address = @person.addresses.build(:set_parent => true, :street => "Madison Ave")
74
- address._parent.should == @person
75
- @person.addresses.first.should == address
76
- end
77
-
78
- end
79
-
80
- context "when a type is not provided" do
81
-
82
- before do
83
- @association = Mongoid::Associations::EmbedMany.new(
84
- @document,
85
- Mongoid::Associations::Options.new(:name => :addresses)
86
- )
87
- end
88
-
89
- it "adds a new document to the array with the suppied parameters" do
90
- @association.build({ :street => "Street 1" })
91
- @association.length.should == 3
92
- @association[2].should be_a_kind_of(Address)
93
- @association[2].street.should == "Street 1"
94
- end
95
-
96
- it "returns the newly built object in the association" do
97
- address = @association.build({ :street => "Yet Another" })
98
- address.should be_a_kind_of(Address)
99
- address.street.should == "Yet Another"
100
- end
101
-
102
- end
103
-
104
- context "when a type is provided" do
105
-
106
- before do
107
- @association = Mongoid::Associations::EmbedMany.new(
108
- @document,
109
- Mongoid::Associations::Options.new(:name => :shapes)
110
- )
111
- end
112
-
113
- it "instantiates a class of the type" do
114
- circle = @association.build({ :radius => 100 }, Circle)
115
- circle.should be_a_kind_of(Circle)
116
- circle.radius.should == 100
117
- end
118
-
119
- end
120
-
121
- end
122
-
123
- describe "#create" do
124
-
125
- context "when a type is not provided" do
126
-
127
- before do
128
- @association = Mongoid::Associations::EmbedMany.new(
129
- @document,
130
- Mongoid::Associations::Options.new(:name => :addresses)
131
- )
132
- @address = mock(:parentize => true, :write_attributes => true)
133
- Address.expects(:instantiate).returns(@address)
134
- @address.expects(:run_callbacks).with(:create).yields
135
- end
136
-
137
- it "builds and saves a new object" do
138
- @address.expects(:save).returns(true)
139
- address = @association.create({ :street => "Yet Another" })
140
- address.should == @address
141
- end
142
-
143
- end
144
-
145
- context "when a type is provided" do
146
-
147
- before do
148
- @association = Mongoid::Associations::EmbedMany.new(
149
- @document,
150
- Mongoid::Associations::Options.new(:name => :shapes)
151
- )
152
- @circle = mock(:parentize => true, :write_attributes => true)
153
- Circle.expects(:instantiate).returns(@circle)
154
- @circle.expects(:run_callbacks).with(:create).yields
155
- end
156
-
157
- it "instantiates a class of that type" do
158
- @circle.expects(:save).returns(true)
159
- circle = @association.create({ :radius => 100 }, Circle)
160
- circle.should == @circle
161
- end
162
-
163
- end
164
-
165
- end
166
-
167
- describe "#create!" do
168
-
169
- context "when validations pass" do
170
-
171
- before do
172
- @association = Mongoid::Associations::EmbedMany.new(
173
- @document,
174
- Mongoid::Associations::Options.new(:name => :addresses)
175
- )
176
- @address = mock(:parentize => true, :write_attributes => true, :errors => [])
177
- Address.expects(:instantiate).returns(@address)
178
- @address.expects(:run_callbacks).with(:create).yields
179
- end
180
-
181
- it "builds and saves a new object" do
182
- @address.expects(:save).returns(true)
183
- address = @association.create!({ :street => "Yet Another" })
184
- address.should == @address
185
- end
186
- end
187
-
188
- context "when validations fail" do
189
-
190
- before do
191
- @association = Mongoid::Associations::EmbedMany.new(
192
- @document,
193
- Mongoid::Associations::Options.new(:name => :addresses)
194
- )
195
- @address = mock(:parentize => true, :write_attributes => true, :errors => [ "test" ])
196
- Address.expects(:instantiate).returns(@address)
197
- @address.expects(:run_callbacks).with(:create).yields
198
- end
199
-
200
- it "builds and saves a new object" do
201
- @address.expects(:save).returns(false)
202
- lambda {
203
- @association.create!({ :street => "Yet Another" })
204
- }.should raise_error(Mongoid::Errors::Validations)
205
- end
206
- end
207
- end
208
-
209
- describe "#concat" do
210
-
211
- before do
212
- @association = Mongoid::Associations::EmbedMany.new(
213
- @document,
214
- Mongoid::Associations::Options.new(:name => :addresses)
215
- )
216
- @address = Address.new
217
- end
218
-
219
- it "adds the parent document before appending to the array" do
220
- @association.concat [@address]
221
- @association.length.should == 3
222
- @address._parent.should == @document
223
- end
224
-
225
- end
226
-
227
- describe "#clear" do
228
-
229
- before do
230
- @association = Mongoid::Associations::EmbedMany.new(
231
- @document,
232
- Mongoid::Associations::Options.new(:name => :addresses)
233
- )
234
- @address = Address.new
235
- @association << @address
236
- end
237
-
238
- it "clears out the association" do
239
- @association.clear
240
- @association.size.should == 0
241
- end
242
-
243
- end
244
-
245
- describe "#find" do
246
-
247
- before do
248
- @association = Mongoid::Associations::EmbedMany.new(
249
- @document,
250
- Mongoid::Associations::Options.new(:name => :addresses)
251
- )
252
- end
253
-
254
- context "when finding all" do
255
-
256
- it "returns all the documents" do
257
- @association.find(:all).should == @association
258
- end
259
-
260
- end
261
-
262
- context "when finding by id" do
263
-
264
- it "returns the document in the array with that id" do
265
- address = @association.find("street-2")
266
- address.should_not be_nil
267
- end
268
-
269
- end
270
-
271
- end
272
-
273
- describe "#first" do
274
-
275
- context "when there are elements in the array" do
276
-
277
- before do
278
- @association = Mongoid::Associations::EmbedMany.new(
279
- @document,
280
- Mongoid::Associations::Options.new(:name => :addresses)
281
- )
282
- end
283
-
284
- it "returns the first element" do
285
- @association.first.should be_a_kind_of(Address)
286
- @association.first.street.should == "Street 1"
287
- end
288
-
289
- end
290
-
291
- context "when the array is empty" do
292
-
293
- before do
294
- @association = Mongoid::Associations::EmbedMany.new(
295
- Person.new,
296
- Mongoid::Associations::Options.new(:name => :addresses)
297
- )
298
- end
299
-
300
- it "returns nil" do
301
- @association.first.should be_nil
302
- end
303
-
304
- end
305
-
306
- end
307
-
308
- describe "#initialize" do
309
-
310
- context "when no extension exists" do
311
-
312
- before do
313
- @canvas = stub(:raw_attributes => { "shapes" => [{ "_type" => "Circle", "radius" => 5 }] }, :update => true)
314
- @association = Mongoid::Associations::EmbedMany.new(
315
- @canvas,
316
- Mongoid::Associations::Options.new(:name => :shapes)
317
- )
318
- end
319
-
320
- it "creates the classes based on their types" do
321
- circle = @association.first
322
- circle.should be_a_kind_of(Circle)
323
- circle.radius.should == 5
324
- end
325
-
326
- end
327
-
328
- context "when an extension is in the options" do
329
-
330
- before do
331
- @person = Person.new
332
- @block = Proc.new do
333
- def extension
334
- "Testing"
335
- end
336
- end
337
- @association = Mongoid::Associations::EmbedMany.new(
338
- @person,
339
- Mongoid::Associations::Options.new(:name => :addresses, :extend => @block)
340
- )
341
- end
342
-
343
- it "adds the extension module" do
344
- @association.extension.should == "Testing"
345
- end
346
-
347
- end
348
-
349
- end
350
-
351
- describe ".instantiate" do
352
-
353
- it "delegates to new" do
354
- Mongoid::Associations::EmbedMany.expects(:new).with(@document, @options)
355
- Mongoid::Associations::EmbedMany.instantiate(@document, @options)
356
- end
357
-
358
- end
359
-
360
- describe "#length" do
361
-
362
- context "#length" do
363
-
364
- it "returns the length of the delegated array" do
365
- @association = Mongoid::Associations::EmbedMany.new(
366
- @document,
367
- Mongoid::Associations::Options.new(:name => :addresses)
368
- )
369
- @association.length.should == 2
370
- end
371
-
372
- end
373
-
374
- end
375
-
376
- describe ".macro" do
377
-
378
- it "returns :embed_many" do
379
- Mongoid::Associations::EmbedMany.macro.should == :embed_many
380
- end
381
-
382
- end
383
-
384
- describe "#nested_build" do
385
-
386
- before do
387
- @association = Mongoid::Associations::EmbedMany.new(
388
- @document,
389
- Mongoid::Associations::Options.new(:name => :addresses)
390
- )
391
- end
392
-
393
- it "returns the newly built object in the association" do
394
- @association.nested_build({ "0" => { :street => "Yet Another" } })
395
- @association.size.should == 3
396
- @association.last.street.should == "Yet Another"
397
- end
398
-
399
- end
400
-
401
- describe "#method_missing" do
402
-
403
- context "when the association class has a criteria class method" do
404
-
405
- before do
406
- @association = Mongoid::Associations::EmbedMany.new(
407
- @document,
408
- Mongoid::Associations::Options.new(:name => :addresses)
409
- )
410
- end
411
-
412
- it "returns the criteria" do
413
- @association.california.should be_a_kind_of(Mongoid::Criteria)
414
- end
415
-
416
- it "sets the documents on the criteria" do
417
- criteria = @association.california
418
- criteria.documents.should == @association.entries
419
- end
420
-
421
- it "returns the scoped documents" do
422
- addresses = @association.california
423
- addresses.size.should == 1
424
- addresses.first.should be_a_kind_of(Address)
425
- addresses.first.state.should == "CA"
426
- end
427
-
428
- end
429
-
430
- context "when no class method exists" do
431
-
432
- before do
433
- @association = Mongoid::Associations::EmbedMany.new(
434
- @document,
435
- Mongoid::Associations::Options.new(:name => :addresses)
436
- )
437
- end
438
-
439
- it "delegates to the array" do
440
- @association.entries.size.should == 2
441
- end
442
-
443
- end
444
-
445
- end
446
-
447
- describe "#paginate" do
448
-
449
- before do
450
- @association = Mongoid::Associations::EmbedMany.new(
451
- @document,
452
- Mongoid::Associations::Options.new(:name => :addresses)
453
- )
454
- @options = { :page => 1, :per_page => 10 }
455
- @criteria = mock
456
- end
457
-
458
- it "creates a criteria and paginates it" do
459
- Mongoid::Criteria.expects(:translate).with(Address, @options).returns(@criteria)
460
- @criteria.expects(:documents=).with(@association.target)
461
- @criteria.expects(:paginate).returns([])
462
- @association.paginate(@options).should == []
463
- end
464
- end
465
-
466
- describe "#push" do
467
-
468
- before do
469
- @association = Mongoid::Associations::EmbedMany.new(
470
- @document,
471
- Mongoid::Associations::Options.new(:name => :addresses)
472
- )
473
- @address = Address.new
474
- end
475
-
476
- it "adds the parent document before appending to the array" do
477
- @association.push @address
478
- @association.length.should == 3
479
- @address._parent.should == @document
480
- end
481
-
482
- it "appends the document to the end of the array" do
483
- @association.push(Address.new)
484
- @association.length.should == 3
485
- end
486
-
487
- end
488
-
489
- describe ".update" do
490
-
491
- before do
492
- @address = Address.new(:street => "Madison Ave")
493
- @person = Person.new(:title => "Sir")
494
- @association = Mongoid::Associations::EmbedMany.update(
495
- [@address],
496
- @person,
497
- Mongoid::Associations::Options.new(:name => :addresses)
498
- )
499
- end
500
-
501
- it "parentizes the child document" do
502
- @address._parent.should == @person
503
- end
504
-
505
- it "sets the attributes of the child on the parent" do
506
- @person.attributes[:addresses].should ==
507
- [{ "_id" => "madison-ave", "street" => "Madison Ave", "_type" => "Address" }]
508
- end
509
-
510
- it "returns the association proxy" do
511
- @association.target.size.should == 1
512
- end
513
-
514
- end
515
-
516
- end