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
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module TimeWithZone
5
+
6
+ # Turn the object from the ruby type we deal with to a Mongo friendly
7
+ # type.
8
+ #
9
+ # @example Mongoize the object.
10
+ # date_time.mongoize
11
+ #
12
+ # @return [ Time ] The object mongoized.
13
+ #
14
+ # @since 3.0.0
15
+ def mongoize
16
+ ::ActiveSupport::TimeWithZone.mongoize(self)
17
+ end
18
+
19
+ module ClassMethods
20
+
21
+ # Convert the object from it's mongo friendly ruby type to this type.
22
+ #
23
+ # @example Demongoize the object.
24
+ # TimeWithZone.demongoize(object)
25
+ #
26
+ # @param [ Time ] object The time from Mongo.
27
+ #
28
+ # @return [ TimeWithZone ] The object as a date.
29
+ #
30
+ # @since 3.0.0
31
+ def demongoize(object)
32
+ ::Time.demongoize(object).in_time_zone
33
+ end
34
+
35
+ # Turn the object from the ruby type we deal with to a Mongo friendly
36
+ # type.
37
+ #
38
+ # @example Mongoize the object.
39
+ # TimeWithZone.mongoize("2012-1-1")
40
+ #
41
+ # @param [ Object ] object The object to convert.
42
+ #
43
+ # @return [ Time ] The object mongoized.
44
+ #
45
+ # @since 3.0.0
46
+ def mongoize(object)
47
+ ::Time.mongoize(object)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ ::ActiveSupport::TimeWithZone.__send__(:include, Mongoid::Extensions::TimeWithZone)
55
+ ::ActiveSupport::TimeWithZone.__send__(:extend, Mongoid::Extensions::TimeWithZone::ClassMethods)
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Extensions
4
+ module TrueClass
5
+
6
+ # Is the passed value a boolean?
7
+ #
8
+ # @example Is the value a boolean type?
9
+ # true.is_a?(Boolean)
10
+ #
11
+ # @param [ Class ] other The class to check.
12
+ #
13
+ # @return [ true, false ] If the other is a boolean.
14
+ #
15
+ # @since 1.0.0
16
+ def is_a?(other)
17
+ if other == ::Boolean || other.class == ::Boolean
18
+ return true
19
+ end
20
+ super(other)
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ ::TrueClass.__send__(:include, Mongoid::Extensions::TrueClass)
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # Instantiates documents that came from the database.
5
5
  module Factory
@@ -1,34 +1,10 @@
1
1
  # encoding: utf-8
2
- require "mongoid/fields/mappings"
3
- require "mongoid/fields/serializable"
4
- require "mongoid/fields/internal/timekeeping"
5
- require "mongoid/fields/internal/array"
6
- require "mongoid/fields/internal/big_decimal"
7
- require "mongoid/fields/internal/binary"
8
- require "mongoid/fields/internal/boolean"
9
- require "mongoid/fields/internal/date"
10
- require "mongoid/fields/internal/date_time"
11
- require "mongoid/fields/internal/false_class"
12
- require "mongoid/fields/internal/float"
13
- require "mongoid/fields/internal/hash"
14
- require "mongoid/fields/internal/integer"
15
- require "mongoid/fields/internal/bignum"
16
- require "mongoid/fields/internal/fixnum"
17
- require "mongoid/fields/internal/localized"
18
- require "mongoid/fields/internal/nil_class"
19
- require "mongoid/fields/internal/object"
20
- require "mongoid/fields/internal/object_id"
21
- require "mongoid/fields/internal/range"
22
- require "mongoid/fields/internal/set"
23
- require "mongoid/fields/internal/string"
24
- require "mongoid/fields/internal/symbol"
25
- require "mongoid/fields/internal/time"
26
- require "mongoid/fields/internal/time_with_zone"
27
- require "mongoid/fields/internal/true_class"
28
- require "mongoid/fields/internal/foreign_keys/array"
29
- require "mongoid/fields/internal/foreign_keys/object"
30
-
31
- module Mongoid #:nodoc
2
+ require "mongoid/fields/standard"
3
+ require "mongoid/fields/foreign_key"
4
+ require "mongoid/fields/localized"
5
+ require "mongoid/fields/validators"
6
+
7
+ module Mongoid
32
8
 
