mongoid 1.9.5 → 2.0.0.alpha

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 (213) hide show
  1. data/.gitignore +6 -0
  2. data/.watchr +29 -0
  3. data/Rakefile +52 -0
  4. data/VERSION +1 -0
  5. data/caliper.yml +4 -0
  6. data/lib/mongoid.rb +20 -9
  7. data/lib/mongoid/associations.rb +100 -123
  8. data/lib/mongoid/associations/belongs_to_related.rb +3 -2
  9. data/lib/mongoid/associations/{embeds_many.rb → embed_many.rb} +29 -90
  10. data/lib/mongoid/associations/{embeds_one.rb → embed_one.rb} +7 -8
  11. data/lib/mongoid/associations/embedded_in.rb +4 -12
  12. data/lib/mongoid/associations/has_many_related.rb +4 -52
  13. data/lib/mongoid/associations/has_one_related.rb +4 -8
  14. data/lib/mongoid/associations/meta_data.rb +1 -2
  15. data/lib/mongoid/associations/options.rb +1 -6
  16. data/lib/mongoid/associations/proxy.rb +21 -14
  17. data/lib/mongoid/attributes.rb +13 -33
  18. data/lib/mongoid/callbacks.rb +11 -16
  19. data/lib/mongoid/collection.rb +3 -4
  20. data/lib/mongoid/collections/master.rb +2 -3
  21. data/lib/mongoid/collections/mimic.rb +46 -0
  22. data/lib/mongoid/collections/slaves.rb +2 -3
  23. data/lib/mongoid/commands.rb +161 -0
  24. data/lib/mongoid/commands/create.rb +19 -0
  25. data/lib/mongoid/commands/delete.rb +16 -0
  26. data/lib/mongoid/commands/delete_all.rb +23 -0
  27. data/lib/mongoid/commands/deletion.rb +18 -0
  28. data/lib/mongoid/commands/destroy.rb +17 -0
  29. data/lib/mongoid/commands/destroy_all.rb +23 -0
  30. data/lib/mongoid/commands/save.rb +29 -0
  31. data/lib/mongoid/components.rb +6 -4
  32. data/lib/mongoid/config.rb +15 -134
  33. data/lib/mongoid/contexts.rb +1 -1
  34. data/lib/mongoid/contexts/enumerable.rb +1 -1
  35. data/lib/mongoid/contexts/mongo.rb +1 -1
  36. data/lib/mongoid/contexts/paging.rb +2 -10
  37. data/lib/mongoid/criterion/inclusion.rb +0 -17
  38. data/lib/mongoid/criterion/optional.rb +1 -1
  39. data/lib/mongoid/cursor.rb +1 -0
  40. data/lib/mongoid/document.rb +45 -49
  41. data/lib/mongoid/errors.rb +1 -32
  42. data/lib/mongoid/extensions.rb +10 -12
  43. data/lib/mongoid/extensions/array/conversions.rb +6 -8
  44. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  45. data/lib/mongoid/extensions/boolean/conversions.rb +2 -8
  46. data/lib/mongoid/extensions/date/conversions.rb +4 -13
  47. data/lib/mongoid/extensions/datetime/conversions.rb +6 -1
  48. data/lib/mongoid/extensions/float/conversions.rb +1 -5
  49. data/lib/mongoid/extensions/hash/assimilation.rb +3 -12
  50. data/lib/mongoid/extensions/hash/conversions.rb +4 -34
  51. data/lib/mongoid/extensions/integer/conversions.rb +1 -5
  52. data/lib/mongoid/extensions/nil/assimilation.rb +0 -4
  53. data/lib/mongoid/extensions/object/conversions.rb +2 -8
  54. data/lib/mongoid/extensions/objectid/conversions.rb +1 -1
  55. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  56. data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
  57. data/lib/mongoid/extensions/time/conversions.rb +18 -0
  58. data/lib/mongoid/factory.rb +1 -2
  59. data/lib/mongoid/field.rb +2 -9
  60. data/lib/mongoid/fields.rb +7 -11
  61. data/lib/mongoid/finders.rb +2 -2
  62. data/lib/mongoid/identity.rb +4 -4
  63. data/lib/mongoid/indexes.rb +7 -10
  64. data/lib/mongoid/memoization.rb +2 -8
  65. data/lib/mongoid/named_scope.rb +5 -0
  66. data/lib/mongoid/observable.rb +1 -1
  67. data/lib/mongoid/paths.rb +22 -30
  68. data/lib/mongoid/state.rb +21 -28
  69. data/lib/mongoid/timestamps.rb +1 -1
  70. data/lib/mongoid/validations.rb +51 -0
  71. data/lib/mongoid/validations/associated.rb +32 -0
  72. data/lib/mongoid/validations/locale/en.yml +4 -0
  73. data/lib/mongoid/validations/uniqueness.rb +22 -0
  74. data/lib/mongoid/versioning.rb +1 -2
  75. data/mongoid.gemspec +408 -0
  76. data/perf/benchmark.rb +77 -0
  77. data/spec/integration/mongoid/associations_spec.rb +340 -0
  78. data/spec/integration/mongoid/attributes_spec.rb +22 -0
  79. data/spec/integration/mongoid/commands_spec.rb +227 -0
  80. data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
  81. data/spec/integration/mongoid/criteria_spec.rb +272 -0
  82. data/spec/integration/mongoid/document_spec.rb +650 -0
  83. data/spec/integration/mongoid/extensions_spec.rb +22 -0
  84. data/spec/integration/mongoid/finders_spec.rb +119 -0
  85. data/spec/integration/mongoid/inheritance_spec.rb +137 -0
  86. data/spec/integration/mongoid/named_scope_spec.rb +46 -0
  87. data/spec/models/address.rb +39 -0
  88. data/spec/models/animal.rb +6 -0
  89. data/spec/models/callbacks.rb +18 -0
  90. data/spec/models/comment.rb +8 -0
  91. data/spec/models/country_code.rb +6 -0
  92. data/spec/models/employer.rb +5 -0
  93. data/spec/models/game.rb +7 -0
  94. data/spec/models/inheritance.rb +56 -0
  95. data/spec/models/location.rb +5 -0
  96. data/spec/models/mixed_drink.rb +4 -0
  97. data/spec/models/name.rb +13 -0
  98. data/spec/models/namespacing.rb +11 -0
  99. data/spec/models/patient.rb +4 -0
  100. data/spec/models/person.rb +99 -0
  101. data/spec/models/pet.rb +7 -0
  102. data/spec/models/pet_owner.rb +6 -0
  103. data/spec/models/phone.rb +7 -0
  104. data/spec/models/post.rb +15 -0
  105. data/spec/models/translation.rb +5 -0
  106. data/spec/models/vet_visit.rb +5 -0
  107. data/spec/spec.opts +3 -0
  108. data/spec/spec_helper.rb +31 -0
  109. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +145 -0
  110. data/spec/unit/mongoid/associations/embed_many_spec.rb +516 -0
  111. data/spec/unit/mongoid/associations/embed_one_spec.rb +282 -0
  112. data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
  113. data/spec/unit/mongoid/associations/has_many_related_spec.rb +418 -0
  114. data/spec/unit/mongoid/associations/has_one_related_spec.rb +179 -0
  115. data/spec/unit/mongoid/associations/meta_data_spec.rb +88 -0
  116. data/spec/unit/mongoid/associations/options_spec.rb +192 -0
  117. data/spec/unit/mongoid/associations_spec.rb +595 -0
  118. data/spec/unit/mongoid/attributes_spec.rb +507 -0
  119. data/spec/unit/mongoid/callbacks_spec.rb +55 -0
  120. data/spec/unit/mongoid/collection_spec.rb +187 -0
  121. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  122. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  123. data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
  124. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  125. data/spec/unit/mongoid/commands/create_spec.rb +31 -0
  126. data/spec/unit/mongoid/commands/delete_all_spec.rb +58 -0
  127. data/spec/unit/mongoid/commands/delete_spec.rb +38 -0
  128. data/spec/unit/mongoid/commands/destroy_all_spec.rb +21 -0
  129. data/spec/unit/mongoid/commands/destroy_spec.rb +51 -0
  130. data/spec/unit/mongoid/commands/save_spec.rb +107 -0
  131. data/spec/unit/mongoid/commands_spec.rb +270 -0
  132. data/spec/unit/mongoid/config_spec.rb +172 -0
  133. data/spec/unit/mongoid/contexts/enumerable_spec.rb +421 -0
  134. data/spec/unit/mongoid/contexts/mongo_spec.rb +682 -0
  135. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  136. data/spec/unit/mongoid/criteria_spec.rb +824 -0
  137. data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
  138. data/spec/unit/mongoid/criterion/exclusion_spec.rb +91 -0
  139. data/spec/unit/mongoid/criterion/inclusion_spec.rb +219 -0
  140. data/spec/unit/mongoid/criterion/optional_spec.rb +319 -0
  141. data/spec/unit/mongoid/cursor_spec.rb +74 -0
  142. data/spec/unit/mongoid/deprecation_spec.rb +24 -0
  143. data/spec/unit/mongoid/document_spec.rb +818 -0
  144. data/spec/unit/mongoid/errors_spec.rb +103 -0
  145. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  146. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  147. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +35 -0
  148. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  149. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +22 -0
  150. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  151. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  152. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +102 -0
  153. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +67 -0
  154. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  155. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  156. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +46 -0
  157. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +21 -0
  158. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  159. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  160. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  161. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +24 -0
  162. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +57 -0
  163. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  164. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +17 -0
  165. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  166. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +91 -0
  167. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +70 -0
  168. data/spec/unit/mongoid/extras_spec.rb +102 -0
  169. data/spec/unit/mongoid/factory_spec.rb +31 -0
  170. data/spec/unit/mongoid/field_spec.rb +143 -0
  171. data/spec/unit/mongoid/fields_spec.rb +181 -0
  172. data/spec/unit/mongoid/finders_spec.rb +404 -0
  173. data/spec/unit/mongoid/identity_spec.rb +109 -0
  174. data/spec/unit/mongoid/indexes_spec.rb +93 -0
  175. data/spec/unit/mongoid/javascript_spec.rb +48 -0
  176. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  177. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  178. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  179. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  180. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  181. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  182. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  183. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  184. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  185. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  186. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  187. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  188. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  189. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  190. data/spec/unit/mongoid/observable_spec.rb +46 -0
  191. data/spec/unit/mongoid/paths_spec.rb +124 -0
  192. data/spec/unit/mongoid/scope_spec.rb +240 -0
  193. data/spec/unit/mongoid/state_spec.rb +83 -0
  194. data/spec/unit/mongoid/timestamps_spec.rb +25 -0
  195. data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
  196. data/spec/unit/mongoid/validations/uniqueness_spec.rb +47 -0
  197. data/spec/unit/mongoid/validations_spec.rb +190 -0
  198. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  199. data/spec/unit/mongoid_spec.rb +46 -0
  200. metadata +316 -110
  201. data/lib/mongoid/collections.rb +0 -41
  202. data/lib/mongoid/concern.rb +0 -31
  203. data/lib/mongoid/dirty.rb +0 -253
  204. data/lib/mongoid/extensions/time_conversions.rb +0 -35
  205. data/lib/mongoid/persistence.rb +0 -222
  206. data/lib/mongoid/persistence/command.rb +0 -39
  207. data/lib/mongoid/persistence/insert.rb +0 -50
  208. data/lib/mongoid/persistence/insert_embedded.rb +0 -38
  209. data/lib/mongoid/persistence/remove.rb +0 -39
  210. data/lib/mongoid/persistence/remove_all.rb +0 -37
  211. data/lib/mongoid/persistence/remove_embedded.rb +0 -50
  212. data/lib/mongoid/persistence/update.rb +0 -63
  213. data/lib/mongoid/version.rb +0 -4
