mongoid 2.4.10 → 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 +843 -9
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -17
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  8. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/root.rb +4 -5
  11. data/lib/mongoid/atomic.rb +16 -9
  12. data/lib/mongoid/attributes/processing.rb +14 -10
  13. data/lib/mongoid/attributes/readonly.rb +56 -0
  14. data/lib/mongoid/attributes.rb +95 -32
  15. data/lib/mongoid/callbacks.rb +100 -42
  16. data/lib/mongoid/collections/retry.rb +2 -3
  17. data/lib/mongoid/components.rb +10 -22
  18. data/lib/mongoid/config/environment.rb +4 -3
  19. data/lib/mongoid/config/inflections.rb +6 -0
  20. data/lib/mongoid/config/options.rb +1 -1
  21. data/lib/mongoid/config/validators/option.rb +25 -0
  22. data/lib/mongoid/config/validators/session.rb +140 -0
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config.rb +87 -233
  25. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  26. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  27. data/lib/mongoid/contextual/atomic.rb +179 -0
  28. data/lib/mongoid/contextual/command.rb +43 -0
  29. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  30. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  31. data/lib/mongoid/contextual/memory.rb +383 -0
  32. data/lib/mongoid/contextual/mongo.rb +543 -0
  33. data/lib/mongoid/contextual.rb +50 -0
  34. data/lib/mongoid/copyable.rb +2 -2
  35. data/lib/mongoid/criteria.rb +436 -248
  36. data/lib/mongoid/criterion/inspection.rb +14 -8
  37. data/lib/mongoid/criterion/scoping.rb +114 -44
  38. data/lib/mongoid/dirty.rb +152 -67
  39. data/lib/mongoid/document.rb +68 -49
  40. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  41. data/lib/mongoid/errors/callback.rb +5 -6
  42. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  43. data/lib/mongoid/errors/document_not_found.rb +98 -17
  44. data/lib/mongoid/errors/eager_load.rb +3 -6
  45. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  46. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  47. data/lib/mongoid/errors/invalid_database.rb +3 -3
  48. data/lib/mongoid/errors/invalid_field.rb +54 -8
  49. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  50. data/lib/mongoid/errors/invalid_find.rb +3 -3
  51. data/lib/mongoid/errors/invalid_index.rb +28 -0
  52. data/lib/mongoid/errors/invalid_options.rb +4 -4
  53. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  54. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  55. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  56. data/lib/mongoid/errors/invalid_time.rb +3 -6
  57. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  58. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  59. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  60. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  61. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  62. data/lib/mongoid/errors/no_default_session.rb +23 -0
  63. data/lib/mongoid/errors/no_environment.rb +3 -3
  64. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  65. data/lib/mongoid/errors/no_parent.rb +24 -0
  66. data/lib/mongoid/errors/no_session_config.rb +22 -0
  67. data/lib/mongoid/errors/no_session_database.rb +27 -0
  68. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  69. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  70. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  71. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  72. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  73. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  74. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  75. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  76. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  77. data/lib/mongoid/errors/validations.rb +7 -6
  78. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  79. data/lib/mongoid/errors.rb +22 -1
  80. data/lib/mongoid/extensions/array.rb +127 -0
  81. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  82. data/lib/mongoid/extensions/boolean.rb +24 -0
  83. data/lib/mongoid/extensions/date.rb +70 -0
  84. data/lib/mongoid/extensions/date_time.rb +68 -0
  85. data/lib/mongoid/extensions/false_class.rb +26 -0
  86. data/lib/mongoid/extensions/float.rb +44 -0
  87. data/lib/mongoid/extensions/hash.rb +91 -0
  88. data/lib/mongoid/extensions/integer.rb +54 -0
  89. data/lib/mongoid/extensions/module.rb +28 -0
  90. data/lib/mongoid/extensions/nil_class.rb +21 -0
  91. data/lib/mongoid/extensions/object.rb +188 -0
  92. data/lib/mongoid/extensions/object_id.rb +53 -0
  93. data/lib/mongoid/extensions/range.rb +55 -0
  94. data/lib/mongoid/extensions/regexp.rb +27 -0
  95. data/lib/mongoid/extensions/set.rb +55 -0
  96. data/lib/mongoid/extensions/string.rb +155 -0
  97. data/lib/mongoid/extensions/symbol.rb +54 -0
  98. data/lib/mongoid/extensions/time.rb +78 -0
  99. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  100. data/lib/mongoid/extensions/true_class.rb +26 -0
  101. data/lib/mongoid/extensions.rb +28 -76
  102. data/lib/mongoid/factory.rb +1 -1
  103. data/lib/mongoid/fields/foreign_key.rb +134 -0
  104. data/lib/mongoid/fields/localized.rb +73 -0
  105. data/lib/mongoid/fields/standard.rb +268 -0
  106. data/lib/mongoid/fields/validators/macro.rb +83 -0
  107. data/lib/mongoid/fields/validators.rb +2 -0
  108. data/lib/mongoid/fields.rb +129 -194
  109. data/lib/mongoid/finders.rb +42 -43
  110. data/lib/mongoid/hierarchy.rb +25 -14
  111. data/lib/mongoid/identity_map.rb +31 -19
  112. data/lib/mongoid/indexes/validators/options.rb +80 -0
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/inspection.rb +1 -1
  115. data/lib/mongoid/javascript.rb +1 -1
  116. data/lib/mongoid/json.rb +2 -2
  117. data/lib/mongoid/loggable.rb +69 -0
  118. data/lib/mongoid/matchers/all.rb +7 -8
  119. data/lib/mongoid/matchers/and.rb +3 -3
  120. data/lib/mongoid/matchers/default.rb +6 -4
  121. data/lib/mongoid/matchers/exists.rb +2 -2
  122. data/lib/mongoid/matchers/gt.rb +2 -2
  123. data/lib/mongoid/matchers/gte.rb +2 -2
  124. data/lib/mongoid/matchers/in.rb +3 -7
  125. data/lib/mongoid/matchers/lt.rb +2 -2
  126. data/lib/mongoid/matchers/lte.rb +2 -2
  127. data/lib/mongoid/matchers/ne.rb +2 -2
  128. data/lib/mongoid/matchers/nin.rb +2 -2
  129. data/lib/mongoid/matchers/or.rb +2 -2
  130. data/lib/mongoid/matchers/size.rb +2 -2
  131. data/lib/mongoid/matchers/strategies.rb +3 -3
  132. data/lib/mongoid/matchers.rb +1 -1
  133. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +13 -18
  137. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  138. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  139. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  140. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  141. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  144. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  145. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  146. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  147. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  148. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  149. data/lib/mongoid/persistence/atomic.rb +2 -2
  150. data/lib/mongoid/persistence/deletion.rb +2 -2
  151. data/lib/mongoid/persistence/insertion.rb +10 -16
  152. data/lib/mongoid/persistence/modification.rb +5 -9
  153. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  154. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  155. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  156. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  157. data/lib/mongoid/persistence/operations/update.rb +5 -5
  158. data/lib/mongoid/persistence/operations.rb +6 -19
  159. data/lib/mongoid/persistence.rb +64 -27
  160. data/lib/mongoid/railtie.rb +26 -11
  161. data/lib/mongoid/railties/database.rake +22 -108
  162. data/lib/mongoid/relations/accessors.rb +119 -19
  163. data/lib/mongoid/relations/auto_save.rb +59 -5
  164. data/lib/mongoid/relations/binding.rb +211 -2
  165. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  166. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  167. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  168. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  169. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  170. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  171. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  172. data/lib/mongoid/relations/builder.rb +3 -3
  173. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  174. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  175. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  176. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  177. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  178. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  179. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  181. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  182. data/lib/mongoid/relations/builders.rb +19 -16
  183. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  184. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  185. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  186. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  187. data/lib/mongoid/relations/cascading.rb +6 -4
  188. data/lib/mongoid/relations/constraint.rb +4 -3
  189. data/lib/mongoid/relations/conversions.rb +5 -6
  190. data/lib/mongoid/relations/cyclic.rb +7 -7
  191. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  192. data/lib/mongoid/relations/embedded/in.rb +23 -12
  193. data/lib/mongoid/relations/embedded/many.rb +99 -160
  194. data/lib/mongoid/relations/embedded/one.rb +25 -14
  195. data/lib/mongoid/relations/macros.rb +105 -60
  196. data/lib/mongoid/relations/many.rb +93 -14
  197. data/lib/mongoid/relations/metadata.rb +231 -45
  198. data/lib/mongoid/relations/nested_builder.rb +3 -5
  199. data/lib/mongoid/relations/one.rb +2 -2
  200. data/lib/mongoid/relations/options.rb +2 -2
  201. data/lib/mongoid/relations/polymorphic.rb +9 -9
  202. data/lib/mongoid/relations/proxy.rb +60 -31
  203. data/lib/mongoid/relations/referenced/in.rb +40 -15
  204. data/lib/mongoid/relations/referenced/many.rb +116 -128
  205. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  206. data/lib/mongoid/relations/referenced/one.rb +34 -13
  207. data/lib/mongoid/relations/reflections.rb +3 -3
  208. data/lib/mongoid/relations/synchronization.rb +19 -23
  209. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  210. data/lib/mongoid/relations/touchable.rb +32 -0
  211. data/lib/mongoid/relations.rb +6 -6
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +13 -30
  215. data/lib/mongoid/sessions/factory.rb +106 -0
  216. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  217. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions.rb +359 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  223. data/lib/mongoid/threaded/sessions.rb +0 -0
  224. data/lib/mongoid/threaded.rb +167 -59
  225. data/lib/mongoid/timestamps/created.rb +8 -4
  226. data/lib/mongoid/timestamps/timeless.rb +6 -4
  227. data/lib/mongoid/timestamps/updated.rb +3 -3
  228. data/lib/mongoid/timestamps.rb +1 -1
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations/associated.rb +2 -2
  231. data/lib/mongoid/validations/format.rb +2 -2
  232. data/lib/mongoid/validations/presence.rb +34 -4
  233. data/lib/mongoid/validations/uniqueness.rb +8 -10
  234. data/lib/mongoid/validations.rb +28 -20
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/mongoid.rb +24 -39
  238. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  239. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  240. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  241. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  242. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  243. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  244. data/lib/rails/generators/mongoid_generator.rb +5 -5
  245. data/lib/rails/mongoid.rb +69 -25
  246. metadata +92 -154
  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/master.rb +0 -45
  269. data/lib/mongoid/collections/operations.rb +0 -44
  270. data/lib/mongoid/collections.rb +0 -120
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/mongo.rb +0 -487
  276. data/lib/mongoid/contexts.rb +0 -25
  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 -108
  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 -76
  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/operation.rb +0 -63
  343. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  344. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  345. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  346. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  347. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  348. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  349. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Bindings #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Bindings
