mongoid 2.8.1 → 3.0.0.rc

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 (351) hide show
  1. data/CHANGELOG.md +802 -58
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -8
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid.rb +24 -39
  7. data/lib/mongoid/atomic.rb +16 -33
  8. data/lib/mongoid/atomic/modifiers.rb +2 -2
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  11. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  12. data/lib/mongoid/atomic/paths/root.rb +4 -5
  13. data/lib/mongoid/attributes.rb +95 -32
  14. data/lib/mongoid/attributes/processing.rb +14 -10
  15. data/lib/mongoid/attributes/readonly.rb +56 -0
  16. data/lib/mongoid/callbacks.rb +90 -27
  17. data/lib/mongoid/collections/retry.rb +2 -3
  18. data/lib/mongoid/components.rb +11 -23
  19. data/lib/mongoid/config.rb +87 -233
  20. data/lib/mongoid/config/environment.rb +5 -6
  21. data/lib/mongoid/config/inflections.rb +6 -0
  22. data/lib/mongoid/config/options.rb +1 -1
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config/validators/option.rb +25 -0
  25. data/lib/mongoid/config/validators/session.rb +140 -0
  26. data/lib/mongoid/contextual.rb +50 -0
  27. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  28. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  29. data/lib/mongoid/contextual/atomic.rb +179 -0
  30. data/lib/mongoid/contextual/command.rb +43 -0
  31. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  32. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  33. data/lib/mongoid/contextual/memory.rb +383 -0
  34. data/lib/mongoid/contextual/mongo.rb +543 -0
  35. data/lib/mongoid/copyable.rb +3 -34
  36. data/lib/mongoid/criteria.rb +436 -250
  37. data/lib/mongoid/criterion/inspection.rb +14 -8
  38. data/lib/mongoid/criterion/scoping.rb +114 -44
  39. data/lib/mongoid/dirty.rb +152 -67
  40. data/lib/mongoid/document.rb +69 -50
  41. data/lib/mongoid/errors.rb +22 -1
  42. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  43. data/lib/mongoid/errors/callback.rb +5 -6
  44. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  45. data/lib/mongoid/errors/document_not_found.rb +98 -17
  46. data/lib/mongoid/errors/eager_load.rb +3 -6
  47. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  48. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  49. data/lib/mongoid/errors/invalid_database.rb +3 -3
  50. data/lib/mongoid/errors/invalid_field.rb +54 -8
  51. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  52. data/lib/mongoid/errors/invalid_find.rb +3 -3
  53. data/lib/mongoid/errors/invalid_index.rb +28 -0
  54. data/lib/mongoid/errors/invalid_options.rb +4 -4
  55. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  56. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  57. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  58. data/lib/mongoid/errors/invalid_time.rb +3 -6
  59. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  60. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  61. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  62. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  63. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  64. data/lib/mongoid/errors/no_default_session.rb +23 -0
  65. data/lib/mongoid/errors/no_environment.rb +3 -3
  66. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  67. data/lib/mongoid/errors/no_parent.rb +24 -0
  68. data/lib/mongoid/errors/no_session_config.rb +22 -0
  69. data/lib/mongoid/errors/no_session_database.rb +27 -0
  70. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  71. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  72. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  73. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  74. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  75. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  76. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  77. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  78. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  79. data/lib/mongoid/errors/validations.rb +7 -6
  80. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  81. data/lib/mongoid/extensions.rb +28 -76
  82. data/lib/mongoid/extensions/array.rb +127 -0
  83. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  84. data/lib/mongoid/extensions/boolean.rb +24 -0
  85. data/lib/mongoid/extensions/date.rb +70 -0
  86. data/lib/mongoid/extensions/date_time.rb +68 -0
  87. data/lib/mongoid/extensions/false_class.rb +26 -0
  88. data/lib/mongoid/extensions/float.rb +44 -0
  89. data/lib/mongoid/extensions/hash.rb +91 -0
  90. data/lib/mongoid/extensions/integer.rb +54 -0
  91. data/lib/mongoid/extensions/module.rb +28 -0
  92. data/lib/mongoid/extensions/nil_class.rb +21 -0
  93. data/lib/mongoid/extensions/object.rb +188 -0
  94. data/lib/mongoid/extensions/object_id.rb +53 -0
  95. data/lib/mongoid/extensions/range.rb +55 -0
  96. data/lib/mongoid/extensions/regexp.rb +27 -0
  97. data/lib/mongoid/extensions/set.rb +55 -0
  98. data/lib/mongoid/extensions/string.rb +155 -0
  99. data/lib/mongoid/extensions/symbol.rb +54 -0
  100. data/lib/mongoid/extensions/time.rb +78 -0
  101. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  102. data/lib/mongoid/extensions/true_class.rb +26 -0
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields.rb +129 -194
  105. data/lib/mongoid/fields/foreign_key.rb +134 -0
  106. data/lib/mongoid/fields/localized.rb +73 -0
  107. data/lib/mongoid/fields/standard.rb +268 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields/validators/macro.rb +83 -0
  110. data/lib/mongoid/finders.rb +42 -43
  111. data/lib/mongoid/hierarchy.rb +25 -14
  112. data/lib/mongoid/identity_map.rb +31 -19
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/indexes/validators/options.rb +80 -0
  115. data/lib/mongoid/inspection.rb +1 -1
  116. data/lib/mongoid/javascript.rb +1 -1
  117. data/lib/mongoid/json.rb +2 -2
  118. data/lib/mongoid/loggable.rb +69 -0
  119. data/lib/mongoid/matchers.rb +1 -1
  120. data/lib/mongoid/matchers/all.rb +7 -8
  121. data/lib/mongoid/matchers/and.rb +3 -3
  122. data/lib/mongoid/matchers/default.rb +6 -4
  123. data/lib/mongoid/matchers/exists.rb +2 -2
  124. data/lib/mongoid/matchers/gt.rb +2 -2
  125. data/lib/mongoid/matchers/gte.rb +2 -2
  126. data/lib/mongoid/matchers/in.rb +3 -7
  127. data/lib/mongoid/matchers/lt.rb +2 -2
  128. data/lib/mongoid/matchers/lte.rb +2 -2
  129. data/lib/mongoid/matchers/ne.rb +2 -2
  130. data/lib/mongoid/matchers/nin.rb +2 -2
  131. data/lib/mongoid/matchers/or.rb +2 -2
  132. data/lib/mongoid/matchers/size.rb +2 -2
  133. data/lib/mongoid/matchers/strategies.rb +3 -3
  134. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  135. data/lib/mongoid/nested_attributes.rb +17 -9
  136. data/lib/mongoid/observer.rb +1 -2
  137. data/lib/mongoid/paranoia.rb +13 -18
  138. data/lib/mongoid/persistence.rb +43 -39
  139. data/lib/mongoid/persistence/atomic.rb +2 -2
  140. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  141. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  144. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  145. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  146. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  147. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  148. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  149. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  150. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  151. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  152. data/lib/mongoid/persistence/deletion.rb +2 -2
  153. data/lib/mongoid/persistence/insertion.rb +10 -16
  154. data/lib/mongoid/persistence/modification.rb +5 -9
  155. data/lib/mongoid/persistence/operations.rb +6 -19
  156. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  157. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  158. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  159. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  160. data/lib/mongoid/persistence/operations/update.rb +5 -5
  161. data/lib/mongoid/railtie.rb +26 -11
  162. data/lib/mongoid/railties/database.rake +22 -108
  163. data/lib/mongoid/relations.rb +4 -6
  164. data/lib/mongoid/relations/accessors.rb +119 -19
  165. data/lib/mongoid/relations/auto_save.rb +59 -5
  166. data/lib/mongoid/relations/binding.rb +211 -2
  167. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  168. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  169. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  170. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  171. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  172. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  173. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  174. data/lib/mongoid/relations/builder.rb +3 -3
  175. data/lib/mongoid/relations/builders.rb +19 -16
  176. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  177. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  178. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  179. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  180. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  182. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  183. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  184. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  185. data/lib/mongoid/relations/cascading.rb +6 -4
  186. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  187. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  188. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  189. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +5 -6
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +99 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -61
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +200 -45
  200. data/lib/mongoid/relations/nested_builder.rb +3 -5
  201. data/lib/mongoid/relations/one.rb +2 -2
  202. data/lib/mongoid/relations/options.rb +2 -2
  203. data/lib/mongoid/relations/polymorphic.rb +9 -9
  204. data/lib/mongoid/relations/proxy.rb +60 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +117 -132
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  208. data/lib/mongoid/relations/referenced/one.rb +34 -13
  209. data/lib/mongoid/relations/reflections.rb +3 -3
  210. data/lib/mongoid/relations/synchronization.rb +19 -23
  211. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +8 -27
  215. data/lib/mongoid/sessions.rb +359 -0
  216. data/lib/mongoid/sessions/factory.rb +106 -0
  217. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded.rb +167 -59
  223. data/lib/mongoid/threaded/lifecycle.rb +21 -22
  224. data/lib/mongoid/threaded/sessions.rb +0 -0
  225. data/lib/mongoid/timestamps.rb +1 -1
  226. data/lib/mongoid/timestamps/created.rb +8 -4
  227. data/lib/mongoid/timestamps/timeless.rb +6 -4
  228. data/lib/mongoid/timestamps/updated.rb +3 -3
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations.rb +27 -19
  231. data/lib/mongoid/validations/associated.rb +2 -2
  232. data/lib/mongoid/validations/format.rb +2 -2
  233. data/lib/mongoid/validations/presence.rb +31 -5
  234. data/lib/mongoid/validations/uniqueness.rb +9 -12
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  238. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  239. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  240. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  241. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  242. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  243. data/lib/rails/generators/mongoid_generator.rb +5 -5
  244. data/lib/rails/mongoid.rb +69 -25
  245. metadata +110 -137
  246. checksums.yaml +0 -7
  247. data/lib/config/locales/bg.yml +0 -61
  248. data/lib/config/locales/de.yml +0 -61
  249. data/lib/config/locales/en-GB.yml +0 -64
  250. data/lib/config/locales/es.yml +0 -59
  251. data/lib/config/locales/fr.yml +0 -62
  252. data/lib/config/locales/hi.yml +0 -53
  253. data/lib/config/locales/hu.yml +0 -64
  254. data/lib/config/locales/id.yml +0 -62
  255. data/lib/config/locales/it.yml +0 -59
  256. data/lib/config/locales/ja.yml +0 -57
  257. data/lib/config/locales/kr.yml +0 -54
  258. data/lib/config/locales/nl.yml +0 -61
  259. data/lib/config/locales/pl.yml +0 -59
  260. data/lib/config/locales/pt-BR.yml +0 -60
  261. data/lib/config/locales/pt.yml +0 -60
  262. data/lib/config/locales/ro.yml +0 -66
  263. data/lib/config/locales/ru.yml +0 -61
  264. data/lib/config/locales/sv.yml +0 -60
  265. data/lib/config/locales/vi.yml +0 -62
  266. data/lib/config/locales/zh-CN.yml +0 -53
  267. data/lib/mongoid/collection.rb +0 -157
  268. data/lib/mongoid/collections.rb +0 -120
  269. data/lib/mongoid/collections/master.rb +0 -45
  270. data/lib/mongoid/collections/operations.rb +0 -44
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts.rb +0 -25
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  276. data/lib/mongoid/contexts/mongo.rb +0 -487
  277. data/lib/mongoid/criterion/builder.rb +0 -34
  278. data/lib/mongoid/criterion/complex.rb +0 -84
  279. data/lib/mongoid/criterion/creational.rb +0 -34
  280. data/lib/mongoid/criterion/exclusion.rb +0 -110
  281. data/lib/mongoid/criterion/inclusion.rb +0 -290
  282. data/lib/mongoid/criterion/optional.rb +0 -259
  283. data/lib/mongoid/criterion/selector.rb +0 -177
  284. data/lib/mongoid/cursor.rb +0 -88
  285. data/lib/mongoid/default_scope.rb +0 -36
  286. data/lib/mongoid/errors/invalid_type.rb +0 -25
  287. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  288. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  289. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  290. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  291. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  292. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  293. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  294. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  295. data/lib/mongoid/extensions/object/checks.rb +0 -29
  296. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  297. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  298. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  299. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  300. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  301. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  302. data/lib/mongoid/extensions/string/checks.rb +0 -36
  303. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  304. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  305. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  306. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  307. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  308. data/lib/mongoid/extras.rb +0 -31
  309. data/lib/mongoid/fields/internal/array.rb +0 -77
  310. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  311. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  312. data/lib/mongoid/fields/internal/binary.rb +0 -11
  313. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  314. data/lib/mongoid/fields/internal/date.rb +0 -51
  315. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  316. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  317. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  318. data/lib/mongoid/fields/internal/float.rb +0 -47
  319. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  320. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  321. data/lib/mongoid/fields/internal/hash.rb +0 -11
  322. data/lib/mongoid/fields/internal/integer.rb +0 -59
  323. data/lib/mongoid/fields/internal/localized.rb +0 -62
  324. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  325. data/lib/mongoid/fields/internal/object.rb +0 -11
  326. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  327. data/lib/mongoid/fields/internal/range.rb +0 -61
  328. data/lib/mongoid/fields/internal/set.rb +0 -57
  329. data/lib/mongoid/fields/internal/string.rb +0 -42
  330. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  331. data/lib/mongoid/fields/internal/time.rb +0 -23
  332. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  333. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  334. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  335. data/lib/mongoid/fields/mappings.rb +0 -42
  336. data/lib/mongoid/fields/serializable.rb +0 -270
  337. data/lib/mongoid/identity.rb +0 -92
  338. data/lib/mongoid/keys.rb +0 -144
  339. data/lib/mongoid/logger.rb +0 -45
  340. data/lib/mongoid/multi_database.rb +0 -36
  341. data/lib/mongoid/named_scope.rb +0 -166
  342. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  343. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  344. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  345. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  346. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  347. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  348. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  349. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -1,27 +1,27 @@