@@ -3,41 +3,11 @@ module Mongoid #:nodoc:
3
3
  module Extensions #:nodoc:
4
4
  module Hash #:nodoc:
5
5
  module Conversions #:nodoc:
6
- extend ActiveSupport::Concern
7
-
8
- module InstanceMethods #:nodoc:
9
-
10
- # Get the difference between 2 hashes. This will give back a new hash
11
- # with the keys and pairs of [ old, new ] values.
12
- #
13
- # Example:
14
- #
15
- # first = { :field => "value" }
16
- # second = { :field => "new" }
17
- # first.difference(second) # => { :field => [ "value", "new" ] }
18
- #
19
- # Returns:
20
- #
21
- # A +Hash+ of modifications.
22
- def difference(other)
23
- changes = {}
24
- each_pair do |key, value|
25
- if other.has_key?(key)
26
- new_value = other[key]
27
- changes[key] = [ value, new_value ] if new_value != value
28
- end
29
- end
30
- changes
31
- end
6
+ def get(value)
7
+ value
32
8
  end
33
-
34
- module ClassMethods #:nodoc:
35
- def get(value)
36
- value
37
- end
38
- def set(value)
39
- value
40
- end
9
+ def set(value)
10
+ value
41
11
  end
42
12
  end
43
13
  end
