mongoid 2.8.1 → 3.0.0.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (351) hide show
  1. data/CHANGELOG.md +802 -58
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -8
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid.rb +24 -39
  7. data/lib/mongoid/atomic.rb +16 -33
  8. data/lib/mongoid/atomic/modifiers.rb +2 -2
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  11. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  12. data/lib/mongoid/atomic/paths/root.rb +4 -5
  13. data/lib/mongoid/attributes.rb +95 -32
  14. data/lib/mongoid/attributes/processing.rb +14 -10
  15. data/lib/mongoid/attributes/readonly.rb +56 -0
  16. data/lib/mongoid/callbacks.rb +90 -27
  17. data/lib/mongoid/collections/retry.rb +2 -3
  18. data/lib/mongoid/components.rb +11 -23
  19. data/lib/mongoid/config.rb +87 -233
  20. data/lib/mongoid/config/environment.rb +5 -6
  21. data/lib/mongoid/config/inflections.rb +6 -0
  22. data/lib/mongoid/config/options.rb +1 -1
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config/validators/option.rb +25 -0
  25. data/lib/mongoid/config/validators/session.rb +140 -0
  26. data/lib/mongoid/contextual.rb +50 -0
  27. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  28. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  29. data/lib/mongoid/contextual/atomic.rb +179 -0
  30. data/lib/mongoid/contextual/command.rb +43 -0
  31. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  32. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  33. data/lib/mongoid/contextual/memory.rb +383 -0
  34. data/lib/mongoid/contextual/mongo.rb +543 -0
  35. data/lib/mongoid/copyable.rb +3 -34
  36. data/lib/mongoid/criteria.rb +436 -250
  37. data/lib/mongoid/criterion/inspection.rb +14 -8
  38. data/lib/mongoid/criterion/scoping.rb +114 -44
  39. data/lib/mongoid/dirty.rb +152 -67
  40. data/lib/mongoid/document.rb +69 -50
  41. data/lib/mongoid/errors.rb +22 -1
  42. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  43. data/lib/mongoid/errors/callback.rb +5 -6
  44. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  45. data/lib/mongoid/errors/document_not_found.rb +98 -17
  46. data/lib/mongoid/errors/eager_load.rb +3 -6
  47. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  48. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  49. data/lib/mongoid/errors/invalid_database.rb +3 -3
  50. data/lib/mongoid/errors/invalid_field.rb +54 -8
  51. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  52. data/lib/mongoid/errors/invalid_find.rb +3 -3
  53. data/lib/mongoid/errors/invalid_index.rb +28 -0
  54. data/lib/mongoid/errors/invalid_options.rb +4 -4
  55. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  56. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  57. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  58. data/lib/mongoid/errors/invalid_time.rb +3 -6
  59. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  60. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  61. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  62. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  63. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  64. data/lib/mongoid/errors/no_default_session.rb +23 -0
  65. data/lib/mongoid/errors/no_environment.rb +3 -3
  66. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  67. data/lib/mongoid/errors/no_parent.rb +24 -0
  68. data/lib/mongoid/errors/no_session_config.rb +22 -0
  69. data/lib/mongoid/errors/no_session_database.rb +27 -0
  70. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  71. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  72. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  73. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  74. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  75. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  76. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  77. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  78. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  79. data/lib/mongoid/errors/validations.rb +7 -6
  80. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  81. data/lib/mongoid/extensions.rb +28 -76
  82. data/lib/mongoid/extensions/array.rb +127 -0
  83. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  84. data/lib/mongoid/extensions/boolean.rb +24 -0
  85. data/lib/mongoid/extensions/date.rb +70 -0
  86. data/lib/mongoid/extensions/date_time.rb +68 -0
  87. data/lib/mongoid/extensions/false_class.rb +26 -0
  88. data/lib/mongoid/extensions/float.rb +44 -0
  89. data/lib/mongoid/extensions/hash.rb +91 -0
  90. data/lib/mongoid/extensions/integer.rb +54 -0
  91. data/lib/mongoid/extensions/module.rb +28 -0
  92. data/lib/mongoid/extensions/nil_class.rb +21 -0
  93. data/lib/mongoid/extensions/object.rb +188 -0
  94. data/lib/mongoid/extensions/object_id.rb +53 -0
  95. data/lib/mongoid/extensions/range.rb +55 -0
  96. data/lib/mongoid/extensions/regexp.rb +27 -0
  97. data/lib/mongoid/extensions/set.rb +55 -0
  98. data/lib/mongoid/extensions/string.rb +155 -0
  99. data/lib/mongoid/extensions/symbol.rb +54 -0
  100. data/lib/mongoid/extensions/time.rb +78 -0
  101. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  102. data/lib/mongoid/extensions/true_class.rb +26 -0
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields.rb +129 -194
  105. data/lib/mongoid/fields/foreign_key.rb +134 -0
  106. data/lib/mongoid/fields/localized.rb +73 -0
  107. data/lib/mongoid/fields/standard.rb +268 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields/validators/macro.rb +83 -0
  110. data/lib/mongoid/finders.rb +42 -43
  111. data/lib/mongoid/hierarchy.rb +25 -14
  112. data/lib/mongoid/identity_map.rb +31 -19
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/indexes/validators/options.rb +80 -0
  115. data/lib/mongoid/inspection.rb +1 -1
  116. data/lib/mongoid/javascript.rb +1 -1
  117. data/lib/mongoid/json.rb +2 -2
  118. data/lib/mongoid/loggable.rb +69 -0
  119. data/lib/mongoid/matchers.rb +1 -1
  120. data/lib/mongoid/matchers/all.rb +7 -8
  121. data/lib/mongoid/matchers/and.rb +3 -3
  122. data/lib/mongoid/matchers/default.rb +6 -4
  123. data/lib/mongoid/matchers/exists.rb +2 -2
  124. data/lib/mongoid/matchers/gt.rb +2 -2
  125. data/lib/mongoid/matchers/gte.rb +2 -2
  126. data/lib/mongoid/matchers/in.rb +3 -7
  127. data/lib/mongoid/matchers/lt.rb +2 -2
  128. data/lib/mongoid/matchers/lte.rb +2 -2
  129. data/lib/mongoid/matchers/ne.rb +2 -2
  130. data/lib/mongoid/matchers/nin.rb +2 -2
  131. data/lib/mongoid/matchers/or.rb +2 -2
  132. data/lib/mongoid/matchers/size.rb +2 -2
  133. data/lib/mongoid/matchers/strategies.rb +3 -3
  134. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  135. data/lib/mongoid/nested_attributes.rb +17 -9
  136. data/lib/mongoid/observer.rb +1 -2
  137. data/lib/mongoid/paranoia.rb +13 -18
  138. data/lib/mongoid/persistence.rb +43 -39
  139. data/lib/mongoid/persistence/atomic.rb +2 -2
  140. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  141. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  144. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  145. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  146. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  147. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  148. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  149. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  150. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  151. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  152. data/lib/mongoid/persistence/deletion.rb +2 -2
  153. data/lib/mongoid/persistence/insertion.rb +10 -16
  154. data/lib/mongoid/persistence/modification.rb +5 -9
  155. data/lib/mongoid/persistence/operations.rb +6 -19
  156. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  157. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  158. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  159. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  160. data/lib/mongoid/persistence/operations/update.rb +5 -5
  161. data/lib/mongoid/railtie.rb +26 -11
  162. data/lib/mongoid/railties/database.rake +22 -108
  163. data/lib/mongoid/relations.rb +4 -6
  164. data/lib/mongoid/relations/accessors.rb +119 -19
  165. data/lib/mongoid/relations/auto_save.rb +59 -5
  166. data/lib/mongoid/relations/binding.rb +211 -2
  167. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  168. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  169. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  170. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  171. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  172. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  173. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  174. data/lib/mongoid/relations/builder.rb +3 -3
  175. data/lib/mongoid/relations/builders.rb +19 -16
  176. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  177. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  178. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  179. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  180. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  182. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  183. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  184. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  185. data/lib/mongoid/relations/cascading.rb +6 -4
  186. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  187. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  188. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  189. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +5 -6
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +99 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -61
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +200 -45
  200. data/lib/mongoid/relations/nested_builder.rb +3 -5
  201. data/lib/mongoid/relations/one.rb +2 -2
  202. data/lib/mongoid/relations/options.rb +2 -2
  203. data/lib/mongoid/relations/polymorphic.rb +9 -9
  204. data/lib/mongoid/relations/proxy.rb +60 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +117 -132
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  208. data/lib/mongoid/relations/referenced/one.rb +34 -13
  209. data/lib/mongoid/relations/reflections.rb +3 -3
  210. data/lib/mongoid/relations/synchronization.rb +19 -23
  211. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +8 -27
  215. data/lib/mongoid/sessions.rb +359 -0
  216. data/lib/mongoid/sessions/factory.rb +106 -0
  217. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded.rb +167 -59
  223. data/lib/mongoid/threaded/lifecycle.rb +21 -22
  224. data/lib/mongoid/threaded/sessions.rb +0 -0
  225. data/lib/mongoid/timestamps.rb +1 -1
  226. data/lib/mongoid/timestamps/created.rb +8 -4
  227. data/lib/mongoid/timestamps/timeless.rb +6 -4
  228. data/lib/mongoid/timestamps/updated.rb +3 -3
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations.rb +27 -19
  231. data/lib/mongoid/validations/associated.rb +2 -2
  232. data/lib/mongoid/validations/format.rb +2 -2
  233. data/lib/mongoid/validations/presence.rb +31 -5
  234. data/lib/mongoid/validations/uniqueness.rb +9 -12
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  238. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  239. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  240. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  241. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  242. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  243. data/lib/rails/generators/mongoid_generator.rb +5 -5
  244. data/lib/rails/mongoid.rb +69 -25
  245. metadata +110 -137
  246. checksums.yaml +0 -7
  247. data/lib/config/locales/bg.yml +0 -61
  248. data/lib/config/locales/de.yml +0 -61
  249. data/lib/config/locales/en-GB.yml +0 -64
  250. data/lib/config/locales/es.yml +0 -59
  251. data/lib/config/locales/fr.yml +0 -62
  252. data/lib/config/locales/hi.yml +0 -53
  253. data/lib/config/locales/hu.yml +0 -64
  254. data/lib/config/locales/id.yml +0 -62
  255. data/lib/config/locales/it.yml +0 -59
  256. data/lib/config/locales/ja.yml +0 -57
  257. data/lib/config/locales/kr.yml +0 -54
  258. data/lib/config/locales/nl.yml +0 -61
  259. data/lib/config/locales/pl.yml +0 -59
  260. data/lib/config/locales/pt-BR.yml +0 -60
  261. data/lib/config/locales/pt.yml +0 -60
  262. data/lib/config/locales/ro.yml +0 -66
  263. data/lib/config/locales/ru.yml +0 -61
  264. data/lib/config/locales/sv.yml +0 -60
  265. data/lib/config/locales/vi.yml +0 -62
  266. data/lib/config/locales/zh-CN.yml +0 -53
  267. data/lib/mongoid/collection.rb +0 -157
  268. data/lib/mongoid/collections.rb +0 -120
  269. data/lib/mongoid/collections/master.rb +0 -45
  270. data/lib/mongoid/collections/operations.rb +0 -44
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts.rb +0 -25
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  276. data/lib/mongoid/contexts/mongo.rb +0 -487
  277. data/lib/mongoid/criterion/builder.rb +0 -34
  278. data/lib/mongoid/criterion/complex.rb +0 -84
  279. data/lib/mongoid/criterion/creational.rb +0 -34
  280. data/lib/mongoid/criterion/exclusion.rb +0 -110
  281. data/lib/mongoid/criterion/inclusion.rb +0 -290
  282. data/lib/mongoid/criterion/optional.rb +0 -259
  283. data/lib/mongoid/criterion/selector.rb +0 -177
  284. data/lib/mongoid/cursor.rb +0 -88
  285. data/lib/mongoid/default_scope.rb +0 -36
  286. data/lib/mongoid/errors/invalid_type.rb +0 -25
  287. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  288. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  289. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  290. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  291. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  292. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  293. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  294. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  295. data/lib/mongoid/extensions/object/checks.rb +0 -29
  296. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  297. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  298. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  299. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  300. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  301. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  302. data/lib/mongoid/extensions/string/checks.rb +0 -36
  303. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  304. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  305. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  306. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  307. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  308. data/lib/mongoid/extras.rb +0 -31
  309. data/lib/mongoid/fields/internal/array.rb +0 -77
  310. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  311. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  312. data/lib/mongoid/fields/internal/binary.rb +0 -11
  313. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  314. data/lib/mongoid/fields/internal/date.rb +0 -51
  315. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  316. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  317. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  318. data/lib/mongoid/fields/internal/float.rb +0 -47
  319. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  320. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  321. data/lib/mongoid/fields/internal/hash.rb +0 -11
  322. data/lib/mongoid/fields/internal/integer.rb +0 -59
  323. data/lib/mongoid/fields/internal/localized.rb +0 -62
  324. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  325. data/lib/mongoid/fields/internal/object.rb +0 -11
  326. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  327. data/lib/mongoid/fields/internal/range.rb +0 -61
  328. data/lib/mongoid/fields/internal/set.rb +0 -57
  329. data/lib/mongoid/fields/internal/string.rb +0 -42
  330. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  331. data/lib/mongoid/fields/internal/time.rb +0 -23
  332. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  333. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  334. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  335. data/lib/mongoid/fields/mappings.rb +0 -42
  336. data/lib/mongoid/fields/serializable.rb +0 -270
  337. data/lib/mongoid/identity.rb +0 -92
  338. data/lib/mongoid/keys.rb +0 -144
  339. data/lib/mongoid/logger.rb +0 -45
  340. data/lib/mongoid/multi_database.rb +0 -36
  341. data/lib/mongoid/named_scope.rb +0 -166
  342. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  343. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  344. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  345. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  346. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  347. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  348. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  349. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -22,13 +22,18 @@
