mongoid 2.4.10 → 3.0.0

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 (356) hide show
  1. data/CHANGELOG.md +949 -10
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +3 -17
  5. data/lib/config/locales/en.yml +455 -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 +70 -16
  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 +106 -43
  16. data/lib/mongoid/components.rb +12 -23
  17. data/lib/mongoid/config/environment.rb +7 -4
  18. data/lib/mongoid/config/inflections.rb +6 -0
  19. data/lib/mongoid/config/options.rb +1 -1
  20. data/lib/mongoid/config/validators/option.rb +25 -0
  21. data/lib/mongoid/config/validators/session.rb +140 -0
  22. data/lib/mongoid/config/validators.rb +3 -0
  23. data/lib/mongoid/config.rb +104 -225
  24. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  25. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  26. data/lib/mongoid/contextual/atomic.rb +179 -0
  27. data/lib/mongoid/contextual/command.rb +43 -0
  28. data/lib/mongoid/contextual/find_and_modify.rb +68 -0
  29. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  30. data/lib/mongoid/contextual/memory.rb +406 -0
  31. data/lib/mongoid/contextual/mongo.rb +662 -0
  32. data/lib/mongoid/contextual.rb +50 -0
  33. data/lib/mongoid/copyable.rb +7 -25
  34. data/lib/mongoid/criteria.rb +515 -245
  35. data/lib/mongoid/criterion/inspection.rb +14 -8
  36. data/lib/mongoid/criterion/scoping.rb +114 -44
  37. data/lib/mongoid/dirty.rb +152 -67
  38. data/lib/mongoid/document.rb +71 -52
  39. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  40. data/lib/mongoid/errors/callback.rb +5 -6
  41. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  42. data/lib/mongoid/errors/document_not_found.rb +98 -17
  43. data/lib/mongoid/errors/eager_load.rb +3 -6
  44. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  45. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  46. data/lib/mongoid/errors/invalid_database.rb +3 -3
  47. data/lib/mongoid/errors/invalid_field.rb +54 -8
  48. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  49. data/lib/mongoid/errors/invalid_find.rb +3 -3
  50. data/lib/mongoid/errors/invalid_index.rb +28 -0
  51. data/lib/mongoid/errors/invalid_options.rb +4 -4
  52. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  53. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  54. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  55. data/lib/mongoid/errors/invalid_time.rb +3 -6
  56. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  57. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  58. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  59. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  60. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  61. data/lib/mongoid/errors/no_default_session.rb +23 -0
  62. data/lib/mongoid/errors/no_environment.rb +3 -3
  63. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  64. data/lib/mongoid/errors/no_metadata.rb +21 -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 +23 -1
  80. data/lib/mongoid/evolvable.rb +19 -0
  81. data/lib/mongoid/extensions/array.rb +164 -0
  82. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  83. data/lib/mongoid/extensions/boolean.rb +24 -0
  84. data/lib/mongoid/extensions/date.rb +70 -0
  85. data/lib/mongoid/extensions/date_time.rb +73 -0
  86. data/lib/mongoid/extensions/false_class.rb +38 -0
  87. data/lib/mongoid/extensions/float.rb +56 -0
  88. data/lib/mongoid/extensions/hash.rb +123 -0
  89. data/lib/mongoid/extensions/integer.rb +66 -0
  90. data/lib/mongoid/extensions/module.rb +28 -0
  91. data/lib/mongoid/extensions/nil_class.rb +21 -0
  92. data/lib/mongoid/extensions/object.rb +238 -0
  93. data/lib/mongoid/extensions/object_id.rb +54 -0
  94. data/lib/mongoid/extensions/range.rb +79 -0
  95. data/lib/mongoid/extensions/regexp.rb +27 -0
  96. data/lib/mongoid/extensions/set.rb +55 -0
  97. data/lib/mongoid/extensions/string.rb +181 -0
  98. data/lib/mongoid/extensions/symbol.rb +54 -0
  99. data/lib/mongoid/extensions/time.rb +78 -0
  100. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  101. data/lib/mongoid/extensions/true_class.rb +38 -0
  102. data/lib/mongoid/extensions.rb +28 -76
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields/foreign_key.rb +150 -0
  105. data/lib/mongoid/fields/localized.rb +73 -0
  106. data/lib/mongoid/fields/standard.rb +268 -0
  107. data/lib/mongoid/fields/validators/macro.rb +83 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields.rb +142 -208
  110. data/lib/mongoid/finders.rb +45 -50
  111. data/lib/mongoid/hierarchy.rb +44 -15
  112. data/lib/mongoid/identity_map.rb +49 -21
  113. data/lib/mongoid/indexes/validators/options.rb +80 -0
  114. data/lib/mongoid/indexes.rb +66 -15
  115. data/lib/mongoid/inspection.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 +9 -11
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +10 -44
  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/upsert.rb +28 -0
  159. data/lib/mongoid/persistence/operations.rb +22 -19
  160. data/lib/mongoid/persistence/upsertion.rb +30 -0
  161. data/lib/mongoid/persistence.rb +94 -39
  162. data/lib/mongoid/railtie.rb +26 -11
  163. data/lib/mongoid/railties/database.rake +22 -108
  164. data/lib/mongoid/relations/accessors.rb +120 -20
  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 +4 -4
  175. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  176. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  177. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  178. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  179. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/many.rb +6 -6
  182. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  183. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  184. data/lib/mongoid/relations/builders.rb +19 -16
  185. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  186. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  187. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  188. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  189. data/lib/mongoid/relations/cascading.rb +10 -7
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +6 -7
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +347 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +100 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -60
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +277 -47
  200. data/lib/mongoid/relations/nested_builder.rb +4 -6
  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 +62 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +162 -130
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +104 -48
  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/relations/touchable.rb +32 -0
  213. data/lib/mongoid/relations.rb +22 -6
  214. data/lib/mongoid/reloading.rb +12 -14
  215. data/lib/mongoid/scoping.rb +312 -0
  216. data/lib/mongoid/serialization.rb +94 -42
  217. data/lib/mongoid/sessions/factory.rb +108 -0
  218. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sessions/validators.rb +2 -0
  221. data/lib/mongoid/sessions.rb +383 -0
  222. data/lib/mongoid/sharding.rb +6 -6
  223. data/lib/mongoid/state.rb +6 -7
  224. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  225. data/lib/mongoid/threaded/sessions.rb +0 -0
  226. data/lib/mongoid/threaded.rb +219 -59
  227. data/lib/mongoid/timestamps/created.rb +8 -4
  228. data/lib/mongoid/timestamps/timeless.rb +6 -4
  229. data/lib/mongoid/timestamps/updated.rb +4 -3
  230. data/lib/mongoid/timestamps.rb +1 -1
  231. data/lib/mongoid/unit_of_work.rb +61 -0
  232. data/lib/mongoid/validations/associated.rb +2 -2
  233. data/lib/mongoid/validations/format.rb +2 -2
  234. data/lib/mongoid/validations/presence.rb +34 -4
  235. data/lib/mongoid/validations/uniqueness.rb +11 -12
  236. data/lib/mongoid/validations.rb +28 -20
  237. data/lib/mongoid/version.rb +2 -2
  238. data/lib/mongoid/versioning.rb +25 -26
  239. data/lib/mongoid.rb +37 -37
  240. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  241. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  242. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +65 -17
  243. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  244. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  245. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  246. data/lib/rails/generators/mongoid_generator.rb +5 -5
  247. data/lib/rails/mongoid.rb +73 -26
  248. metadata +103 -148
  249. data/lib/config/locales/bg.yml +0 -61
  250. data/lib/config/locales/de.yml +0 -61
  251. data/lib/config/locales/en-GB.yml +0 -64
  252. data/lib/config/locales/es.yml +0 -59
  253. data/lib/config/locales/fr.yml +0 -62
  254. data/lib/config/locales/hi.yml +0 -53
  255. data/lib/config/locales/hu.yml +0 -64
  256. data/lib/config/locales/id.yml +0 -62
  257. data/lib/config/locales/it.yml +0 -59
  258. data/lib/config/locales/ja.yml +0 -57
  259. data/lib/config/locales/kr.yml +0 -54
  260. data/lib/config/locales/nl.yml +0 -61
  261. data/lib/config/locales/pl.yml +0 -59
  262. data/lib/config/locales/pt-BR.yml +0 -60
  263. data/lib/config/locales/pt.yml +0 -60
  264. data/lib/config/locales/ro.yml +0 -66
  265. data/lib/config/locales/ru.yml +0 -61
  266. data/lib/config/locales/sv.yml +0 -60
  267. data/lib/config/locales/vi.yml +0 -62
  268. data/lib/config/locales/zh-CN.yml +0 -53
  269. data/lib/mongoid/collection.rb +0 -157
  270. data/lib/mongoid/collections/master.rb +0 -45
  271. data/lib/mongoid/collections/operations.rb +0 -44
  272. data/lib/mongoid/collections/retry.rb +0 -59
  273. data/lib/mongoid/collections.rb +0 -120
  274. data/lib/mongoid/config/database.rb +0 -181
  275. data/lib/mongoid/config/replset_database.rb +0 -80
  276. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  277. data/lib/mongoid/contexts/enumerable.rb +0 -313
  278. data/lib/mongoid/contexts/mongo.rb +0 -487
  279. data/lib/mongoid/contexts.rb +0 -25
  280. data/lib/mongoid/criterion/builder.rb +0 -34
  281. data/lib/mongoid/criterion/complex.rb +0 -84
  282. data/lib/mongoid/criterion/creational.rb +0 -34
  283. data/lib/mongoid/criterion/exclusion.rb +0 -108
  284. data/lib/mongoid/criterion/inclusion.rb +0 -290
  285. data/lib/mongoid/criterion/optional.rb +0 -259
  286. data/lib/mongoid/criterion/selector.rb +0 -177
  287. data/lib/mongoid/cursor.rb +0 -88
  288. data/lib/mongoid/default_scope.rb +0 -36
  289. data/lib/mongoid/errors/invalid_type.rb +0 -25
  290. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  291. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  292. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  293. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  294. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  295. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  296. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  297. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  298. data/lib/mongoid/extensions/object/checks.rb +0 -29
  299. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  300. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  301. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  302. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  303. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  304. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  305. data/lib/mongoid/extensions/string/checks.rb +0 -36
  306. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  307. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  308. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  309. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  310. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  311. data/lib/mongoid/extras.rb +0 -31
  312. data/lib/mongoid/fields/internal/array.rb +0 -76
  313. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  314. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  315. data/lib/mongoid/fields/internal/binary.rb +0 -11
  316. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  317. data/lib/mongoid/fields/internal/date.rb +0 -51
  318. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  319. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  320. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  321. data/lib/mongoid/fields/internal/float.rb +0 -47
  322. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  323. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  324. data/lib/mongoid/fields/internal/hash.rb +0 -11
  325. data/lib/mongoid/fields/internal/integer.rb +0 -59
  326. data/lib/mongoid/fields/internal/localized.rb +0 -62
  327. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  328. data/lib/mongoid/fields/internal/object.rb +0 -11
  329. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  330. data/lib/mongoid/fields/internal/range.rb +0 -61
  331. data/lib/mongoid/fields/internal/set.rb +0 -57
  332. data/lib/mongoid/fields/internal/string.rb +0 -42
  333. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  334. data/lib/mongoid/fields/internal/time.rb +0 -23
  335. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  336. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  337. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  338. data/lib/mongoid/fields/mappings.rb +0 -42
  339. data/lib/mongoid/fields/serializable.rb +0 -270
  340. data/lib/mongoid/identity.rb +0 -92
  341. data/lib/mongoid/javascript/functions.yml +0 -63
  342. data/lib/mongoid/javascript.rb +0 -20
  343. data/lib/mongoid/keys.rb +0 -144
  344. data/lib/mongoid/logger.rb +0 -45
  345. data/lib/mongoid/multi_database.rb +0 -36
  346. data/lib/mongoid/named_scope.rb +0 -166
  347. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  348. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  349. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  350. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  351. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  352. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  353. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  354. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  355. data/lib/mongoid/safety.rb +0 -105
  356. data/lib/mongoid/scope.rb +0 -31
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module Float
5
+
6
+ # Convert the float into a time.
7
+ #
8
+ # @example Convert the float into a time.
9
+ # 1335532685.117847.__mongoize_time__
10
+ #
11
+ # @return [ Time ] The float as a time.
12
+ #
13
+ # @since 3.0.0
14
+ def __mongoize_time__
15
+ ::Time.at(self)
16
+ end
17
+
18
+ # Is the float a number?
19
+ #
20
+ # @example Is the object a number?.
21
+ # object.numeric?
22
+ #
23
+ # @return [ true ] Always true.
24
+ #
25
+ # @since 3.0.0
26
+ def numeric?
27
+ true
28
+ end
29
+
30
+ module ClassMethods
31
+
32
+ # Turn the object from the ruby type we deal with to a Mongo friendly
33
+ # type.
34
+ #
35
+ # @example Mongoize the object.
36
+ # Float.mongoize("123.11")
37
+ #
38
+ # @param [ Object ] object The object to mongoize.
39
+ #
40
+ # @return [ String ] The object mongoized.
41
+ #
42
+ # @since 3.0.0
43
+ def mongoize(object)
44
+ unless object.blank?
45
+ __numeric__(object) rescue 0.0
46
+ else
47
+ nil
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ ::Float.__send__(:include, Mongoid::Extensions::Float)
56
+ ::Float.__send__(:extend, Mongoid::Extensions::Float::ClassMethods)
@@ -0,0 +1,123 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module Hash
5
+
6
+ # Evolves each value in the hash to an object id if it is convertable.
7
+ #
8
+ # @example Convert the hash values.
9
+ # { field: id }.__evolve_object_id__
10
+ #
11
+ # @return [ Hash ] The converted hash.
12
+ #
13
+ # @since 3.0.0
14
+ def __evolve_object_id__
15
+ update_values(&:__evolve_object_id__)
16
+ end
17
+
18
+ # Mongoizes each value in the hash to an object id if it is convertable.
19
+ #
20
+ # @example Convert the hash values.
21
+ # { field: id }.__mongoize_object_id__
22
+ #
23
+ # @return [ Hash ] The converted hash.
24
+ #
25
+ # @since 3.0.0
26
+ def __mongoize_object_id__
27
+ update_values(&:__mongoize_object_id__)
28
+ end
29
+
30
+ # Consolidate the key/values in the hash under an atomic $set.
31
+ #
32
+ # @example Consolidate the hash.
33
+ # { name: "Placebo" }.__consolidate__
34
+ #
35
+ # @return [ Hash ] A new consolidated hash.
36
+ #
37
+ # @since 3.0.0
38
+ def __consolidate__
39
+ consolidated = {}
40
+ each_pair do |key, value|
41
+ if key =~ /\$/
42
+ (consolidated[key] ||= {}).merge!(value)
43
+ else
44
+ (consolidated["$set"] ||= {}).merge!(key => value)
45
+ end
46
+ end
47
+ consolidated
48
+ end
49
+
50
+ # Get the id attribute from this hash, whether it's prefixed with an
51
+ # underscore or is a symbol.
52
+ #
53
+ # @example Extract the id.
54
+ # { :_id => 1 }.extract_id
55
+ #
56
+ # @return [ Object ] The value of the id.
57
+ #
58
+ # @since 2.3.2
59
+ def extract_id
60
+ self["_id"] || self["id"] || self[:id] || self[:_id]
61
+ end
62
+
63
+ # Turn the object from the ruby type we deal with to a Mongo friendly
64
+ # type.
65
+ #
66
+ # @example Mongoize the object.
67
+ # object.mongoize
68
+ #
69
+ # @return [ Hash ] The object.
70
+ #
71
+ # @since 3.0.0
72
+ def mongoize
73
+ ::Hash.mongoize(self)
74
+ end
75
+
76
+ # Can the size of this object change?
77
+ #
78
+ # @example Is the hash resizable?
79
+ # {}.resizable?
80
+ #
81
+ # @return [ true ] true.
82
+ #
83
+ # @since 3.0.0
84
+ def resizable?
85
+ true
86
+ end
87
+
88
+ module ClassMethods
89
+
90
+ # Turn the object from the ruby type we deal with to a Mongo friendly
91
+ # type.
92
+ #
93
+ # @example Mongoize the object.
94
+ # Hash.mongoize([ 1, 2, 3 ])
95
+ #
96
+ # @param [ Object ] object The object to mongoize.
97
+ #
98
+ # @return [ Hash ] The object mongoized.
99
+ #
100
+ # @since 3.0.0
101
+ def mongoize(object)
102
+ return if object.nil?
103
+ evolve(object).update_values { |value| value.mongoize }
104
+ end
105
+
106
+ # Can the size of this object change?
107
+ #
108
+ # @example Is the hash resizable?
109
+ # {}.resizable?
110
+ #
111
+ # @return [ true ] true.
112
+ #
113
+ # @since 3.0.0
114
+ def resizable?
115
+ true
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+
122
+ ::Hash.__send__(:include, Mongoid::Extensions::Hash)
123
+ ::Hash.__send__(:extend, Mongoid::Extensions::Hash::ClassMethods)
@@ -0,0 +1,66 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module Integer
5
+
6
+ # Returns the integer as a time.
7
+ #
8
+ # @example Convert the integer to a time.
9
+ # 1335532685.__mongoize_time__
10
+ #
11
+ # @return [ Time ] The converted time.
12
+ #
13
+ # @since 3.0.0
14
+ def __mongoize_time__
15
+ ::Time.at(self)
16
+ end
17
+
18
+ # Is the integer a number?
19
+ #
20
+ # @example Is the object a number?.
21
+ # object.numeric?
22
+ #
23
+ # @return [ true ] Always true.
24
+ #
25
+ # @since 3.0.0
26
+ def numeric?
27
+ true
28
+ end
29
+
30
+ # Is the object not to be converted to bson on criteria creation?
31
+ #
32
+ # @example Is the object unconvertable?
33
+ # object.unconvertable_to_bson?
34
+ #
35
+ # @return [ true ] If the object is unconvertable.
36
+ #
37
+ # @since 2.2.1
38
+ def unconvertable_to_bson?
39
+ true
40
+ end
41
+
42
+ module ClassMethods
43
+
44
+ # Turn the object from the ruby type we deal with to a Mongo friendly
45
+ # type.
46
+ #
47
+ # @example Mongoize the object.
48
+ # BigDecimal.mongoize("123.11")
49
+ #
50
+ # @return [ String ] The object mongoized.
51
+ #
52
+ # @since 3.0.0
53
+ def mongoize(object)
54
+ unless object.blank?
55
+ __numeric__(object).to_i rescue 0
56
+ else
57
+ nil
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ ::Integer.__send__(:include, Mongoid::Extensions::Integer)
66
+ ::Integer.__send__(:extend, Mongoid::Extensions::Integer::ClassMethods)
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module Module
5
+
6
+ # Redefine the method. Will undef the method if it exists or simply
7
+ # just define it.
8
+ #
9
+ # @example Redefine the method.
10
+ # Object.re_define_method("exists?") do
11
+ # self
12
+ # end
13
+ #
14
+ # @param [ String, Symbol ] name The name of the method.
15
+ # @param [ Proc ] block The method body.
16
+ #
17
+ # @return [ Method ] The new method.
18
+ #
19
+ # @since 3.0.0
20
+ def re_define_method(name, &block)
21
+ undef_method(name) if method_defined?(name)
22
+ define_method(name, &block)
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ ::Module.__send__(:include, Mongoid::Extensions::Module)
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module NilClass
5
+
6
+ # Get the name of a nil collection.
7
+ #
8
+ # @example Get the nil name.
9
+ # nil.collectionize
10
+ #
11
+ # @return [ String ] A blank string.
12
+ #
13
+ # @since 1.0.0
14
+ def collectionize
15
+ to_s.collectionize
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ ::NilClass.__send__(:include, Mongoid::Extensions::NilClass)
@@ -0,0 +1,238 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module Object
5
+
6
+ # Evolve a plain object into an object id.
7
+ #
8
+ # @example Evolve the object.
9
+ # object.__evolve_object_id__
10
+ #
11
+ # @return [ Object ] self.
12
+ #
13
+ # @since 3.0.0
14
+ def __evolve_object_id__
15
+ self
16
+ end
17
+ alias :__mongoize_object_id__ :__evolve_object_id__
18
+
19
+ # Convert the object to args for a find query.
20
+ #
21
+ # @example Convert the object to args.
22
+ # object.__find_args__
23
+ #
24
+ # @return [ Object ] self.
25
+ #
26
+ # @since 3.0.0
27
+ def __find_args__
28
+ self
29
+ end
30
+
31
+ # Mongoize a plain object into a time.
32
+ #
33
+ # @example Mongoize the object.
34
+ # object.__mongoize_time__
35
+ #
36
+ # @return [ Object ] self.
37
+ #
38
+ # @since 3.0.0
39
+ def __mongoize_time__
40
+ self
41
+ end
42
+
43
+ # Get the value of the object as a mongo friendy sort value.
44
+ #
45
+ # @example Get the object as sort criteria.
46
+ # object.__sortable__
47
+ #
48
+ # @return [ Object ] self.
49
+ #
50
+ # @since 3.0.0
51
+ def __sortable__
52
+ self
53
+ end
54
+
55
+ # Do or do not, there is no try. -- Yoda.
56
+ #
57
+ # @example Do or do not.
58
+ # object.do_or_do_not(:use, "The Force")
59
+ #
60
+ # @param [ String, Symbol ] name The method name.
61
+ # @param [ Array ] *args The arguments.
62
+ #
63
+ # @return [ Object, nil ] The result of the method call or nil if the
64
+ # method does not exist.
65
+ #
66
+ # @since 2.0.0.rc.1
67
+ def do_or_do_not(name, *args)
68
+ send(name, *args) if name && respond_to?(name)
69
+ end
70
+
71
+ # Get the value for an instance variable or nil if it doesn't exist.
72
+ #
73
+ # @example Get the value for an instance var.
74
+ # document.ivar("person")
75
+ #
76
+ # @param [ String ] name The name of the variable.
77
+ #
78
+ # @return [ Object, nil ] The value or nil.
79
+ #
80
+ # @since 2.0.0.rc.1
81
+ def ivar(name)
82
+ if instance_variable_defined?("@#{name}")
83
+ return instance_variable_get("@#{name}")
84
+ else
85
+ false
86
+ end
87
+ end
88
+
89
+ # Turn the object from the ruby type we deal with to a Mongo friendly
90
+ # type.
91
+ #
92
+ # @example Mongoize the object.
93
+ # object.mongoize
94
+ #
95
+ # @return [ Object ] The object.
96
+ #
97
+ # @since 3.0.0
98
+ def mongoize
99
+ self
100
+ end
101
+
102
+ # Is the object multi args.
103
+ #
104
+ # @example Is the object multi args?
105
+ # object.multi_arged?
106
+ #
107
+ # @return [ false ] false.
108
+ #
109
+ # @since 3.0.0
110
+ def multi_arged?
111
+ false
112
+ end
113
+
114
+ # Is the object a number?
115
+ #
116
+ # @example Is the object a number?.
117
+ # object.numeric?
118
+ #
119
+ # @return [ false ] Always false.
120
+ #
121
+ # @since 3.0.0
122
+ def numeric?
123
+ false
124
+ end
125
+
126
+ # Remove the instance variable for the provided name.
127
+ #
128
+ # @example Remove the instance variable
129
+ # document.remove_ivar("person")
130
+ #
131
+ # @param [ String ] name The name of the variable.
132
+ #
133
+ # @return [ true, false ] If the variable was defined.
134
+ #
135
+ # @since 2.1.0
136
+ def remove_ivar(name)
137
+ if instance_variable_defined?("@#{name}")
138
+ return remove_instance_variable("@#{name}")
139
+ else
140
+ false
141
+ end
142
+ end
143
+
144
+ # Is the object's size changable? Only returns true for arrays and hashes
145
+ # currently.
146
+ #
147
+ # @example Is the object resizable?
148
+ # object.resizable?
149
+ #
150
+ # @return [ false ] false.
151
+ #
152
+ # @since 3.0.0
153
+ def resizable?
154
+ false
155
+ end
156
+
157
+ # Get the substitutable version of an object.
158
+ #
159
+ # @example Get the substitutable.
160
+ # object.substitutable
161
+ #
162
+ # @return [ Object ] self.
163
+ #
164
+ # @since 2.0.0
165
+ def substitutable
166
+ self
167
+ end
168
+
169
+ # You must unlearn what you have learned. -- Yoda
170
+ #
171
+ # @example You must perform this execution.
172
+ # object.you_must(:use, "The Force")
173
+ #
174
+ # @param [ String, Symbol ] name The method name.
175
+ # @param [ Array ] *args The arguments.
176
+ #
177
+ # @return [ Object, nil ] The result of the method call or nil if the
178
+ # method does not exist. Nil if the object is frozen.
179
+ #
180
+ # @since 2.2.1
181
+ def you_must(name, *args)
182
+ frozen? ? nil : do_or_do_not(name, *args)
183
+ end
184
+
185
+ module ClassMethods
186
+
187
+ # Convert the provided object to a foreign key, given the metadata key
188
+ # contstraint.
189
+ #
190
+ # @example Convert the object to a fk.
191
+ # Object.__mongoize_fk__(constraint, object)
192
+ #
193
+ # @param [ Constraint ] constraint The constraint.
194
+ # @param [ Object ] object The object to convert.
195
+ #
196
+ # @return [ Object ] The converted object.
197
+ #
198
+ # @since 3.0.0
199
+ def __mongoize_fk__(constraint, object)
200
+ return nil if !object || object == ""
201
+ constraint.convert(object)
202
+ end
203
+
204
+ # Convert the object from it's mongo friendly ruby type to this type.
205
+ #
206
+ # @example Demongoize the object.
207
+ # Object.demongoize(object)
208
+ #
209
+ # @param [ Object ] object The object to demongoize.
210
+ #
211
+ # @return [ Object ] The object.
212
+ #
213
+ # @since 3.0.0
214
+ def demongoize(object)
215
+ object
216
+ end
217
+
218
+ # Turn the object from the ruby type we deal with to a Mongo friendly
219
+ # type.
220
+ #
221
+ # @example Mongoize the object.
222
+ # Object.mongoize("123.11")
223
+ #
224
+ # @param [ Object ] object The object to mongoize.
225
+ #
226
+ # @return [ Object ] The object mongoized.
227
+ #
228
+ # @since 3.0.0
229
+ def mongoize(object)
230
+ object.mongoize
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
236
+
237
+ ::Object.__send__(:include, Mongoid::Extensions::Object)
238
+ ::Object.__send__(:extend, Mongoid::Extensions::Object::ClassMethods)
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module ObjectId
5
+
6
+ # Evolve the object id.
7
+ #
8
+ # @example Evolve the object id.
9
+ # object_id.__evolve_object_id__
10
+ #
11
+ # @return [ Moped::BSON::ObjectId ] self.
12
+ #
13
+ # @since 3.0.0
14
+ def __evolve_object_id__
15
+ self
16
+ end
17
+ alias :__mongoize_object_id__ :__evolve_object_id__
18
+
19
+ module ClassMethods
20
+
21
+ # Evolve the object into a mongo-friendly value to query with.
22
+ #
23
+ # @example Evolve the object.
24
+ # ObjectId.evolve(id)
25
+ #
26
+ # @param [ Object ] object The object to evolve.
27
+ #
28
+ # @return [ Moped::BSON::ObjectId ] The object id.
29
+ #
30
+ # @since 3.0.0
31
+ def evolve(object)
32
+ object.__evolve_object_id__
33
+ end
34
+
35
+ # Convert the object into a mongo-friendly value to store.
36
+ #
37
+ # @example Convert the object.
38
+ # ObjectId.mongoize(id)
39
+ #
40
+ # @param [ Object ] object The object to convert.
41
+ #
42
+ # @return [ Moped::BSON::ObjectId ] The object id.
43
+ #
44
+ # @since 3.0.0
45
+ def mongoize(object)
46
+ object.__mongoize_object_id__
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ Moped::BSON::ObjectId.__send__(:include, Mongoid::Extensions::ObjectId)
54
+ Moped::BSON::ObjectId.__send__(:extend, Mongoid::Extensions::ObjectId::ClassMethods)
@@ -0,0 +1,79 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module Range
5
+
6
+ # Get the range as arguments for a find.
7
+ #
8
+ # @example Get the range as find args.
9
+ # range.__find_args__
10
+ #
11
+ # @return [ Array ] The range as an array.
12
+ #
13
+ # @since 3.0.0
14
+ def __find_args__
15
+ to_a
16
+ end
17
+
18
+ # Turn the object from the ruby type we deal with to a Mongo friendly
19
+ # type.
20
+ #
21
+ # @example Mongoize the object.
22
+ # range.mongoize
23
+ #
24
+ # @return [ Hash ] The object mongoized.
25
+ #
26
+ # @since 3.0.0
27
+ def mongoize
28
+ ::Range.mongoize(self)
29
+ end
30
+
31
+ # Is this a resizable object.
32
+ #
33
+ # @example Is this resizable?
34
+ # range.resizable?
35
+ #
36
+ # @return [ true ] True.
37
+ #
38
+ # @since 3.0.0
39
+ def resizable?
40
+ true
41
+ end
42
+
43
+ module ClassMethods
44
+
45
+ # Convert the object from it's mongo friendly ruby type to this type.
46
+ #
47
+ # @example Demongoize the object.
48
+ # Range.demongoize({ "min" => 1, "max" => 5 })
49
+ #
50
+ # @param [ Hash ] object The object to demongoize.
51
+ #
52
+ # @return [ Range ] The range.
53
+ #
54
+ # @since 3.0.0
55
+ def demongoize(object)
56
+ object.nil? ? nil : ::Range.new(object["min"], object["max"])
57
+ end
58
+
59
+ # Turn the object from the ruby type we deal with to a Mongo friendly
60
+ # type.
61
+ #
62
+ # @example Mongoize the object.
63
+ # Range.mongoize(1..3)
64
+ #
65
+ # @param [ Range ] object The object to mongoize.
66
+ #
67
+ # @return [ Hash ] The object mongoized.
68
+ #
69
+ # @since 3.0.0
70
+ def mongoize(object)
71
+ object.nil? ? nil : { "min" => object.first, "max" => object.last }
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ ::Range.__send__(:include, Mongoid::Extensions::Range)
79
+ ::Range.__send__(:extend, Mongoid::Extensions::Range::ClassMethods)
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module Regexp
5
+
6
+ module ClassMethods
7
+
8
+ # Turn the object from the ruby type we deal with to a Mongo friendly
9
+ # type.
10
+ #
11
+ # @example Mongoize the object.
12
+ # Regexp.mongoize(/^[abc]/)
13
+ #
14
+ # @param [ Regexp, String ] object The object to mongoize.
15
+ #
16
+ # @return [ Regexp ] The object mongoized.
17
+ #
18
+ # @since 3.0.0
19
+ def mongoize(object)
20
+ ::Regexp.new(object)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ ::Regexp.__send__(:extend, Mongoid::Extensions::Regexp::ClassMethods)