@@ -5,11 +5,7 @@ module Mongoid #:nodoc:
5
5
  module Conversions #:nodoc:
6
6
  def set(value)
7
7
  return nil if value.blank?
8
- begin
9
- Integer(value)
10
- rescue ArgumentError => e
11
- puts(e.message); value
12
- end
8
+ value =~ /\d/ ? value.to_i : value
13
9
  end
14
10
  def get(value)
15
11
  value
@@ -7,10 +7,6 @@ module Mongoid #:nodoc:
7
7
  def assimilate(parent, options, type = nil)
8
8
  parent.remove_attribute(options.name); self
9
9
  end
10
-
11
- def collectionize
12
- to_s.collectionize
13
- end
14
10
  end
15
11
  end
16
12
  end
@@ -4,13 +4,7 @@ module Mongoid #:nodoc:
4
4
  module Object #:nodoc:
5
5
  # This module converts objects into mongoid related objects.
6
6
  module Conversions #:nodoc:
7
- def self.included(base)
8
- base.class_eval do
9
- include InstanceMethods
10
- extend ClassMethods
11
- end
12
- end
13
-
7
+ extend ActiveSupport::Concern
14
8
  module InstanceMethods
15
9
  # Converts this object to a hash of attributes
16
10
  def mongoidize
@@ -24,7 +18,7 @@ module Mongoid #:nodoc:
24
18
  end
