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,2 @@
1
+ # encoding: utf-8
2
+ require "mongoid/fields/validators/macro"
@@ -0,0 +1,83 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Fields
4
+ module Validators
5
+
6
+ # Validates the params passed to the field macro.
7
+ module Macro
8
+ extend self
9
+
10
+ OPTIONS = [
11
+ :as,
12
+ :default,
13
+ :identity,
14
+ :label,
15
+ :localize,
16
+ :metadata,
17
+ :pre_processed,
18
+ :subtype,
19
+ :type,
20
+ :versioned
21
+ ]
22
+
23
+ # Validate the field definition.
24
+ #
25
+ # @example Validate the field definition.
26
+ # Macro.validate(Model, :name, { localized: true })
27
+ #
28
+ # @param [ Class ] klass The model class.
29
+ # @param [ Symbol ] name The field name.
30
+ # @param [ Hash ] options The provided options.
31
+ #
32
+ # @since 3.0.0
33
+ def validate(klass, name, options)
34
+ validate_name(klass, name)
35
+ validate_options(klass, name, options)
36
+ end
37
+
38
+ private
39
+
40
+ # Determine if the field name is allowed, if not raise an error.
41
+ #
42
+ # @api private
43
+ #
44
+ # @example Check the field name.
45
+ # Macro.validate_name(Model, :name)
46
+ #
47
+ # @param [ Class ] klass The model class.
48
+ # @param [ Symbol ] name The field name.
49
+ #
50
+ # @raise [ Errors::InvalidField ] If the name is not allowed.
51
+ #
52
+ # @since 3.0.0
53
+ def validate_name(klass, name)
54
+ if Mongoid.destructive_fields.include?(name)
55
+ raise Errors::InvalidField.new(klass, name)
56
+ end
57
+ end
58
+
59
+ # Validate that the field options are allowed.
60
+ #
61
+ # @api private
62
+ #
63
+ # @example Validate the field options.
64
+ # Macro.validate_options(Model, :name, { localized: true })
65
+ #
66
+ # @param [ Class ] klass The model class.
67
+ # @param [ Symbol ] name The field name.
68
+ # @param [ Hash ] options The provided options.
69
+ #
70
+ # @raise [ Errors::InvalidFieldOption ] If an option is invalid.
71
+ #
72
+ # @since 3.0.0
73
+ def validate_options(klass, name, options)
74
+ options.keys.each do |option|
75
+ if !OPTIONS.include?(option) && !Fields.options.include?(option)
76
+ raise Errors::InvalidFieldOption.new(klass, name, option, OPTIONS)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -1,42 +1,25 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # This module defines the finder methods that hang off the document at the
5
5
  # class level.
6
6
  module Finders
7
+ extend Origin::Forwardable
7
8
 
8
- # Delegate to the criteria methods that are natural for creating a new
9
- # criteria.
10
- critera_methods = [ :all_in, :all_of, :any_in, :any_of, :asc, :ascending,
11
- :avg, :desc, :descending, :excludes,
12
- :includes, :limit, :max, :min, :not_in, :only,
13
- :order_by, :search, :skip, :sum, :without, :where,
14
- :update, :update_all, :near ]
15
- delegate *(critera_methods.dup << { :to => :criteria })
9
+ select_with :with_default_scope
10
+ delegate :aggregates, :avg, :each, :extras, :find_and_modify, :includes,
11
+ :map_reduce, :max, :min, :sum, :update, :update_all, to: :with_default_scope
16
12
 
17
- # Find all documents that match the given conditions.
18
- #
19
- # @example Find all matching documents given conditions.
20
- # Person.all(:conditions => { :attribute => "value" })
21
- #
22
- # @param [ Array ] args The conditions with options.
23
- #
24
- # @return [ Criteria ] The matching documents.
25
- def all(*args)
26
- find(:all, *args)
27
- end
28
-
29
- # Returns a count of matching records in the database based on the
30
- # provided arguments.
13
+ # Returns a count of records in the database.
14
+ # If you want to specify conditions use where.
31
15
  #
32
16
  # @example Get the count of matching documents.
33
- # Person.count(:conditions => { :attribute => "value" })
34
- #
35
- # @param [ Array ] args The conditions.
17
+ # Person.count
18
+ # Person.where(title: "Sir").count
36
19
  #
37
20
  # @return [ Integer ] The number of matching documents.
38
- def count(*args)
39
- find(:all, *args).count
21
+ def count
22
+ with_default_scope.count
40
23
  end