22
22
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
23
  require "delegate"
24
24
  require "time"
25
+ require "set"
26
+
25
27
  require "active_support/core_ext"
26
28
  require 'active_support/json'
27
29
  require "active_support/inflector"
28
- require "active_support/lazy_load_hooks"
29
30
  require "active_support/time_with_zone"
30
31
  require "active_model"
31
- require "mongo"
32
+
33
+ require "origin"
34
+ require "moped"
35
+ BSON = Moped::BSON
36
+
32
37
  require "mongoid/extensions"
33
38
  require "mongoid/errors"
34
39
  require "mongoid/threaded"
@@ -36,42 +41,34 @@ require "mongoid/relations"
36
41
  require "mongoid/atomic"
37
42
  require "mongoid/attributes"
38
43
  require "mongoid/callbacks"
39
- require "mongoid/collection"
40
- require "mongoid/collections"
41
44
  require "mongoid/config"
42
- require "mongoid/contexts"
45
+ require "mongoid/contextual"
43
46
  require "mongoid/copyable"
44
47
  require "mongoid/criteria"
45
- require "mongoid/cursor"
46
- require "mongoid/default_scope"
47
48
  require "mongoid/dirty"
48
- require "mongoid/extras"
49
49
  require "mongoid/factory"
50
50
  require "mongoid/fields"