25
19
 
26
20
  def get(value)
27
- value ? self.new(value) : value
21
+ self.new(value)
28
22
  end
29
23
  end
30
24
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  module Extensions #:nodoc:
4
- module ObjectId #:nodoc:
4
+ module ObjectID #:nodoc:
5
5
  module Conversions #:nodoc:
6
6
  def set(value)
7
7
  value
@@ -4,7 +4,7 @@ module Mongoid #:nodoc:
4
4
  module String #:nodoc:
5
5
  module Conversions #:nodoc:
6
6
  def set(value)
7
- value.to_s unless value.nil?
7
+ value.to_s
8
8
  end
9
9
  def get(value)
10
10
  value
@@ -23,7 +23,7 @@ module Mongoid #:nodoc:
23
23
  to_s.plural?
24
24
  end
25
25
 
26
- ["gt", "lt", "gte", "lte", "ne", "near", "in", "nin", "mod", "all", "size", "exists", "within"].each do |oper|
26
+ ["gt", "lt", "gte", "lte", "ne", "in", "nin", "mod", "all", "size", "exists"].each do |oper|
27
27
  class_eval <<-OPERATORS
28
28
  def #{oper}
29
29
  Criterion::Complex.new(:key => self, :operator => "#{oper}")
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module Time #:nodoc:
5
+ module Conversions #:nodoc:
6
+ def set(value)
7
+ return nil if value.blank?
8
+ time = ::Time.parse(value.is_a?(::Time) ? value.strftime("%Y-%m-%d %H:%M:%S %Z") : value.to_s)
9
+ time.utc? ? time : time.utc
10
+ end
11
+ def get(value)
12
+ return nil if value.blank?
13
+ ::Time.zone ? value.getlocal : value
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -11,8 +11,7 @@ module Mongoid #:nodoc:
11
11
  #
12
12
  # klass: The class to instantiate from if _type is not present.
13
13
  # attributes: The +Document+ attributes.
