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
@@ -1,42 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Fields #:nodoc:
4
- module Internal #:nodoc:
5
-
6
- # Defines the behaviour for string fields.
7
- class String
8
- include Serializable
9
-
10
- # Special case to serialize the object.
11
- #
12
- # @example Convert to a selection.
13
- # field.selection(object)
14
- #
15
- # @param [ Object ] The object to convert.
16
- #
17
- # @return [ Object ] The converted object.
18
- #
19
- # @since 2.4.0
20
- def selection(object)
21
- return object if object.is_a?(::Hash)
22
- serialize(object)
23
- end
24
-
25
- # Serialize the object from the type defined in the model to a MongoDB
26
- # compatible object to store.
27
- #
28
- # @example Serialize the field.
29
- # field.serialize(object)
30
- #
31
- # @param [ Object ] object The object to cast.
32
- #
33
- # @return [ String ] The converted string.
34
- #
35
- # @since 2.1.0
36
- def serialize(object)
37
- object.try(:to_s)
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,43 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Fields #:nodoc:
4
- module Internal #:nodoc:
5
-
6
- # Defines the behaviour for symbol fields.
7
- class Symbol
8
- include Serializable
9
-
10
- # Special case to serialize the object.
11
- #
12
- # @example Convert to a selection.
13
- # field.selection(object)
14
- #
15
- # @param [ Object ] The object to convert.
16
- #
17
- # @return [ Object ] The converted object.
18
- #
19
- # @since 2.4.0
20
- def selection(object)
21
- return object if object.is_a?(::Hash)
22
- serialize(object)
23
- end
24
-
25
- # Serialize the object from the type defined in the model to a MongoDB
26
- # compatible object to store.
27
- #
28
- # @example Serialize the field.
29
- # field.serialize(object)
30
- #
31
- # @param [ Object ] object The object to cast.
32
- #
33
- # @return [ Symbol ] The converted symbol.
34
- #
35
- # @since 2.1.0
36
- def serialize(object)
37
- object.blank? ? nil : object.to_sym
38
- end
39
- alias :deserialize :serialize
40
- end
41
- end
42
- end
43
- end
@@ -1,23 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Fields #:nodoc:
4
- module Internal #:nodoc:
5
- # Defines the behaviour for date fields.
6
- class Time
7
- include Serializable
8
- include Timekeeping
9
-
10
- # When reading the field do we need to cast the value? This holds true when
11
- # times are stored or for big decimals which are stored as strings.
12
- #
13
- # @example Typecast on a read?
14
- # field.cast_on_read?
15
- #
16
- # @return [ true ] Date fields cast on read.
17
- #
18
- # @since 2.1.0
19
- def cast_on_read?; true; end
20
- end
21
- end
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Fields #:nodoc:
4
- module Internal #:nodoc:
5
- # Defines the behaviour for time with zone fields.
6
- class TimeWithZone
7
- include Serializable
8
- include Timekeeping
9
-
10
- # When reading the field do we need to cast the value? This holds true when
11
- # times are stored or for big decimals which are stored as strings.
12
- #
13
- # @example Typecast on a read?
14
- # field.cast_on_read?
15
- #
16
- # @return [ true ] Date fields cast on read.
17
- #
18
- # @since 2.1.0
19
- def cast_on_read?; true; end
20
- end
21
- end
22
- end
23
- end
@@ -1,122 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Fields #:nodoc:
4
- module Internal #:nodoc:
5
-
6
- # This module contains shared behaviour for date conversions.
7
- module Timekeeping
8
-
9
- # When reading the field do we need to cast the value? This holds true when
10
- # times are stored or for big decimals which are stored as strings.
11
- #
12
- # @example Typecast on a read?
13
- # field.cast_on_read?
14
- #
15
- # @return [ true ] Date fields cast on read.
16
- #
17
- # @since 2.1.0
18
- def cast_on_read?; true; end
19
-
20
- # Deserialize this field from the type stored in MongoDB to the type
21
- # defined on the model.
22
- #
23
- # @example Deserialize the field.
24
- # field.deserialize(object)
25
- #
26
- # @param [ Object ] object The object to cast.
27
- #
28
- # @return [ Time ] The converted time.
29
- #
30
- # @since 2.1.0
31
- def deserialize(object)
32
- return nil if object.blank?
33
- object = object.getlocal unless Mongoid::Config.use_utc?
34
- if Mongoid::Config.use_activesupport_time_zone?
35
- time_zone = Mongoid::Config.use_utc? ? "UTC" : ::Time.zone
36
- object = object.in_time_zone(time_zone)
37
- end
38
- object
39
- end
40
-
41
- # Special case to serialize the object.
42
- #
43
- # @example Convert to a selection.
44
- # field.selection(object)
45
- #
46
- # @param [ Object ] The object to convert.
47
- #
48
- # @return [ Object ] The converted object.
49
- #
50
- # @since 2.4.0
51
- def selection(object)
52
- return object if object.is_a?(::Hash)
53
- serialize(object)
54
- end
55
-
56
- # Serialize the object from the type defined in the model to a MongoDB
57
- # compatible object to store.
58
- #
59
- # @example Serialize the field.
60
- # field.serialize(object)
61
- #
62
- # @param [ Object ] object The object to cast.
63
- #
64
- # @return [ Time ] The converted UTC time.
65
- #
66
- # @since 2.1.0
67
- def serialize(object)
68
- return nil if object.blank?
69
- begin
70
- time = convert_to_time(object)
71
- strip_milliseconds(time).utc
72
- rescue ArgumentError
73
- raise Errors::InvalidTime.new(object)
74
- end
75
- end
76
-
77
- # Convert the provided object to a UTC time to store in the database.
78
- #
79
- # @example Set the time.
80
- # Time.convert_to_time(Date.today)
81
- #
82
- # @param [ String, Date, DateTime, Array ] value The object to cast.
83
- #
84
- # @return [ Time ] The object as a UTC time.
85
- #
86
- # @since 1.0.0
87
- def convert_to_time(value)
88
- time = Mongoid::Config.use_activesupport_time_zone? ? ::Time.zone : ::Time
89
- case value
90
- when ::String
91
- time.parse(value)
92
- when ::DateTime
93
- return value if value.utc? && Mongoid.use_utc?
94
- time.local(value.year, value.month, value.day, value.hour, value.min, value.sec)
95
- when ::Date
96
- time.local(value.year, value.month, value.day)
97
- when ::Array
98
- time.local(*value)
99
- else
100
- value
101
- end
102
- end
103
-
104
- # Strip the milliseconds off the time.
105
- #
106
- # @todo Durran: Why is this here? Still need time refactoring.
107
- #
108
- # @example Strip.
109
- # Time.strip_millseconds(Time.now)
110
- #
111
- # @param [ Time ] time The time to strip.
112
- #
113
- # @return [ Time ] The time without millis.
114
- #
115
- # @since 2.1.0
116
- def strip_milliseconds(time)
117
- ::Time.at(time.to_i)
118
- end
119
- end
120
- end
121
- end
122
- end
@@ -1,10 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Fields #:nodoc:
4
- module Internal #:nodoc:
5
- # Defines the behaviour for true values.
6
- class TrueClass < Boolean
7
- end
8
- end
9
- end
10
- end
@@ -1,42 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc
3
- module Fields #:nodoc:
4
-
5
- module Internal #:nodoc:
6
- end
7
-
8
- # This module maps classes used in field type definitions to the custom
9
- # definable field in Mongoid.
10
- module Mappings
11
- extend self
12
-
13
- # Get the custom field type for the provided class used in the field
14
- # definition.
15
- #
16
- # @example Get the mapping for the class.
17
- # Mappings.for(BSON::ObjectId)
18
- #
19
- # @param [ Class ] klass The class to get the field type for.
20
- #
21
- # @return [ Class ] The class of the custom field.
22
- #
23
- # @since 2.1.0
24
- def for(klass, foreign_key = false)
25
- if klass.nil?
26
- Internal::Object
27
- elsif foreign_key
28
- Internal::ForeignKeys.const_get(klass.to_s)
29
- else
30
- modules = "BSON::|ActiveSupport::"
31
- match = klass.to_s.match(Regexp.new("^(#{ modules })?(\\w+)$"))
32
- if match and Internal.const_defined?(match[2])
33
- Internal.const_get(match[2])
34
- else
35
- klass
36
- end
37
- end
38
- end
39
-
40
- end
41
- end
42
- end
@@ -1,270 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Fields #:nodoc:
4
-
5
- # Defines the behaviour for defined fields in the document.
6
- #
7
- # For people who want to have custom field types in their
8
- # applications and want control over the serialization process
9
- # to and from the domain model and MongoDB you will need to include
10
- # this module in your custom type class. You will also need to define
11
- # either a #serialize and #deserialize instance method, where previously
12
- # these were a .set and .get class method respectively.
13
- #
14
- # class MyCustomType
15
- # include Mongoid::Fields::Serializable
16
- #
17
- # def deserialize(object)
18
- # # Do something to convert it from Mongo to my type.
19
- # end
20
- #
21
- # def serialize(object)
22
- # # Do something to convert from my type to MongoDB friendly.
23
- # end
24
- # end
25
- module Serializable
26
- extend ActiveSupport::Concern
27
-
28
- included do
29
- # @todo: Durran: Pull out in 3.0.0
30
- unless method_defined?(:default)
31
- alias :default :default_val
32
- end
33
-
34
- class_attribute :cast_on_read
35
- end
36
-
37
- # Set readers for the instance variables.
38
- attr_accessor :default_val, :label, :localize, :name, :options
39
-
40
- # Get the constraint from the metadata once.
41
- #
42
- # @example Get the constraint.
43
- # field.constraint
44
- #
45
- # @return [ Constraint ] The relation's contraint.
46
- #
47
- # @since 2.1.0
48
- def constraint
49
- @constraint ||= metadata.constraint
50
- end
51
-
52
- # Deserialize this field from the type stored in MongoDB to the type
53
- # defined on the model
54
- #
55
- # @example Deserialize the field.
56
- # field.deserialize(object)
57
- #
58
- # @param [ Object ] object The object to cast.
59
- #
60
- # @return [ Object ] The converted object.
61
- #
62
- # @since 2.1.0
63
- def deserialize(object); object; end
64
-
65
- # Evaluate the default value and return it. Will handle the
66
- # serialization, proc calls, and duplication if necessary.
67
- #
68
- # @example Evaluate the default value.
69
- # field.eval_default(document)
70
- #
71
- # @param [ Document ] doc The document the field belongs to.
72
- #
73
- # @return [ Object ] The serialized default value.
74
- #
75
- # @since 2.1.8
76
- def eval_default(doc)
77
- if fields = Threaded.selection
78
- evaluated_default(doc) if included?(fields)
79
- else
80
- evaluated_default(doc)
81
- end
82
- end
83
-
84
- # Is this field a foreign key?
85
- #
86
- # @example Is the field a foreign key?
87
- # field.foreign_key?
88
- #
89
- # @return [ true, false ] If the field is a foreign key.
90
- #
91
- # @since 2.4.0
92
- def foreign_key?
93
- !!options[:identity]
94
- end
95
-
96
- # Is the field localized or not?
97
- #
98
- # @example Is the field localized?
99
- # field.localized?
100
- #
101
- # @return [ true, false ] If the field is localized.
102
- #
103
- # @since 2.3.0
104
- def localized?
105
- !!@localize
106
- end
107
-
108
- # Get the metadata for the field if its a foreign key.
109
- #
110
- # @example Get the metadata.
111
- # field.metadata
112
- #
113
- # @return [ Metadata ] The relation metadata.
114
- #
115
- # @since 2.2.0
116
- def metadata
117
- @metadata ||= options[:metadata]
118
- end
119
-
120
- # Is the field a BSON::ObjectId?
121
- #
122
- # @example Is the field a BSON::ObjectId?
123
- # field.object_id_field?
124
- #
125
- # @return [ true, false ] If the field is a BSON::ObjectId.
126
- #
127
- # @since 2.2.0
128
- def object_id_field?
129
- @object_id_field ||= (type == BSON::ObjectId)
130
- end
131
-
132
- # Can the field vary in size, similar to arrays.
133
- #
134
- # @example Is the field varying in size?
135
- # field.resizable?
136
- #
137
- # @return [ false ] false by default.
138
- #
139
- # @since 2.4.0
140
- def resizable?; false; end
141
-
142
- # Serialize the object from the type defined in the model to a MongoDB
143
- # compatible object to store.
144
- #
145
- # @example Serialize the field.
146
- # field.serialize(object)
147
- #
148
- # @param [ Object ] object The object to cast.
149
- #
150
- # @return [ Object ] The converted object.
151
- #
152
- # @since 2.1.0
153
- def serialize(object); object; end
154
-
155
- # Convert the provided object to a Mongoid criteria friendly value.
156
- #
157
- # @example Convert the field.
158
- # field.selection(object)
159
- #
160
- # @param [ Object ] The object to convert.
161
- #
162
- # @return [ Object ] The converted object.
163
- #
164
- # @since 2.4.0
165
- def selection(object); object; end
166
-
167
- # Get the type of this field - inferred from the class name.
168
- #
169
- # @example Get the type.
170
- # field.type
171
- #
172
- # @return [ Class ] The name of the class.
173
- #
174
- # @since 2.1.0
175
- def type
176
- @type ||= options[:type] || Object
177
- end
178
-
179
- # Is this field included in versioned attributes?
180
- #
181
- # @example Is the field versioned?
182
- # field.versioned?
183
- #
184
- # @return [ true, false ] If the field is included in versioning.
185
- #
186
- # @since 2.1.0
187
- def versioned?
188
- @versioned ||= (options[:versioned].nil? ? true : options[:versioned])
189
- end
190
-
191
- private
192
-
193
- # Is the field included in the fields that were returned from the
194
- # database? We can apply the default if:
195
- # 1. The field is included in an only limitation (field: 1)
196
- # 2. The field is not excluded in a without limitation (field: 0)
197
- #
198
- # @example Is the field included?
199
- # field.included?(fields)
200
- #
201
- # @param [ Hash ] fields The field limitations.
202
- #
203
- # @return [ true, false ] If the field was included.
204
- #
205
- # @since 2.4.4
206
- def included?(fields)
207
- (fields.values.first == 1 && fields[name.to_sym] == 1) ||
208
- (fields.values.first == 0 && !fields.has_key?(name.to_sym))
209
- end
210
-
211
- # Get the evaluated default.
212
- #
213
- # @example Get the evaluated default.
214
- # field.evaluated_default.
215
- #
216
- # @param [ Document ] doc The doc being applied to.
217
- #
218
- # @return [ Object ] The default value.
219
- #
220
- # @since 2.4.4
221
- def evaluated_default(doc)
222
- if default_val.respond_to?(:call)
223
- serialize(doc.instance_exec(&default_val))
224
- else
225
- serialize(default_val.duplicable? ? default_val.dup : default_val)
226
- end
227
- end
228
-
229
- module ClassMethods #:nodoc:
230
-
231
- # Create the new field with a name and optional additional options.
232
- #
233
- # @example Create the new field.
234
- # Field.new(:name, :type => String)
235
- #
236
- # @param [ Hash ] options The field options.
237
- #
238
- # @option options [ Class ] :type The class of the field.
239
- # @option options [ Object ] :default The default value for the field.
240
- # @option options [ String ] :label The field's label.
241
- #
242
- # @since 2.1.0
243
- def instantiate(name, options = {})
244
- allocate.tap do |field|
245
- field.name = name
246
- field.options = options
247
- field.label = options[:label]
248
- field.localize = options[:localize]
249
- field.default_val = options[:default]
250
- end
251
- end
252
-
253
- private
254
-
255
- # If we define a method called deserialize then we need to cast on
256
- # read.
257
- #
258
- # @example Hook into method added.
259
- # method_added(:deserialize)
260
- #
261
- # @param [ Symbol ] method The method name.
262
- #
263
- # @since 2.3.4
264
- def method_added(method)
265
- self.cast_on_read = true if method == :deserialize
266
- end
267
- end
268
- end
269
- end
270
- end
@@ -1,92 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- class Identity #:nodoc:
4
-
5
- attr_reader :document
6
-
7
- # Create the identity for the document. The id will be set in either in
8
- # the form of a Mongo object id or a composite key set up by defining
9
- # a key on the document. The _type will be set to the document's class
10
- # name.
11
- #
12
- # @example Create the id and set the type.
13
- # identity.create
14
- def create
15
- identify.tap { type }
16
- end
17
-
18
- # Create the new identity generator - this will be expanded in the future
19
- # to support pk generators.
20
- #
21
- # @example
22
- # Identity.new(document)
23
- #
24
- # @param [ Document ] document The document to generate an id for.
25
- #
26
- # @return [ Identity ] The new identity object.
27
- def initialize(document)
28
- @document = document
29
- end
30
-
31
- private
32
-
33
- # Return the proper id for the document. Will be an object id or its string
34
- # representation depending on the configuration.
35
- #
36
- # @example Generate the id.
37
- # identity.generate_id
38
- #
39
- # @return [ Object ] The bson object id or its string equivalent.
40
- def generate_id
41
- id = BSON::ObjectId.new
42
- document.using_object_ids? ? id : id.to_s
43
- end
44
-
45
- # Sets the id on the document. Will either set a newly generated id or
46
- # build the composite key.
47
- #
48
- # @example Set the id.
49
- # identity.identify
50
- def identify
51
- document.id = compose.join(" ").identify if document.primary_key
52
- document.id = generate_id if document.id.blank?
53
- document.id
54
- end
55
-
56
- # Set the _type field on the document if the document is hereditary or in a
57
- # polymorphic relation.
58
- #
59
- # @example Set the type.
60
- # identity.type
61
- def type
62
- document._type = document.class.name if typed?
63
- end
64
-
65
- # Generates the array of keys to build the id.
66
- #
67
- # @example Build the array for the keys.
68
- # identity.compose.
69
- #
70
- # @return [ Array<Object> ] The array of keys.
71
- def compose
72
- kf = document.key_formatter
73
- document.primary_key.collect do |key|
74
- val = document.attributes[key.to_s]
75
- val && kf ? kf.call(val) : val
76
- end.compact
77
- end
78
-
79
- # Determines if the document stores the type information. This is if it is
80
- # in a hierarchy, has subclasses, or is in a polymorphic relation.
81
- #
82
- # @example Check if the document is typed.
83
- # identity.typed?
84
- #
85
- # @return [ true, false ] True if typed, false if not.
86
- def typed?
87
- document.hereditary? ||
88
- document.class.descendants.any? ||
89
- document.polymorphic?
90
- end
91
- end
92
- end