mongoid 2.8.1 → 3.0.0.rc

Sign up to get free protection for your applications and to get access to all the features.
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