mongoid-locomotive 2.0.0.beta9

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 (274) hide show
  1. data/MIT_LICENSE +20 -0
  2. data/README.rdoc +47 -0
  3. data/lib/mongoid.rb +141 -0
  4. data/lib/mongoid/associations.rb +306 -0
  5. data/lib/mongoid/associations/embedded_in.rb +74 -0
  6. data/lib/mongoid/associations/embeds_many.rb +280 -0
  7. data/lib/mongoid/associations/embeds_one.rb +97 -0
  8. data/lib/mongoid/associations/foreign_key.rb +35 -0
  9. data/lib/mongoid/associations/meta_data.rb +38 -0
  10. data/lib/mongoid/associations/options.rb +62 -0
  11. data/lib/mongoid/associations/proxy.rb +33 -0
  12. data/lib/mongoid/associations/referenced_in.rb +59 -0
  13. data/lib/mongoid/associations/references_many.rb +245 -0
  14. data/lib/mongoid/associations/references_many_as_array.rb +78 -0
  15. data/lib/mongoid/associations/references_one.rb +99 -0
  16. data/lib/mongoid/atomicity.rb +55 -0
  17. data/lib/mongoid/attributes.rb +242 -0
  18. data/lib/mongoid/callbacks.rb +21 -0
  19. data/lib/mongoid/collection.rb +120 -0
  20. data/lib/mongoid/collections.rb +71 -0
  21. data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
  22. data/lib/mongoid/collections/master.rb +29 -0
  23. data/lib/mongoid/collections/operations.rb +41 -0
  24. data/lib/mongoid/collections/slaves.rb +45 -0
  25. data/lib/mongoid/components.rb +34 -0
  26. data/lib/mongoid/config.rb +263 -0
  27. data/lib/mongoid/contexts.rb +24 -0
  28. data/lib/mongoid/contexts/enumerable.rb +156 -0
  29. data/lib/mongoid/contexts/ids.rb +25 -0
  30. data/lib/mongoid/contexts/mongo.rb +285 -0
  31. data/lib/mongoid/contexts/paging.rb +50 -0
  32. data/lib/mongoid/criteria.rb +248 -0
  33. data/lib/mongoid/criterion/complex.rb +21 -0
  34. data/lib/mongoid/criterion/exclusion.rb +65 -0
  35. data/lib/mongoid/criterion/inclusion.rb +110 -0
  36. data/lib/mongoid/criterion/optional.rb +189 -0
  37. data/lib/mongoid/cursor.rb +81 -0
  38. data/lib/mongoid/deprecation.rb +21 -0
  39. data/lib/mongoid/dirty.rb +252 -0
  40. data/lib/mongoid/document.rb +210 -0
  41. data/lib/mongoid/errors.rb +131 -0
  42. data/lib/mongoid/extensions.rb +115 -0
  43. data/lib/mongoid/extensions/array/accessors.rb +17 -0
  44. data/lib/mongoid/extensions/array/assimilation.rb +26 -0
  45. data/lib/mongoid/extensions/array/conversions.rb +23 -0
  46. data/lib/mongoid/extensions/array/parentization.rb +13 -0
  47. data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
  48. data/lib/mongoid/extensions/binary/conversions.rb +17 -0
  49. data/lib/mongoid/extensions/boolean/conversions.rb +27 -0
  50. data/lib/mongoid/extensions/date/conversions.rb +24 -0
  51. data/lib/mongoid/extensions/datetime/conversions.rb +12 -0
  52. data/lib/mongoid/extensions/false_class/equality.rb +13 -0
  53. data/lib/mongoid/extensions/float/conversions.rb +20 -0
  54. data/lib/mongoid/extensions/hash/accessors.rb +42 -0
  55. data/lib/mongoid/extensions/hash/assimilation.rb +40 -0
  56. data/lib/mongoid/extensions/hash/conversions.rb +42 -0
  57. data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -0
  58. data/lib/mongoid/extensions/hash/scoping.rb +12 -0
  59. data/lib/mongoid/extensions/integer/conversions.rb +20 -0
  60. data/lib/mongoid/extensions/nil/assimilation.rb +17 -0
  61. data/lib/mongoid/extensions/object/conversions.rb +21 -0
  62. data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
  63. data/lib/mongoid/extensions/proc/scoping.rb +12 -0
  64. data/lib/mongoid/extensions/set/conversions.rb +20 -0
  65. data/lib/mongoid/extensions/string/conversions.rb +15 -0
  66. data/lib/mongoid/extensions/string/inflections.rb +97 -0
  67. data/lib/mongoid/extensions/symbol/inflections.rb +40 -0
  68. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  69. data/lib/mongoid/extensions/true_class/equality.rb +13 -0
  70. data/lib/mongoid/extras.rb +61 -0
  71. data/lib/mongoid/factory.rb +20 -0
  72. data/lib/mongoid/field.rb +83 -0
  73. data/lib/mongoid/fields.rb +62 -0
  74. data/lib/mongoid/finders.rb +145 -0
  75. data/lib/mongoid/hierarchy.rb +74 -0
  76. data/lib/mongoid/identity.rb +47 -0
  77. data/lib/mongoid/indexes.rb +27 -0
  78. data/lib/mongoid/javascript.rb +21 -0
  79. data/lib/mongoid/javascript/functions.yml +37 -0
  80. data/lib/mongoid/logger.rb +19 -0
  81. data/lib/mongoid/matchers.rb +35 -0
  82. data/lib/mongoid/matchers/all.rb +11 -0
  83. data/lib/mongoid/matchers/default.rb +26 -0
  84. data/lib/mongoid/matchers/exists.rb +13 -0
  85. data/lib/mongoid/matchers/gt.rb +11 -0
  86. data/lib/mongoid/matchers/gte.rb +11 -0
  87. data/lib/mongoid/matchers/in.rb +11 -0
  88. data/lib/mongoid/matchers/lt.rb +11 -0
  89. data/lib/mongoid/matchers/lte.rb +11 -0
  90. data/lib/mongoid/matchers/ne.rb +11 -0
  91. data/lib/mongoid/matchers/nin.rb +11 -0
  92. data/lib/mongoid/matchers/size.rb +11 -0
  93. data/lib/mongoid/memoization.rb +33 -0
  94. data/lib/mongoid/named_scope.rb +37 -0
  95. data/lib/mongoid/paranoia.rb +106 -0
  96. data/lib/mongoid/paths.rb +61 -0
  97. data/lib/mongoid/persistence.rb +216 -0
  98. data/lib/mongoid/persistence/command.rb +39 -0
  99. data/lib/mongoid/persistence/insert.rb +48 -0
  100. data/lib/mongoid/persistence/insert_embedded.rb +44 -0
  101. data/lib/mongoid/persistence/remove.rb +39 -0
  102. data/lib/mongoid/persistence/remove_all.rb +38 -0
  103. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  104. data/lib/mongoid/persistence/update.rb +71 -0
  105. data/lib/mongoid/railtie.rb +67 -0
  106. data/lib/mongoid/railties/database.rake +60 -0
  107. data/lib/mongoid/scope.rb +75 -0
  108. data/lib/mongoid/state.rb +32 -0
  109. data/lib/mongoid/timestamps.rb +27 -0
  110. data/lib/mongoid/validations.rb +51 -0
  111. data/lib/mongoid/validations/associated.rb +32 -0
  112. data/lib/mongoid/validations/locale/en.yml +5 -0
  113. data/lib/mongoid/validations/uniqueness.rb +56 -0
  114. data/lib/mongoid/version.rb +4 -0
  115. data/lib/mongoid/versioning.rb +26 -0
  116. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  117. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
  118. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  119. data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
  120. data/lib/rails/generators/mongoid_generator.rb +61 -0
  121. data/spec/integration/mongoid/association_attributes_spec.rb +71 -0
  122. data/spec/integration/mongoid/associations_spec.rb +768 -0
  123. data/spec/integration/mongoid/attributes_spec.rb +59 -0
  124. data/spec/integration/mongoid/callback_spec.rb +33 -0
  125. data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
  126. data/spec/integration/mongoid/criteria_spec.rb +281 -0
  127. data/spec/integration/mongoid/dirty_spec.rb +85 -0
  128. data/spec/integration/mongoid/document_spec.rb +741 -0
  129. data/spec/integration/mongoid/extensions_spec.rb +22 -0
  130. data/spec/integration/mongoid/finders_spec.rb +119 -0
  131. data/spec/integration/mongoid/inheritance_spec.rb +171 -0
  132. data/spec/integration/mongoid/named_scope_spec.rb +58 -0
  133. data/spec/integration/mongoid/paranoia_spec.rb +44 -0
  134. data/spec/integration/mongoid/persistence/update_spec.rb +46 -0
  135. data/spec/integration/mongoid/persistence_spec.rb +311 -0
  136. data/spec/integration/mongoid/validations/uniqueness_spec.rb +206 -0
  137. data/spec/models/account.rb +5 -0
  138. data/spec/models/address.rb +40 -0
  139. data/spec/models/agent.rb +7 -0
  140. data/spec/models/animal.rb +15 -0
  141. data/spec/models/answer.rb +4 -0
  142. data/spec/models/callbacks.rb +47 -0
  143. data/spec/models/category.rb +13 -0
  144. data/spec/models/comment.rb +10 -0
  145. data/spec/models/country_code.rb +6 -0
  146. data/spec/models/employer.rb +5 -0
  147. data/spec/models/favorite.rb +8 -0
  148. data/spec/models/game.rb +9 -0
  149. data/spec/models/inheritance.rb +72 -0
  150. data/spec/models/location.rb +5 -0
  151. data/spec/models/login.rb +6 -0
  152. data/spec/models/mixed_drink.rb +4 -0
  153. data/spec/models/name.rb +13 -0
  154. data/spec/models/namespacing.rb +11 -0
  155. data/spec/models/paranoid_post.rb +18 -0
  156. data/spec/models/parents.rb +32 -0
  157. data/spec/models/patient.rb +15 -0
  158. data/spec/models/person.rb +106 -0
  159. data/spec/models/pet.rb +7 -0
  160. data/spec/models/pet_owner.rb +6 -0
  161. data/spec/models/phone.rb +7 -0
  162. data/spec/models/post.rb +25 -0
  163. data/spec/models/preference.rb +7 -0
  164. data/spec/models/question.rb +8 -0
  165. data/spec/models/survey.rb +6 -0
  166. data/spec/models/translation.rb +5 -0
  167. data/spec/models/user.rb +6 -0
  168. data/spec/models/user_accout.rb +5 -0
  169. data/spec/models/vet_visit.rb +5 -0
  170. data/spec/models/video.rb +5 -0
  171. data/spec/spec_helper.rb +33 -0
  172. data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
  173. data/spec/unit/mongoid/associations/embeds_many_spec.rb +626 -0
  174. data/spec/unit/mongoid/associations/embeds_one_spec.rb +287 -0
  175. data/spec/unit/mongoid/associations/foreign_key_spec.rb +90 -0
  176. data/spec/unit/mongoid/associations/meta_data_spec.rb +110 -0
  177. data/spec/unit/mongoid/associations/options_spec.rb +215 -0
  178. data/spec/unit/mongoid/associations/referenced_in_spec.rb +145 -0
  179. data/spec/unit/mongoid/associations/references_many_as_array_spec.rb +424 -0
  180. data/spec/unit/mongoid/associations/references_many_spec.rb +502 -0
  181. data/spec/unit/mongoid/associations/references_one_spec.rb +204 -0
  182. data/spec/unit/mongoid/associations_spec.rb +688 -0
  183. data/spec/unit/mongoid/atomicity_spec.rb +164 -0
  184. data/spec/unit/mongoid/attributes_spec.rb +646 -0
  185. data/spec/unit/mongoid/callbacks_spec.rb +85 -0
  186. data/spec/unit/mongoid/collection_spec.rb +187 -0
  187. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  188. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  189. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  190. data/spec/unit/mongoid/collections_spec.rb +98 -0
  191. data/spec/unit/mongoid/config_spec.rb +298 -0
  192. data/spec/unit/mongoid/contexts/enumerable_spec.rb +447 -0
  193. data/spec/unit/mongoid/contexts/mongo_spec.rb +703 -0
  194. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  195. data/spec/unit/mongoid/criteria_spec.rb +873 -0
  196. data/spec/unit/mongoid/criterion/complex_spec.rb +17 -0
  197. data/spec/unit/mongoid/criterion/exclusion_spec.rb +121 -0
  198. data/spec/unit/mongoid/criterion/inclusion_spec.rb +274 -0
  199. data/spec/unit/mongoid/criterion/optional_spec.rb +483 -0
  200. data/spec/unit/mongoid/cursor_spec.rb +80 -0
  201. data/spec/unit/mongoid/deprecation_spec.rb +24 -0
  202. data/spec/unit/mongoid/dirty_spec.rb +430 -0
  203. data/spec/unit/mongoid/document_spec.rb +623 -0
  204. data/spec/unit/mongoid/errors_spec.rb +154 -0
  205. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  206. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  207. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +52 -0
  208. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  209. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +36 -0
  210. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  211. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  212. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +145 -0
  213. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +14 -0
  214. data/spec/unit/mongoid/extensions/false_class/equality_spec.rb +35 -0
  215. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  216. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  217. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +59 -0
  218. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +35 -0
  219. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  220. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  221. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  222. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +29 -0
  223. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +44 -0
  224. data/spec/unit/mongoid/extensions/objectid/conversions_spec.rb +22 -0
  225. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  226. data/spec/unit/mongoid/extensions/set/conversions_spec.rb +21 -0
  227. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +28 -0
  228. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  229. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +107 -0
  230. data/spec/unit/mongoid/extensions/time_conversions_spec.rb +186 -0
  231. data/spec/unit/mongoid/extensions/true_class/equality_spec.rb +35 -0
  232. data/spec/unit/mongoid/extras_spec.rb +102 -0
  233. data/spec/unit/mongoid/factory_spec.rb +31 -0
  234. data/spec/unit/mongoid/field_spec.rb +169 -0
  235. data/spec/unit/mongoid/fields_spec.rb +181 -0
  236. data/spec/unit/mongoid/finders_spec.rb +439 -0
  237. data/spec/unit/mongoid/hierarchy_spec.rb +68 -0
  238. data/spec/unit/mongoid/identity_spec.rb +109 -0
  239. data/spec/unit/mongoid/indexes_spec.rb +99 -0
  240. data/spec/unit/mongoid/javascript_spec.rb +48 -0
  241. data/spec/unit/mongoid/logger_spec.rb +38 -0
  242. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  243. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  244. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  245. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  246. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  247. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  248. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  249. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  250. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  251. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  252. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  253. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  254. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  255. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  256. data/spec/unit/mongoid/paranoia_spec.rb +108 -0
  257. data/spec/unit/mongoid/paths_spec.rb +272 -0
  258. data/spec/unit/mongoid/persistence/insert_embedded_spec.rb +154 -0
  259. data/spec/unit/mongoid/persistence/insert_spec.rb +144 -0
  260. data/spec/unit/mongoid/persistence/remove_all_spec.rb +82 -0
  261. data/spec/unit/mongoid/persistence/remove_embedded_spec.rb +152 -0
  262. data/spec/unit/mongoid/persistence/remove_spec.rb +89 -0
  263. data/spec/unit/mongoid/persistence/update_spec.rb +177 -0
  264. data/spec/unit/mongoid/persistence_spec.rb +452 -0
  265. data/spec/unit/mongoid/scope_spec.rb +240 -0
  266. data/spec/unit/mongoid/serialization_spec.rb +43 -0
  267. data/spec/unit/mongoid/state_spec.rb +94 -0
  268. data/spec/unit/mongoid/timestamps_spec.rb +30 -0
  269. data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
  270. data/spec/unit/mongoid/validations/uniqueness_spec.rb +201 -0
  271. data/spec/unit/mongoid/validations_spec.rb +43 -0
  272. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  273. data/spec/unit/mongoid_spec.rb +46 -0
  274. metadata +433 -0