14
- def self.build(klass, attributes)
15
- attrs = {}.merge(attributes)
14
+ def self.build(klass, attrs)
16
15
  type = attrs["_type"]
17
16
  type ? type.constantize.instantiate(attrs) : klass.instantiate(attrs)
18
17
  end
@@ -18,7 +18,7 @@ module Mongoid #:nodoc:
18
18
  #
19
19
  # The primitive value or a copy of the default.
20
20
  def default
21
- copy
21
+ (@default.is_a?(Array) || @default.is_a?(Hash)) ? @default.dup : @default
22
22
  end
23
23
 
24
24
  # Create the new field with a name and optional additional options. Valid
@@ -34,7 +34,6 @@ module Mongoid #:nodoc:
34
34
  # <tt>Field.new(:score, :default => 0)</tt>
35
35
  def initialize(name, options = {})
36
36
  @name, @default = name, options[:default]
37
- @copyable = (@default.is_a?(Array) || @default.is_a?(Hash))
38
37
  @type = options[:type] || String
39
38
  @accessible = options.has_key?(:accessible) ? options[:accessible] : true
40
39
  end
@@ -42,18 +41,12 @@ module Mongoid #:nodoc:
42
41
  # Used for setting an object in the attributes hash. If nil is provided the
43
42
  # default will get returned if it exists.
44
43
  def set(object)
45
- type.set(object)
44
+ object.nil? ? default : type.set(object)
46
45
  end
47
46
 
48
47
  # Used for retrieving the object out of the attributes hash.
49
48
  def get(object)
50
49
  type.get(object)
51
50
  end
52
-
53
- protected
54
- # Slightly faster default check.
55
- def copy
56
- @copyable ? @default.dup : @default
57
- end
58
51
  end
59
52
  end
@@ -1,17 +1,14 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc
3
3
  module Fields #:nodoc
4
- def self.included(base)
5
- base.class_eval do
6
- extend ClassMethods
7
- # Set up the class attributes that must be available to all subclasses.
8
- # These include defaults, fields
9
- class_inheritable_accessor :fields
4
+ extend ActiveSupport::Concern
5
+ included do
6
+ # Set up the class attributes that must be available to all subclasses.
7
+ # These include defaults, fields
8
+ class_inheritable_accessor :fields
10
9
 
11
- self.fields = {}
12
-
13
- delegate :defaults, :fields, :to => "self.class"
14
- end
10
+ self.fields = {}
11
+ delegate :defaults, :fields, :to => "self.class"
15
12
  end
16
13
 
17
14
  module ClassMethods #:nodoc
@@ -47,7 +44,6 @@ module Mongoid #:nodoc
47
44
  meth = options.delete(:as) || name
48
45
  fields[name] = Field.new(name, options)
49
46
  create_accessors(name, meth, options)
50
- add_dirty_methods(name)
51
47
  end
52
48
 
53
49
  # Create the field accessors.
@@ -42,7 +42,7 @@ module Mongoid #:nodoc:
42
42
  # Find a +Document+ in several different ways.
43
43
  #
44
44
  # If a +String+ is provided, it will be assumed that it is a
45
- # representation of a Mongo::ObjectId and will attempt to find a single
45
+ # representation of a Mongo::ObjectID and will attempt to find a single
46
46
  # +Document+ based on that id. If a +Symbol+ and +Hash+ is provided then
47
47
  # it will attempt to find either a single +Document+ or multiples based
48
48
  # on the conditions provided and the first parameter.
@@ -51,7 +51,7 @@ module Mongoid #:nodoc:
51
51
  #
52
52
  # <tt>Person.find(:all, :conditions => { :attribute => "value" })</tt>
53
53
  #
54
- # <tt>Person.find(Mongo::ObjectId.new.to_s)</tt>
54
+ # <tt>Person.find(Mongo::ObjectID.new.to_s)</tt>
55
55
  def find(*args)
56
56
  raise Errors::InvalidOptions.new("Calling Document#find with nil is invalid") if args[0].nil?
57
57
  type = args.delete_at(0) if args[0].is_a?(Symbol)
@@ -5,7 +5,7 @@ module Mongoid #:nodoc:
5
5
  # Create the identity for the +Document+.
6
6
  #
7
7
  # The id will be set in either in the form of a Mongo
