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,134 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Fields
4
+ class ForeignKey < Standard
5
+
6
+ # Adds the atomic changes for this type of resizable field.
7
+ #
8
+ # @example Add the atomic changes.
9
+ # field.add_atomic_changes(doc, "key", {}, [], [])
10
+ #
11
+ # @todo: Durran: Refactor, big time.
12
+ #
13
+ # @param [ Document ] document The document to add to.
14
+ # @param [ String ] name The name of the field.
15
+ # @param [ String ] key The atomic location of the field.
16
+ # @param [ Hash ] mods The current modifications.
17
+ # @param [ Array ] new The new elements to add.
18
+ # @param [ Array ] old The old elements getting removed.
19
+ #
20
+ # @since 2.4.0
21
+ def add_atomic_changes(document, name, key, mods, new_elements, old_elements)
22
+ old = (old_elements || [])
23
+ new = (new_elements || [])
24
+ if new.length > old.length
25
+ if new.first(old.length) == old
26
+ document.atomic_array_add_to_sets[key] = new.drop(old.length)
27
+ else
28
+ mods[key] = document.attributes[name]
29
+ end
30
+ elsif new.length < old.length
31
+ pulls = old - new
32
+ if new == old - pulls
33
+ document.atomic_array_pulls[key] = pulls
34
+ else
35
+ mods[key] = document.attributes[name]
36
+ end
37
+ elsif new != old
38
+ mods[key] = document.attributes[name]
39
+ end
40
+ end
41
+
42
+ # Is this field a foreign key?
43
+ #
44
+ # @example Is the field a foreign key?
45
+ # field.foreign_key?
46
+ #
47
+ # @return [ true, false ] If the field is a foreign key.
48
+ #
49
+ # @since 2.4.0
50
+ def foreign_key?
51
+ true
52
+ end
53
+
54
+ # Evolve the object into an id compatible object.
55
+ #
56
+ # @example Evolve the object.
57
+ # field.evolve(object)
58
+ #
59
+ # @param [ Object ] object The object to evolve.
60
+ #
61
+ # @return [ Object ] The evolved object.
62
+ #
63
+ # @since 3.0.0
64
+ def evolve(object)
65
+ return object.id if object.is_a?(Document)
66
+ evolved = mongoize(object)
67
+ type.resizable? ? evolved.first : evolved
68
+ end
69
+
70
+ # Mongoize the object into the Mongo friendly value.
71
+ #
72
+ # @example Mongoize the object.
73
+ # field.mongoize(object)
74
+ #
75
+ # @param [ Object ] object The object to Mongoize.
76
+ #
77
+ # @return [ Object ] The mongoized object.
78
+ #
79
+ # @since 3.0.0
80
+ def mongoize(object)
81
+ if type.resizable? || object_id_field?
82
+ type.__mongoize_fk__(constraint, object)
83
+ else
84
+ metadata.klass.fields["_id"].mongoize(object)
85
+ end
86
+ end
87
+
88
+ # Is the field a BSON::ObjectId?
89
+ #
90
+ # @example Is the field a BSON::ObjectId?
91
+ # field.object_id_field?
92
+ #
93
+ # @return [ true, false ] If the field is a BSON::ObjectId.
94
+ #
95
+ # @since 2.2.0
96
+ def object_id_field?
97
+ @object_id_field ||=
98
+ metadata.polymorphic? ? true : metadata.klass.using_object_ids?
99
+ end
100
+
101
+ private
102
+
103
+ # Evaluate the default proc. In some cases we need to instance exec,
104
+ # in others we don't.
105
+ #
106
+ # @example Eval the default proc.
107
+ # field.evaluate_default_proc(band)
108
+ #
109
+ # @param [ Document ] doc The document.
110
+ #
111
+ # @return [ Object ] The called proc.
112
+ #
113
+ # @since 3.0.0
114
+ def evaluate_default_proc(doc)
115
+ serialize_default(default_val[])
116
+ end
117
+
118
+ # This is used when default values need to be serialized. Most of the
119
+ # time just return the object.
120
+ #
121
+ # @api private
122
+ #
123
+ # @example Serialize the default value.
124
+ # field.serialize_default(obj)
125
+ #
126
+ # @param [ Object ] object The default.
127
+ #
128
+ # @return [ Object ] The serialized default.
129
+ #
130
+ # @since 3.0.0
131
+ def serialize_default(object); object; end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,73 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Fields
4
+ class Localized < Standard
5
+
6
+ # Demongoize the object based on the current locale. Will look in the
7
+ # hash for the current locale.
8
+ #
9
+ # @example Get the demongoized value.
10
+ # field.demongoize({ "en" => "testing" })
11
+ #
12
+ # @param [ Hash ] object The hash of translations.
13
+ #
14
+ # @return [ Object ] The value for the current locale.
15
+ #
16
+ # @since 2.3.0
17
+ def demongoize(object)
18
+ if object
19
+ type.demongoize(lookup(object))
20
+ end
21
+ end
22
+
23
+ # Is the field localized or not?
24
+ #
25
+ # @example Is the field localized?
26
+ # field.localized?
27
+ #
28
+ # @return [ true, false ] If the field is localized.
29
+ #
30
+ # @since 2.3.0
31
+ def localized?
32
+ true
33
+ end
34
+
35
+ # Convert the provided string into a hash for the locale.
36
+ #
37
+ # @example Serialize the value.
38
+ # field.mongoize("testing")
39
+ #
40
+ # @param [ String ] object The string to convert.
41
+ #
42
+ # @return [ Hash ] The locale with string translation.
43
+ #
44
+ # @since 2.3.0
45
+ def mongoize(object)
46
+ { ::I18n.locale.to_s => type.mongoize(object) }
47
+ end
48
+
49
+ private
50
+
51
+ # Lookup the value from the provided object.
52
+ #
53
+ # @api private
54
+ #
55
+ # @example Lookup the value.
56
+ # field.lookup({ "en" => "test" })
57
+ #
58
+ # @param [ Hash ] object The localized object.
59
+ #
60
+ # @return [ Object ] The object for the locale.
61
+ #
62
+ # @since 3.0.0
63
+ def lookup(object)
64
+ locale = ::I18n.locale
65
+ if ::I18n.respond_to?(:fallbacks)
66
+ object[::I18n.fallbacks[locale].map(&:to_s).find{ |loc| object[loc] }]
67
+ else
68
+ object[locale.to_s]
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,268 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Fields
4
+ class Standard
5
+
6
+ # Defines the behaviour for defined fields in the document.
7
+ # Set readers for the instance variables.
8
+ attr_accessor :default_val, :label, :name, :options
9
+
10
+ delegate :demongoize, :evolve, :mongoize, to: :type
11
+
12
+ # Adds the atomic changes for this type of resizable field.
13
+ #
14
+ # @example Add the atomic changes.
15
+ # field.add_atomic_changes(doc, "key", {}, [], [])
16
+ #
17
+ # @param [ Document ] document The document to add to.
18
+ # @param [ String ] name The name of the field.
19
+ # @param [ String ] key The atomic location of the field.
20
+ # @param [ Hash ] mods The current modifications.
21
+ # @param [ Array ] new The new elements to add.
22
+ # @param [ Array ] old The old elements getting removed.
23
+ #
24
+ # @since 2.4.0
25
+ def add_atomic_changes(document, name, key, mods, new, old)
26
+ mods[key] = new
27
+ end
28
+
29
+ # Get the constraint from the metadata once.
30
+ #
31
+ # @example Get the constraint.
32
+ # field.constraint
33
+ #
34
+ # @return [ Constraint ] The relation's contraint.
35
+ #
36
+ # @since 2.1.0
37
+ def constraint
38
+ @constraint ||= metadata.constraint
39
+ end
40
+
41
+ # Evaluate the default value and return it. Will handle the
42
+ # serialization, proc calls, and duplication if necessary.
43
+ #
44
+ # @example Evaluate the default value.
45
+ # field.eval_default(document)
46
+ #
47
+ # @param [ Document ] doc The document the field belongs to.
48
+ #
49
+ # @return [ Object ] The serialized default value.
50
+ #
51
+ # @since 2.1.8
52
+ def eval_default(doc)
53
+ if fields = Threaded.selection
54
+ evaluated_default(doc) if included?(fields)
55
+ else
56
+ evaluated_default(doc)
57
+ end
58
+ end
59
+
60
+ # Is this field a foreign key?
61
+ #
62
+ # @example Is the field a foreign key?
63
+ # field.foreign_key?
64
+ #
65
+ # @return [ true, false ] If the field is a foreign key.
66
+ #
67
+ # @since 2.4.0
68
+ def foreign_key?
69
+ false
70
+ end
71
+
72
+ # Create the new field with a name and optional additional options.
73
+ #
74
+ # @example Create the new field.
75
+ # Field.new(:name, :type => String)
76
+ #
77
+ # @param [ Hash ] options The field options.
78
+ #
79
+ # @option options [ Class ] :type The class of the field.
80
+ # @option options [ Object ] :default The default value for the field.
81
+ # @option options [ String ] :label The field's label.
82
+ #
83
+ # @since 3.0.0
84
+ def initialize(name, options = {})
85
+ @name = name
86
+ @options = options
87
+ @label = options[:label]
88
+ @default_val = options[:default]
89
+ end
90
+
91
+ # Is the field localized or not?
92
+ #
93
+ # @example Is the field localized?
94
+ # field.localized?
95
+ #
96
+ # @return [ true, false ] If the field is localized.
97
+ #
98
+ # @since 2.3.0
99
+ def localized?
100
+ false
101
+ end
102
+
103
+ # Get the metadata for the field if its a foreign key.
104
+ #
105
+ # @example Get the metadata.
106
+ # field.metadata
107
+ #
108
+ # @return [ Metadata ] The relation metadata.
109
+ #
110
+ # @since 2.2.0
111
+ def metadata
112
+ @metadata ||= options[:metadata]
113
+ end
114
+
115
+ # Is the field a BSON::ObjectId?
116
+ #
117
+ # @example Is the field a BSON::ObjectId?
118
+ # field.object_id_field?
119
+ #
120
+ # @return [ true, false ] If the field is a BSON::ObjectId.
121
+ #
122
+ # @since 2.2.0
123
+ def object_id_field?
124
+ @object_id_field ||= (type == Moped::BSON::ObjectId)
125
+ end
126
+
127
+ # Does the field pre-process it's default value?
128
+ #
129
+ # @example Does the field pre-process the default?
130
+ # field.pre_processed?
131
+ #
132
+ # @return [ true, false ] If the field's default is pre-processed.
133
+ #
134
+ # @since 3.0.0
135
+ def pre_processed?
136
+ @pre_processed ||=
137
+ (options[:pre_processed] || (default_val && !default_val.is_a?(::Proc)))
138
+ end
139
+
140
+ # Get the type of this field - inferred from the class name.
141
+ #
142
+ # @example Get the type.
143
+ # field.type
144
+ #
145
+ # @return [ Class ] The name of the class.
146
+ #
147
+ # @since 2.1.0
148
+ def type
149
+ @type ||= options[:type] || Object
150
+ end
151
+
152
+ # Is this field included in versioned attributes?
153
+ #
154
+ # @example Is the field versioned?
155
+ # field.versioned?
156
+ #
157
+ # @return [ true, false ] If the field is included in versioning.
158
+ #
159
+ # @since 2.1.0
160
+ def versioned?
161
+ @versioned ||= (options[:versioned].nil? ? true : options[:versioned])
162
+ end
163
+
164
+ private
165
+
166
+ # Get the name of the default method for this field.
167
+ #
168
+ # @api private
169
+ #
170
+ # @example Get the default name.
171
+ # field.default_name
172
+ #
173
+ # @return [ String ] The method name.
174
+ #
175
+ # @since 3.0.0
176
+ def default_name
177
+ @default_name ||= "__#{name}_default__"
178
+ end
179
+
180
+ # Define the method for getting the default on the document.
181
+ #
182
+ # @api private
183
+ #
184
+ # @example Define the method.
185
+ # field.define_default_method(doc)
186
+ #
187
+ # @note Ruby's instance_exec was just too slow.
188
+ #
189
+ # @param [ Document ] doc The document.
190
+ #
191
+ # @since 3.0.0
192
+ def define_default_method(doc)
193
+ unless doc.respond_to?(default_name)
194
+ doc.class.__send__(:define_method, default_name, default_val)
195
+ end
196
+ end
197
+
198
+ # Is the field included in the fields that were returned from the
199
+ # database? We can apply the default if:
200
+ # 1. The field is included in an only limitation (field: 1)
201
+ # 2. The field is not excluded in a without limitation (field: 0)
202
+ #
203
+ # @example Is the field included?
204
+ # field.included?(fields)
205
+ #
206
+ # @param [ Hash ] fields The field limitations.
207
+ #
208
+ # @return [ true, false ] If the field was included.
209
+ #
210
+ # @since 2.4.4
211
+ def included?(fields)
212
+ (fields.values.first == 1 && fields[name.to_s] == 1) ||
213
+ (fields.values.first == 0 && !fields.has_key?(name.to_s))
214
+ end
215
+
216
+ # Get the evaluated default.
217
+ #
218
+ # @example Get the evaluated default.
219
+ # field.evaluated_default.
220
+ #
221
+ # @param [ Document ] doc The doc being applied to.
222
+ #
223
+ # @return [ Object ] The default value.
224
+ #
225
+ # @since 2.4.4
226
+ def evaluated_default(doc)
227
+ if default_val.respond_to?(:call)
228
+ evaluate_default_proc(doc)
229
+ else
230
+ serialize_default(default_val.__deep_copy__)
231
+ end
232
+ end
233
+
234
+ # Evaluate the default proc. In some cases we need to instance exec,
235
+ # in others we don't.
236
+ #
237
+ # @example Eval the default proc.
238
+ # field.evaluate_default_proc(band)
239
+ #
240
+ # @param [ Document ] doc The document.
241
+ #
242
+ # @return [ Object ] The called proc.
243
+ #
244
+ # @since 3.0.0
245
+ def evaluate_default_proc(doc)
246
+ define_default_method(doc)
247
+ serialize_default(doc.__send__(default_name))
248
+ end
249
+
250
+ # This is used when default values need to be serialized. Most of the
251
+ # time just return the object.
252
+ #
253
+ # @api private
254
+ #
255
+ # @example Serialize the default value.
256
+ # field.serialize_default(obj)
257
+ #
258
+ # @param [ Object ] object The default.
259
+ #
260
+ # @return [ Object ] The serialized default.
261
+ #
262
+ # @since 3.0.0
263
+ def serialize_default(object)
264
+ mongoize(object)
265
+ end
266
+ end
267
+ end
268
+ end