5
+ module Referenced
6
6
 
7
7
  # Binding class for all referenced_in relations.
8
8
  class In < Binding
@@ -18,27 +18,23 @@ module Mongoid # :nodoc:
18
18
  # game.person = Person.new
19
19
  #
20
20
  # @since 2.0.0.rc.1
21
- def bind
22
- base.you_must(metadata.foreign_key_setter, target.id)
23
- if metadata.inverse_type
24
- base.you_must(metadata.inverse_type_setter, target.class.model_name)
25
- end
26
- unless _binding?
27
- _binding do
28
- inverse = metadata.inverse(target)
29
- if inverse
30
- if set_base_metadata
31
- if base.referenced_many?
32
- target.send(inverse).push(base) unless Mongoid.identity_map_enabled?
33
- else
34
- target.do_or_do_not(metadata.inverse_setter(target), base)
35
- end
21
+ def bind_one
22
+ binding do
23
+ check_inverses!(target)
24
+ bind_foreign_key(base, target.id)
25
+ bind_polymorphic_inverse_type(base, target.class.model_name)
26
+ if inverse = metadata.inverse(target)
27
+ if set_base_metadata
28
+ bind_inverse_of_field(base, base.metadata.name)
29
+ if base.referenced_many?
30
+ target.__send__(inverse).push(base) unless Mongoid.using_identity_map?
31
+ else
32
+ target.do_or_do_not(metadata.inverse_setter(target), base)
36
33
  end
