mongoid 2.4.10 → 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 +843 -9
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -17
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  8. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/root.rb +4 -5
  11. data/lib/mongoid/atomic.rb +16 -9
  12. data/lib/mongoid/attributes/processing.rb +14 -10
  13. data/lib/mongoid/attributes/readonly.rb +56 -0
  14. data/lib/mongoid/attributes.rb +95 -32
  15. data/lib/mongoid/callbacks.rb +100 -42
  16. data/lib/mongoid/collections/retry.rb +2 -3
  17. data/lib/mongoid/components.rb +10 -22
  18. data/lib/mongoid/config/environment.rb +4 -3
  19. data/lib/mongoid/config/inflections.rb +6 -0
  20. data/lib/mongoid/config/options.rb +1 -1
  21. data/lib/mongoid/config/validators/option.rb +25 -0
  22. data/lib/mongoid/config/validators/session.rb +140 -0
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config.rb +87 -233
  25. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  26. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  27. data/lib/mongoid/contextual/atomic.rb +179 -0
  28. data/lib/mongoid/contextual/command.rb +43 -0
  29. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  30. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  31. data/lib/mongoid/contextual/memory.rb +383 -0
  32. data/lib/mongoid/contextual/mongo.rb +543 -0
  33. data/lib/mongoid/contextual.rb +50 -0
  34. data/lib/mongoid/copyable.rb +2 -2
  35. data/lib/mongoid/criteria.rb +436 -248
  36. data/lib/mongoid/criterion/inspection.rb +14 -8
  37. data/lib/mongoid/criterion/scoping.rb +114 -44
  38. data/lib/mongoid/dirty.rb +152 -67
  39. data/lib/mongoid/document.rb +68 -49
  40. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  41. data/lib/mongoid/errors/callback.rb +5 -6
  42. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  43. data/lib/mongoid/errors/document_not_found.rb +98 -17
  44. data/lib/mongoid/errors/eager_load.rb +3 -6
  45. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  46. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  47. data/lib/mongoid/errors/invalid_database.rb +3 -3
  48. data/lib/mongoid/errors/invalid_field.rb +54 -8
  49. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  50. data/lib/mongoid/errors/invalid_find.rb +3 -3
  51. data/lib/mongoid/errors/invalid_index.rb +28 -0
  52. data/lib/mongoid/errors/invalid_options.rb +4 -4
  53. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  54. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  55. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  56. data/lib/mongoid/errors/invalid_time.rb +3 -6
  57. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  58. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  59. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  60. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  61. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  62. data/lib/mongoid/errors/no_default_session.rb +23 -0
  63. data/lib/mongoid/errors/no_environment.rb +3 -3
  64. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  65. data/lib/mongoid/errors/no_parent.rb +24 -0
  66. data/lib/mongoid/errors/no_session_config.rb +22 -0
  67. data/lib/mongoid/errors/no_session_database.rb +27 -0
  68. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  69. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  70. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  71. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  72. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  73. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  74. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  75. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  76. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  77. data/lib/mongoid/errors/validations.rb +7 -6
  78. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  79. data/lib/mongoid/errors.rb +22 -1
  80. data/lib/mongoid/extensions/array.rb +127 -0
  81. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  82. data/lib/mongoid/extensions/boolean.rb +24 -0
  83. data/lib/mongoid/extensions/date.rb +70 -0
  84. data/lib/mongoid/extensions/date_time.rb +68 -0
  85. data/lib/mongoid/extensions/false_class.rb +26 -0
  86. data/lib/mongoid/extensions/float.rb +44 -0
  87. data/lib/mongoid/extensions/hash.rb +91 -0
  88. data/lib/mongoid/extensions/integer.rb +54 -0
  89. data/lib/mongoid/extensions/module.rb +28 -0
  90. data/lib/mongoid/extensions/nil_class.rb +21 -0
  91. data/lib/mongoid/extensions/object.rb +188 -0
  92. data/lib/mongoid/extensions/object_id.rb +53 -0
  93. data/lib/mongoid/extensions/range.rb +55 -0
  94. data/lib/mongoid/extensions/regexp.rb +27 -0
  95. data/lib/mongoid/extensions/set.rb +55 -0
  96. data/lib/mongoid/extensions/string.rb +155 -0
  97. data/lib/mongoid/extensions/symbol.rb +54 -0
  98. data/lib/mongoid/extensions/time.rb +78 -0
  99. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  100. data/lib/mongoid/extensions/true_class.rb +26 -0
  101. data/lib/mongoid/extensions.rb +28 -76
  102. data/lib/mongoid/factory.rb +1 -1
  103. data/lib/mongoid/fields/foreign_key.rb +134 -0
  104. data/lib/mongoid/fields/localized.rb +73 -0
  105. data/lib/mongoid/fields/standard.rb +268 -0
  106. data/lib/mongoid/fields/validators/macro.rb +83 -0
  107. data/lib/mongoid/fields/validators.rb +2 -0
  108. data/lib/mongoid/fields.rb +129 -194
  109. data/lib/mongoid/finders.rb +42 -43
  110. data/lib/mongoid/hierarchy.rb +25 -14
  111. data/lib/mongoid/identity_map.rb +31 -19
  112. data/lib/mongoid/indexes/validators/options.rb +80 -0
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/inspection.rb +1 -1
  115. data/lib/mongoid/javascript.rb +1 -1
  116. data/lib/mongoid/json.rb +2 -2
  117. data/lib/mongoid/loggable.rb +69 -0
  118. data/lib/mongoid/matchers/all.rb +7 -8
  119. data/lib/mongoid/matchers/and.rb +3 -3
  120. data/lib/mongoid/matchers/default.rb +6 -4
  121. data/lib/mongoid/matchers/exists.rb +2 -2
  122. data/lib/mongoid/matchers/gt.rb +2 -2
  123. data/lib/mongoid/matchers/gte.rb +2 -2
  124. data/lib/mongoid/matchers/in.rb +3 -7
  125. data/lib/mongoid/matchers/lt.rb +2 -2
  126. data/lib/mongoid/matchers/lte.rb +2 -2
  127. data/lib/mongoid/matchers/ne.rb +2 -2
  128. data/lib/mongoid/matchers/nin.rb +2 -2
  129. data/lib/mongoid/matchers/or.rb +2 -2
  130. data/lib/mongoid/matchers/size.rb +2 -2
  131. data/lib/mongoid/matchers/strategies.rb +3 -3
  132. data/lib/mongoid/matchers.rb +1 -1
  133. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +13 -18
  137. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  138. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  139. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  140. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  141. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  144. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  145. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  146. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  147. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  148. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  149. data/lib/mongoid/persistence/atomic.rb +2 -2
  150. data/lib/mongoid/persistence/deletion.rb +2 -2
  151. data/lib/mongoid/persistence/insertion.rb +10 -16
  152. data/lib/mongoid/persistence/modification.rb +5 -9
  153. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  154. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  155. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  156. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  157. data/lib/mongoid/persistence/operations/update.rb +5 -5
  158. data/lib/mongoid/persistence/operations.rb +6 -19
  159. data/lib/mongoid/persistence.rb +64 -27
  160. data/lib/mongoid/railtie.rb +26 -11
  161. data/lib/mongoid/railties/database.rake +22 -108
  162. data/lib/mongoid/relations/accessors.rb +119 -19
  163. data/lib/mongoid/relations/auto_save.rb +59 -5
  164. data/lib/mongoid/relations/binding.rb +211 -2
  165. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  166. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  167. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  168. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  169. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  170. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  171. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  172. data/lib/mongoid/relations/builder.rb +3 -3
  173. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  174. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  175. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  176. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  177. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  178. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  179. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  181. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  182. data/lib/mongoid/relations/builders.rb +19 -16
  183. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  184. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  185. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  186. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  187. data/lib/mongoid/relations/cascading.rb +6 -4
  188. data/lib/mongoid/relations/constraint.rb +4 -3
  189. data/lib/mongoid/relations/conversions.rb +5 -6
  190. data/lib/mongoid/relations/cyclic.rb +7 -7
  191. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  192. data/lib/mongoid/relations/embedded/in.rb +23 -12
  193. data/lib/mongoid/relations/embedded/many.rb +99 -160
  194. data/lib/mongoid/relations/embedded/one.rb +25 -14
  195. data/lib/mongoid/relations/macros.rb +105 -60
  196. data/lib/mongoid/relations/many.rb +93 -14
  197. data/lib/mongoid/relations/metadata.rb +231 -45
  198. data/lib/mongoid/relations/nested_builder.rb +3 -5
  199. data/lib/mongoid/relations/one.rb +2 -2
  200. data/lib/mongoid/relations/options.rb +2 -2
  201. data/lib/mongoid/relations/polymorphic.rb +9 -9
  202. data/lib/mongoid/relations/proxy.rb +60 -31
  203. data/lib/mongoid/relations/referenced/in.rb +40 -15
  204. data/lib/mongoid/relations/referenced/many.rb +116 -128
  205. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  206. data/lib/mongoid/relations/referenced/one.rb +34 -13
  207. data/lib/mongoid/relations/reflections.rb +3 -3
  208. data/lib/mongoid/relations/synchronization.rb +19 -23
  209. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  210. data/lib/mongoid/relations/touchable.rb +32 -0
  211. data/lib/mongoid/relations.rb +6 -6
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +13 -30
  215. data/lib/mongoid/sessions/factory.rb +106 -0
  216. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  217. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions.rb +359 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  223. data/lib/mongoid/threaded/sessions.rb +0 -0
  224. data/lib/mongoid/threaded.rb +167 -59
  225. data/lib/mongoid/timestamps/created.rb +8 -4
  226. data/lib/mongoid/timestamps/timeless.rb +6 -4
  227. data/lib/mongoid/timestamps/updated.rb +3 -3
  228. data/lib/mongoid/timestamps.rb +1 -1
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations/associated.rb +2 -2
  231. data/lib/mongoid/validations/format.rb +2 -2
  232. data/lib/mongoid/validations/presence.rb +34 -4
  233. data/lib/mongoid/validations/uniqueness.rb +8 -10
  234. data/lib/mongoid/validations.rb +28 -20
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/mongoid.rb +24 -39
  238. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  239. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  240. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  241. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  242. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  243. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  244. data/lib/rails/generators/mongoid_generator.rb +5 -5
  245. data/lib/rails/mongoid.rb +69 -25
  246. metadata +92 -154
  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/master.rb +0 -45
  269. data/lib/mongoid/collections/operations.rb +0 -44
  270. data/lib/mongoid/collections.rb +0 -120
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/mongo.rb +0 -487
  276. data/lib/mongoid/contexts.rb +0 -25
  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 -108
  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 -76
  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/operation.rb +0 -63
  343. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  344. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  345. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  346. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  347. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  348. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  349. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -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