33
9
  # This module defines behaviour for fields.
34
10
  module Fields
@@ -37,31 +13,38 @@ module Mongoid #:nodoc
37
13
  included do
38
14
  class_attribute :aliased_fields
39
15
  class_attribute :fields
40
- class_attribute :non_proc_defaults
41
- class_attribute :proc_defaults
16
+ class_attribute :pre_processed_defaults
17
+ class_attribute :post_processed_defaults
42
18
 
43
- self.aliased_fields = {}
19
+ self.aliased_fields = { "id" => "_id" }
44
20
  self.fields = {}
45
- self.non_proc_defaults = []
46
- self.proc_defaults = []
21
+ self.pre_processed_defaults = []
22
+ self.post_processed_defaults = []
47
23
 
48
- field(:_type, :type => String)
49
- field(:_id, :type => BSON::ObjectId)
24
+ field(:_type, default: ->{ self.class.name if hereditary? }, type: String)
25
+ field(
26
+ :_id,
27
+ default: ->{ BSON::ObjectId.new },
28
+ pre_processed: true,
29
+ type: BSON::ObjectId
30
+ )
50
31
 
51
32
  alias :id :_id
52
33
  alias :id= :_id=
34
+
35
+ attr_protected(:id, :_id, :_type) if Mongoid.protect_sensitive_fields?
53
36
  end
54
37
 
55
38
  # Apply all default values to the document which are not procs.
56
39
  #
57
40
  # @example Apply all the non-proc defaults.
58
- # model.apply_non_proc_defaults
41
+ # model.apply_pre_processed_defaults
59
42
  #
60
43
  # @return [ Array<String ] The names of the non-proc defaults.
61
44
  #
62
45
  # @since 2.4.0
63
- def apply_non_proc_defaults
64
- non_proc_defaults.each do |name|
46
+ def apply_pre_processed_defaults
47
+ pre_processed_defaults.each do |name|
65
48
  apply_default(name)
66
49
  end
67
50
  end
@@ -69,13 +52,13 @@ module Mongoid #:nodoc
69
52
  # Apply all default values to the document which are procs.
70
53
  #
71
54
  # @example Apply all the proc defaults.
72
- # model.apply_proc_defaults
55
+ # model.apply_post_processed_defaults
73
56
  #
74
57
  # @return [ Array<String ] The names of the proc defaults.
75
58
  #
76
59
  # @since 2.4.0
77
- def apply_proc_defaults
78
- proc_defaults.each do |name|
60
+ def apply_post_processed_defaults
61
+ post_processed_defaults.each do |name|
79
62
  apply_default(name)
80
63
  end
81
64
  end
@@ -107,20 +90,20 @@ module Mongoid #:nodoc
107
90
  #
108
91
  # @since 2.4.0
109
92
  def apply_defaults
110
- apply_non_proc_defaults
111
- apply_proc_defaults
93
+ apply_pre_processed_defaults
94
+ apply_post_processed_defaults
112
95
  end
113
96
 
114
- # Get a list of all the default fields for the model.
97
+ # Is the document using object ids?
115
98
  #
116
- # @example Get a list of the defaults.
117
- # model.defaults
99
+ # @note Refactored from using delegate for class load performance.
118
100
  #
119
- # @return [ Array<String ] The names of all defaults.
101
+ # @example Is the document using object ids?
102
+ # model.using_object_ids?
120
103
  #
121
- # @since 2.4.0
122
- def defaults
123
- self.class.defaults
104
+ # @return [ true, false ] Using object ids.
105
+ def using_object_ids?
106
+ self.class.using_object_ids?
124
107
  end
125
108
 
126
109
  class << self
@@ -160,18 +143,21 @@ module Mongoid #:nodoc
160
143
  end
161
144
  end
162
145
 
163
- module ClassMethods #:nodoc
146
+ module ClassMethods
164
147
 
165
- # Get a list of all the default fields for the model.
148
+ # Returns an array of names for the attributes available on this object.
166
149
  #