1
1
  namespace :db do
2
2
 
3
3
  unless Rake::Task.task_defined?("db:drop")
4
- desc 'Drops all the collections for the database for the current Rails.env'
4
+ desc "Drops all the collections for the database for the current Rails.env"
5
5
  task :drop => "mongoid:drop"
6
6
  end
7
7
 
8
8
  unless Rake::Task.task_defined?("db:seed")
9
- # if another ORM has defined db:seed, don't run it twice.
10
- desc 'Load the seed data from db/seeds.rb'
9
+ # if another ORM has defined db:seed, don"t run it twice.
10
+ desc "Load the seed data from db/seeds.rb"
11
11
  task :seed => :environment do
12
- seed_file = File.join(Rails.root, 'db', 'seeds.rb')
12
+ seed_file = File.join(Rails.root, "db", "seeds.rb")
13
13
  load(seed_file) if File.exist?(seed_file)
14
14
  end
15
15
  end
16
16
 
17
17
  unless Rake::Task.task_defined?("db:setup")
18
- desc 'Create the database, and initialize with the seed data'
19
- task :setup => [ 'db:create', 'db:mongoid:create_indexes', 'db:seed' ]
18
+ desc "Create the database, and initialize with the seed data"
19
+ task :setup => [ "db:create", "db:mongoid:create_indexes", "db:seed" ]
20
20
  end