@@ -0,0 +1,80 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Indexes
4
+ module Validators
5
+
6
+ # Validates the options passed to the index macro.
7
+ module Options
8
+ extend self
9
+
10
+ VALID_OPTIONS = [ :background, :drop_dups, :name, :sparse, :unique ]
11
+ VALID_TYPES = [ 1, -1, "2d" ]
12
+
13
+ # Validate the index specification.
14
+ #
15
+ # @example Validate the index spec.
16
+ # Options.validate(Band, name: 1)
17
+ #
18
+ # @param [ Class ] klass The model class.
19
+ # @param [ Hash ] spec The index specification.
20
+ # @param [ Hash ] options The index options.
21
+ #
22
+ # @raise [ Errors::InvalidIndex ] If validation failed.
23
+ #
24
+ # @since 3.0.0
25
+ def validate(klass, spec, options)
26
+ validate_spec(klass, spec, options)
27
+ validate_options(klass, spec, options)
28
+ end
29
+
30
+ private
31
+
32
+ # Validates the options of the index spec.
33
+ #
34
+ # @api private
35
+ #
36
+ # @example Validate the options.
37
+ # Options.validate_options(Band, name: 1)
38
+ #
39
+ # @param [ Class ] klass The model class.
40
+ # @param [ Hash ] spec The index specification.
41
+ # @param [ Hash ] options The index options.
42
+ #
43
+ # @raise [ Errors::InvalidIndex ] If validation failed.
44
+ #
45
+ # @since 3.0.0
46
+ def validate_options(klass, spec, options)
47
+ options.each_pair do |name, value|
48
+ unless VALID_OPTIONS.include?(name)
49
+ raise Errors::InvalidIndex.new(klass, spec, options)
50
+ end
51
+ end
52
+ end
53
+
54
+ # Validates the index spec.
55
+ #
56
+ # @api private
57
+ #
58
+ # @example Validate the spec.
59
+ # Options.validate_spec(Band, name: 1)
60
+ #
61
+ # @param [ Class ] klass The model class.
62
+ # @param [ Hash ] spec The index specification.
63
+ # @param [ Hash ] options The index options.
64
+ #
65
+ # @raise [ Errors::InvalidIndex ] If validation failed.
66
+ #
67
+ # @since 3.0.0
68
+ def validate_spec(klass, spec, options)
69
+ raise Errors::InvalidIndex.new(klass, spec, options) if !spec.is_a?(::Hash)
70
+ spec.each_pair do |name, value|
71
+ next if name == :options
72
+ unless VALID_TYPES.include?(value)
73
+ raise Errors::InvalidIndex.new(klass, spec, options)
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ 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
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
2
+ module Mongoid
3
3
 
