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,20 @@
1
+ Copyright (c) 2009 Durran Jordan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,47 @@
1
+ = Overview
2
+
3
+ == About Mongoid
4
+
5
+ Mongoid is an ODM (Object-Document-Mapper) framework for MongoDB in Ruby.
6
+
7
+ == Project Tracking
8
+
9
+ * {Mongoid Google Group}[http://groups.google.com/group/mongoid]
10
+ * {Mongoid Website and Documentation}[http://mongoid.org]
11
+
12
+ == Compatibility
13
+
14
+ Mongoid is developed against Ruby 1.8.7, 1.9.1, 1.9.2
15
+
16
+ = Documentation
17
+
18
+ Please see the new Mongoid website for up-to-date documentation:
19
+ {mongoid.org}[http://mongoid.org]
20
+
21
+ = License
22
+
23
+ Copyright (c) 2009, 2010 Durran Jordan
24
+
25
+ Permission is hereby granted, free of charge, to any person obtaining
26
+ a copy of this software and associated documentation files (the
27
+ "Software"), to deal in the Software without restriction, including
28
+ without limitation the rights to use, copy, modify, merge, publish,
29
+ distribute, sublicense, and/or sell copies of the Software, and to
30
+ permit persons to whom the Software is furnished to do so, subject to
31
+ the following conditions:
32
+
33
+ The above copyright notice and this permission notice shall be
34
+ included in all copies or substantial portions of the Software.
35
+
36
+
37
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
38
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
39
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
40
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
41
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
42
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
43
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
44
+
45
+ = Credits
46
+
47
+ Durran Jordan: durran at gmail dot com
@@ -0,0 +1,141 @@
1
+ # encoding: utf-8
2
+ # Copyright (c) 2009 Durran Jordan
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ require "delegate"
24
+ require "singleton"
25
+ require "time"
26
+ require "ostruct"
27
+ require "active_support/core_ext"
28
+ require 'active_support/json'
29
+ require "active_support/inflector"
30
+ require "active_support/time_with_zone"
31
+ require "active_model"
32
+ require "active_model/callbacks"
33
+ require "active_model/conversion"
34
+ require "active_model/deprecated_error_methods"
35
+ require "active_model/errors"
36
+ require "active_model/naming"
37
+ require "active_model/serialization"
38
+ require "active_model/translation"
39
+ require "active_model/validator"
40
+ require "active_model/validations"
41
+ require "will_paginate/collection"
42
+ require "mongo"
43
+ require "mongoid/extensions"
44
+ require "mongoid/associations"
45
+ require "mongoid/atomicity"
46
+ require "mongoid/attributes"
47
+ require "mongoid/callbacks"
48
+ require "mongoid/collection"
49
+ require "mongoid/collections"
50
+ require "mongoid/config"
51
+ require "mongoid/contexts"
52
+ require "mongoid/criteria"
53
+ require "mongoid/cursor"
54
+ require "mongoid/deprecation"
55
+ require "mongoid/dirty"
56
+ require "mongoid/extras"
57
+ require "mongoid/errors"
58
+ require "mongoid/factory"
59
+ require "mongoid/field"
60
+ require "mongoid/fields"
61
+ require "mongoid/finders"
62
+ require "mongoid/hierarchy"
63
+ require "mongoid/identity"
64
+ require "mongoid/indexes"
65
+ require "mongoid/javascript"
66
+ require "mongoid/logger"
67
+ require "mongoid/matchers"
68
+ require "mongoid/memoization"
69
+ require "mongoid/named_scope"
70
+ require "mongoid/paths"
71
+ require "mongoid/persistence"
72
+ require "mongoid/scope"
73
+ require "mongoid/state"
74
+ require "mongoid/timestamps"
75
+ require "mongoid/validations"
76
+ require "mongoid/versioning"
77
+ require "mongoid/components"
78
+ require "mongoid/paranoia"
79
+ require "mongoid/document"
80
+
81
+ # add railtie
82
+ if defined?(Rails)
83
+ require "mongoid/railtie"
84
+ end
85
+
86
+ module Mongoid #:nodoc
87
+
88
+ MONGODB_VERSION = "1.4.0"
89
+
90
+ class << self
91
+
92
+ # Sets the Mongoid configuration options. Best used by passing a block.
93
+ #
94
+ # Example:
95
+ #
96
+ # Mongoid.configure do |config|
97
+ # name = "mongoid_test"
98
+ # host = "localhost"
99
+ # config.allow_dynamic_fields = false
100
+ # config.master = Mongo::Connection.new.db(name)
101
+ # config.slaves = [
102
+ # Mongo::Connection.new(host, 27018, :slave_ok => true).db(name),
103
+ # Mongo::Connection.new(host, 27019, :slave_ok => true).db(name)
104
+ # ]
105
+ # end
106
+ #
107
+ # Returns:
108
+ #
109
+ # The Mongoid +Config+ singleton instance.
110
+ def configure
111
+ config = Mongoid::Config.instance
112
+ block_given? ? yield(config) : config
113
+ end
114
+
115
+ # Easy convenience method for generating an alert from the
116
+ # deprecation module.
117
+ #
118
+ # Example:
119
+ #
120
+ # <tt>Mongoid.deprecate("Method no longer used")</tt>
121
+ def deprecate(message)
122
+ Mongoid::Deprecation.instance.alert(message)
123
+ end
124
+
125
+ alias :config :configure
126
+ end
127
+
128
+ # Take all the public instance methods from the Config singleton and allow
129
+ # them to be accessed through the Mongoid module directly.
130
+ #
131
+ # Example:
132
+ #
133
+ # <tt>Mongoid.database = Mongo::Connection.new.db("test")</tt>
134
+ Mongoid::Config.public_instance_methods(false).each do |name|
135
+ (class << self; self; end).class_eval <<-EOT
136
+ def #{name}(*args)
137
+ configure.send("#{name}", *args)
138
+ end
139
+ EOT
140
+ end
141
+ end
@@ -0,0 +1,306 @@
1
+ # encoding: utf-8
2
+ require "mongoid/associations/proxy"
3
+ require "mongoid/associations/embedded_in"
4
+ require "mongoid/associations/embeds_many"
5
+ require "mongoid/associations/embeds_one"
6
+ require "mongoid/associations/foreign_key"
7
+ require "mongoid/associations/references_many"
8
+ require "mongoid/associations/references_many_as_array"
9
+ require "mongoid/associations/references_one"
10
+ require "mongoid/associations/referenced_in"
11
+ require "mongoid/associations/options"
12
+ require "mongoid/associations/meta_data"
13
+
14
+ module Mongoid # :nodoc:
15
+ module Associations #:nodoc:
16
+ extend ActiveSupport::Concern
17
+ included do
18
+ include ForeignKey
19
+
20
+ cattr_accessor :embedded
21
+ self.embedded = false
22
+
23
+ class_inheritable_accessor :associations
24
+ self.associations = {}
25
+
26
+ delegate :embedded, :embedded?, :to => "self.class"
27
+ end
28
+
29
+ # Returns the associations for the +Document+.
30
+ def associations
31
+ self.class.associations
32
+ end
33
+
34
+ # are we in an embeds_many?
35
+ def embedded_many?
36
+ embedded? && _parent.associations[association_name].association == EmbedsMany
37
+ end
38
+
39
+ # are we in an embeds_one?
40
+ def embedded_one?
41
+ embedded? && !embedded_many?
42
+ end
43
+
44
+ # Update the one-to-one relational association for the name.
45
+ def update_association(name)
46
+ association = send(name)
47
+ association.save if new_record? && !association.nil?
48
+ end
49
+
50
+ # Updates all the one-to-many relational associations for the name.
51
+ def update_associations(name)
52
+ send(name).each { |doc| doc.save } if new_record?
53
+ end
54
+
55
+ def update_foreign_keys
56
+ associations.each do |name, association|
57
+ next unless association.macro == :referenced_in
58
+ foreign_key = association.options.foreign_key
59
+ if send(foreign_key).nil?
60
+ target = send(name)
61
+ send("#{foreign_key}=", target ? target.id : nil)
62
+ end
63
+ end
64
+ end
65
+
66
+ module ClassMethods
67
+ # Gets whether or not the document is embedded.
68
+ #
69
+ # Example:
70
+ #
71
+ # <tt>Person.embedded?</tt>
72
+ #
73
+ # Returns:
74
+ #
75
+ # <tt>true</tt> if embedded, <tt>false</tt> if not.
76
+ def embedded?
77
+ !!self.embedded
78
+ end
79
+
80
+ # Adds the association back to the parent document. This macro is
81
+ # necessary to set the references from the child back to the parent
82
+ # document. If a child does not define this association calling
83
+ # persistence methods on the child object will cause a save to fail.
84
+ #
85
+ # Options:
86
+ #
87
+ # name: A +Symbol+ that matches the name of the parent class.
88
+ #
89
+ # Example:
90
+ #
91
+ # class Person
92
+ # include Mongoid::Document
93
+ # embeds_many :addresses
94
+ # end
95
+ #
96
+ # class Address
97
+ # include Mongoid::Document
98
+ # embedded_in :person, :inverse_of => :addresses
99
+ # end
100
+ def embedded_in(name, options = {}, &block)
101
+ unless options.has_key?(:inverse_of)
102
+ raise Errors::InvalidOptions.new("Options for embedded_in association must include :inverse_of")
103
+ end
104
+ self.embedded = true
105
+ associate(Associations::EmbeddedIn, optionize(name, options, nil, &block))
106
+ end
107
+
108
+ # Adds the association from a parent document to its children. The name
109
+ # of the association needs to be a pluralized form of the child class
110
+ # name.
111
+ #
112
+ # Options:
113
+ #
114
+ # name: A +Symbol+ that is the plural child class name.
115
+ #
116
+ # Example:
117
+ #
118
+ # class Person
119
+ # include Mongoid::Document
120
+ # embeds_many :addresses
121
+ # end
122
+ #
123
+ # class Address
124
+ # include Mongoid::Document
125
+ # embedded_in :person, :inverse_of => :addresses
126
+ # end
127
+ def embeds_many(name, options = {}, &block)
128
+ associate(Associations::EmbedsMany, optionize(name, options, nil, &block))
129
+ end
130
+
131
+ alias :embed_many :embeds_many
132
+
133
+ # Adds the association from a parent document to its child. The name
134
+ # of the association needs to be a singular form of the child class
135
+ # name.
136
+ #
137
+ # Options:
138
+ #
139
+ # name: A +Symbol+ that is the plural child class name.
140
+ #
141
+ # Example:
142
+ #
143
+ # class Person
144
+ # include Mongoid::Document
145
+ # embeds_one :name
146
+ # end
147
+ #
148
+ # class Name
149
+ # include Mongoid::Document
150
+ # embedded_in :person
151
+ # end
152
+ def embeds_one(name, options = {}, &block)
153
+ opts = optionize(name, options, nil, &block)
154
+ type = Associations::EmbedsOne
155
+ associate(type, opts)
156
+ add_builder(type, opts)
157
+ add_creator(type, opts)
158
+ end
159
+
160
+ alias :embed_one :embeds_one
161
+
162
+ # Adds a relational association from the child Document to a Document in
163
+ # another database or collection.
164
+ #
165
+ # Options:
166
+ #
167
+ # name: A +Symbol+ that is the related class name.
168
+ #
169
+ # Example:
170
+ #
171
+ # class Game
172
+ # include Mongoid::Document
173
+ # referenced_in :person
174
+ # end
175
+ #
176
+ def referenced_in(name, options = {}, &block)
177
+ opts = optionize(name, options, constraint(name, options, :in), &block)
178
+ associate(Associations::ReferencedIn, opts)
179
+ field(opts.foreign_key, :type => Mongoid.use_object_ids ? BSON::ObjectID : String)
180
+ index(opts.foreign_key) unless embedded?
181
+ set_callback(:save, :before) { |document| document.update_foreign_keys }
182
+ end
183
+
184
+ alias :belongs_to_related :referenced_in
185
+
186
+ # Adds a relational association from the Document to many Documents in
187
+ # another database or collection.
188
+ #
189
+ # Options:
190
+ #
191
+ # name: A +Symbol+ that is the related class name pluralized.
192
+ #
193
+ # Example:
194
+ #
195
+ # class Person
196
+ # include Mongoid::Document
197
+ # references_many :posts
198
+ # end
199
+ #
200
+ def references_many(name, options = {}, &block)
201
+ reference_many(name, options, &block)
202
+ set_callback :save, :before do |document|
203
+ document.update_associations(name)
204
+ end
205
+ end
206
+
207
+ alias :has_many_related :references_many
208
+
209
+ # Adds a relational association from the Document to one Document in
210
+ # another database or collection.
211
+ #
212
+ # Options:
213
+ #
214
+ # name: A +Symbol+ that is the related class name pluralized.
215
+ #
216
+ # Example:
217
+ #
218
+ # class Person
219
+ # include Mongoid::Document
220
+ # references_one :game
221
+ # end
222
+ def references_one(name, options = {}, &block)
223
+ opts = optionize(name, options, constraint(name, options, :one), &block)
224
+ associate(Associations::ReferencesOne, opts)
225
+ set_callback :save, :before do |document|
226
+ document.update_association(name)
227
+ end
228
+ end
229
+
230
+ alias :has_one_related :references_one
231
+
232
+ # Returns the macro associated with the supplied association name. This
233
+ # will return embeds_on, embeds_many, embedded_in or nil.
234
+ #
235
+ # Options:
236
+ #
237
+ # name: The association name.
238
+ #
239
+ # Example:
240
+ #
241
+ # <tt>Person.reflect_on_association(:addresses)</tt>
242
+ def reflect_on_association(name)
243
+ association = associations[name.to_s]
244
+ association ? association.macro : nil
245
+ end
246
+
247
+ protected
248
+ # Adds the association to the associations hash with the type as the key,
249
+ # then adds the accessors for the association. The defined setters and
250
+ # getters for the associations will perform the necessary memoization.
251
+ #
252
+ # Example:
253
+ #
254
+ # <tt>Person.associate(EmbedsMany, { :name => :addresses })</tt>
255
+ def associate(type, options)
256
+ name = options.name.to_s
257
+ associations[name] = MetaData.new(type, options)
258
+ define_method(name) { memoized(name) { type.instantiate(self, options) } }
259
+ define_method("#{name}=") do |object|
260
+ unmemoize(name)
261
+ memoized(name) { type.update(object, self, options) }
262
+ end
263
+ end
264
+
265
+ # Adds a builder for a has_one association. This comes in the form of
266
+ # build_name(attributes)
267
+ def add_builder(type, options)
268
+ name = options.name.to_s
269
+ define_method("build_#{name}") do |*params|
270
+ attrs = params[0]
271
+ attr_options = params[1] || {}
272
+ reset(name) { type.new(self, (attrs || {}).stringify_keys, options) } unless type == Associations::EmbedsOne && attr_options[:update_only]
273
+ end
274
+ end
275
+
276
+ # Adds a creator for a has_one association. This comes in the form of
277
+ # create_name(attributes)
278
+ def add_creator(type, options)
279
+ name = options.name.to_s
280
+ define_method("create_#{name}") do |*params|
281
+ attrs = params[0]
282
+ attr_options = params[1] || {}
283
+ send("build_#{name}", attrs, attr_options).tap(&:save) unless type == Associations::EmbedsOne && attr_options[:update_only]
284
+ end
285
+ end
286
+
287
+ # build the options given the params.
288
+ def optionize(name, options, foreign_key, &block)
289
+ Associations::Options.new(
290
+ options.merge(:name => name, :foreign_key => foreign_key, :extend => block)
291
+ )
292
+ end
293
+
294
+ def reference_many(name, options, &block)
295
+ if (options[:stored_as] == :array)
296
+ opts = optionize(name, options, constraint(name, options, :many_as_array), &block)
297
+ field "#{name.to_s.singularize}_ids", :type => Array, :default => []
298
+ associate(Associations::ReferencesManyAsArray, opts)
299
+ else
300
+ opts = optionize(name, options, constraint(name, options, :many), &block)
301
+ associate(Associations::ReferencesMany, opts)
302
+ end
303
+ end
304
+ end
305
+ end
306
+ end