8
- # +ObjectId+ or a composite key set up by defining a key on the document.
8
+ # +ObjectID+ or a composite key set up by defining a key on the document.
9
9
  #
10
10
  # The _type will be set to the document's class name.
11
11
  def create(doc)
@@ -15,19 +15,19 @@ module Mongoid #:nodoc:
15
15
  protected
16
16
  # Return the proper id for the document.
17
17
  def generate_id
18
- id = BSON::ObjectId.new
18
+ id = Mongo::ObjectID.new
19
19
  Mongoid.use_object_ids ? id : id.to_s
20
20
  end
21
21
 
22
22
  # Set the id for the document.
23
23
  def identify(doc)
24
24
  doc.id = compose(doc).join(" ").identify if doc.primary_key
25
- doc.id = generate_id if doc.id.blank?
25
+ doc.id = generate_id unless doc.id
26
26
  end
27
27
 
28
28
  # Set the _type field on the document.
29
29
  def type(doc)
30
- doc._type = doc.class.name if doc.hereditary?
30
+ doc._type = doc.class.name if Mongoid.persist_types
31
31
  end
32
32
 
33
33
  # Generates the composite key for a document.
@@ -1,21 +1,18 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc
3
3
  module Indexes #:nodoc
4
- def self.included(base)
5
- base.class_eval do
6
- extend ClassMethods
7
-
8
- cattr_accessor :indexed
9
- self.indexed = false
10
- end
4
+ extend ActiveSupport::Concern
5
+ included do
6
+ cattr_accessor :indexed
7
+ self.indexed = false
11
8
  end
12
9
 
13
10
  module ClassMethods #:nodoc
14
11
  # Add the default indexes to the root document if they do not already
15
12
  # exist. Currently this is only _type.
16
13
  def add_indexes
17
- if hereditary && !indexed
18
- self._collection.create_index(:_type, :unique => false, :background => true)
14
+ unless indexed
15
+ self._collection.create_index(:_type, false)
19
16
  self.indexed = true
20
17
  end
21
18
  end
@@ -23,7 +20,7 @@ module Mongoid #:nodoc
23
20
  # Adds an index on the field specified. Options can be :unique => true or
24
21
  # :unique => false. It will default to the latter.
25
22
  def index(name, options = { :unique => false })
26
- collection.create_index(name, options)
23
+ collection.create_index(name, options[:unique])
27
24
  end
28
25
  end
29
26
  end
@@ -2,20 +2,14 @@ module Mongoid #:nodoc
2
2
  module Memoization
3
3
 
4
4
  # Handles cases when accessing an association that should be memoized in
5
- # the Mongoid specific manner. Does not memoize nil values though
5
+ # the Mongoid specific manner.
6
6
  def memoized(name, &block)
7
7
  var = "@#{name}"
8
8
  if instance_variable_defined?(var)
9
9
  return instance_variable_get(var)
10
10
  end
11
11
  value = yield
12
- instance_variable_set(var, value) if value
13
- end
14
-
15
- # Removes an memozied association if it exists
16
- def unmemoize(name)
17
- var = "@#{name}"
18
- remove_instance_variable(var) if instance_variable_defined?(var)
12
+ instance_variable_set(var, value)
19
13
  end
20
14
 
21
15
  # Mongoid specific behavior is to remove the memoized object when setting
@@ -27,11 +27,16 @@ module Mongoid #:nodoc:
27
27
  end
28
28
  EOT
29
29
  end
30
+
31
+ alias :scope :named_scope
32
+
30
33
  alias :scope :named_scope
31
34
 
32
35
  # Return the scopes or default to an empty +Hash+.
33
36
  def scopes
34
37
  read_inheritable_attribute(:scopes) || write_inheritable_attribute(:scopes, {})
35
38
  end
39
+
36
40
  end
37
41
  end
42
+
@@ -24,7 +24,7 @@ module Mongoid #:nodoc:
24
24
  #
25
25
  # <tt>document.notify_observers(self)</tt>
26
26
  def notify_observers(*args)
27
- @observers.dup.each { |observer| observer.observe(*args) } if @observers
27
+ @observers.dup.each { |observer| observer.update(*args) } if @observers
28
28
  end
