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.
- data/lib/mongoid.rb +11 -5
- data/lib/mongoid/associations.rb +112 -107
- data/lib/mongoid/associations/belongs_to_related.rb +2 -3
- data/lib/mongoid/associations/embedded_in.rb +12 -4
- data/lib/mongoid/associations/{embed_many.rb → embeds_many.rb} +101 -32
- data/lib/mongoid/associations/{embed_one.rb → embeds_one.rb} +10 -10
- data/lib/mongoid/associations/has_many_related.rb +51 -5
- data/lib/mongoid/associations/has_one_related.rb +9 -5
- data/lib/mongoid/associations/meta_data.rb +2 -1
- data/lib/mongoid/associations/options.rb +15 -6
- data/lib/mongoid/associations/proxy.rb +14 -21
- data/lib/mongoid/attributes.rb +34 -13
- data/lib/mongoid/callbacks.rb +1 -2
- data/lib/mongoid/collection.rb +4 -3
- data/lib/mongoid/collections.rb +41 -0
- data/lib/mongoid/collections/master.rb +3 -2
- data/lib/mongoid/collections/slaves.rb +3 -2
- data/lib/mongoid/components.rb +4 -1
- data/lib/mongoid/config.rb +163 -13
- data/lib/mongoid/contexts.rb +1 -2
- data/lib/mongoid/contexts/enumerable.rb +1 -1
- data/lib/mongoid/contexts/mongo.rb +1 -1
- data/lib/mongoid/contexts/paging.rb +10 -2
- data/lib/mongoid/criteria.rb +13 -22
- data/lib/mongoid/criterion/exclusion.rb +3 -3
- data/lib/mongoid/criterion/inclusion.rb +17 -0
- data/lib/mongoid/criterion/optional.rb +1 -1
- data/lib/mongoid/dirty.rb +253 -0
- data/lib/mongoid/document.rb +40 -85
- data/lib/mongoid/errors.rb +48 -1
- data/lib/mongoid/extensions.rb +11 -9
- data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
- data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
- data/lib/mongoid/extensions/date/conversions.rb +13 -4
- data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
- data/lib/mongoid/extensions/float/conversions.rb +5 -1
- data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
- data/lib/mongoid/extensions/hash/conversions.rb +34 -4
- data/lib/mongoid/extensions/integer/conversions.rb +5 -1
- data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
- data/lib/mongoid/extensions/object/conversions.rb +3 -3
- data/lib/mongoid/extensions/string/conversions.rb +1 -1
- data/lib/mongoid/extensions/symbol/inflections.rb +5 -2
- data/lib/mongoid/extensions/time_conversions.rb +35 -0
- data/lib/mongoid/factory.rb +2 -1
- data/lib/mongoid/field.rb +15 -2
- data/lib/mongoid/fields.rb +1 -1
- data/lib/mongoid/identity.rb +3 -3
- data/lib/mongoid/indexes.rb +3 -3
- data/lib/mongoid/matchers.rb +1 -2
- data/lib/mongoid/memoization.rb +8 -2
- data/lib/mongoid/named_scope.rb +0 -5
- data/lib/mongoid/observable.rb +1 -1
- data/lib/mongoid/paths.rb +30 -22
- data/lib/mongoid/persistence.rb +218 -0
- data/lib/mongoid/persistence/command.rb +39 -0
- data/lib/mongoid/persistence/insert.rb +47 -0
- data/lib/mongoid/persistence/insert_embedded.rb +38 -0
- data/lib/mongoid/persistence/remove.rb +39 -0
- data/lib/mongoid/persistence/remove_all.rb +37 -0
- data/lib/mongoid/persistence/remove_embedded.rb +50 -0
- data/lib/mongoid/persistence/update.rb +63 -0
- data/lib/mongoid/railtie.rb +53 -0
- data/lib/mongoid/railties/database.rake +37 -0
- data/lib/mongoid/timestamps.rb +2 -2
- data/lib/mongoid/validations.rb +2 -2
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/uniqueness.rb +13 -2
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +3 -2
- data/lib/rails/generators/mongoid/config/config_generator.rb +41 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
- data/lib/rails/generators/mongoid_generator.rb +61 -0
- metadata +76 -301
- data/.gitignore +0 -6
- data/.watchr +0 -29
- data/Rakefile +0 -52
- data/VERSION +0 -1
- data/caliper.yml +0 -4
- data/lib/mongoid/collections/mimic.rb +0 -46
- data/lib/mongoid/commands.rb +0 -161
- data/lib/mongoid/commands/create.rb +0 -19
- data/lib/mongoid/commands/delete.rb +0 -16
- data/lib/mongoid/commands/delete_all.rb +0 -23
- data/lib/mongoid/commands/deletion.rb +0 -18
- data/lib/mongoid/commands/destroy.rb +0 -17
- data/lib/mongoid/commands/destroy_all.rb +0 -23
- data/lib/mongoid/commands/save.rb +0 -29
- data/lib/mongoid/extensions/time/conversions.rb +0 -18
- data/mongoid.gemspec +0 -408
- data/perf/benchmark.rb +0 -77
- data/spec/integration/mongoid/associations_spec.rb +0 -340
- data/spec/integration/mongoid/attributes_spec.rb +0 -22
- data/spec/integration/mongoid/commands_spec.rb +0 -227
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
- data/spec/integration/mongoid/criteria_spec.rb +0 -272
- data/spec/integration/mongoid/document_spec.rb +0 -650
- data/spec/integration/mongoid/extensions_spec.rb +0 -22
- data/spec/integration/mongoid/finders_spec.rb +0 -119
- data/spec/integration/mongoid/inheritance_spec.rb +0 -137
- data/spec/integration/mongoid/named_scope_spec.rb +0 -46
- data/spec/models/address.rb +0 -39
- data/spec/models/animal.rb +0 -6
- data/spec/models/callbacks.rb +0 -18
- data/spec/models/comment.rb +0 -8
- data/spec/models/country_code.rb +0 -6
- data/spec/models/employer.rb +0 -5
- data/spec/models/game.rb +0 -7
- data/spec/models/inheritance.rb +0 -56
- data/spec/models/location.rb +0 -5
- data/spec/models/mixed_drink.rb +0 -4
- data/spec/models/name.rb +0 -13
- data/spec/models/namespacing.rb +0 -11
- data/spec/models/patient.rb +0 -4
- data/spec/models/person.rb +0 -99
- data/spec/models/pet.rb +0 -7
- data/spec/models/pet_owner.rb +0 -6
- data/spec/models/phone.rb +0 -7
- data/spec/models/post.rb +0 -15
- data/spec/models/translation.rb +0 -5
- data/spec/models/vet_visit.rb +0 -5
- data/spec/spec.opts +0 -3
- data/spec/spec_helper.rb +0 -31
- data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
- data/spec/unit/mongoid/associations/embed_many_spec.rb +0 -516
- data/spec/unit/mongoid/associations/embed_one_spec.rb +0 -282
- data/spec/unit/mongoid/associations/embedded_in_spec.rb +0 -193
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -418
- data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
- data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
- data/spec/unit/mongoid/associations/options_spec.rb +0 -192
- data/spec/unit/mongoid/associations_spec.rb +0 -595
- data/spec/unit/mongoid/attributes_spec.rb +0 -507
- data/spec/unit/mongoid/callbacks_spec.rb +0 -55
- data/spec/unit/mongoid/collection_spec.rb +0 -187
- data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
- data/spec/unit/mongoid/collections/master_spec.rb +0 -41
- data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
- data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
- data/spec/unit/mongoid/commands/create_spec.rb +0 -31
- data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
- data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
- data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -21
- data/spec/unit/mongoid/commands/destroy_spec.rb +0 -51
- data/spec/unit/mongoid/commands/save_spec.rb +0 -107
- data/spec/unit/mongoid/commands_spec.rb +0 -270
- data/spec/unit/mongoid/config_spec.rb +0 -172
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
- data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
- data/spec/unit/mongoid/contexts_spec.rb +0 -25
- data/spec/unit/mongoid/criteria_spec.rb +0 -824
- data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
- data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
- data/spec/unit/mongoid/cursor_spec.rb +0 -74
- data/spec/unit/mongoid/deprecation_spec.rb +0 -24
- data/spec/unit/mongoid/document_spec.rb +0 -818
- data/spec/unit/mongoid/errors_spec.rb +0 -103
- data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
- data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
- data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
- data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
- data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
- data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
- data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -67
- data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
- data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
- data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
- data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
- data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
- data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
- data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
- data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
- data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
- data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
- data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
- data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
- data/spec/unit/mongoid/extras_spec.rb +0 -102
- data/spec/unit/mongoid/factory_spec.rb +0 -31
- data/spec/unit/mongoid/field_spec.rb +0 -143
- data/spec/unit/mongoid/fields_spec.rb +0 -181
- data/spec/unit/mongoid/finders_spec.rb +0 -404
- data/spec/unit/mongoid/identity_spec.rb +0 -109
- data/spec/unit/mongoid/indexes_spec.rb +0 -93
- data/spec/unit/mongoid/javascript_spec.rb +0 -48
- data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
- data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
- data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
- data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
- data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
- data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
- data/spec/unit/mongoid/matchers_spec.rb +0 -329
- data/spec/unit/mongoid/memoization_spec.rb +0 -75
- data/spec/unit/mongoid/named_scope_spec.rb +0 -123
- data/spec/unit/mongoid/observable_spec.rb +0 -46
- data/spec/unit/mongoid/paths_spec.rb +0 -124
- data/spec/unit/mongoid/scope_spec.rb +0 -240
- data/spec/unit/mongoid/state_spec.rb +0 -83
- data/spec/unit/mongoid/timestamps_spec.rb +0 -25
- data/spec/unit/mongoid/validations/associated_spec.rb +0 -103
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +0 -47
- data/spec/unit/mongoid/validations_spec.rb +0 -190
- data/spec/unit/mongoid/versioning_spec.rb +0 -41
- data/spec/unit/mongoid_spec.rb +0 -46
data/spec/models/location.rb
DELETED
data/spec/models/mixed_drink.rb
DELETED
data/spec/models/name.rb
DELETED
@@ -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
|
data/spec/models/namespacing.rb
DELETED
data/spec/models/patient.rb
DELETED
data/spec/models/person.rb
DELETED
@@ -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
|
data/spec/models/pet.rb
DELETED
data/spec/models/pet_owner.rb
DELETED
data/spec/models/phone.rb
DELETED
data/spec/models/post.rb
DELETED
@@ -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
|
data/spec/models/translation.rb
DELETED
data/spec/models/vet_visit.rb
DELETED
data/spec/spec.opts
DELETED
data/spec/spec_helper.rb
DELETED
@@ -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
|