167
- # @example Get a list of the defaults.
168
- # Model.defaults
150
+ # Provides the field names in an ORM-agnostic way. Rails v3.1+ uses this
151
+ # meathod to automatically wrap params in JSON requests.
169
152
  #
170
- # @return [ Array<String ] The names of all defaults.
153
+ # @example Get the field names
154
+ # Model.attribute_names
171
155
  #
172
- # @since 2.4.0
173
- def defaults
174
- non_proc_defaults + proc_defaults
156
+ # @return [ Array<String> ] The field names
157
+ #
158
+ # @since 3.0.0
159
+ def attribute_names
160
+ fields.keys
175
161
  end
176
162
 
177
163
  # Defines all the fields that are accessible on the Document
@@ -191,12 +177,12 @@ module Mongoid #:nodoc
191
177
  # @return [ Field ] The generated field
192
178
  def field(name, options = {})
193
179
  named = name.to_s
194
- check_field_name!(name)
195
- add_field(named, options).tap do
196
- descendants.each do |subclass|
197
- subclass.add_field(named, options)
198
- end
180
+ Validators::Macro.validate(self, name, options)
181
+ added = add_field(named, options)
182
+ descendants.each do |subclass|
183
+ subclass.add_field(named, options)
199
184
  end
185
+ added
200
186
  end
201
187
 
202
188
  # When inheriting, we want to copy the fields from the parent class and
@@ -211,25 +197,8 @@ module Mongoid #:nodoc
211
197
  # @since 2.0.0.rc.6
212
198
  def inherited(subclass)
213
199
  super
214
- subclass.fields, subclass.non_proc_defaults, subclass.proc_defaults =
215
- fields.dup, non_proc_defaults.dup, proc_defaults.dup
216
- end
217
-
218
- # Is the field with the provided name a BSON::ObjectId?
219
- #
220
- # @example Is the field a BSON::ObjectId?
221
- # Person.object_id_field?(:name)
222
- #
223
- # @param [ String, Symbol ] name The name of the field.
224
- #
225
- # @return [ true, false ] If the field is a BSON::ObjectId.
226
- #
227
- # @since 2.2.0
228
- def object_id_field?(name)
229
- field_name = name.to_s
230
- field_name = "_id" if field_name == "id"
231
- field = fields[field_name]
232
- field ? field.object_id_field? : false
200
+ subclass.fields, subclass.pre_processed_defaults, subclass.post_processed_defaults =
201
+ fields.dup, pre_processed_defaults.dup, post_processed_defaults.dup
233
202
  end
234
203
 
235
204
  # Replace a field with a new type.
@@ -244,8 +213,21 @@ module Mongoid #:nodoc
244
213
  #
245
214
  # @since 2.1.0
246
215
  def replace_field(name, type)
247
- defaults.delete_one(name)
248
- add_field(name, fields[name].options.merge(:type => type))
216
+ remove_defaults(name)
217
+ add_field(name, fields[name].options.merge(type: type))
218
+ end
219
+
220
+ # Convenience method for determining if we are using +BSON::ObjectIds+ as
221
+ # our id.
222
+ #
223
+ # @example Does this class use object ids?
224
+ # person.using_object_ids?
225
+ #
226
+ # @return [ true, false ] If the class uses BSON::ObjectIds for the id.
227
+ #
228
+ # @since 1.0.0
229
+ def using_object_ids?
230
+ fields["_id"].object_id_field?
249
231
  end
250
232
 
251
233
  protected
@@ -261,11 +243,12 @@ module Mongoid #:nodoc
261
243
  # @since 2.4.0
262
244
  def add_defaults(field)
263
245
  default, name = field.default_val, field.name.to_s
246
+ remove_defaults(name)
264
247
  unless default.nil?
265
- if field.default_val.is_a?(::Proc)
266
- proc_defaults.push(name)
248
+ if field.pre_processed?
249
+ pre_processed_defaults.push(name)
267
250
  else
268
- non_proc_defaults.push(name)
251
+ post_processed_defaults.push(name)
269
252
  end
270
253
  end
271
254
  end
@@ -280,16 +263,15 @@ module Mongoid #:nodoc
280
263
  def add_field(name, options = {})