21
21
 
22
22
  unless Rake::Task.task_defined?("db:reseed")
23
- desc 'Delete data and seed'
24
- task :reseed => [ 'db:drop', 'db:seed' ]
23
+ desc "Delete data and seed"
24
+ task :reseed => [ "db:drop", "db:seed" ]
25
25
  end
26
26
 
27
27
  unless Rake::Task.task_defined?("db:create")
@@ -56,26 +56,13 @@ namespace :db do
56
56
  task :create_indexes => "mongoid:create_indexes"
57
57
  end
58
58
 
59
+ unless Rake::Task.task_defined?("db:remove_indexes")
60
+ task :remove_indexes => "mongoid:remove_indexes"
61
+ end
62
+
59
63
  namespace :mongoid do
60
- # gets a list of the mongoid models defined in the app/models directory
61
- def get_mongoid_models
62
- documents = []
63
- Dir.glob("app/models/**/*.rb").sort.each do |file|
64
- model_path = file[0..-4].split('/')[2..-1]
65
- begin
66
- klass = model_path.map { |path| path.camelize }.join('::').constantize
67
- if klass.ancestors.include?(Mongoid::Document) && !klass.embedded
68
- documents << klass
69
- end
70
- rescue => e
71
- # Just for non-mongoid objects that dont have the embedded
72
- # attribute at the class level.
73
- end
74
- end
75
- documents
76
- end
77
64
 
