mongoid 2.8.1 → 3.0.0.rc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. data/CHANGELOG.md +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