mongoid-pre 2.0.0.beta1 → 2.0.0.pre
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/.watchr +15 -10
- data/HISTORY +342 -0
- data/README.rdoc +8 -1
- data/Rakefile +2 -3
- data/VERSION +1 -1
- data/lib/mongoid/associations/{embedded_in.rb → belongs_to.rb} +4 -4
- data/lib/mongoid/associations/belongs_to_related.rb +9 -6
- data/lib/mongoid/associations/{embeds_many.rb → has_many.rb} +20 -33
- data/lib/mongoid/associations/has_many_related.rb +4 -28
- data/lib/mongoid/associations/{embeds_one.rb → has_one.rb} +6 -6
- data/lib/mongoid/associations/options.rb +6 -1
- data/lib/mongoid/associations.rb +32 -41
- data/lib/mongoid/attributes.rb +6 -13
- data/lib/mongoid/collection.rb +1 -2
- data/lib/mongoid/commands/delete.rb +1 -1
- data/lib/mongoid/commands/delete_all.rb +1 -4
- data/lib/mongoid/commands/destroy.rb +1 -1
- data/lib/mongoid/commands/destroy_all.rb +1 -3
- data/lib/mongoid/commands/save.rb +0 -1
- data/lib/mongoid/commands.rb +13 -2
- data/lib/mongoid/components.rb +1 -6
- data/lib/mongoid/config.rb +1 -5
- data/lib/mongoid/contexts/enumerable.rb +17 -54
- data/lib/mongoid/contexts/mongo.rb +38 -101
- data/lib/mongoid/contexts/paging.rb +2 -2
- data/lib/mongoid/contexts.rb +0 -21
- data/lib/mongoid/criteria.rb +73 -15
- data/lib/mongoid/criterion/inclusion.rb +0 -2
- data/lib/mongoid/criterion/optional.rb +2 -10
- data/lib/mongoid/document.rb +30 -41
- data/lib/mongoid/extensions.rb +0 -15
- data/lib/mongoid/field.rb +7 -20
- data/lib/mongoid/fields.rb +10 -15
- data/lib/mongoid/finders.rb +98 -10
- data/lib/mongoid/identity.rb +2 -8
- data/lib/mongoid/named_scope.rb +0 -2
- data/lib/mongoid/validations/associated.rb +8 -3
- data/lib/mongoid/validations/uniqueness.rb +7 -2
- data/lib/mongoid/validations.rb +2 -2
- data/lib/mongoid/versioning.rb +1 -1
- data/lib/mongoid.rb +5 -21
- data/mongoid.gemspec +19 -59
- data/spec/integration/mongoid/associations_spec.rb +3 -42
- data/spec/integration/mongoid/attributes_spec.rb +2 -2
- data/spec/integration/mongoid/commands_spec.rb +13 -27
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -13
- data/spec/integration/mongoid/criteria_spec.rb +3 -50
- data/spec/integration/mongoid/document_spec.rb +5 -72
- data/spec/integration/mongoid/finders_spec.rb +28 -85
- data/spec/models/address.rb +3 -3
- data/spec/models/animal.rb +2 -2
- data/spec/models/country_code.rb +2 -2
- data/spec/models/game.rb +1 -2
- data/spec/models/inheritance.rb +5 -5
- data/spec/models/location.rb +2 -2
- data/spec/models/name.rb +3 -3
- data/spec/models/namespacing.rb +2 -2
- data/spec/models/patient.rb +0 -2
- data/spec/models/person.rb +4 -6
- data/spec/models/pet.rb +3 -3
- data/spec/models/pet_owner.rb +3 -3
- data/spec/models/phone.rb +3 -3
- data/spec/models/post.rb +1 -1
- data/spec/models/translation.rb +2 -2
- data/spec/models/vet_visit.rb +2 -2
- data/spec/spec_helper.rb +2 -2
- data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -4
- data/spec/unit/mongoid/associations/{embedded_in_spec.rb → belongs_to_spec.rb} +11 -11
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +14 -45
- data/spec/unit/mongoid/associations/{embeds_many_spec.rb → has_many_spec.rb} +34 -79
- data/spec/unit/mongoid/associations/{embeds_one_spec.rb → has_one_spec.rb} +18 -18
- data/spec/unit/mongoid/associations/options_spec.rb +19 -20
- data/spec/unit/mongoid/associations_spec.rb +12 -74
- data/spec/unit/mongoid/attributes_spec.rb +51 -83
- data/spec/unit/mongoid/collection_spec.rb +0 -46
- data/spec/unit/mongoid/commands/delete_all_spec.rb +8 -9
- data/spec/unit/mongoid/commands/delete_spec.rb +3 -6
- data/spec/unit/mongoid/commands/destroy_all_spec.rb +2 -0
- data/spec/unit/mongoid/commands/destroy_spec.rb +3 -10
- data/spec/unit/mongoid/commands_spec.rb +11 -20
- data/spec/unit/mongoid/config_spec.rb +0 -18
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +11 -198
- data/spec/unit/mongoid/contexts/mongo_spec.rb +54 -357
- data/spec/unit/mongoid/criteria_spec.rb +78 -107
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +13 -3
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +19 -25
- data/spec/unit/mongoid/criterion/optional_spec.rb +18 -25
- data/spec/unit/mongoid/document_spec.rb +34 -71
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +2 -2
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +3 -0
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +2 -16
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +1 -1
- data/spec/unit/mongoid/field_spec.rb +0 -62
- data/spec/unit/mongoid/fields_spec.rb +0 -33
- data/spec/unit/mongoid/finders_spec.rb +1 -37
- data/spec/unit/mongoid/identity_spec.rb +6 -47
- data/spec/unit/mongoid/named_scope_spec.rb +2 -15
- data/spec/unit/mongoid/scope_spec.rb +1 -1
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +3 -3
- data/spec/unit/mongoid_spec.rb +2 -11
- metadata +14 -64
- data/lib/mongoid/associations/meta_data.rb +0 -28
- data/lib/mongoid/contexts/ids.rb +0 -25
- data/lib/mongoid/deprecation.rb +0 -22
- data/lib/mongoid/dirty.rb +0 -203
- data/lib/mongoid/extensions/big_decimal/conversions.rb +0 -19
- data/lib/mongoid/extensions/binary/conversions.rb +0 -17
- data/lib/mongoid/extensions/objectid/conversions.rb +0 -15
- data/lib/mongoid/extras.rb +0 -61
- data/lib/mongoid/javascript/functions.yml +0 -37
- data/lib/mongoid/javascript.rb +0 -21
- data/lib/mongoid/observable.rb +0 -30
- data/lib/mongoid/paths.rb +0 -54
- data/lib/mongoid/persistence/command.rb +0 -20
- data/lib/mongoid/persistence/insert.rb +0 -71
- data/lib/mongoid/persistence/update.rb +0 -78
- data/lib/mongoid/persistence.rb +0 -27
- data/lib/mongoid/state.rb +0 -32
- data/spec/integration/mongoid/dirty_spec.rb +0 -70
- data/spec/integration/mongoid/persistence/update_spec.rb +0 -46
- data/spec/models/callbacks.rb +0 -18
- data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
- data/spec/unit/mongoid/contexts_spec.rb +0 -25
- data/spec/unit/mongoid/deprecation_spec.rb +0 -24
- data/spec/unit/mongoid/dirty_spec.rb +0 -286
- 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/extras_spec.rb +0 -102
- data/spec/unit/mongoid/javascript_spec.rb +0 -48
- data/spec/unit/mongoid/observable_spec.rb +0 -46
- data/spec/unit/mongoid/paths_spec.rb +0 -124
- data/spec/unit/mongoid/persistence/insert_spec.rb +0 -175
- data/spec/unit/mongoid/persistence/update_spec.rb +0 -148
- data/spec/unit/mongoid/persistence_spec.rb +0 -40
- data/spec/unit/mongoid/state_spec.rb +0 -83
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
aggregate:
|
|
2
|
-
"function(obj, prev) {
|
|
3
|
-
prev.count++;
|
|
4
|
-
}"
|
|
5
|
-
|
|
6
|
-
group:
|
|
7
|
-
"function(obj, prev) {
|
|
8
|
-
prev.group.push(obj);
|
|
9
|
-
}"
|
|
10
|
-
|
|
11
|
-
max:
|
|
12
|
-
"function(obj, prev) {
|
|
13
|
-
if (prev.max == 'start') {
|
|
14
|
-
prev.max = obj.[field];
|
|
15
|
-
}
|
|
16
|
-
if (prev.max < obj.[field]) {
|
|
17
|
-
prev.max = obj.[field];
|
|
18
|
-
}
|
|
19
|
-
}"
|
|
20
|
-
|
|
21
|
-
min:
|
|
22
|
-
"function(obj, prev) {
|
|
23
|
-
if (prev.min == 'start') {
|
|
24
|
-
prev.min = obj.[field];
|
|
25
|
-
}
|
|
26
|
-
if (prev.min > obj.[field]) {
|
|
27
|
-
prev.min = obj.[field];
|
|
28
|
-
}
|
|
29
|
-
}"
|
|
30
|
-
|
|
31
|
-
sum:
|
|
32
|
-
"function(obj, prev) {
|
|
33
|
-
if (prev.sum == 'start') {
|
|
34
|
-
prev.sum = 0;
|
|
35
|
-
}
|
|
36
|
-
prev.sum += obj.[field];
|
|
37
|
-
}"
|
data/lib/mongoid/javascript.rb
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
class Javascript
|
|
4
|
-
# Constant for the file that defines all the js functions.
|
|
5
|
-
FUNCTIONS = File.join(File.dirname(__FILE__), "javascript", "functions.yml")
|
|
6
|
-
|
|
7
|
-
# Load the javascript functions and define a class method for each one,
|
|
8
|
-
# that memoizes the value.
|
|
9
|
-
#
|
|
10
|
-
# Example:
|
|
11
|
-
#
|
|
12
|
-
# <tt>Mongoid::Javascript.aggregate</tt>
|
|
13
|
-
YAML.load(File.read(FUNCTIONS)).each_pair do |key, function|
|
|
14
|
-
(class << self; self; end).class_eval <<-EOT
|
|
15
|
-
def #{key}
|
|
16
|
-
@#{key} ||= "#{function}"
|
|
17
|
-
end
|
|
18
|
-
EOT
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
data/lib/mongoid/observable.rb
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Observable #:nodoc:
|
|
4
|
-
extend ActiveSupport::Concern
|
|
5
|
-
included do
|
|
6
|
-
attr_reader :observers
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
# Add an observer to this object. This mimics the standard Ruby observable
|
|
10
|
-
# library.
|
|
11
|
-
#
|
|
12
|
-
# Example:
|
|
13
|
-
#
|
|
14
|
-
# <tt>address.add_observer(person)</tt>
|
|
15
|
-
def add_observer(object)
|
|
16
|
-
@observers ||= []
|
|
17
|
-
@observers.push(object)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# Notify all the objects observing this object of an update. All observers
|
|
21
|
-
# need to respond to the update method in order to handle this.
|
|
22
|
-
#
|
|
23
|
-
# Example:
|
|
24
|
-
#
|
|
25
|
-
# <tt>document.notify_observers(self)</tt>
|
|
26
|
-
def notify_observers(*args)
|
|
27
|
-
@observers.dup.each { |observer| observer.observe(*args) } if @observers
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
data/lib/mongoid/paths.rb
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Paths #:nodoc:
|
|
4
|
-
extend ActiveSupport::Concern
|
|
5
|
-
included do
|
|
6
|
-
cattr_accessor :_path, :_position
|
|
7
|
-
delegate :_path, :_position, :to => "self.class"
|
|
8
|
-
end
|
|
9
|
-
module InstanceMethods
|
|
10
|
-
# Return the path to this +Document+ in JSON notation, used for atomic
|
|
11
|
-
# updates via $set in MongoDB.
|
|
12
|
-
#
|
|
13
|
-
# Example:
|
|
14
|
-
#
|
|
15
|
-
# <tt>address.path # returns "addresses"</tt>
|
|
16
|
-
def path
|
|
17
|
-
self._path ||= climb("") do |document, value|
|
|
18
|
-
value = "#{document.association_name}#{"." + value unless value.blank?}"
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Returns the positional operator of this document for modification.
|
|
23
|
-
#
|
|
24
|
-
# Example:
|
|
25
|
-
#
|
|
26
|
-
# <tt>address.position</tt>
|
|
27
|
-
def position
|
|
28
|
-
self._position ||= (path.blank? ? "" : "#{path}.$")
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Return the selector for this document to be matched exactly for use
|
|
32
|
-
# with MongoDB's $ operator.
|
|
33
|
-
#
|
|
34
|
-
# Example:
|
|
35
|
-
#
|
|
36
|
-
# <tt>address.selector</tt>
|
|
37
|
-
def selector
|
|
38
|
-
@selector ||= climb({ "_id" => _root.id }) do |document, value|
|
|
39
|
-
value["#{document.path}._id"] = document.id; value
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
protected
|
|
44
|
-
def climb(value, &block)
|
|
45
|
-
document = self;
|
|
46
|
-
while (document._parent) do
|
|
47
|
-
value = yield document, value
|
|
48
|
-
document = document._parent
|
|
49
|
-
end
|
|
50
|
-
value
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Persistence #:nodoc:
|
|
4
|
-
# Mixin for common functionality for all persistence commands.
|
|
5
|
-
module Command
|
|
6
|
-
attr_reader :collection, :document, :options, :validate
|
|
7
|
-
# Initialize the persistence +Command+.
|
|
8
|
-
#
|
|
9
|
-
# Options:
|
|
10
|
-
#
|
|
11
|
-
# document: The +Document+ to be persisted.
|
|
12
|
-
# validate: Is the document to be validated.
|
|
13
|
-
def init(document, validate)
|
|
14
|
-
@collection = document.embedded ? document._root.collection : document.collection
|
|
15
|
-
@document = document
|
|
16
|
-
@validate = validate
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Persistence #:nodoc:
|
|
4
|
-
# Insert is a persistence command responsible for taking a document that
|
|
5
|
-
# has not been saved to the database and saving it.
|
|
6
|
-
#
|
|
7
|
-
# The underlying query resembles the following MongoDB query:
|
|
8
|
-
#
|
|
9
|
-
# collection.insert(
|
|
10
|
-
# { "_id" : 1, "field" : "value" },
|
|
11
|
-
# false
|
|
12
|
-
# );
|
|
13
|
-
class Insert
|
|
14
|
-
include Persistence::Command
|
|
15
|
-
|
|
16
|
-
# Create the new insert persister.
|
|
17
|
-
#
|
|
18
|
-
# Options:
|
|
19
|
-
#
|
|
20
|
-
# document: The +Document+ to persist.
|
|
21
|
-
# validate: +Boolean+ to validate or not.
|
|
22
|
-
#
|
|
23
|
-
# Example:
|
|
24
|
-
#
|
|
25
|
-
# <tt>Insert.new(document)</tt>
|
|
26
|
-
def initialize(document, validate = true)
|
|
27
|
-
init(document, validate)
|
|
28
|
-
@options = { :safe => Mongoid.persist_in_safe_mode }
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Insert the new document in the database. This delegates to the standard
|
|
32
|
-
# MongoDB collection's insert command.
|
|
33
|
-
#
|
|
34
|
-
# Example:
|
|
35
|
-
#
|
|
36
|
-
# <tt>Insert.persist</tt>
|
|
37
|
-
#
|
|
38
|
-
# Returns:
|
|
39
|
-
#
|
|
40
|
-
# The +Document+, whether the insert succeeded or not.
|
|
41
|
-
def persist
|
|
42
|
-
return @document if validate && !@document.valid?
|
|
43
|
-
@document.run_callbacks(:create, :save) do
|
|
44
|
-
@document.new_record = false if insert
|
|
45
|
-
@document
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
protected
|
|
50
|
-
# Insert the document into the database.
|
|
51
|
-
def insert
|
|
52
|
-
if @document.embedded
|
|
53
|
-
insert_embedded
|
|
54
|
-
else
|
|
55
|
-
collection.insert(@document.raw_attributes, options)
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# Logic for determining how to insert the embedded doc.
|
|
60
|
-
def insert_embedded
|
|
61
|
-
parent = @document._parent
|
|
62
|
-
if parent.new_record?
|
|
63
|
-
@document.notify_observers(document, true); parent.insert
|
|
64
|
-
else
|
|
65
|
-
update = { @document.path => { "$push" => @document.raw_attributes } }
|
|
66
|
-
collection.update(parent.selector, update, @options)
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Persistence #:nodoc:
|
|
4
|
-
# Update is a persistence command responsible for taking a document that
|
|
5
|
-
# has already been saved to the database and saving it, depending on
|
|
6
|
-
# whether or not the document has been modified.
|
|
7
|
-
#
|
|
8
|
-
# Before persisting the command will check via dirty attributes if the
|
|
9
|
-
# document has changed, if not, it will simply return true. If it has it
|
|
10
|
-
# will go through the validation steps, run callbacks, and set the changed
|
|
11
|
-
# fields atomically on the document. The underlying query resembles the
|
|
12
|
-
# following MongoDB query:
|
|
13
|
-
#
|
|
14
|
-
# collection.update(
|
|
15
|
-
# { "_id" : 1,
|
|
16
|
-
# { "$set" : { "field" : "value" },
|
|
17
|
-
# false,
|
|
18
|
-
# false
|
|
19
|
-
# );
|
|
20
|
-
#
|
|
21
|
-
# For embedded documents it will use the positional locator:
|
|
22
|
-
#
|
|
23
|
-
# collection.update(
|
|
24
|
-
# { "_id" : 1, "addresses._id" : 2 },
|
|
25
|
-
# { "$set" : { "addresses.$.field" : "value" },
|
|
26
|
-
# false,
|
|
27
|
-
# false
|
|
28
|
-
# );
|
|
29
|
-
#
|
|
30
|
-
class Update
|
|
31
|
-
include Persistence::Command
|
|
32
|
-
|
|
33
|
-
# Create the new update persister.
|
|
34
|
-
#
|
|
35
|
-
# Options:
|
|
36
|
-
#
|
|
37
|
-
# document: The +Document+ to persist.
|
|
38
|
-
# validate: +Boolean+ to validate or not.
|
|
39
|
-
#
|
|
40
|
-
# Example:
|
|
41
|
-
#
|
|
42
|
-
# <tt>Update.new(document)</tt>
|
|
43
|
-
def initialize(document, validate = true)
|
|
44
|
-
init(document, validate)
|
|
45
|
-
@options = { :multi => false, :safe => Mongoid.persist_in_safe_mode }
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Persist the document that is to be updated to the database. This will
|
|
49
|
-
# only write changed fields via MongoDB's $set modifier operation.
|
|
50
|
-
#
|
|
51
|
-
# Example:
|
|
52
|
-
#
|
|
53
|
-
# <tt>Update.persist</tt>
|
|
54
|
-
#
|
|
55
|
-
# Returns:
|
|
56
|
-
#
|
|
57
|
-
# +true+ or +false+, depending on validation.
|
|
58
|
-
def persist
|
|
59
|
-
if @document.changed?
|
|
60
|
-
return false if validate && !@document.valid?
|
|
61
|
-
@document.run_callbacks(:save, :update) do
|
|
62
|
-
if update
|
|
63
|
-
@document.move_changes
|
|
64
|
-
else
|
|
65
|
-
return false
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end; true
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
protected
|
|
72
|
-
# Update the document in the database atomically.
|
|
73
|
-
def update
|
|
74
|
-
collection.update(@document.selector, { "$set" => @document.setters }, @options)
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
data/lib/mongoid/persistence.rb
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
require "mongoid/persistence/command"
|
|
3
|
-
require "mongoid/persistence/insert"
|
|
4
|
-
require "mongoid/persistence/update"
|
|
5
|
-
|
|
6
|
-
module Mongoid #:nodoc:
|
|
7
|
-
module Persistence #:nodoc:
|
|
8
|
-
# Insert a new +Document+ into the database. Will return the document
|
|
9
|
-
# itself whether or not the save was successful.
|
|
10
|
-
#
|
|
11
|
-
# Example:
|
|
12
|
-
#
|
|
13
|
-
# <tt>document.insert</tt>
|
|
14
|
-
def insert
|
|
15
|
-
Insert.new(self).persist
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# Update the +Document+ in the datbase.
|
|
19
|
-
#
|
|
20
|
-
# Example:
|
|
21
|
-
#
|
|
22
|
-
# <tt>document.update</tt>
|
|
23
|
-
def update
|
|
24
|
-
Update.new(self).persist
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
data/lib/mongoid/state.rb
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module State #:nodoc:
|
|
4
|
-
# Returns true if the +Document+ has not been persisted to the database,
|
|
5
|
-
# false if it has. This is determined by the variable @new_record
|
|
6
|
-
# and NOT if the object has an id.
|
|
7
|
-
def new_record?
|
|
8
|
-
@new_record == true
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
# Sets the new_record boolean - used after document is saved.
|
|
12
|
-
def new_record=(saved)
|
|
13
|
-
@new_record = saved
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
# Checks if the document has been saved to the database.
|
|
17
|
-
def persisted?
|
|
18
|
-
!new_record?
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# Returns true if the +Document+ has been succesfully destroyed, and false if it hasn't.
|
|
22
|
-
# This is determined by the variable @destroyed and NOT by checking the database.
|
|
23
|
-
def destroyed?
|
|
24
|
-
@destroyed == true
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Sets the destroyed boolean - used after document is destroyed.
|
|
28
|
-
def destroyed=(destroyed)
|
|
29
|
-
@destroyed = destroyed && true
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
require "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe Mongoid::Dirty do
|
|
4
|
-
|
|
5
|
-
before do
|
|
6
|
-
Person.delete_all
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
after do
|
|
10
|
-
Person.delete_all
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
context "when fields are getting changed" do
|
|
14
|
-
|
|
15
|
-
before do
|
|
16
|
-
@person = Person.create(:title => "MC", :ssn => "234-11-2533")
|
|
17
|
-
@person.title = "DJ"
|
|
18
|
-
@person.write_attribute(:ssn, "222-22-2222")
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
it "marks the document as changed" do
|
|
22
|
-
@person.changed?.should == true
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it "marks field changes" do
|
|
26
|
-
@person.changes.should == {
|
|
27
|
-
"title" => [ "MC", "DJ" ],
|
|
28
|
-
"ssn" => [ "234-11-2533", "222-22-2222" ]
|
|
29
|
-
}
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it "marks changed fields" do
|
|
33
|
-
@person.changed.should == [ "title", "ssn" ]
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it "marks the field as changed" do
|
|
37
|
-
@person.title_changed?.should == true
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it "stores previous field values" do
|
|
41
|
-
@person.title_was.should == "MC"
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it "marks field changes" do
|
|
45
|
-
@person.title_change.should == [ "MC", "DJ" ]
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it "allows reset of field changes" do
|
|
49
|
-
@person.reset_title!
|
|
50
|
-
@person.title.should == "MC"
|
|
51
|
-
@person.changed.should == [ "ssn" ]
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
context "after a save" do
|
|
55
|
-
|
|
56
|
-
before do
|
|
57
|
-
@person.save!
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
it "clears changes" do
|
|
61
|
-
@person.changed?.should == false
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
it "stores previous changes" do
|
|
65
|
-
@person.previous_changes["title"].should == [ "MC", "DJ" ]
|
|
66
|
-
@person.previous_changes["ssn"].should == [ "234-11-2533", "222-22-2222" ]
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
require "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe Mongoid::Persistence::Update do
|
|
4
|
-
|
|
5
|
-
before do
|
|
6
|
-
Person.delete_all
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
after do
|
|
10
|
-
Person.delete_all
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
describe "#persist" do
|
|
14
|
-
|
|
15
|
-
let(:person) do
|
|
16
|
-
Person.create!(:ssn => "111-11-1111", :title => "Sir")
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
context "when the document has changed" do
|
|
20
|
-
|
|
21
|
-
before do
|
|
22
|
-
@person = Person.find(person.id)
|
|
23
|
-
@person.title = "Grand Poobah"
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it "updates the document in the database" do
|
|
27
|
-
update = Mongoid::Persistence::Update.new(@person)
|
|
28
|
-
update.persist
|
|
29
|
-
from_db = Person.find(@person.id)
|
|
30
|
-
from_db.title.should == "Grand Poobah"
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
context "when the document has not changed" do
|
|
35
|
-
|
|
36
|
-
before do
|
|
37
|
-
@person = Person.find(person.id)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it "returns true" do
|
|
41
|
-
update = Mongoid::Persistence::Update.new(@person)
|
|
42
|
-
update.persist.should == true
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
data/spec/models/callbacks.rb
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
class Artist
|
|
2
|
-
include Mongoid::Document
|
|
3
|
-
field :name
|
|
4
|
-
embeds_many :songs
|
|
5
|
-
|
|
6
|
-
after_create :create_songs
|
|
7
|
-
|
|
8
|
-
protected
|
|
9
|
-
def create_songs
|
|
10
|
-
2.times { |n| songs.create!(:title => "#{n}") }
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
class Song
|
|
15
|
-
include Mongoid::Document
|
|
16
|
-
field :title
|
|
17
|
-
embedded_in :artist, :inverse_of => :songs
|
|
18
|
-
end
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
require "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe Mongoid::Associations::MetaData do
|
|
4
|
-
|
|
5
|
-
before do
|
|
6
|
-
@extension = lambda { "Test" }
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
let(:association) do
|
|
10
|
-
Mongoid::Associations::HasManyRelated
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
let(:options) do
|
|
14
|
-
Mongoid::Associations::Options.new(
|
|
15
|
-
:name => :games,
|
|
16
|
-
:extend => @extension,
|
|
17
|
-
:foreign_key => "person_id",
|
|
18
|
-
:inverse_of => :people
|
|
19
|
-
)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
let(:metadata) do
|
|
23
|
-
Mongoid::Associations::MetaData.new(association, options)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
describe "#extension" do
|
|
27
|
-
|
|
28
|
-
it "delegates to the options" do
|
|
29
|
-
metadata.extension.should == @extension
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
describe "#foreign_key" do
|
|
34
|
-
|
|
35
|
-
it "delegates to the options" do
|
|
36
|
-
metadata.foreign_key.should == "person_id"
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
describe "#inverse_of" do
|
|
41
|
-
|
|
42
|
-
it "delegates to the options" do
|
|
43
|
-
metadata.inverse_of.should == :people
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
describe "#klass" do
|
|
48
|
-
|
|
49
|
-
it "returns the associated klass" do
|
|
50
|
-
metadata.klass.should == Game
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
describe "#macro" do
|
|
55
|
-
|
|
56
|
-
it "returns the association macro" do
|
|
57
|
-
metadata.macro.should == :has_many_related
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
describe "#name" do
|
|
62
|
-
|
|
63
|
-
it "delegates to the options" do
|
|
64
|
-
metadata.name.should == "games"
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
describe "#options" do
|
|
69
|
-
|
|
70
|
-
it "returns the association options" do
|
|
71
|
-
metadata.options.should == options
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
describe "#polymorphic" do
|
|
76
|
-
|
|
77
|
-
it "delegates to the options" do
|
|
78
|
-
metadata.polymorphic.should be_false
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
describe "#association" do
|
|
83
|
-
|
|
84
|
-
it "returns the association type" do
|
|
85
|
-
metadata.association.should == Mongoid::Associations::HasManyRelated
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
require "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe Mongoid::Contexts do
|
|
4
|
-
|
|
5
|
-
context ".context_for" do
|
|
6
|
-
let(:klass) { stub('klass', :embedded => false) }
|
|
7
|
-
let(:criteria) { stub('criteria', :klass => klass) }
|
|
8
|
-
|
|
9
|
-
context "when criteria is for a top-level Mongoid::Document" do
|
|
10
|
-
it "creates a Mongo context" do
|
|
11
|
-
Mongoid::Contexts::Mongo.expects(:new).with(criteria)
|
|
12
|
-
Mongoid::Contexts.context_for(criteria)
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
context "when criteria is for an embedded Mongoid::Document" do
|
|
17
|
-
it "creates a Mongo context" do
|
|
18
|
-
klass.stubs(:embedded).returns(true)
|
|
19
|
-
Mongoid::Contexts::Enumerable.expects(:new).with(criteria)
|
|
20
|
-
Mongoid::Contexts.context_for(criteria)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
end
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
require "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe Mongoid::Deprecation do
|
|
4
|
-
|
|
5
|
-
let(:logger) do
|
|
6
|
-
stub.quacks_like(Logger.allocate)
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
before do
|
|
10
|
-
Logger.expects(:new).with($stdout).returns(logger)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
describe "#alert" do
|
|
14
|
-
|
|
15
|
-
let(:deprecation) do
|
|
16
|
-
Mongoid::Deprecation.instance
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it "calls warn on the memoized logger" do
|
|
20
|
-
logger.expects(:warn).with("Deprecation: testing")
|
|
21
|
-
deprecation.alert("testing")
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|