78
- desc 'Create the indexes defined on your mongoid models'
65
+ desc "Create the indexes defined on your mongoid models"
79
66
  task :create_indexes => :environment do
80
67
  engines_models_paths = Rails.application.railties.engines.map do |engine|
81
68
  engine.paths["app/models"].expanded
@@ -88,95 +75,22 @@ namespace :db do
88
75
  end
89
76
  end
90
77
 
91
- def convert_ids(obj)
92
- if obj.is_a?(String) && obj =~ /^[a-f0-9]{24}$/
93
- BSON::ObjectId(obj)
94
- elsif obj.is_a?(Array)
95
- obj.map do |v|
96
- convert_ids(v)
97
- end
98
- elsif obj.is_a?(Hash)
99
- obj.each_pair do |k, v|
100
- obj[k] = convert_ids(v)
101
- end
102
- else
103
- obj
104
- end
105
- end
106
-
107
- def collection_names
108
- @collection_names ||= get_mongoid_models.map{ |d| d.collection.name }.uniq
109
- end
110
-
111
- desc "Convert string objectids in mongo database to ObjectID type"
112
- task :objectid_convert => :environment do
113
- collection_names.each do |collection_name|
114
- puts "Converting #{collection_name} to use ObjectIDs"
115
-
116
- # get old collection
117
- collection = Mongoid.master.collection(collection_name)
118
-
119
- # get new collection (a clean one)
120
- collection.db["#{collection_name}_new"].drop
121
- new_collection = collection.db["#{collection_name}_new"]
122
-
123
- # convert collection documents
124
- collection.find({}, :timeout => false, :sort => "_id") do |cursor|
125
- cursor.each do |doc|
126
- new_doc = convert_ids(doc)
127
- new_collection.insert(new_doc, :safe => true)
128
- end
129
- end
130
-
131
- puts "Done! Converted collection is in #{new_collection.name}\n\n"
132
- end
133
-
134
- # no errors. great! now rename _new to collection_name
135
- collection_names.each do |collection_name|
136
- collection = Mongoid.master.collection(collection_name)
137
- new_collection = collection.db["#{collection_name}_new"]
138
-
139
- # swap collection to _old
140
- puts "Moving #{collection.name} to #{collection_name}_old"
141
- collection.db["#{collection_name}_old"].drop
142
-
143
- begin
144
- collection.rename("#{collection_name}_old")
145
- rescue Exception => e
146
- puts "Unable to rename database #{collection_name} to #{collection_name}_old"
147
- puts "reason: #{e.message}\n\n"
148
- end
149
-
150
- # swap _new to collection
151
- puts "Moving #{new_collection.name} to #{collection_name}\n\n"
152
-
153
- begin
154
- new_collection.rename(collection_name)
155
- rescue Exception => e
156
- puts "Unable to rename database #{new_collection.name} to #{collection_name}"
157
- puts "reason: #{e.message}\n\n"
158
- end
78
+ desc "Remove the indexes defined on your mongoid models without questions!"
79
+ task :remove_indexes => :environment do
80
+ engines_models_paths = Rails.application.railties.engines.map do |engine|
81
+ engine.paths["app/models"].expanded
159
82
  end