51
51
  require "mongoid/finders"
52
52
  require "mongoid/hierarchy"
53
- require "mongoid/identity"
54
53
  require "mongoid/identity_map"
55
54
  require "mongoid/indexes"
56
55
  require "mongoid/inspection"
57
56
  require "mongoid/javascript"
58
57
  require "mongoid/json"
59
- require "mongoid/keys"
60
- require "mongoid/logger"
58
+ require "mongoid/loggable"
61
59
  require "mongoid/matchers"
62
60
  require "mongoid/multi_parameter_attributes"
63
- require "mongoid/multi_database"
64
- require "mongoid/named_scope"
65
61
  require "mongoid/nested_attributes"
66
62
  require "mongoid/observer"
67
63
  require "mongoid/persistence"
68
64
  require "mongoid/reloading"
69
- require "mongoid/safety"
70
- require "mongoid/scope"
65
+ require "mongoid/scoping"
71
66
  require "mongoid/serialization"
67
+ require "mongoid/sessions"
72
68
  require "mongoid/sharding"
73
69
  require "mongoid/state"
74
70
  require "mongoid/timestamps"
71
+ require "mongoid/unit_of_work"
75
72
  require "mongoid/validations"
76
73
  require "mongoid/version"
77
74
  require "mongoid/versioning"