29
29
  end
30
30
  end
@@ -3,49 +3,29 @@ module Mongoid #:nodoc:
3
3
  module Paths #:nodoc:
4
4
  extend ActiveSupport::Concern
5
5
  included do
6
- attr_accessor :__path
7
- attr_accessor :_index
6
+ cattr_accessor :_path, :_position
7
+ delegate :_path, :_position, :to => "self.class"
8
8
  end
9
9
  module InstanceMethods
10
- # Get the insertion modifier for the document. Will be nil on root
11
- # documents, $set on embeds_one, $push on embeds_many.
12
- #
13
- # Example:
14
- #
15
- # <tt>name.inserter</tt>
16
- def _inserter
17
- embedded? ? (embedded_many? ? "$push" : "$set") : nil
18
- end
19
-
20
10
  # Return the path to this +Document+ in JSON notation, used for atomic
21
11
  # updates via $set in MongoDB.
22
12
  #
23
13
  # Example:
24
14
  #
25
15
  # <tt>address.path # returns "addresses"</tt>
26
- def _path
27
- _position.sub!(/\.\d+$/, '') || _position
16
+ def path
17
+ self._path ||= climb("") do |document, value|
18
+ value = "#{document.association_name}#{"." + value unless value.blank?}"
19
+ end
28
20
  end
29
- alias :_pull :_path
30
21
 
31
22
  # Returns the positional operator of this document for modification.
32
23
  #
33
24
  # Example:
34
25
  #
35
26
  # <tt>address.position</tt>
36
- def _position
37
- locator = _index ? (new_record? ? "" : ".#{_index}") : ""
38
- embedded? ? "#{_parent._position}#{"." unless _parent._position.blank?}#{@association_name}#{locator}" : ""
39
- end
40
-
41
- # Get the removal modifier for the document. Will be nil on root
42
- # documents, $unset on embeds_one, $set on embeds_many.
43
- #
44
- # Example:
45
- #
46
- # <tt>name.remover</tt>
47
- def _remover
48
- embedded? ? (_index ? "$pull" : "$unset") : nil
27
+ def position
28
+ self._position ||= (path.blank? ? "" : "#{path}.$")
49
29
  end
50
30
 
51
31
  # Return the selector for this document to be matched exactly for use
@@ -54,8 +34,20 @@ module Mongoid #:nodoc:
54
34
  # Example:
55
35
  #
56
36
  # <tt>address.selector</tt>
57
- def _selector
58
- embedded? ? _parent._selector.merge("#{_path}._id" => id) : { "_id" => id }
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
59
51
  end
60
52
  end
61
53
  end
@@ -1,39 +1,32 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  module State #:nodoc:
4
- extend ActiveSupport::Concern
5
- included do
6
- attr_reader :new_record
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
7
9
  end
8
10
 
9
- module InstanceMethods
10
- # Returns true if the +Document+ has not been persisted to the database,
11
- # false if it has. This is determined by the variable @new_record
12
- # and NOT if the object has an id.
13
- def new_record?
14
- !!@new_record
15
- end
16
-
17
- # Sets the new_record boolean - used after document is saved.
18
- def new_record=(saved)
19
- @new_record = saved
20
- end
11
+ # Sets the new_record boolean - used after document is saved.
12
+ def new_record=(saved)
13
+ @new_record = saved
14
+ end
21
15
 
22
- # Checks if the document has been saved to the database.
23
- def persisted?
24
- !new_record?
25
- end
16
+ # Checks if the document has been saved to the database.
17
+ def persisted?
18
+ !new_record?
19
+ end
26
20
 
27
- # Returns true if the +Document+ has been succesfully destroyed, and false if it hasn't.
28
- # This is determined by the variable @destroyed and NOT by checking the database.
29
- def destroyed?
30
- @destroyed == true
31
- end
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
32
26
 
33
- # Sets the destroyed boolean - used after document is destroyed.
34
- def destroyed=(destroyed)
35
- @destroyed = destroyed && true
36
- end
27
+ # Sets the destroyed boolean - used after document is destroyed.
28
+ def destroyed=(destroyed)
29
+ @destroyed = destroyed && true
37
30
  end
38
31
  end
39
32
  end