83
+ root_models_paths = Rails.application.paths["app/models"]
84
+ models_paths = engines_models_paths.push(root_models_paths).flatten
160
85
 
161
- puts "DONE! Run `rake db:mongoid:cleanup_old_collections` to remove old collections"
162
- end
163
-
164
- desc "Clean up old collections backed up by objectid_convert"
165
- task :cleanup_old_collections => :environment do
166
- collection_names.each do |collection_name|
167
- collection = Mongoid.master.collection(collection_name)
168
- collection.db["#{collection.name}_old"].drop
86
+ models_paths.each do |path|
87
+ ::Rails::Mongoid.remove_indexes("#{path}/**/*.rb")
169
88
  end
170
89
  end
171
90
 
172
91
  desc "Drops the database for the current Rails.env"
173
92
  task :drop => :environment do
174
- Mongoid.master.collections.select {|c| c.name !~ /system/ }.each { |c| c.drop }
93
+ ::Mongoid::Sessions.default.drop
175
94
  end
176
-
177
- ########
178
- # TODO: lots more useful db tasks can be added here. stuff like copyDatabase, etc
179
- ########
180
95
  end
181
-
182
96
  end
@@ -13,11 +13,9 @@ require "mongoid/relations/one"
13
13
  require "mongoid/relations/options"