@@ -94,7 +91,9 @@ end
94
91
  # add english load path by default
95
92
  I18n.load_path << File.join(File.dirname(__FILE__), "config", "locales", "en.yml")
96
93
 
97
- module Mongoid #:nodoc
94
+ module Mongoid
95
+ extend Loggable
96
+ extend UnitOfWork
98
97
  extend self
99
98
 
100
99
  MONGODB_VERSION = "2.0.0"
@@ -103,10 +102,8 @@ module Mongoid #:nodoc
103
102
  #
104
103
  # @example Set up configuration options.
105
104
  # Mongoid.configure do |config|
106
- # name = "mongoid_test"
107
- # host = "localhost"
108
105
  # config.allow_dynamic_fields = false
109
- # config.master = Mongo::Connection.new.db(name)
106
+ # config.use(name: "mongoid_test", host: "localhost", port: 27017)
110
107
  # end
111
108
  #
112
109
  # @return [ Config ] The configuration obejct.
@@ -115,25 +112,13 @@ module Mongoid #:nodoc
115
112
  def configure
116
113
  block_given? ? yield(Config) : Config
117
114
  end
118
- alias :config :configure
119
115
 
120
- # We can process a unit of work in Mongoid and have the identity map
121
- # automatically clear itself out after the work is complete.
122
- #
123
- # @example Process a unit of work.
124
- # Mongoid.unit_of_work do
125
- # Person.create(:title => "Sir")
126
- # end
127
- #
128
- # @return [ Object ] The result of the block.
129
- #
130
- # @since 2.1.0
131
- def unit_of_work
132
- begin
133
- yield if block_given?
134
- ensure
135
- IdentityMap.clear
136
- end
116
+ def default_session
117
+ Sessions.default
118
+ end
119
+
120
+ def session(name)
121
+ Sessions.with_name(name)
137
122
  end