37
34
  end
38
35
  end
39
36
  end
40
37
  end
41
- alias :bind_one :bind
42
38
 
43
39
  # Unbinds the base object and the inverse, caused by setting the
44
40
  # reference to nil.
@@ -48,47 +44,25 @@ module Mongoid # :nodoc:
48
44
  # game.person = nil
49
45
  #
50
46
  # @since 2.0.0.rc.1
51
- def unbind
52
- base.you_must(metadata.foreign_key_setter, nil)
53
- if metadata.inverse_type
54
- base.you_must(metadata.inverse_type_setter, nil)
55
- end
56
- unless _binding?
57
- _binding do
58
- inverse = metadata.inverse(target)
59
- if inverse
60
- set_base_metadata
61
- if base.referenced_many?
62
- target.send(inverse).delete(base)
63
- else
64
- target.send(metadata.inverse_setter(target), nil)
65
- end
47
+ def unbind_one
48
+ binding do
49
+ inverse = metadata.inverse(target)
50
+ if !inverse && metadata.inverse_of_field
51
+ inverse = base.__send__(metadata.inverse_of_field)
52
+ end
53
+ bind_foreign_key(base, nil)
54
+ bind_polymorphic_inverse_type(base, nil)
55
+ bind_inverse_of_field(base, nil)
56
+ if inverse
57
+ set_base_metadata
58
+ if base.referenced_many?
59
+ target.__send__(inverse).delete(base)
60
+ else
61
+ target.__send__("#{inverse}=", nil)
66
62
  end