14
14
  require "mongoid/relations/polymorphic"
15
15
  require "mongoid/relations/targets/enumerable"
16
- require "mongoid/relations/embedded/atomic"
17
16
  require "mongoid/relations/embedded/in"
18
17
  require "mongoid/relations/embedded/many"
19
18
  require "mongoid/relations/embedded/one"
20
- require "mongoid/relations/referenced/batch"
21
19
  require "mongoid/relations/referenced/in"
22
20
  require "mongoid/relations/referenced/many"
23
21
  require "mongoid/relations/referenced/many_to_many"
@@ -28,7 +26,7 @@ require "mongoid/relations/touchable"
28
26
  require "mongoid/relations/metadata"
29
27
  require "mongoid/relations/macros"
30
28
 
31
- module Mongoid # :nodoc:
29
+ module Mongoid
32
30
 
33
31
  # All classes and modules under the relations namespace handle the
34
32
  # functionality that has to do with embedded and referenced (relational)
@@ -94,7 +92,7 @@ module Mongoid # :nodoc:
94
92
  #
95
93
  # @since 2.0.0.rc.1
96
94
  def referenced_many?
97
- metadata && metadata.macro == :references_many
95
+ metadata && metadata.macro == :has_many
98
96
  end
99
97
 
100
98
  # Determine if the document is part of an references_one relation.
@@ -106,7 +104,7 @@ module Mongoid # :nodoc:
106
104
  #
107
105
  # @since 2.0.0.rc.1
108
106
  def referenced_one?
109
- metadata && metadata.macro == :references_one
107
+ metadata && metadata.macro == :has_one
110
108
  end
111
109
 
112
110
  # Convenience method for iterating through the loaded relations and
@@ -128,7 +126,7 @@ module Mongoid # :nodoc:
128
126
  end
129
127
  end
130
128
 
131
- module ClassMethods #:nodoc:
129
+ module ClassMethods
132
130
 
133
131
  # This is convenience for librarys still on the old API.
134
132
  #
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
4
 
5
5
  # This module contains all the behaviour related to accessing relations
6
6
  # through the getters and setters, and how to delegate to builders to
@@ -12,7 +12,7 @@ module Mongoid # :nodoc:
12
12
  # document is nil, then sets the relation on this document.
13
13
  #
14
14
  # @example Build the relation.
15
- # person.build(:addresses, { :id => 1 }, metadata)
15
+ # person.__build__(:addresses, { :id => 1 }, metadata)
16
16
  #
17
17
  # @param [ String, Symbol ] name The name of the relation.
18
18
  # @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
@@ -22,7 +22,7 @@ module Mongoid # :nodoc:
22
22
  # @return [ Proxy ] The relation.
23
23
  #
24
24
  # @since 2.0.0.rc.1
25
- def build(name, object, metadata)
25
+ def __build__(name, object, metadata)
26
26
  relation = create_relation(object, metadata)
27
27
  set_relation(name, relation)
28
28
  end
@@ -74,7 +74,64 @@ module Mongoid # :nodoc:
74
74
  instance_variable_set("@#{name}", relation)
75
75
  end
76
76
 