138
123
 
139
124
  # Take all the public instance methods from the Config singleton and allow
@@ -143,7 +128,7 @@ module Mongoid #:nodoc
143
128
  # Mongoid.database = Mongo::Connection.new.db("test")
144
129
  #
145
130
  # @since 1.0.0
146
- delegate *(Config.public_instance_methods(false) +
131
+ delegate(*(Config.public_instance_methods(false) +
147
132
  ActiveModel::Observing::ClassMethods.public_instance_methods(false) <<
148
- { :to => Config })
133
+ { to: Config }))
149
134
  end
@@ -2,7 +2,7 @@
2
2
  require "mongoid/atomic/modifiers"
3
3
  require "mongoid/atomic/paths"
4
4
 
5
- module Mongoid #:nodoc:
5
+ module Mongoid
6
6
 
7
7
  # This module contains the logic for supporting atomic operations against the
8
8
  # database.
@@ -99,12 +99,12 @@ module Mongoid #:nodoc:
99
99
  #
100
100
  # @since 2.1.0
101
101
  def atomic_updates
102
- Modifiers.new.tap do |mods|
103
- generate_atomic_updates(mods, self)
104
- _children.each do |child|
105
- generate_atomic_updates(mods, child)
106
- end
102
+ mods = Modifiers.new
103
+ generate_atomic_updates(mods, self)
104
+ _children.each do |child|
105
+ generate_atomic_updates(mods, child)
107
106
  end
107
+ mods
108
108
  end
109
109
  alias :_updates :atomic_updates
110
110
 
@@ -151,6 +151,16 @@ module Mongoid #:nodoc:
151
151
  atomic_paths.position
152
152
  end
153
153
 
154
+ # Returns path of the attribute for modification
155
+ #
156
+ # @example Get path of the attribute
157
+ # address.atomic_attribute_name(:city)
158
+ #
159
+ # @return [ String ] The path to the document attribute in the database
160
+ def atomic_attribute_name(name)
161
+ embedded? ? "#{atomic_position}.#{name}" : name
162
+ end
163
+
154
164
  # Get all the attributes that need to be pulled.
155
165
  #
156
166
  # @example Get the pulls.
@@ -252,9 +262,6 @@ module Mongoid #:nodoc:
252
262
  # @example Get the atomic paths.
253
263
  # document.atomic_paths
254
264
  #
255
- # @todo: Durran: Should probably raise error for embedded docs w/o
256
- # metadata.
257
- #
258
265
  # @return [ Object ] The associated path.
259
266
  #
260
267
  # @since 2.1.0
@@ -281,29 +288,5 @@ module Mongoid #:nodoc:
281
288
  mods.add_to_set(doc.atomic_array_add_to_sets)