67
63
  end
68
64
  end
69
65
  end
70
- alias :unbind_one :unbind
71
-
72
- private
73
-
74
- # Ensure that the metadata on the base is correct, for the cases
75
- # where we have multiple belongs to definitions and were are setting
76
- # different parents in memory in order.
77
- #
78
- # @api private
79
- #
80
- # @example Set the base metadata.
81
- # binding.set_base_metadata
82
- #
83
- # @return [ true, false ] If the metadata changed.
84
- #
85
- # @since 2.4.4
86
- def set_base_metadata
87
- inverse_metadata = metadata.inverse_metadata(target)
88
- if inverse_metadata != metadata && !inverse_metadata.nil?
89
- base.metadata = inverse_metadata
90
- end
91
- end
92
66
  end
93
67
  end
94
68
  end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Bindings #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Bindings
5
+ module Referenced
6
6
 
7
7
  # Binding class for references_many relations.
8
8
  class Many < Binding
@@ -17,14 +17,8 @@ module Mongoid # :nodoc:
17
17
  #
18
18
  # @since 2.0.0.rc.1
19
19
  def bind_one(doc)
20
- doc.you_must(metadata.foreign_key_setter, base.id)
21
- if metadata.type
22
- doc.you_must(metadata.type_setter, base.class.model_name)
23
- end
24
- unless _binding?
25
- _binding do
26
- doc.send(metadata.inverse_setter, base)
27
- end
20
+ binding do
21
+ bind_from_relational_parent(doc)
28
22
  end
29
23
  end
30
24
 
@@ -37,14 +31,8 @@ module Mongoid # :nodoc:
37
31
  #
38
32
  # @since 2.0.0.rc.1
39
33
  def unbind_one(doc)
40
- doc.you_must(metadata.foreign_key_setter, nil)
41
- if metadata.type
42
- doc.you_must(metadata.type_setter, nil)
43
- end
44
- unless _binding?
45
- _binding do
46
- doc.send(metadata.inverse_setter, nil)
47
- end
34
+ binding do
35
+ unbind_from_relational_parent(doc)
48
36
  end
49
37
  end
50
38
  end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Bindings #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Bindings
5
+ module Referenced
6
6
 
7
7
  # Binding class for all references_and_referenced_in_many relations.
8
8
  class ManyToMany < Binding
@@ -17,13 +17,11 @@ module Mongoid # :nodoc:
17
17
  #
18
18
  # @since 2.0.0.rc.1
19
19
  def bind_one(doc)
20
- unless _binding?
21
- _binding do
22
- inverse_keys = doc.you_must(metadata.inverse_foreign_key)
23
- inverse_keys.push(base.id) if inverse_keys
24
- base.synced[metadata.foreign_key] = true
25
- doc.synced[metadata.inverse_foreign_key] = true
26
- end
20
+ binding do
21
+ inverse_keys = doc.you_must(metadata.inverse_foreign_key)
22
+ inverse_keys.push(base.id) if inverse_keys
23
+ base.synced[metadata.foreign_key] = true
24
+ doc.synced[metadata.inverse_foreign_key] = true
27
25
  end