77
- module ClassMethods #:nodoc:
77
+ private
78
+
79
+ # Is the current code executing without autobuild functionality?
80
+ #
81
+ # @example Is autobuild disabled?
82
+ # document.without_autobuild?
83
+ #
84
+ # @return [ true, false ] If autobuild is disabled.
85
+ #
86
+ # @since 3.0.0
87
+ def without_autobuild?
88
+ Threaded.executing?(:without_autobuild)
89
+ end
90
+
91
+ # Yield to the block with autobuild functionality turned off.
92
+ #
93
+ # @example Execute without autobuild.
94
+ # document.without_autobuild do
95
+ # document.name
96
+ # end
97
+ #
98
+ # @return [ Object ] The result of the yield.
99
+ #
100
+ # @since 3.0.0
101
+ def without_autobuild
102
+ Threaded.begin("without_autobuild")
103
+ yield
104
+ ensure
105
+ Threaded.exit("without_autobuild")
106
+ end
107
+
108
+ module ClassMethods
109
+
110
+ # Adds the existence check for relations.
111
+ #
112
+ # @example Add the existence check.
113
+ # Person.existence_check(:name, meta)
114
+ #
115
+ # @example Check if a relation exists.
116
+ # person = Person.new
117
+ # person.has_game?
118
+ # person.game?
119
+ #
120
+ # @param [ String, Symbol ] name The name of the relation.
121
+ # @param [ Metadata ] The metadata.
122
+ #
123
+ # @return [ Class ] The model being set up.
124
+ #
125
+ # @since 3.0.0
126
+ def existence_check(name, metadata)
127
+ module_eval <<-END
128
+ def #{name}?
129
+ without_autobuild { !#{name}.blank? }
130
+ end
131
+ alias :has_#{name}? :#{name}?
132
+ END
133
+ self
134
+ end
78
135
 
79
136
  # Defines the getter for the relation. Nothing too special here: just
80
137
  # return the instance variable for the relation if it exists or build
@@ -90,22 +147,43 @@ module Mongoid # :nodoc:
90
147
  #
91
148
  # @since 2.0.0.rc.1
92
149
  def getter(name, metadata)
93
- tap do
94
- define_method(name) do |*args|
95
- reload, variable = args.first, "@#{name}"
96
- if instance_variable_defined?(variable) && !reload
97
- instance_variable_get(variable)
98
- else
99
- _building do
100
- _loading do
101
- build(name, attributes[metadata.key], metadata)
102
- end
103
- end
150
+ re_define_method(name) do |*args|
151
+ reload, variable = args.first, "@#{name}"
152
+ value = if instance_variable_defined?(variable) && !reload
153
+ instance_variable_get(variable)
154
+ else
155
+ _building do
156
+ _loading { __build__(name, attributes[metadata.key], metadata) }
104
157
  end
105
158
  end
159
+ if value.nil? && metadata.autobuilding? && !without_autobuild?
160
+ send("build_#{name}")
161
+ else
162
+ value
163
+ end
164
+ end
165
+ self
166
+ end
167
+
168
+ # Defines the getter for the ids of documents in the relation. Should
169
+ # be specify only for referenced many relations.
170
+ #
171
+ # @example Set up the ids getter for the relation.
172
+ # Person.ids_getter("addresses", metadata)
173
+ #
174
+ # @param [ String, Symbol ] name The name of the relation.
175
+ # @param [ Metadata] metadata The metadata for the relation.
176
+ #
177
+ # @return [ Class ] The class being set up.
178
+ def ids_getter(name, metadata)
179
+ ids_method = "#{name.to_s.singularize}_ids"
180
+ re_define_method(ids_method) do
181
+ send(name).only(:id).map(&:id)
106
182
  end
183
+ self
107
184
  end
108
185
 
186
+
109
187
  # Defines the setter for the relation. This does a few things based on
110
188
  # some conditions. If there is an existing association, a target
111
189
  # substitution will take place, otherwise a new relation will be
@@ -121,16 +199,38 @@ module Mongoid # :nodoc:
121
199
  #
122
200
  # @since 2.0.0.rc.1
123
201
  def setter(name, metadata)
124
- tap do
125
- define_method("#{name}=") do |object|
202
+ re_define_method("#{name}=") do |object|
203
+ without_autobuild do
126
204
  if relation_exists?(name) || metadata.many? ||
127
205
  (object.blank? && send(name))
128
206
  set_relation(name, send(name).substitute(object.substitutable))
129
207
  else
130
- build(name, object.substitutable, metadata)
208
+ __build__(name, object.substitutable, metadata)
131
209
  end
132
210
  end
133
211
  end
212
+ self
213
+ end
214
+
215
+ # Defines the setter method that allows you to set documents
216
+ # in this relation by their ids. The defined setter, finds
217
+ # documents with given ids and invokes regular relation setter
218
+ # with found documents. Ids setters should be defined only for
219
+ # referenced many relations.
220
+ #
221
+ # @example Set up the id_setter for the relation.
222
+ # Person.ids_setter("addesses", metadata)
223
+ #
224
+ # @param [ String, Symbol ] name The name of the relation.
225
+ # @param [ Metadata ] metadata The metadata for the relation.
226
+ #
227
+ # @return [ Class ] The class being set up.
228
+ def ids_setter(name, metadata)
229
+ ids_method = "#{name.to_s.singularize}_ids="
230
+ re_define_method(ids_method) do |ids|
231
+ send(metadata.setter, metadata.klass.find(ids))
232
+ end
233
+ self
134
234
  end
135
235
  end
136
236
  end
@@ -1,13 +1,50 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
4
 
5
5
  # This module contains the behaviour for auto-saving relations in
6
6
  # different collections.
7
7
  module AutoSave
8
8
  extend ActiveSupport::Concern
9
9
 
10
- module ClassMethods #:nodoc:
10
+ included do
11
+ class_attribute :autosaved_relations
12
+ self.autosaved_relations = []
13
+ end
14
+
15
+ # Used to prevent infinite loops in associated autosaves.
16
+ #
17
+ # @example Is the document autosaved?
18
+ # document.autosaved?
19
+ #
20
+ # @return [ true, false ] Has the document already been autosaved?
21
+ #
22
+ # @since 3.0.0
23
+ def autosaved?
24
+ Threaded.autosaved?(self)
25
+ end
26
+
27
+ # Begin the associated autosave.
28
+ #
29
+ # @example Begin autosave.
30
+ # document.begin_autosave
31
+ #
32
+ # @since 3.0.0
33
+ def begin_autosave
34
+ Threaded.begin_autosave(self)
35
+ end
36
+
37
+ # Exit the associated autosave.
38
+ #
39
+ # @example Exit autosave.
40
+ # document.exit_autosave
41
+ #
42
+ # @since 3.0.0
43
+ def exit_autosave
44
+ Threaded.exit_autosave(self)
45
+ end
46
+
47
+ module ClassMethods
11
48
 
12
49
  # Set up the autosave behaviour for references many and references one
13
50
  # relations. When the option is set to true, these relations will get
@@ -21,17 +58,34 @@ module Mongoid # :nodoc:
21
58
  #
22
59
  # @since 2.0.0.rc.1
23
60
  def autosave(metadata)
24
- if metadata.autosave?
25
- set_callback :save, :after do |document|
61
+ if metadata.autosave? && autosavable?(metadata)
62
+ autosaved_relations.push(metadata.name)
63
+ set_callback :save, :after, unless: :autosaved? do |document|
64
+ begin_autosave
26
65
  relation = document.send(metadata.name)
27
66
  if relation
28
67
  (relation.do_or_do_not(:in_memory) || Array.wrap(relation)).each do |doc|
29
68
  doc.save
30
69
  end
31
70
  end
71
+ exit_autosave
32
72
  end
33
73
  end
34
74
  end
75
+
76
+ # Can the autosave be added?
77
+ #
78
+ # @example Can the autosave be added?
79
+ # Person.autosavable?(metadata)
80
+ #
81
+ # @param [ Metadata ] metadata The relation metadata.
82
+ #
83
+ # @return [ true, false ] If the autosave is able to be added.
84
+ #
85
+ # @since 3.0.0
86
+ def autosavable?(metadata)
87
+ !autosaved_relations.include?(metadata.name) && !metadata.embedded?
88
+ end
35
89
  end
36
90
  end
37
91
  end