282
289
  mods.pull_all(doc.atomic_array_pulls)
283
290
  end
284
-
285
-
286
- # Get the atomic updates for a touch operation. Should only include the
287
- # updated_at field and the optional extra field.
288
- #
289
- # @api private
290
- #
291
- # @example Get the touch atomic updates.
292
- # document.touch_atomic_updates
293
- #
294
- # @param [ Symbol ] field The optional field.
295
- #
296
- # @return [ Hash ] The atomic updates.
297
- #
298
- # @since 2.6.0
299
- def touch_atomic_updates(field = nil)
300
- updates = atomic_updates
301
- return {} unless atomic_updates.has_key?("$set")
302
- touches = {}
303
- updates["$set"].each_pair do |key, value|
304
- touches.merge!({ key => value }) if key =~ /updated_at|#{field}/
305
- end
306
- { "$set" => touches }
307
- end
308
291
  end
309
292
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Atomic #:nodoc:
2
+ module Mongoid
3
+ module Atomic
4
4
 
5
5
  # This class contains the logic for supporting atomic operations against the
6
6
  # database.
@@ -2,9 +2,9 @@
2
2
  require "mongoid/atomic/paths/embedded/one"
3
3
  require "mongoid/atomic/paths/embedded/many"
4
4
 
5
- module Mongoid #:nodoc:
6
- module Atomic #:nodoc:
7
- module Paths #:nodoc:
5
+ module Mongoid
6
+ module Atomic
7
+ module Paths
8
8
 
9
9
  # Common functionality between the two different embedded paths.
10
10
  module Embedded
@@ -34,8 +34,7 @@ module Mongoid #:nodoc:
34
34
  # @since 2.1.0
35
35
  def selector
36
36
  parent.atomic_selector.
37
- merge!({ "#{path}._id" => document.identifier || document._id }).
38
- merge!(document.shard_key_selector)
37
+ merge!({ "#{path}._id" => document._id }).merge!(document.shard_key_selector)
39
38
  end
40
39
  end
41
40
  end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Atomic #:nodoc:
4
- module Paths #:nodoc:
5
- module Embedded #:nodoc:
2
+ module Mongoid
3
+ module Atomic
4
+ module Paths
5
+ module Embedded
6
6
 
7
7
  # This class encapsulates behaviour for locating and updating
8
8
  # documents that are defined as an embedded 1-n.
@@ -34,8 +34,8 @@ module Mongoid #:nodoc:
34
34
  # @since 2.1.0
35
35
  def position
36
36
  pos = parent.atomic_position
37
- locator = document.new? ? "" : ".#{document._index}"
38
- "#{pos}#{"." unless pos.blank?}#{document.metadata.name}#{locator}"
37
+ locator = document.new_record? ? "" : ".#{document._index}"
38
+ "#{pos}#{"." unless pos.blank?}#{document.metadata.store_as}#{locator}"
39
39
  end
40
40
  end
41
41
  end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Atomic #:nodoc:
4
- module Paths #:nodoc:
5
- module Embedded #:nodoc:
2
+ module Mongoid
3
+ module Atomic
4
+ module Paths
5
+ module Embedded
6
6
 
7
7
  # This class encapsulates behaviour for locating and updating
8
8
  # documents that are defined as an embedded 1-1.
@@ -34,7 +34,7 @@ module Mongoid #:nodoc:
34
34
  # @since 2.1.0
35
35
  def position
36
36
  pos = parent.atomic_position
37
- "#{pos}#{"." unless pos.blank?}#{document.metadata.name}"
37
+ "#{pos}#{"." unless pos.blank?}#{document.metadata.store_as}"
38
38
  end
39
39
  end
40
40
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Atomic #:nodoc:
4
- module Paths #:nodoc:
2
+ module Mongoid
3
+ module Atomic
4
+ module Paths
5
5
 
6
6
  # This class encapsulates behaviour for locating and updating root
7
7
  # documents atomically.
@@ -31,8 +31,7 @@ module Mongoid #:nodoc:
31
31
  #
32
32
  # @since 2.1.0
33
33
  def selector
34
- { "_id" => document.identifier || document._id }.
35
- merge!(document.shard_key_selector)
34
+ { "_id" => document._id }.merge!(document.shard_key_selector)
36
35
  end