41
24
 
42
25
  # Returns true if count is zero
@@ -53,11 +36,11 @@ module Mongoid #:nodoc:
53
36
  # provided arguments.
54
37
  #
55
38
  # @example Do any documents exist for the conditions?
56
- # Person.exists?(:conditions => { :attribute => "value" })
39
+ # Person.exists?
57
40
  #
58
41
  # @param [ Array ] args The conditions.
59
- def exists?(*args)
60
- find(:all, *args).count > 0
42
+ def exists?
43
+ with_default_scope.exists?
61
44
  end
62
45
 
63
46
  # Find a +Document+ in several different ways.
@@ -68,12 +51,6 @@ module Mongoid #:nodoc:
68
51
  # it will attempt to find either a single +Document+ or multiples based
69
52
  # on the conditions provided and the first parameter.
70
53
  #
71
- # @example Find the first matching document.
72
- # Person.find(:first, :conditions => { :attribute => "value" })
73
- #
74
- # @example Find all matching documents.
75
- # Person.find(:all, :conditions => { :attribute => "value" })
76
- #
77
54
  # @example Find a single document by an id.
78
55
  # Person.find(BSON::ObjectId)
79
56
  #
@@ -81,7 +58,7 @@ module Mongoid #:nodoc:
81
58
  #
82
59
  # @return [ Document, nil, Criteria ] A document or matching documents.
83
60
  def find(*args)
84
- criteria.find(*args)
61
+ with_default_scope.find(*args)
85
62
  end
86
63
 
87
64
  # Find the first +Document+ given the conditions, or creates a new document
@@ -110,6 +87,28 @@ module Mongoid #:nodoc:
110
87
  find_or(:new, attrs, &block)
111
88
  end
112
89
 
90
+ # Find the first +Document+ given the conditions, or raises
91
+ # Mongoid::Errors::DocumentNotFound
92
+ #
93
+ # @example Find the document by attribute other than id
94
+ # Person.find_by(:username => "superuser")
95
+ #
96
+ # @param [ Hash ] attrs The attributes to check.
97
+ #
98
+ # @raise [ Errors::DocumentNotFound ] If no document found.
99
+ #
100
+ # @return [ Document ] A matching document.
101
+ #
102
+ # @since 3.0.0
103
+ def find_by(attrs = {})
104
+ result = where(attrs).first
105
+ if result.nil? && Mongoid.raise_not_found_error
106
+ raise(Errors::DocumentNotFound.new(self, attrs))
107
+ end
108
+ yield(result) if result && block_given?
109
+ result
110
+ end
111
+
113
112
  # Find the first +Document+ given the conditions.
114
113
  #
115
114
  # @example Find the first document.
@@ -118,8 +117,8 @@ module Mongoid #:nodoc:
118
117
  # @param [ Array ] args The conditions with options.
119
118
  #
120
119
  # @return [ Document ] The first matching document.
121
- def first(*args)
122
- find(:first, *args)
120
+ def first
121
+ with_default_scope.first
123
122
  end
124
123
 
125
124
  # Find the last +Document+ given the conditions.
@@ -130,8 +129,8 @@ module Mongoid #:nodoc:
130
129
  # @param [ Array ] args The conditions with options.
131
130
  #
132
131
  # @return [ Document ] The last matching document.
133
- def last(*args)
134
- find(:last, *args)
132
+ def last
133
+ with_default_scope.last
135
134
  end
136
135
 
137
136
  protected
@@ -146,7 +145,7 @@ module Mongoid #:nodoc:
146
145
  #
147
146
  # @return [ Document ] The first or new document.
148
147
  def find_or(method, attrs = {}, &block)
149
- first(:conditions => attrs) || send(method, attrs, &block)
148
+ where(attrs).first || send(method, attrs, &block)
150
149
  end
151
150
  end
152
151
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
3
- module Hierarchy #:nodoc
2
+ module Mongoid
3
+ module Hierarchy
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
@@ -19,18 +19,29 @@ module Mongoid #:nodoc
19
19
  #
20
20
  # @return [ Array<Document> ] All child documents in the hierarchy.
21
21
  def _children