4
4
  # Contains the bahviour around inspecting documents via
5
5
  # <tt>Object#inspect</tt>.
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
  class Javascript
4
4
  # Constant for the file that defines all the js functions.
5
5
  FUNCTIONS = File.join(File.dirname(__FILE__), "javascript", "functions.yml")
data/lib/mongoid/json.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
  # This module is for hooking in to +ActiveModel+s serialization to let
4
4
  # configuring the ability to include the root in JSON happen from the Mongoid
5
5
  # config.
@@ -10,7 +10,7 @@ module Mongoid #:nodoc:
10
10
  # similar to +ActiveRecord+.
11
11
  included do
12
12
  undef_method :include_root_in_json
13
- delegate :include_root_in_json, :to => ::Mongoid
13
+ delegate :include_root_in_json, to: ::Mongoid
14
14
  end
15
15
  end
16
16
  end
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+
4
+ # Contains logging behaviour.
5
+ module Loggable
6
+
7
+ # Get the logger.
8
+ #
9
+ # @note Will try to grab Rails' logger first before creating a new logger
10
+ # with stdout.
11
+ #
12
+ # @example Get the logger.
13
+ # Loggable.logger
14
+ #
15
+ # @return [ Logger ] The logger.
16
+ #
17
+ # @since 3.0.0
18
+ def logger
19
+ return @logger if defined?(@logger)
20
+ @logger = rails_logger || default_logger
21
+ end
22
+
23
+ # Set the logger.
24
+ #
25
+ # @example Set the logger.
26
+ # Loggable.logger = Logger.new($stdout)
27
+ #
28
+ # @param [ Logger ] The logger to set.
29
+ #
30
+ # @return [ Logger ] The new logger.
31
+ #
32
+ # @since 3.0.0
33
+ def logger=(logger)
34
+ @logger = logger
35
+ end
36
+
37
+ private
38
+
39
+ # Gets the default Mongoid logger - stdout.
40
+ #
41
+ # @api private
42
+ #
43
+ # @example Get the default logger.
44
+ # Loggable.default_logger
45
+ #
46
+ # @return [ Logger ] The default logger.
47
+ #
48
+ # @since 3.0.0
49
+ def default_logger
50
+ logger = Logger.new($stdout)
51
+ logger.level = Logger::INFO
52
+ logger
53
+ end
54
+
55
+ # Get the Rails logger if it's defined.
56
+ #
57
+ # @api private
58
+ #
59
+ # @example Get Rails' logger.
60
+ # Loggable.rails_logger
61
+ #
62
+ # @return [ Logger ] The Rails logger.
63
+ #
64
+ # @since 3.0.0
65
+ def rails_logger
66
+ defined?(::Rails) && ::Rails.respond_to?(:logger) && ::Rails.logger
67
+ end
68
+ end
69
+ end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Checks that all values match.
6
6
  class All < Default