37
36
  end
38
37
  end
@@ -1,13 +1,15 @@
1
1
  # encoding: utf-8
2
2
  require "mongoid/attributes/processing"
3
+ require "mongoid/attributes/readonly"
3
4
 
4
- module Mongoid #:nodoc:
5
+ module Mongoid
5
6
 
6
7
  # This module contains the logic for handling the internal attributes hash,
7
8
  # and how to get and set values.
8
9
  module Attributes
9
10
  extend ActiveSupport::Concern
10
11
  include Processing
12
+ include Readonly
11
13
 
12
14
  attr_reader :attributes
13
15
  alias :raw_attributes :attributes
@@ -24,9 +26,22 @@ module Mongoid #:nodoc:
24
26
  # @since 1.0.0
25
27
  def attribute_present?(name)
26
28
  attribute = read_attribute(name)
27
- ! attribute.blank? || attribute == false
29
+ !attribute.blank? || attribute == false
30
+ end
31
+
32
+ # Does the document have the provided attribute?
33
+ #
34
+ # @example Does the document have the attribute?
35
+ # model.has_attribute?(:name)
36
+ #
37
+ # @param [ String, Symbol ] name The name of the attribute.
38
+ #
39
+ # @return [ true, false ] If the key is present in the attributes.
40
+ #
41
+ # @since 3.0.0
42
+ def has_attribute?(name)
43
+ attributes.has_key?(name.to_s)
28
44
  end
29
- alias :has_attribute? :attribute_present?
30
45
 
31
46
  # Read a value from the document attributes. If the value does not exist
32
47
  # it will return nil.
@@ -55,11 +70,18 @@ module Mongoid #:nodoc:
55
70
  #
56
71
  # @param [ String, Symbol ] name The name of the attribute to remove.
57
72
  #
73
+ # @raise [ Errors::ReadonlyAttribute ] If the field cannot be removed due
74
+ # to being flagged as reaodnly.
75
+ #
58
76
  # @since 1.0.0
59
77
  def remove_attribute(name)
78
+ access = name.to_s
79
+ unless attribute_writable?(name)
80
+ raise Errors::ReadonlyAttribute.new(name, :nil)
81
+ end
60
82
  _assigning do
61
- access = name.to_s
62
83
  attribute_will_change!(access)
84
+ atomic_unsets.push(atomic_attribute_name(access))
63
85
  attributes.delete(access)
64
86
  end
65
87
  end
@@ -74,11 +96,12 @@ module Mongoid #:nodoc:
74
96
  # @return [ true, false ] True if it does, false if not.
75
97
  #
76
98
  # @since 1.0.0
77
- def respond_to?(*args)
78
- (Mongoid.allow_dynamic_fields &&
99
+ def respond_to?(name, include_private = false)
100
+ super || (
101
+ Mongoid.allow_dynamic_fields &&
79
102
  attributes &&
80
- attributes.has_key?(args.first.to_s.reader)
81
- ) || super
103
+ attributes.has_key?(name.to_s.reader)
104
+ )
82
105
  end
83
106
 
84
107
  # Write a single attribute to the document attribute hash. This will
@@ -96,18 +119,20 @@ module Mongoid #:nodoc:
96
119
  #
97
120
  # @since 1.0.0
98
121
  def write_attribute(name, value)
99
- _assigning do
100
- access = name.to_s
101
- localized = fields[access].try(:localized?)
102
- typed_value_for(access, value).tap do |value|
103
- unless attributes[access] == value || attribute_changed?(access)
122
+ access = name.to_s
123
+ if attribute_writable?(access)
124
+ _assigning do
125
+ localized = fields[access].try(:localized?)
126
+ typed_value = typed_value_for(access, value)
127
+ unless attributes[access] == typed_value || attribute_changed?(access)
104
128
  attribute_will_change!(access)
105
129
  end
106
130
  if localized
107
- (attributes[access] ||= {}).merge!(value)
131
+ (attributes[access] ||= {}).merge!(typed_value)
108
132
  else
109
- attributes[access] = value
133
+ attributes[access] = typed_value
110
134
  end
135
+ typed_value
111
136
  end
112
137
  end
113
138
  end
@@ -130,9 +155,7 @@ module Mongoid #:nodoc:
130
155
  # @since 2.2.1