22
- @_children ||=
23
- [].tap do |children|
24
- relations.each_pair do |name, metadata|
25
- if metadata.embedded?
26
- child = send(name)
27
- Array.wrap(child).each do |doc|
28
- children.push(doc)
29
- children.concat(doc._children) unless metadata.versioned?
30
- end if child
31
- end
32
- end
22
+ @_children ||= collect_children
23
+ end
24
+
25
+ # Collect all the children of this document.
26
+ #
27
+ # @example Collect all the children.
28
+ # document.collect_children
29
+ #
30
+ # @return [ Array<Document> ] The children.
31
+ #
32
+ # @since 2.4.0
33
+ def collect_children
34
+ children = []
35
+ embedded_relations.each_pair do |name, metadata|
36
+ without_autobuild do
37
+ child = send(name)
38
+ Array.wrap(child).each do |doc|
39
+ children.push(doc)
40
+ children.concat(doc._children) unless metadata.versioned?
41
+ end if child
33
42
  end
43
+ end
44
+ children
34
45
  end
35
46
 
36
47
  # Determines if the document is a subclass of another document.
@@ -106,7 +117,7 @@ module Mongoid #:nodoc
106
117
  object || self
107
118
  end
108
119
 
109
- module ClassMethods #:nodoc:
120
+ module ClassMethods
110
121
 
111
122
  # Determines if the document is a subclass of another document.
112
123
  #
@@ -1,22 +1,23 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # Defines behaviour for the identity map in Mongoid.
5
5
  class IdentityMap < Hash
6
6
 
7
- # Clear the many documents.
7
+ # Clear out the loaded documents for the provided selector.
8
8
  #
9
- # @example Clear the docs.
10
- # identity_map.clear_many(Post, selector)
9
+ # @example Clear out the documents.
10
+ # map.clear_many(Post, { person_id: person.id })
11
11
  #
12
- # @param [ Class ] klass The klass to clear.
13
- # @param [ Hash ] selector The selector to identify it.
12
+ # @param [ Class ] klass The class of the relation.
13
+ # @param [ Hash ] selector The selector.
14
14
  #
15
- # @return [ Array<Document> ] The documents.
15
+ # @return [ Array ] An empty array.
16
16
  #
17
17
  # @since 2.4.10
18
18
  def clear_many(klass, selector)
19
- (documents_for(klass)[selector] ||= []).clear
19
+ documents = documents_for(klass)[selector]
20
+ documents.clear if documents
20
21
  end
21
22
 
22
23
  # Get a document from the identity map by its id.
@@ -31,8 +32,16 @@ module Mongoid #:nodoc:
31
32
  #
32
33
  # @since 2.1.0
33
34
  def get(klass, identifier)
34
- return nil unless Mongoid.identity_map_enabled? && klass
35
- documents_for(klass)[identifier]
35
+ if Mongoid.using_identity_map? && klass
36
+ if identifier.is_a?(::Array)
37
+ documents = documents_for(klass)
38
+ identifier.map do |id|
39
+ documents[id] || (return nil)
40
+ end
41
+ else
42
+ documents_for(klass)[identifier]
43
+ end
44
+ end
36
45
  end
37
46
 
38
47
  # Remove the document from the identity map.
@@ -46,8 +55,9 @@ module Mongoid #:nodoc:
46
55
  #
47
56
  # @since 2.1.0
48
57
  def remove(document)
49
- return nil unless Mongoid.identity_map_enabled? && document && document.id
50
- documents_for(document.class).delete(document.id)
58
+ if Mongoid.using_identity_map? && document && document.id
59
+ documents_for(document.class).delete(document.id)
60
+ end
51
61
  end
52
62
 
53
63
  # Puts a document in the identity map, accessed by it's id.
@@ -61,8 +71,9 @@ module Mongoid #:nodoc:
61
71
  #
62
72
  # @since 2.1.0
63
73
  def set(document)
64
- return nil unless Mongoid.identity_map_enabled? && document && document.id
65
- documents_for(document.class)[document.id] = document
74
+ if Mongoid.using_identity_map? && document && document.id
75
+ documents_for(document.class)[document.id] = document
76
+ end
66
77
  end
67
78
 
68
79
  # Set a document in the identity map for the provided selector.
@@ -108,8 +119,9 @@ module Mongoid #:nodoc:
108
119
  #
109
120
  # @since 2.1.0
110
121
  def documents_for(klass)
111
- return nil unless klass
112
- self[klass.collection_name] ||= {}
122
+ if klass
123
+ self[klass.collection_name] ||= {}
124
+ end
113
125
  end
114
126
 
115
127
  class << self
@@ -125,11 +137,11 @@ module Mongoid #:nodoc:
125
137
  # IdentityMap.set(document)
126
138
  #
127
139
  # @since 2.1.0