281
264
  aliased = options[:as]
282
265
  aliased_fields[aliased.to_s] = name if aliased
283
- type = options[:localize] ? Fields::Internal::Localized : options[:type]
284
- Mappings.for(type, options[:identity]).instantiate(name, options).tap do |field|
285
- fields[name] = field
286
- add_defaults(field)
287
- create_accessors(name, name, options)
288
- create_accessors(name, aliased, options) if aliased
289
- process_options(field)
290
- create_dirty_methods(name, name)
291
- create_dirty_methods(name, aliased) if aliased
292
- end
266
+ field = field_for(name, options)
267
+ fields[name] = field
268
+ add_defaults(field)
269
+ create_accessors(name, name, options)
270
+ create_accessors(name, aliased, options) if aliased
271
+ process_options(field)
272
+ create_dirty_methods(name, name)
273
+ create_dirty_methods(name, aliased) if aliased
274
+ field
293
275
  end
294
276
 
295
277
  # Run through all custom options stored in Mongoid::Fields.options and
@@ -315,22 +297,6 @@ module Mongoid #:nodoc
315
297
  end
316
298
  end
317
299
 
318
- # Determine if the field name is allowed, if not raise an error.
319
- #
320
- # @example Check the field name.
321
- # Model.check_field_name!(:collection)
322
- #
323
- # @param [ Symbol ] name The field name.
324
- #
325
- # @raise [ Errors::InvalidField ] If the name is not allowed.
326
- #
327
- # @since 2.1.8
328
- def check_field_name!(name)
329
- if Mongoid.destructive_fields.include?(name)
330
- raise Errors::InvalidField.new(name)
331
- end
332
- end
333
-
334
300
  # Create the field accessors.
335
301
  #
336
302
  # @example Generate the accessors.
@@ -348,12 +314,12 @@ module Mongoid #:nodoc
348
314
  field = fields[name]
349
315
 
350
316
  create_field_getter(name, meth, field)
351
- create_field_setter(name, meth)
317
+ create_field_setter(name, meth, field)
352
318
  create_field_check(name, meth)
353
319
 
354
320
  if options[:localize]
355
321
  create_translations_getter(name, meth)
356
- create_translations_setter(name, meth)
322
+ create_translations_setter(name, meth, field)
357
323
  end
358
324
  end
359
325
 
@@ -369,38 +335,10 @@ module Mongoid #:nodoc
369
335
  # @since 2.4.0
370
336
  def create_field_getter(name, meth, field)
371
337
  generated_methods.module_eval do