@@ -14,13 +14,12 @@ module Mongoid #:nodoc:
14
14
  #
15
15
  # @return [ true, false ] If the values match.
16
16
  def matches?(value)
17
+ first = first(value)
18
+ return false if first.is_a?(Array) && first.empty?
19
+
17
20
  attribute_array = Array.wrap(@attribute)
18
- value.values.first.all? do |e|
19
- if e.is_a?(Regexp)
20
- attribute_array.any? { |_attribute| _attribute =~ e }
21
- else
22
- attribute_array.include?(e)
23
- end
21
+ first.all? do |e|
22
+ attribute_array.any? { |_attribute| e === _attribute }
24
23
  end
25
24
  end
26
25
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Defines behavior for handling $or expressions in embedded documents.
6
6
  class And < Default
@@ -8,7 +8,7 @@ module Mongoid #:nodoc:
8
8
  # Does the supplied query match the attribute?
9
9
  #
10
10
  # @example Does this match?
11
- # matcher.matches?("$and" => [ { field => value } ])
11
+ # matcher.matches?([ { field => value } ])
12
12
  #
13
13
  # @param [ Array ] conditions The or expression.
14
14
  #
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Contains all the default behavior for checking for matching documents
6
6
  # given MongoDB expressions.
@@ -32,7 +32,7 @@ module Mongoid #:nodoc:
32
32
  #