128
- delegate *(
140
+ delegate(*(
129
141
  Hash.public_instance_methods(false) +
130
142
  IdentityMap.public_instance_methods(false) <<
131
- { :to => :"Mongoid::Threaded.identity_map" }
132
- )
143
+ { to: :"Mongoid::Threaded.identity_map" }
144
+ ))
133
145
  end
134
146
  end
135
147
  end
@@ -1,6 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
3
- module Indexes #:nodoc
2
+ require "mongoid/indexes/validators/options"
3
+
4
+ module Mongoid
5
+ module Indexes
4
6
  extend ActiveSupport::Concern
5
7
 
6
8
  included do
@@ -8,18 +10,37 @@ module Mongoid #:nodoc
8
10
  self.index_options = {}
9
11
  end
10
12
 
11
- module ClassMethods #:nodoc
13
+ module ClassMethods
12
14
 
13
15
  # Send the actual index creation comments to the MongoDB driver
14
16
  #
15
17
  # @example Create the indexes for the class.
16
18
  # Person.create_indexes
19
+ #
20
+ # @return [ true ] If the operation succeeded.
21
+ #
22
+ # @since 1.0.0
17
23
  def create_indexes
18
24
  return unless index_options
19
- current_collection = self._collection || set_collection
20
- index_options.each_pair do |name, options|
21
- current_collection.create_index(name, options)
22
- end
25
+ index_options.each_pair do |spec, options|
26
+ collection.indexes.create(spec, options)
27
+ end and true
28
+ end
29
+
30
+ # Send the actual index removal comments to the MongoDB driver,
31
+ # but lets _id untouched.
32
+ #
33
+ # @example Remove the indexes for the class.
34
+ # Person.remove_indexes
35
+ #
36
+ # @return [ true ] If the operation succeeded.
37
+ #
38
+ # @since 3.0.0
39
+ def remove_indexes
40
+ collection.indexes.each do |spec|
41
+ next if spec["name"] == "_id_"
42
+ collection.indexes.drop(spec["key"])
43
+ end and true
23
44
  end
24
45
 
25
46
  # Add the default indexes to the root document if they do not already
@@ -27,11 +48,15 @@ module Mongoid #:nodoc
27
48
  #
28
49
  # @example Add Mongoid internal indexes.
29
50
  # Person.add_indexes
51
+ #
52
+ # @return [ true ] If the operation succeeded.
53
+ #
54
+ # @since 1.0.0
30
55
  def add_indexes
31
- if hereditary? && !index_options[:_type]
32
- self.index_options[:_type] = {:unique => false, :background => true}
56
+ if hereditary? && !index_options[{ _type: 1 }]
57
+ index({ _type: 1 }, { unique: false, background: true })
33
58
  end
34
- create_indexes if Mongoid.autocreate_indexes
59
+ true
35
60
  end
36
61
 
37
62
  # Adds an index on the field specified. Options can be :unique => true or
@@ -40,14 +65,40 @@ module Mongoid #:nodoc
40
65
  # @example Create a basic index.
41
66
  # class Person
42
67
  # include Mongoid::Document
43
- # field :name, :type => String
44
- # index :name, :background => true
68
+ # field :name, type: String
69
+
70
+ # index({ name: 1 }, { background: true })
71
+ # end
45
72
  #
46
73
  # @param [ Symbol ] name The name of the field.
47
74
  # @param [ Hash ] options The index options.
48
- def index(name, options = { :unique => false })
49
- self.index_options[name] = options
50
- create_indexes if Mongoid.autocreate_indexes
75
+ #
76
+ # @return [ Hash ] The index options.
77
+ #
78
+ # @since 1.0.0
79
+ def index(spec, options = nil)
80
+ Validators::Options.validate(self, spec, options || {})
81
+ index_options[spec] = normalize_index_options(options)
82
+ end
83
+
84
+ private
85
+
86
+ # Normalize the index options, if any are provided.
87
+ #
88
+ # @api private
89
+ #
90
+ # @example Normalize the index options.
91
+ # Model.normalize_index_options(drop_dups: true)
92
+ #
93
+ # @param [ Hash ] options The index options.
94
+ #
95
+ # @return [ Hash ] The normalized options.
96
+ #
97
+ # @since 3.0.0
98
+ def normalize_index_options(options)
99
+ opts = options || {}
100
+ opts[:dropDups] = opts.delete(:drop_dups) if opts.has_key?(:drop_dups)
101
+ opts
51
102
  end
52
103
  end
53
104
  end