131
156
  def assign_attributes(attrs = nil, options = {})
132
157
  _assigning do
133
- process(attrs, options[:as] || :default, !options[:without_protection]) do |document|
134
- document.identify if new? && id.blank?
135
- end
158
+ process_attributes(attrs, options[:as] || :default, !options[:without_protection])
136
159
  end
137
160
  end
138
161
 
@@ -151,11 +174,47 @@ module Mongoid #:nodoc:
151
174
  #
152
175
  # @since 1.0.0
153
176
  def write_attributes(attrs = nil, guard_protected_attributes = true)
154
- assign_attributes(attrs, :without_protection => !guard_protected_attributes)
177
+ assign_attributes(attrs, without_protection: !guard_protected_attributes)
155
178
  end
156
179
  alias :attributes= :write_attributes
157
180
 
158
- protected
181
+ private
182
+
183
+ # Define a reader method for a dynamic attribute.
184
+ #
185
+ # @api private
186
+ #
187
+ # @example Define a reader method.
188
+ # model.define_dynamic_reader(:field)
189
+ #
190
+ # @param [ String ] name The name of the field.
191
+ #
192
+ # @since 3.0.0
193
+ def define_dynamic_reader(name)
194
+ class_eval <<-READER
195
+ def #{name}
196
+ read_attribute(#{name.inspect})
197
+ end
198
+ READER
199
+ end
200
+
201
+ # Define a writer method for a dynamic attribute.
202
+ #
203
+ # @api private
204
+ #
205
+ # @example Define a writer method.
206
+ # model.define_dynamic_writer(:field)
207
+ #
208
+ # @param [ String ] name The name of the field.
209
+ #
210
+ # @since 3.0.0
211
+ def define_dynamic_writer(name)
212
+ class_eval <<-WRITER
213
+ def #{name}=(value)
214
+ write_attribute(#{name.inspect}, value)
215
+ end
216
+ WRITER
217
+ end
159
218
 
160
219
  # Used for allowing accessor methods for dynamic attributes.
161
220
  #
@@ -165,9 +224,13 @@ module Mongoid #:nodoc:
165
224
  attr = name.to_s
166
225
  return super unless attributes.has_key?(attr.reader)
167
226
  if attr.writer?
168
- write_attribute(attr.reader, (args.size > 1) ? args : args.first)
227
+ getter = attr.reader
228
+ define_dynamic_writer(getter)
229
+ write_attribute(getter, args.first)
169
230
  else
170
- read_attribute(attr.reader)
231
+ getter = attr.reader
232
+ define_dynamic_reader(getter)
233
+ read_attribute(getter)
171
234
  end
172
235
  end
173
236
 
@@ -183,10 +246,10 @@ module Mongoid #:nodoc:
183
246
  #
184
247
  # @since 1.0.0
185
248
  def typed_value_for(key, value)
186
- fields.has_key?(key) ? fields[key].serialize(value) : value
249
+ fields.has_key?(key) ? fields[key].mongoize(value) : value
187
250
  end
188
251
 
189
- module ClassMethods #:nodoc:
252
+ module ClassMethods
190
253
 
191
254
  # Alias the provided name to the original field. This will provide an
192
255
  # aliased getter, setter, existance check, and all dirty attribute
@@ -205,14 +268,14 @@ module Mongoid #:nodoc:
205
268
  # @since 2.3.0
206
269
  def alias_attribute(name, original)
207
270
  class_eval <<-RUBY
208
- alias :#{name} :#{original}
209
- alias :#{name}= :#{original}=
210
- alias :#{name}? :#{original}?
211
- alias :#{name}_change :#{original}_change
212
- alias :#{name}_changed? :#{original}_changed?
213
- alias :reset_#{name}! :reset_#{original}!
214
- alias :#{name}_was :#{original}_was
215
- alias :#{name}_will_change! :#{original}_will_change!
271
+ alias #{name} #{original}
272
+ alias #{name}= #{original}=
273
+ alias #{name}? #{original}?
274
+ alias #{name}_change #{original}_change
275
+ alias #{name}_changed? #{original}_changed?
276
+ alias reset_#{name}! reset_#{original}!
277
+ alias #{name}_was #{original}_was
278
+ alias #{name}_will_change! #{original}_will_change!
216
279
  RUBY
217
280
  end
218
281
  end