28
26
  end
29
27
 
@@ -34,14 +32,12 @@ module Mongoid # :nodoc:
34
32
  #
35
33
  # @since 2.0.0.rc.1
36
34
  def unbind_one(doc)
37
- unless _binding?
38
- _binding do
39
- base.send(metadata.foreign_key).delete_one(doc.id)
40
- inverse_keys = doc.you_must(metadata.inverse_foreign_key)
41
- inverse_keys.delete_one(base.id) if inverse_keys
42
- base.synced[metadata.foreign_key] = true
43
- doc.synced[metadata.inverse_foreign_key] = true
44
- end
35
+ binding do
36
+ base.send(metadata.foreign_key).delete_one(doc.id)
37
+ inverse_keys = doc.you_must(metadata.inverse_foreign_key)
38
+ inverse_keys.delete_one(base.id) if inverse_keys
39
+ base.synced[metadata.foreign_key] = true
40
+ doc.synced[metadata.inverse_foreign_key] = true
45
41
  end
46
42
  end
47
43
  end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Bindings #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Bindings
5
+ module Referenced
6
6
 
7
7
  # Binding class for references_one relations.
8
8
  class One < Binding
@@ -18,18 +18,11 @@ module Mongoid # :nodoc:
18
18
  # person.game = Game.new
19
19
  #
20
20
  # @since 2.0.0.rc.1
21
- def bind
22
- target.you_must(metadata.foreign_key_setter, base.id)
23
- if metadata.type
24
- target.you_must(metadata.type_setter, base.class.model_name)
25
- end
26
- unless _binding?
27
- _binding do
28
- target.send(metadata.inverse_setter, base)
29
- end
21
+ def bind_one
22
+ binding do
23
+ bind_from_relational_parent(target)
30
24
  end
31
25
  end
32
- alias :bind_one :bind
33
26
 
34
27
  # Unbinds the base object and the inverse, caused by setting the
35
28
  # reference to nil.
@@ -39,18 +32,11 @@ module Mongoid # :nodoc:
39
32
  # person.game = nil
40
33
  #
41
34
  # @since 2.0.0.rc.1
42
- def unbind
43
- target.you_must(metadata.foreign_key_setter, nil)
44
- if metadata.type
45
- target.you_must(metadata.type_setter, nil)
46
- end
47
- unless _binding?
48
- _binding do
49
- target.send(metadata.inverse_setter, nil)
50
- end
35
+ def unbind_one
36
+ binding do
37
+ unbind_from_relational_parent(target)
51
38
  end
52
39
  end
53
- alias :unbind_one :unbind
54
40
  end
55
41
  end
56
42
  end
@@ -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
  # Superclass for all builder objects. Builders are responsible for either
6
6
  # looking up a relation's target from the database, or creating them from a
@@ -49,7 +49,7 @@ module Mongoid # :nodoc:
49
49
  #
50
50
  # @since 2.0.0.rc.1
51
51
  def query?
52
- obj = Array(object).first
52
+ obj = object.__array__.first
53
53
  !obj.is_a?(Mongoid::Document) && !obj.nil?
54
54
  end
55
55
  end
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Embedded #:nodoc:
6
- class In < Builder #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Embedded
6
+ class In < Builder
7
7
 
8
8
  # This builder doesn't actually build anything, just returns the
9
9
  # parent since it should already be instantiated.
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Embedded #:nodoc:
6
- class Many < Builder #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Embedded
6
+ class Many < Builder
7
7
 
8
8
  # Builds the document out of the attributes using the provided
9
9
  # metadata on the relation. Instantiates through the factory in order
@@ -19,15 +19,15 @@ module Mongoid # :nodoc:
19
19
  def build(type = nil)
20
20
  return [] if object.blank?
21
21
  return object if object.first.is_a?(Document)
22
- [].tap do |docs|
23
- object.each do |attrs|
24
- if _loading?
25
- docs.push(Factory.from_db(klass, attrs))
26
- else
27
- docs.push(Factory.build(klass, attrs))
28
- end
22
+ docs = []
23
+ object.each do |attrs|
24
+ if _loading? && base.persisted?
25
+ docs.push(Factory.from_db(klass, attrs))
26
+ else
27
+ docs.push(Factory.build(klass, attrs))
29
28
  end