@@ -0,0 +1,210 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Document
4
+ extend ActiveSupport::Concern
5
+ included do
6
+ include Mongoid::Components
7
+
8
+ cattr_accessor :primary_key
9
+
10
+ attr_accessor :association_name
11
+ attr_reader :new_record
12
+
13
+ delegate :primary_key, :to => "self.class"
14
+ end
15
+
16
+ module ClassMethods #:nodoc:
17
+
18
+ # Perform default behavior but mark the hierarchy as being hereditary.
19
+ #
20
+ # This method must remain in the +Document+ module, even though its
21
+ # behavior affects items in the Hierarchy module.
22
+ def inherited(subclass)
23
+ super(subclass)
24
+ self.hereditary = true
25
+ end
26
+
27
+ # Instantiate a new object, only when loaded from the database or when
28
+ # the attributes have already been typecast.
29
+ #
30
+ # Example:
31
+ #
32
+ # <tt>Person.instantiate(:title => "Sir", :age => 30)</tt>
33
+ def instantiate(attrs = nil, allocating = false)
34
+ attributes = attrs || {}
35
+ if attributes["_id"] || allocating
36
+ document = allocate
37
+ document.instance_variable_set(:@attributes, attributes)
38
+ document.setup_modifications
39
+ return document
40
+ else
41
+ return new(attrs)
42
+ end
43
+ end
44
+
45
+ # Defines the field that will be used for the id of this +Document+. This
46
+ # set the id of this +Document+ before save to a parameterized version of
47
+ # the field that was supplied. This is good for use for readable URLS in
48
+ # web applications.
49
+ #
50
+ # Example:
51
+ #
52
+ # class Person
53
+ # include Mongoid::Document
54
+ # key :first_name, :last_name
55
+ # end
56
+ def key(*fields)
57
+ self.primary_key = fields
58
+ set_callback :save, :before, :identify
59
+ end
60
+
61
+ # Returns all types to query for when using this class as the base.
62
+ # *subclasses* is from activesupport. Note that a bug in *subclasses*
63
+ # causes the first call to only return direct children, hence
64
+ # the double call and unique.
65
+ def _types
66
+ @_type ||= [subclasses + subclasses + [self.name]].flatten.uniq.map(&:to_s)
67
+ end
68
+ end
69
+
70
+ # Performs equality checking on the document ids. For more robust
71
+ # equality checking please override this method.
72
+ def ==(other)
73
+ return false unless other.is_a?(Document)
74
+ id == other.id
75
+ end
76
+
77
+ # Delegates to ==
78
+ def eql?(comparison_object)
79
+ self == (comparison_object)
80
+ end
81
+
82
+ # Delegates to id in order to allow two records of the same type and id to work with something like:
83
+ # [ Person.find(1), Person.find(2), Person.find(3) ] & [ Person.find(1), Person.find(4) ] # => [ Person.find(1) ]
84
+ def hash
85
+ id.hash
86
+ end
87
+
88
+ # Introduces a child object into the +Document+ object graph. This will
89
+ # set up the relationships between the parent and child and update the
90
+ # attributes of the parent +Document+.
91
+ #
92
+ # Options:
93
+ #
94
+ # parent: The +Document+ to assimilate with.
95
+ # options: The association +Options+ for the child.
96
+ def assimilate(parent, options)
97
+ parentize(parent, options.name); notify; self
98
+ end
99
+
100
+ # Return the attributes hash with indifferent access.
101
+ def attributes
102
+ @attributes.with_indifferent_access
103
+ end
104
+
105
+ # Clone the current +Document+. This will return all attributes with the
106
+ # exception of the document's id and versions.
107
+ def clone
108
+ self.class.instantiate(@attributes.except("_id").except("versions").dup, true)
109
+ end
110
+
111
+ # Generate an id for this +Document+.
112
+ def identify
113
+ Identity.new(self).create
114
+ end
115
+
116
+ # Instantiate a new +Document+, setting the Document's attributes if
117
+ # given. If no attributes are provided, they will be initialized with
118
+ # an empty +Hash+.
119
+ #
120
+ # If a primary key is defined, the document's id will be set to that key,
121
+ # otherwise it will be set to a fresh +BSON::ObjectID+ string.
122
+ #
123
+ # Options:
124
+ #
125
+ # attrs: The attributes +Hash+ to set up the document with.
126
+ def initialize(attrs = nil)
127
+ @attributes = default_attributes
128
+ process(attrs)
129
+ @new_record = true
130
+ document = yield self if block_given?
131
+ identify
132
+ end
133
+
134
+ # Returns the class name plus its attributes.
135
+ def inspect
136
+ attrs = fields.map { |name, field| "#{name}: #{@attributes[name].inspect}" }
137
+ if Mongoid.allow_dynamic_fields
138
+ dynamic_keys = @attributes.keys - fields.keys - associations.keys - ["_id", "_type"]
139
+ attrs += dynamic_keys.map { |name| "#{name}: #{@attributes[name].inspect}" }
140
+ end
141
+ "#<#{self.class.name} _id: #{id}, #{attrs * ', '}>"
142
+ end
143
+
144
+ # Notify parent of an update.
145
+ #
146
+ # Example:
147
+ #
148
+ # <tt>person.notify</tt>
149
+ def notify
150
+ _parent.update_child(self) if _parent
151
+ end
152
+
153
+ # Return the attributes hash.
154
+ def raw_attributes
155
+ @attributes
156
+ end
157
+
158
+ # Reloads the +Document+ attributes from the database.
159
+ def reload
160
+ reloaded = collection.find_one(:_id => id)
161
+ if Mongoid.raise_not_found_error
162
+ raise Errors::DocumentNotFound.new(self.class, id) if reloaded.nil?
163
+ end
164
+ @attributes = {}.merge(reloaded || {})
165
+ self.associations.keys.each { |association_name| unmemoize(association_name) }; self
166
+ end
167
+
168
+ # Remove a child document from this parent +Document+. Will reset the
169
+ # memoized association and notify the parent of the change.
170
+ def remove(child)
171
+ name = child.association_name
172
+ if @building_nested
173
+ @attributes.remove(name, child.raw_attributes)
174
+ else
175
+ reset(name) { @attributes.remove(name, child.raw_attributes) }
176
+ notify
177
+ end
178
+ end
179
+
180
+ # def remove_without_reset
181
+ # name = child.association_name
182
+ # @attributes.remove(name, child.raw_attributes)
183
+ # notify
184
+ # end
185
+
186
+ # Return an array with this +Document+ only in it.
187
+ def to_a
188
+ [ self ]
189
+ end
190
+
191
+ # Recieve a notify call from a child +Document+. This will either update
192
+ # existing attributes on the +Document+ or clear them out for the child if
193
+ # the clear boolean is provided.
194
+ #
195
+ # Options:
196
+ #
197
+ # child: The child +Document+ that sent the notification.
198
+ # clear: Will clear out the child's attributes if set to true.
199
+ def update_child(child, clear = false)
200
+ name = child.association_name
201
+ attrs = child.instance_variable_get(:@attributes)
202
+ if clear
203
+ @attributes.delete(name)
204
+ else
205
+ # check good for array only
206
+ @attributes.insert(name, attrs) unless @attributes[name] && @attributes[name].include?(attrs)
207
+ end
208
+ end
209
+ end
210
+ end
@@ -0,0 +1,131 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc
3
+ module Errors #:nodoc
4
+
5
+ # Default parent Mongoid error for all custom errors
6
+ class MongoidError < StandardError; end
7
+
8
+ # Raised when querying the database for a document by a specific id which
9
+ # does not exist. If multiple ids were passed then it will display all of
10
+ # those.
11
+ #
12
+ # Example:
13
+ #
14
+ # <tt>DocumentNotFound.new(Person, ["1", "2"])</tt>
15
+ class DocumentNotFound < MongoidError
16
+ attr_reader :klass, :indentifiers
17
+ def initialize(klass, ids)
18
+ @klass = klass
19
+ @identifiers = ids.is_a?(Array) ? ids.join(", ") : ids
20
+ super("Document not found for class #{@klass} with id(s) #{@identifiers}")
21
+ end
22
+ end
23
+
24
+ # Raised when invalid options are passed into a constructor or method.
25
+ #
26
+ # Example:
27
+ #
28
+ # <tt>InvalidOptions.new</tt>
29
+ class InvalidOptions < MongoidError; end
30
+
31
+ # Raised when the database connection has not been set up properly, either
32
+ # by attempting to set an object on the db that is not a +Mongo::DB+, or
33
+ # not setting anything at all.
34
+ #
35
+ # Example:
36
+ #
37
+ # <tt>InvalidDatabase.new("Not a DB")</tt>
38
+ class InvalidDatabase < MongoidError
39
+ attr_reader :database
40
+ def initialize(database)
41
+ @database = database
42
+ super("Database should be a Mongo::DB, not #{@database.class.name}")
43
+ end
44
+ end
45
+
46
+ # Raised when trying to get or set a value for a defined field, where the
47
+ # type of the object does not match the defined field type.
48
+ #
49
+ # Example:
50
+ #
51
+ # <tt>InvalidType.new(Array, "Not an Array")</tt>
52
+ class InvalidType < MongoidError
53
+ def initialize(klass, value)
54
+ super("Field was defined as a(n) #{klass.name}, but received a #{value.class.name} " +
55
+ "with the value #{value.inspect}.")
56
+ end
57
+ end
58
+
59
+ # Raised when the database version is not supported by Mongoid.
60
+ #
61
+ # Example:
62
+ #
63
+ # <tt>UnsupportedVersion.new(Mongo::ServerVersion.new("1.3.1"))</tt>
64
+ class UnsupportedVersion < MongoidError
65
+ def initialize(version)
66
+ super("MongoDB #{version} not supported, please upgrade to #{Mongoid::MONGODB_VERSION}")
67
+ end
68
+ end
69
+
70
+ # Raised when a persisence method ending in ! fails validation. The message
71
+ # will contain the full error messages from the +Document+ in question.
72
+ #
73
+ # Example:
74
+ #
75
+ # <tt>Validations.new(person.errors)</tt>
76
+ class Validations < MongoidError
77
+ attr_reader :document
78
+ def initialize(document)
79
+ @document = document
80
+ super("Validation Failed: #{@document.errors.full_messages.join(", ")}")
81
+ end
82
+ end
83
+
84
+ # This error is raised when trying to access a Mongo::Collection from an
85
+ # embedded document.
86
+ #
87
+ # Example:
88
+ #
89
+ # <tt>InvalidCollection.new(Address)</tt>
90
+ class InvalidCollection < MongoidError
91
+ attr_reader :klass
92
+ def initialize(klass)
93
+ @klass = klass
94
+ super("Access to the collection for #{@klass.name} is not allowed " +
95
+ "since it is an embedded document, please access a collection from " +
96
+ "the root document")
97
+ end
98
+ end
99
+
100
+ # This error is raised when trying to create a field that conflicts with
101
+ # a Mongoid internal attribute or method.
102
+ #
103
+ # Example:
104
+ #
105
+ # <tt>InvalidField.new('collection')</tt>
106
+ class InvalidField < MongoidError
107
+ attr_reader :name
108
+ def initialize(name)
109
+ @name = name
110
+ super("Defining a field named '#{@name}' is not allowed. " +
111
+ "Do not define fields that conflict with Mongoid internal attributes " +
112
+ "or method names. Use Document#instance_methods to see what " +
113
+ "names this includes.")
114
+ end
115
+ end
116
+
117
+ # This error is raised when trying to create set nested records above the
118
+ # specified :limit
119
+ #
120
+ # Example:
121
+ #
122
+ #<tt>TooManyNestedAttributeRecords.new('association', limit)
123
+ class TooManyNestedAttributeRecords < MongoidError
124
+ attr_reader :association, :limit
125
+ def initialize(association, limit)
126
+ @association, @limit = association.to_s.humanize.capitalize, limit
127
+ super("Accept Nested Attributes for #{@association} is limited to #{@limit} records")
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,115 @@
1
+ # encoding: utf-8
2
+ require "mongoid/extensions/time_conversions"
3
+ require "mongoid/extensions/array/accessors"
4
+ require "mongoid/extensions/array/assimilation"
5
+ require "mongoid/extensions/array/conversions"
6
+ require "mongoid/extensions/array/parentization"
7
+ require "mongoid/extensions/set/conversions"
8
+ require "mongoid/extensions/big_decimal/conversions"
9
+ require "mongoid/extensions/binary/conversions"
10
+ require "mongoid/extensions/boolean/conversions"
11
+ require "mongoid/extensions/date/conversions"
12
+ require "mongoid/extensions/datetime/conversions"
13
+ require "mongoid/extensions/false_class/equality"
14
+ require "mongoid/extensions/float/conversions"
15
+ require "mongoid/extensions/hash/accessors"
16
+ require "mongoid/extensions/hash/assimilation"
17
+ require "mongoid/extensions/hash/conversions"
18
+ require "mongoid/extensions/hash/criteria_helpers"
19
+ require "mongoid/extensions/hash/scoping"
20
+ require "mongoid/extensions/integer/conversions"
21
+ require "mongoid/extensions/nil/assimilation"
22
+ require "mongoid/extensions/object/conversions"
23
+ require "mongoid/extensions/proc/scoping"
24
+ require "mongoid/extensions/string/conversions"
25
+ require "mongoid/extensions/string/inflections"
26
+ require "mongoid/extensions/symbol/inflections"
27
+ require "mongoid/extensions/true_class/equality"
28
+ require "mongoid/extensions/objectid/conversions"
29
+
30
+ class Array #:nodoc
31
+ include Mongoid::Extensions::Array::Accessors
32
+ include Mongoid::Extensions::Array::Assimilation
33
+ include Mongoid::Extensions::Array::Conversions
34
+ include Mongoid::Extensions::Array::Parentization
35
+ end
36
+
37
+ class Set #:nodoc
38
+ include Mongoid::Extensions::Set::Conversions
39
+ end
40
+
41
+ class BigDecimal #:nodoc
42
+ extend Mongoid::Extensions::BigDecimal::Conversions
43
+ end
44
+
45
+ class Binary #:nodoc
46
+ extend Mongoid::Extensions::Binary::Conversions
47
+ end
48
+
49
+ class Boolean #:nodoc
50
+ include Mongoid::Extensions::Boolean::Conversions
51
+ end
52
+
53
+ class DateTime #:nodoc
54
+ extend Mongoid::Extensions::TimeConversions
55
+ extend Mongoid::Extensions::DateTime::Conversions
56
+ end
57
+
58
+ class Date #:nodoc
59
+ extend Mongoid::Extensions::TimeConversions
60
+ extend Mongoid::Extensions::Date::Conversions
61
+ end
62
+
63
+ class FalseClass #:nodoc
64
+ include Mongoid::Extensions::FalseClass::Equality
65
+ end
66
+
67
+ class Float #:nodoc
68
+ extend Mongoid::Extensions::Float::Conversions
69
+ end
70
+
71
+ class Hash #:nodoc
72
+ include Mongoid::Extensions::Hash::Accessors
73
+ include Mongoid::Extensions::Hash::Assimilation
74
+ include Mongoid::Extensions::Hash::CriteriaHelpers
75
+ include Mongoid::Extensions::Hash::Scoping
76
+ include Mongoid::Extensions::Hash::Conversions
77
+ end
78
+
79
+ class Integer #:nodoc
80
+ extend Mongoid::Extensions::Integer::Conversions
81
+ end
82
+
83
+ class NilClass #:nodoc
84
+ include Mongoid::Extensions::Nil::Assimilation
85
+ end
86
+
87
+ class Object #:nodoc:
88
+ include Mongoid::Extensions::Object::Conversions
89
+ end
90
+
91
+ class Proc #:nodoc:
92
+ include Mongoid::Extensions::Proc::Scoping
93
+ end
94
+
95
+ class String #:nodoc
96
+ include Mongoid::Extensions::String::Inflections
97
+ extend Mongoid::Extensions::String::Conversions
98
+ end
99
+
100
+ class Symbol #:nodoc
101
+ remove_method :size if instance_methods.include? :size # temporal fix for ruby 1.9
102
+ include Mongoid::Extensions::Symbol::Inflections
103
+ end
104
+
105
+ class Time #:nodoc
106
+ extend Mongoid::Extensions::TimeConversions
107
+ end
108
+
109
+ class TrueClass #:nodoc
110
+ include Mongoid::Extensions::TrueClass::Equality
111
+ end
112
+
113
+ class BSON::ObjectID #:nodoc
114
+ extend Mongoid::Extensions::ObjectID::Conversions
115
+ end