33
33
  # @since 1.0.0
34
34
  def matches?(value)
35
- attribute.is_a?(Array) && !value.is_a?(Array) ? attribute.include?(value) : value === attribute
35
+ attribute.is_a?(Array) && !value.is_a?(Array) ? attribute.any? { |_attribute| value === _attribute } : value === attribute
36
36
  end
37
37
 
38
38
  protected
@@ -63,7 +63,9 @@ module Mongoid #:nodoc:
63
63
  #
64
64
  # @since 1.0.0
65
65
  def determine(value, operator)
66
- attribute ? attribute.send(operator, first(value)) : false
66
+ attribute.__array__.any? {|attr|
67
+ attr ? attr.send(operator, first(value)) : false
68
+ }
67
69
  end
68
70
  end
69
71
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Checks for existance.
6
6
  class Exists < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs Greater Than matching.
6
6
  class Gt < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs Greater than or equal to matching.
6
6
  class Gte < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs matching for any value in an array.
6
6
  class In < Default
@@ -16,11 +16,7 @@ module Mongoid #:nodoc:
16
16
  def matches?(value)
17
17
  attribute_array = Array.wrap(@attribute)
18
18
  value.values.first.any? do |e|
19
- if e.is_a?(Regexp)
20
- attribute_array.any? { |_attribute| _attribute =~ e }
21
- else
22
- attribute_array.include?(e)
23
- end
19
+ attribute_array.any? { |_attribute| e === _attribute }
24
20
  end
25
21
  end
26
22
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs less than matching.
6
6
  class Lt < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs less than or equal to matching.
6
6
  class Lte < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs non-equivalency checks.
6
6
  class Ne < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs not in checking.
6
6
  class Nin < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Defines behavior for handling $or expressions in embedded documents.
6
6
  class Or < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs size checking.
6
6
  class Size < Default
@@ -13,8 +13,8 @@ require "mongoid/matchers/nin"
13
13
  require "mongoid/matchers/or"
14
14
  require "mongoid/matchers/size"
15
15
 
16
- module Mongoid #:nodoc:
17
- module Matchers #:nodoc:
16
+ module Mongoid
17
+ module Matchers
18
18
 
19
19
  # This module is responsible for returning the correct matcher given a
20
20
  # MongoDB query expression.
@@ -81,7 +81,7 @@ module Mongoid #:nodoc:
81
81
  # @since 2.2.1
82
82
  def extract_attribute(document, key)
83
83
  if (key_string = key.to_s) =~ /.+\..+/
84
- key_string.split('.').inject(document.attributes) do |_attribs, _key|
84
+ key_string.split('.').inject(document.as_document) do |_attribs, _key|
85
85
  if _attribs.is_a?(::Array)
86
86
  _attribs.map { |doc| doc.try(:[], _key) }
87
87
  else
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  require "mongoid/matchers/strategies"
3
3
 
4
- module Mongoid #:nodoc:
4
+ module Mongoid
5
5
 
6
6
  # This module contains all the behavior for ruby implementations of MongoDB
7
7
  # selectors.