30
29
  end
30
+ docs
31
31
  end
32
32
  end
33
33
  end
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Embedded #:nodoc:
6
- class One < Builder #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Embedded
6
+ class One < Builder
7
7
 
8
8
  # Builds the document out of the attributes using the provided
9
9
  # metadata on the relation. Instantiates through the factory in order
@@ -17,7 +17,7 @@ module Mongoid # :nodoc:
17
17
  # @return [ Document ] A single document.
18
18
  def build(type = nil)
19
19
  return object unless object.is_a?(Hash)
20
- if _loading?
20
+ if _loading? && base.persisted?
21
21
  Factory.from_db(klass, object)
22
22
  else
23
23
  Factory.build(klass, object)
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module NestedAttributes #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module NestedAttributes
6
6
  class Many < NestedBuilder
7
7
 
8
8
  # Builds the relation depending on the attributes and the options
@@ -25,9 +25,9 @@ module Mongoid # :nodoc:
25
25
  end
26
26
  attributes.each do |attrs|
27
27
  if attrs.respond_to?(:with_indifferent_access)
28
- process(parent, attrs)
28
+ process_attributes(parent, attrs)
29
29
  else
30
- process(parent, attrs[1])
30
+ process_attributes(parent, attrs[1])
31
31
  end
32
32
  end
33
33
  end
@@ -86,10 +86,10 @@ module Mongoid # :nodoc:
86
86
  # new, existing, or ignored document.
87
87
  #
88
88
  # @example Process the attributes
89
- # builder.process({ "id" => 1, "street" => "Bond" })
89
+ # builder.process_attributes({ "id" => 1, "street" => "Bond" })
90
90
  #
91
91
  # @param [ Hash ] attrs The single document attributes to process.
92
- def process(parent, attrs)
92
+ def process_attributes(parent, attrs)
93
93
  return if reject?(parent, attrs)
94
94
  if id = attrs.extract_id
95
95
  first = existing.first
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module NestedAttributes #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module NestedAttributes
6
6
  class One < NestedBuilder
7
7
 
8
8
  attr_accessor :destroy
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Referenced
6
6
  class In < Builder
7
7
 
8
8
  # This builder either takes a foreign key and queries for the
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Referenced
6
6
  class Many < Builder
7
7
 
8
8
  # This builder either takes a hash and queries for the
@@ -17,7 +17,7 @@ module Mongoid # :nodoc:
17
17
  def build(type = nil)
18
18
  return object unless query?
19
19
  return [] if object.is_a?(Array)
20
- crit = metadata.criteria(Conversions.flag(object, metadata))
20
+ crit = metadata.criteria(Conversions.flag(object, metadata), base.class)
21
21
  IdentityMap.get(crit.klass, crit.selector) || crit
22
22
  end
23
23
  end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Referenced
6
6
  class ManyToMany < Builder
7
7
 
8
8
  # This builder either takes a hash and queries for the
@@ -16,7 +16,9 @@ module Mongoid # :nodoc:
16
16
  # @return [ Array<Document> ] The documents.
17
17
  def build(type = nil)
18
18
  return object.try(:dup) unless query?
19
- metadata.criteria(object || [])
19
+ ids = object || []
20
+ crit = metadata.criteria(ids, base.class)
21
+ IdentityMap.get(crit.klass, ids) || crit
20
22
  end
21
23
 
22
24
  # Do we need to perform a database query? It will be so if the object we
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Referenced
6
6
  class One < Builder
7
7
 
8
8
  # This builder either takes an _id or an object and queries for the
@@ -17,7 +17,7 @@ module Mongoid # :nodoc:
17
17
  def build(type = nil)
18
18
  return object unless query?
19
19
  return nil if base.new_record?
20
- metadata.criteria(Conversions.flag(object, metadata)).from_map_or_db
20
+ metadata.criteria(Conversions.flag(object, metadata), base.class).from_map_or_db
21
21
  end
22
22
  end
23
23
  end
@@ -11,8 +11,8 @@ require "mongoid/relations/builders/referenced/many"
11
11
  require "mongoid/relations/builders/referenced/many_to_many"
12
12
  require "mongoid/relations/builders/referenced/one"