372
- if meth =~ /\W/
373
- if field.cast_on_read?
374
- define_method(meth) do
375
- fields[name].deserialize(read_attribute(name))
376
- end
377
- else
378
- define_method(meth) do
379
- read_attribute(name).tap do |value|
380
- if value.is_a?(Array) || value.is_a?(Hash)
381
- attribute_will_change!(name)
382
- end
383
- end
384
- end
385
- end
386
- else
387
- if field.cast_on_read?
388
- class_eval <<-EOM
389
- def #{meth}
390
- fields[#{name.inspect}].deserialize(read_attribute(#{name.inspect}))
391
- end
392
- EOM
393
- else
394
- class_eval <<-EOM
395
- def #{meth}
396
- read_attribute(#{name.inspect}).tap do |value|
397
- if value.is_a?(Array) || value.is_a?(Hash)
398
- attribute_will_change!(#{name.inspect})
399
- end
400
- end
401
- end
402
- EOM
403
- end
338
+ re_define_method(meth) do
339
+ value = fields[name].demongoize(read_attribute(name))
340
+ attribute_will_change!(name) if value.resizable?
341
+ value
404
342
  end
405
343
  end
406
344
  end
@@ -412,20 +350,16 @@ module Mongoid #:nodoc
412
350
  #
413
351
  # @param [ String ] name The name of the attribute.
414
352
  # @param [ String ] meth The name of the method.
353
+ # @param [ Field ] field The field.
415
354
  #
416
355
  # @since 2.4.0
417
- def create_field_setter(name, meth)
356
+ def create_field_setter(name, meth, field)
418
357
  generated_methods.module_eval do
419
- if meth =~ /\W/
420
- define_method(meth) do |value|
421
- write_attribute(name, value)
358
+ re_define_method("#{meth}=") do |value|
359
+ write_attribute(name, value)
360
+ if field.foreign_key?
361
+ remove_ivar(field.metadata.name)
422
362
  end
423
- else
424
- class_eval <<-EOM
425
- def #{meth}=(value)
426
- write_attribute(#{name.inspect}, value)
427
- end
428
- EOM
429
363
  end
430
364
  end
431
365
  end
@@ -441,18 +375,9 @@ module Mongoid #:nodoc
441
375
  # @since 2.4.0
442
376
  def create_field_check(name, meth)
443
377
  generated_methods.module_eval do
444
- if meth =~ /\W/
445
- define_method("#{meth}?") do
446
- attr = read_attribute(name)
447
- attr == true || attr.present?
448
- end
449
- else
450
- class_eval <<-EOM
451
- def #{meth}?
452
- attr = read_attribute(#{name.inspect})
453
- attr == true || attr.present?
454
- end
455
- EOM
378
+ re_define_method("#{meth}?") do
379
+ attr = read_attribute(name)
380
+ attr == true || attr.present?
456
381
  end
457
382
  end
458
383
  end
@@ -468,16 +393,8 @@ module Mongoid #:nodoc
468
393
  # @since 2.4.0
469
394
  def create_translations_getter(name, meth)
470
395
  generated_methods.module_eval do
471
- if meth =~ /\W/
472
- define_method("#{meth}_translations") do
473
- attributes[name]
474
- end
475
- else
476
- class_eval <<-EOM
477
- def #{meth}_translations
478
- attributes[#{name.inspect}]
479
- end
480
- EOM
396
+ re_define_method("#{meth}_translations") do
397
+ attributes[name] ||= {}
481
398
  end
482
399
  end
483
400
  end
@@ -489,22 +406,19 @@ module Mongoid #:nodoc
489
406
  #
490
407
  # @param [ String ] name The name of the attribute.
491
408
  # @param [ String ] meth The name of the method.
409
+ # @param [ Field ] field The field.
492
410
  #
493
411
  # @since 2.4.0
494
- def create_translations_setter(name, meth)
412
+ def create_translations_setter(name, meth, field)
495
413
  generated_methods.module_eval do
496
- if meth =~ /\W/
497
- define_method("#{meth}_translations=") do |value|
498
- attribute_will_change!(name)
499
- attributes[name] = value
500
- end
501
- else
502
- class_eval <<-EOM
503
- def #{meth}_translations=(value)
504
- attribute_will_change!(#{name.inspect})
505
- attributes[#{name.inspect}] = value
414
+ re_define_method("#{meth}_translations=") do |value|
415
+ attribute_will_change!(name)
416
+ if value
417
+ value.update_values do |value|
418
+ field.type.mongoize(value)
506
419
  end
507
- EOM
420
+ end
421
+ attributes[name] = value
508
422
  end
509
423
  end
510
424
  end
@@ -519,9 +433,30 @@ module Mongoid #:nodoc
519
433
  # @since 2.0.0
520
434
  def generated_methods
521
435
  @generated_methods ||= begin
522
- Module.new.tap { |mod| include(mod) }
436
+ mod = Module.new
437
+ include(mod)
438
+ mod
523
439
  end
524
440
  end
441
+
442
+ # Remove the default keys for the provided name.
443
+ #
444
+ # @example Remove the default keys.
445
+ # Model.remove_defaults(name)
446
+ #
447
+ # @param [ String ] name The field name.
448
+ #
449
+ # @since 2.4.0
450
+ def remove_defaults(name)
451
+ pre_processed_defaults.delete_one(name)
452
+ post_processed_defaults.delete_one(name)
453
+ end
454
+
455
+ def field_for(name, options)
456
+ return Fields::Localized.new(name, options) if options[:localize]
457
+ return Fields::ForeignKey.new(name, options) if options[:identity]
458
+ Fields::Standard.new(name, options)
459
+ end
525
460
  end
526
461
  end
527
462
  end