13
13
 
14
- module Mongoid # :nodoc:
15
- module Relations #:nodoc:
14
+ module Mongoid
15
+ module Relations
16
16
 
17
17
  # This module is responsible for defining the build and create methods used
18
18
  # in one to one relations.
@@ -49,7 +49,7 @@ module Mongoid # :nodoc:
49
49
  [ args.first || {}, args.size > 1 ? args[1] : {} ]
50
50
  end
51
51
 
52
- module ClassMethods #:nodoc:
52
+ module ClassMethods
53
53
 
54
54
  # Defines a builder method for an embeds_one relation. This is
55
55
  # defined as #build_name.
@@ -63,15 +63,16 @@ module Mongoid # :nodoc:
63
63
  #
64
64
  # @since 2.0.0.rc.1
65
65
  def builder(name, metadata)
66
- tap do
67
- define_method("build_#{name}") do |*args|
68
- attributes, options = parse_args(*args)
69
- document = Factory.build(metadata.klass, attributes, options)
70
- _building do
71
- send("#{name}=", document).tap {|child| child.run_callbacks(:build) }
72
- end
66
+ re_define_method("build_#{name}") do |*args|
67
+ attributes, options = parse_args(*args)
68
+ document = Factory.build(metadata.klass, attributes, options)
69
+ _building do
70
+ child = send("#{name}=", document)
71
+ child.run_callbacks(:build)
72
+ child
73
73
  end
74
74
  end
75
+ self
75
76
  end
76
77
 
77
78
  # Defines a creator method for an embeds_one relation. This is
@@ -87,13 +88,15 @@ module Mongoid # :nodoc:
87
88
  #
88
89
  # @since 2.0.0.rc.1
89
90
  def creator(name, metadata)
90
- tap do
91
- define_method("create_#{name}") do |*args|
92
- attributes, options = parse_args(*args)
93
- document = Factory.build(metadata.klass, attributes, options)
94
- send("#{name}=", document).tap { |doc| doc.save }
95
- end
91
+ re_define_method("create_#{name}") do |*args|
92
+ attributes, options = parse_args(*args)
93
+ document = Factory.build(metadata.klass, attributes, options)
94
+ doc = send("#{name}=", document)
95
+ doc.save
96
+ save if new_record? && metadata.stores_foreign_key?
97
+ doc
96
98
  end
99
+ self
97
100
  end
98
101
  end
99
102
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Cascading #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Cascading
5
5
  class Delete
6
6
 
7
7
  attr_accessor :document, :relation, :metadata
@@ -32,9 +32,7 @@ module Mongoid # :nodoc:
32
32
  def cascade
33
33
  if relation
34
34
  if relation.cascades.empty?
35
- safety = Threaded.safety_options
36
35
  relation.clear
37
- Threaded.safety_options = safety
38
36
  else
39
37
  ::Array.wrap(relation).each { |doc| doc.delete }
40
38
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Cascading #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Cascading
5
5
  class Destroy
6
6
 
7
7
  attr_accessor :document, :relation, :metadata
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Cascading #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Cascading
5
5
  class Nullify
6
6
 
7
7
  attr_accessor :document, :relation, :metadata
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Relations
4
+ module Cascading
5
+ class Restrict
6
+
7
+ attr_accessor :document, :relation, :metadata
8
+
9
+ # Initialize the new cascade strategy, which will set up the relation
10
+ # and the metadata.
11
+ #
12
+ # @example Instantiate the strategy
13
+ # Strategy.new(document, metadata)
14
+ #
15
+ # @param [ Document ] document The document to cascade from.
16
+ # @param [ Metadata ] metadata The relation's metadata.
17
+ #
18
+ # @return [ Strategy ] The new strategy.
19
+ def initialize(document, metadata)
20
+ @document, @metadata = document, metadata
21
+ @relation = document.send(metadata.name)
22
+ end
23
+
24
+ # Execute the cascading deletion for the relation if it already exists.
25
+ # This should be optimized in the future potentially not to load all
26
+ # objects from the db.
27
+ #
28
+ # @example Perform the cascading delete.
29
+ # strategy.cascade
30
+ def cascade
31
+ raise Errors::DeleteRestriction.new(document, metadata.name) unless relation.blank?
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+