mongoid 6.4.8 → 7.0.13

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 (376) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/LICENSE +1 -0
  4. data/README.md +4 -3
  5. data/Rakefile +33 -7
  6. data/lib/config/locales/en.yml +17 -0
  7. data/lib/mongoid/association/accessors.rb +339 -0
  8. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  9. data/lib/mongoid/association/builders.rb +92 -0
  10. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  11. data/lib/mongoid/association/depending.rb +137 -0
  12. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  13. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  14. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  16. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  18. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  19. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  20. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  22. data/lib/mongoid/association/embedded/embeds_many.rb +211 -0
  23. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  24. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  26. data/lib/mongoid/association/embedded/embeds_one.rb +174 -0
  27. data/lib/mongoid/association/embedded.rb +4 -0
  28. data/lib/mongoid/association/macros.rb +204 -0
  29. data/lib/mongoid/{relations → association}/many.rb +19 -49
  30. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  31. data/lib/mongoid/association/nested/many.rb +200 -0
  32. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  33. data/lib/mongoid/association/nested/one.rb +127 -0
  34. data/lib/mongoid/association/nested.rb +15 -0
  35. data/lib/mongoid/{relations → association}/one.rb +6 -6
  36. data/lib/mongoid/association/options.rb +152 -0
  37. data/lib/mongoid/{relations → association}/proxy.rb +45 -59
  38. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  43. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  44. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  45. data/lib/mongoid/association/referenced/eager.rb +162 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  51. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  56. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  57. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  60. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  63. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  64. data/lib/mongoid/association/referenced.rb +7 -0
  65. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  66. data/lib/mongoid/association/relatable.rb +511 -0
  67. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  68. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  69. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  70. data/lib/mongoid/atomic/paths/embedded.rb +1 -1
  71. data/lib/mongoid/atomic.rb +14 -4
  72. data/lib/mongoid/attributes/dynamic.rb +16 -15
  73. data/lib/mongoid/attributes/nested.rb +22 -11
  74. data/lib/mongoid/attributes/processing.rb +2 -2
  75. data/lib/mongoid/attributes/readonly.rb +2 -4
  76. data/lib/mongoid/attributes.rb +55 -31
  77. data/lib/mongoid/changeable.rb +1 -1
  78. data/lib/mongoid/clients/options.rb +7 -5
  79. data/lib/mongoid/clients/sessions.rb +20 -4
  80. data/lib/mongoid/composable.rb +4 -4
  81. data/lib/mongoid/config/environment.rb +21 -8
  82. data/lib/mongoid/config.rb +1 -0
  83. data/lib/mongoid/contextual/atomic.rb +1 -1
  84. data/lib/mongoid/contextual/geo_near.rb +1 -1
  85. data/lib/mongoid/contextual/memory.rb +21 -3
  86. data/lib/mongoid/contextual/mongo.rb +10 -8
  87. data/lib/mongoid/copyable.rb +11 -6
  88. data/lib/mongoid/criteria/includable.rb +14 -14
  89. data/lib/mongoid/criteria/modifiable.rb +8 -3
  90. data/lib/mongoid/criteria/options.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  92. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  93. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  94. data/lib/mongoid/criteria/queryable/extensions/time.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  96. data/lib/mongoid/criteria/queryable/key.rb +67 -8
  97. data/lib/mongoid/criteria/queryable/mergeable.rb +5 -4
  98. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  99. data/lib/mongoid/criteria/queryable/selectable.rb +5 -3
  100. data/lib/mongoid/criteria/queryable/selector.rb +9 -31
  101. data/lib/mongoid/criteria.rb +9 -3
  102. data/lib/mongoid/document.rb +14 -4
  103. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  104. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  105. data/lib/mongoid/errors/unknown_model.rb +25 -0
  106. data/lib/mongoid/errors.rb +3 -0
  107. data/lib/mongoid/extensions/array.rb +5 -5
  108. data/lib/mongoid/extensions/hash.rb +9 -4
  109. data/lib/mongoid/extensions/object.rb +4 -4
  110. data/lib/mongoid/extensions/range.rb +1 -0
  111. data/lib/mongoid/extensions/regexp.rb +1 -1
  112. data/lib/mongoid/extensions/string.rb +2 -2
  113. data/lib/mongoid/extensions.rb +0 -4
  114. data/lib/mongoid/factory.rb +13 -3
  115. data/lib/mongoid/fields/foreign_key.rb +5 -5
  116. data/lib/mongoid/fields/standard.rb +2 -14
  117. data/lib/mongoid/fields/validators/macro.rb +1 -1
  118. data/lib/mongoid/fields.rb +5 -4
  119. data/lib/mongoid/indexable.rb +4 -1
  120. data/lib/mongoid/interceptable.rb +8 -6
  121. data/lib/mongoid/matchable/all.rb +4 -3
  122. data/lib/mongoid/matchable/and.rb +1 -1
  123. data/lib/mongoid/matchable/default.rb +71 -24
  124. data/lib/mongoid/matchable/elem_match.rb +9 -3
  125. data/lib/mongoid/matchable/eq.rb +22 -0
  126. data/lib/mongoid/matchable/ne.rb +1 -1
  127. data/lib/mongoid/matchable/regexp.rb +2 -2
  128. data/lib/mongoid/matchable.rb +17 -16
  129. data/lib/mongoid/persistable/deletable.rb +7 -6
  130. data/lib/mongoid/persistable/incrementable.rb +1 -1
  131. data/lib/mongoid/persistable/logical.rb +1 -1
  132. data/lib/mongoid/persistable/pushable.rb +11 -2
  133. data/lib/mongoid/persistable/settable.rb +57 -12
  134. data/lib/mongoid/persistable.rb +4 -5
  135. data/lib/mongoid/persistence_context.rb +26 -11
  136. data/lib/mongoid/positional.rb +1 -1
  137. data/lib/mongoid/query_cache.rb +4 -2
  138. data/lib/mongoid/serializable.rb +4 -4
  139. data/lib/mongoid/shardable.rb +1 -1
  140. data/lib/mongoid/touchable.rb +102 -0
  141. data/lib/mongoid/traversable.rb +3 -3
  142. data/lib/mongoid/validatable/macros.rb +1 -1
  143. data/lib/mongoid/validatable/presence.rb +2 -2
  144. data/lib/mongoid/validatable/uniqueness.rb +5 -5
  145. data/lib/mongoid/validatable.rb +8 -8
  146. data/lib/mongoid/version.rb +2 -1
  147. data/lib/mongoid.rb +1 -0
  148. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
  149. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  150. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  151. data/spec/README.md +18 -0
  152. data/spec/app/models/animal.rb +2 -1
  153. data/spec/app/models/bomb.rb +1 -1
  154. data/spec/app/models/customer.rb +11 -0
  155. data/spec/app/models/customer_address.rb +12 -0
  156. data/spec/app/models/message.rb +1 -1
  157. data/spec/app/models/minim.rb +7 -0
  158. data/spec/app/models/other_owner_object.rb +2 -0
  159. data/spec/app/models/person.rb +5 -2
  160. data/spec/app/models/shipment_address.rb +1 -0
  161. data/spec/app/models/store_as_dup_test3.rb +7 -0
  162. data/spec/app/models/store_as_dup_test4.rb +7 -0
  163. data/spec/app/models/updatable.rb +7 -0
  164. data/spec/app/models/vertex.rb +6 -0
  165. data/spec/app/models/wiki_page.rb +1 -1
  166. data/spec/config/mongoid.yml +13 -3
  167. data/spec/integration/app_spec.rb +341 -0
  168. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  169. data/spec/integration/associations/embedded_spec.rb +176 -0
  170. data/spec/integration/callbacks_models.rb +49 -0
  171. data/spec/integration/callbacks_spec.rb +216 -0
  172. data/spec/integration/criteria/date_field_spec.rb +41 -0
  173. data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
  174. data/spec/integration/matchable_spec.rb +680 -0
  175. data/spec/lite_spec_helper.rb +71 -0
  176. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  177. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  178. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  179. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  180. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  181. data/spec/mongoid/association/depending_spec.rb +866 -0
  182. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  183. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  184. data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
  185. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  186. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  187. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +55 -77
  188. data/spec/mongoid/association/embedded/embedded_in_spec.rb +901 -0
  189. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  190. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  191. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  192. data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
  193. data/spec/mongoid/association/embedded/embeds_many_spec.rb +862 -0
  194. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  195. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  196. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  197. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +6 -0
  198. data/spec/mongoid/association/embedded/embeds_one_models.rb +51 -0
  199. data/spec/mongoid/association/embedded/embeds_one_spec.rb +954 -0
  200. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  201. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  202. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  203. data/spec/mongoid/association/options_spec.rb +1321 -0
  204. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  205. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  206. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  207. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  208. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  209. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2023 -0
  210. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  211. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  212. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  213. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  214. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +247 -99
  215. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  216. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  217. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  218. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  219. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  220. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +227 -1
  221. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  222. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +30 -94
  223. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  224. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  225. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  226. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  227. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  228. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  229. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  230. data/spec/mongoid/association/referenced/has_one_spec.rb +1360 -0
  231. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  232. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  233. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  234. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  235. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  236. data/spec/mongoid/atomic_spec.rb +4 -4
  237. data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
  238. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  239. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  240. data/spec/mongoid/attributes_spec.rb +298 -9
  241. data/spec/mongoid/clients/factory_spec.rb +20 -38
  242. data/spec/mongoid/clients/options_spec.rb +64 -50
  243. data/spec/mongoid/clients/sessions_spec.rb +9 -5
  244. data/spec/mongoid/clients/transactions_spec.rb +390 -0
  245. data/spec/mongoid/clients_spec.rb +70 -10
  246. data/spec/mongoid/config_spec.rb +27 -1
  247. data/spec/mongoid/contextual/atomic_spec.rb +37 -14
  248. data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
  249. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  250. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  251. data/spec/mongoid/contextual/mongo_spec.rb +107 -56
  252. data/spec/mongoid/copyable_spec.rb +90 -6
  253. data/spec/mongoid/copyable_spec_models.rb +17 -0
  254. data/spec/mongoid/criteria/modifiable_spec.rb +173 -1
  255. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
  256. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  257. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +44 -1
  258. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  259. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  260. data/spec/mongoid/criteria/queryable/key_spec.rb +48 -6
  261. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  262. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +762 -0
  263. data/spec/mongoid/criteria/queryable/selectable_spec.rb +5 -224
  264. data/spec/mongoid/criteria/queryable/selector_spec.rb +37 -0
  265. data/spec/mongoid/criteria_spec.rb +36 -19
  266. data/spec/mongoid/document_fields_spec.rb +88 -0
  267. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  268. data/spec/mongoid/document_spec.rb +29 -4
  269. data/spec/mongoid/extensions/array_spec.rb +11 -15
  270. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  271. data/spec/mongoid/extensions/object_spec.rb +7 -11
  272. data/spec/mongoid/extensions/range_spec.rb +7 -0
  273. data/spec/mongoid/factory_spec.rb +21 -3
  274. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  275. data/spec/mongoid/fields_spec.rb +1 -1
  276. data/spec/mongoid/indexable_spec.rb +24 -12
  277. data/spec/mongoid/interceptable_spec.rb +22 -1
  278. data/spec/mongoid/matchable/default_spec.rb +10 -3
  279. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  280. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  281. data/spec/mongoid/matchable/regexp_spec.rb +2 -2
  282. data/spec/mongoid/matchable_spec.rb +2 -2
  283. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  284. data/spec/mongoid/persistable/savable_spec.rb +5 -5
  285. data/spec/mongoid/persistable/settable_spec.rb +125 -10
  286. data/spec/mongoid/persistable_spec.rb +21 -6
  287. data/spec/mongoid/persistence_context_spec.rb +1 -1
  288. data/spec/mongoid/query_cache_spec.rb +65 -27
  289. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  290. data/spec/mongoid/scopable_spec.rb +2 -1
  291. data/spec/mongoid/shardable_spec.rb +32 -12
  292. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  293. data/spec/mongoid/tasks/database_spec.rb +1 -1
  294. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  295. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  296. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  297. data/spec/mongoid/validatable/uniqueness_spec.rb +33 -6
  298. data/spec/mongoid/validatable_spec.rb +1 -1
  299. data/spec/shared/LICENSE +20 -0
  300. data/spec/shared/bin/get-mongodb-download-url +17 -0
  301. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  302. data/spec/shared/lib/mrss/cluster_config.rb +221 -0
  303. data/spec/shared/lib/mrss/constraints.rb +354 -0
  304. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  305. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  306. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  307. data/spec/shared/lib/mrss/spec_organizer.rb +162 -0
  308. data/spec/shared/lib/mrss/utils.rb +15 -0
  309. data/spec/shared/share/Dockerfile.erb +231 -0
  310. data/spec/shared/shlib/distro.sh +73 -0
  311. data/spec/shared/shlib/server.sh +290 -0
  312. data/spec/shared/shlib/set_env.sh +128 -0
  313. data/spec/spec_helper.rb +34 -49
  314. data/spec/support/cluster_config.rb +3 -3
  315. data/spec/support/constraints.rb +21 -76
  316. data/spec/support/expectations.rb +17 -3
  317. data/spec/support/spec_config.rb +20 -7
  318. data.tar.gz.sig +0 -0
  319. metadata +646 -541
  320. metadata.gz.sig +1 -5
  321. data/lib/mongoid/relations/accessors.rb +0 -267
  322. data/lib/mongoid/relations/auto_save.rb +0 -94
  323. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  324. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  325. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  326. data/lib/mongoid/relations/bindings.rb +0 -9
  327. data/lib/mongoid/relations/builder.rb +0 -57
  328. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  329. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  330. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  331. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  332. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  333. data/lib/mongoid/relations/builders.rb +0 -106
  334. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  335. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  336. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  337. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  338. data/lib/mongoid/relations/cascading.rb +0 -56
  339. data/lib/mongoid/relations/conversions.rb +0 -34
  340. data/lib/mongoid/relations/counter_cache.rb +0 -160
  341. data/lib/mongoid/relations/cyclic.rb +0 -107
  342. data/lib/mongoid/relations/eager/base.rb +0 -153
  343. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  344. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  345. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  346. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  347. data/lib/mongoid/relations/embedded/in.rb +0 -241
  348. data/lib/mongoid/relations/embedded/many.rb +0 -683
  349. data/lib/mongoid/relations/embedded/one.rb +0 -235
  350. data/lib/mongoid/relations/macros.rb +0 -367
  351. data/lib/mongoid/relations/metadata.rb +0 -1179
  352. data/lib/mongoid/relations/nested_builder.rb +0 -74
  353. data/lib/mongoid/relations/options.rb +0 -49
  354. data/lib/mongoid/relations/polymorphic.rb +0 -39
  355. data/lib/mongoid/relations/referenced/in.rb +0 -304
  356. data/lib/mongoid/relations/referenced/many.rb +0 -812
  357. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  358. data/lib/mongoid/relations/referenced/one.rb +0 -290
  359. data/lib/mongoid/relations/synchronization.rb +0 -169
  360. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  361. data/lib/mongoid/relations/targets.rb +0 -2
  362. data/lib/mongoid/relations/touchable.rb +0 -97
  363. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  364. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  365. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  366. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  367. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  368. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  369. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  370. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  371. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  372. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  373. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  374. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  375. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  376. data/spec/mongoid/relations/options_spec.rb +0 -35
@@ -36,7 +36,9 @@ module Mongoid
36
36
  # @since 2.2.0
37
37
  def add_atomic_pull(document)
38
38
  document.flagged_for_destroy = true
39
- (delayed_atomic_pulls[document.metadata_name.to_s] ||= []).push(document)
39
+ key = document.association_name.to_s
40
+ delayed_atomic_pulls[key] ||= []
41
+ delayed_atomic_pulls[key] << document
40
42
  end
41
43
 
42
44
  # Add an atomic unset for the document.
@@ -51,7 +53,9 @@ module Mongoid
51
53
  # @since 3.0.0
52
54
  def add_atomic_unset(document)
53
55
  document.flagged_for_destroy = true
54
- (delayed_atomic_unsets[document.metadata_name.to_s] ||= []).push(document)
56
+ key = document.association_name.to_s
57
+ delayed_atomic_unsets[key] ||= []
58
+ delayed_atomic_unsets[key] << document
55
59
  end
56
60
 
57
61
  # Returns path of the attribute for modification
@@ -189,7 +193,13 @@ module Mongoid
189
193
  #
190
194
  # @since 2.1.0
191
195
  def atomic_paths
192
- @atomic_paths ||= __metadata ? __metadata.path(self) : Atomic::Paths::Root.new(self)
196
+ @atomic_paths ||= begin
197
+ if _association
198
+ _association.path(self)
199
+ else
200
+ Atomic::Paths::Root.new(self)
201
+ end
202
+ end
193
203
  end
194
204
 
195
205
  # Get all the attributes that need to be pulled.
@@ -218,7 +228,7 @@ module Mongoid
218
228
  # @example Get the pushes.
219
229
  # person.atomic_pushes
220
230
  #
221
- # @return [ Hash ] The The $push and $each operations.
231
+ # @return [ Hash ] The $push and $each operations.
222
232
  #
223
233
  # @since 2.1.0
224
234
  def atomic_pushes
@@ -38,12 +38,13 @@ module Mongoid
38
38
  # @since 4.0.0
39
39
  def define_dynamic_reader(name)
40
40
  return unless name.valid_method_name?
41
- class_eval <<-READER, __FILE__, __LINE__ + 1
42
- def #{name}
43
- attribute_will_change!(#{name.inspect})
44
- read_attribute(#{name.inspect})
41
+
42
+ class_eval do
43
+ define_method(name) do
44
+ attribute_will_change!(name)
45
+ read_raw_attribute(name)
45
46
  end
46
- READER
47
+ end
47
48
  end
48
49
 
49
50
  # Define a reader method for a dynamic attribute before type cast.
@@ -57,12 +58,12 @@ module Mongoid
57
58
  #
58
59
  # @since 4.0.0
59
60
  def define_dynamic_before_type_cast_reader(name)
60
- class_eval <<-READER, __FILE__, __LINE__ + 1
61
- def #{name}_before_type_cast
62
- attribute_will_change!(#{name.inspect})
63
- read_attribute_before_type_cast(#{name.inspect})
61
+ class_eval do
62
+ define_method("#{name}_before_type_cast") do
63
+ attribute_will_change!(name)
64
+ read_attribute_before_type_cast(name)
64
65
  end
65
- READER
66
+ end
66
67
  end
67
68
 
68
69
  # Define a writer method for a dynamic attribute.
@@ -78,11 +79,11 @@ module Mongoid
78
79
  def define_dynamic_writer(name)
79
80
  return unless name.valid_method_name?
80
81
 
81
- class_eval <<-WRITER, __FILE__, __LINE__ + 1
82
- def #{name}=(value)
83
- write_attribute(#{name.inspect}, value)
82
+ class_eval do
83
+ define_method("#{name}=") do |value|
84
+ write_attribute(name, value)
84
85
  end
85
- WRITER
86
+ end
86
87
  end
87
88
 
88
89
  # If the attribute is dynamic, add a field for it with a type of object
@@ -147,7 +148,7 @@ module Mongoid
147
148
  getter = attr.reader
148
149
  define_dynamic_reader(getter)
149
150
  attribute_will_change!(attr.reader)
150
- read_attribute(getter)
151
+ read_raw_attribute(getter)
151
152
  end
152
153
  end
153
154
  end
@@ -42,21 +42,27 @@ module Mongoid
42
42
  # to a class method to reject documents with.
43
43
  # @option *args [ Integer ] :limit The max number to create.
44
44
  # @option *args [ true, false ] :update_only Only update existing docs.
45
+ # @options *args [ true, false ] :autosave Whether autosave should be enabled on the
46
+ # association. Note that since the default is true, setting autosave to nil will still
47
+ # enable it.
45
48
  def accepts_nested_attributes_for(*args)
46
- options = args.extract_options!
49
+ options = args.extract_options!.dup
50
+ options[:autosave] = true if options[:autosave].nil?
51
+
47
52
  options[:reject_if] = REJECT_ALL_BLANK_PROC if options[:reject_if] == :all_blank
48
53
  args.each do |name|
49
54
  meth = "#{name}_attributes="
50
55
  self.nested_attributes["#{name}_attributes"] = meth
51
- metadata = relations[name.to_s]
52
- raise Errors::NestedAttributesMetadataNotFound.new(self, name) unless metadata
53
- autosave_nested_attributes(metadata)
56
+ association = relations[name.to_s]
57
+ raise Errors::NestedAttributesMetadataNotFound.new(self, name) unless association
58
+ autosave_nested_attributes(association) if options[:autosave]
59
+
54
60
  re_define_method(meth) do |attrs|
55
61
  _assigning do
56
- if metadata.polymorphic? and metadata.inverse_type
57
- options = options.merge!(:class_name => self.send(metadata.inverse_type))
62
+ if association.polymorphic? and association.inverse_type
63
+ options = options.merge!(:class_name => self.send(association.inverse_type))
58
64
  end
59
- metadata.nested_builder(attrs, options).build(self)
65
+ association.nested_builder(attrs, options).build(self)
60
66
  end
61
67
  end
62
68
  end
@@ -71,12 +77,17 @@ module Mongoid
71
77
  # @example Add the autosave if appropriate.
72
78
  # Person.autosave_nested_attributes(metadata)
73
79
  #
74
- # @param [ Metadata ] metadata The existing relation metadata.
80
+ # @param [ Association ] association The existing association metadata.
75
81
  #
76
82
  # @since 3.1.4
77
- def autosave_nested_attributes(metadata)
78
- unless metadata.autosave == false
79
- autosave(metadata.merge!(autosave: true))
83
+ def autosave_nested_attributes(association)
84
+ # In order for the autosave functionality to work properly, the association needs to be
85
+ # marked as autosave despite the fact that the option isn't present. Because the method
86
+ # Association#autosave? is implemented by checking the autosave option, this is the most
87
+ # straightforward way to mark it.
88
+ if association.autosave? || (association.options[:autosave].nil? && !association.embedded?)
89
+ association.options[:autosave] = true
90
+ Association::Referenced::AutoSave.define_autosave!(association)
80
91
  end
81
92
  end
82
93
  end
@@ -133,9 +133,9 @@ module Mongoid
133
133
  # @since 2.0.0.rc.7
134
134
  def process_relations
135
135
  pending_relations.each_pair do |name, value|
136
- metadata = relations[name]
136
+ association = relations[name]
137
137
  if value.is_a?(Hash)
138
- metadata.nested_builder(value, {}).build(self)
138
+ association.nested_builder(value, {}).build(self)
139
139
  else
140
140
  send("#{name}=", value)
141
141
  end
@@ -22,17 +22,15 @@ module Mongoid
22
22
  # readonly.
23
23
  #
24
24
  # @since 3.0.0
25
- #
26
- # @deprecated Use #as_writable_attribute! instead.
27
25
  def attribute_writable?(name)
28
- new_record? || !readonly_attributes.include?(database_field_name(name))
26
+ new_record? || (!readonly_attributes.include?(name) && _loaded?(name))
29
27
  end
30
28
 
31
29
  private
32
30
 
33
31
  def as_writable_attribute!(name, value = :nil)
34
32
  normalized_name = database_field_name(name)
35
- if new_record? || (!readonly_attributes.include?(normalized_name) && _loaded?(normalized_name))
33
+ if attribute_writable?(normalized_name)
36
34
  yield(normalized_name)
37
35
  else
38
36
  raise Errors::ReadonlyAttribute.new(name, value)
@@ -29,7 +29,7 @@ module Mongoid
29
29
  #
30
30
  # @since 1.0.0
31
31
  def attribute_present?(name)
32
- attribute = read_attribute(name)
32
+ attribute = read_raw_attribute(name)
33
33
  !attribute.blank? || attribute == false
34
34
  rescue ActiveModel::MissingAttributeError
35
35
  false
@@ -92,21 +92,15 @@ module Mongoid
92
92
  #
93
93
  # @since 1.0.0
94
94
  def read_attribute(name)
95
- normalized = database_field_name(name.to_s)
96
- if attribute_missing?(normalized)
97
- raise ActiveModel::MissingAttributeError, "Missing attribute: '#{name}'."
98
- end
99
- if hash_dot_syntax?(normalized)
100
- attributes.__nested__(normalized)
101
- else
102
- attributes[normalized]
103
- end
95
+ field = fields[name.to_s]
96
+ raw = read_raw_attribute(name)
97
+ field ? field.demongoize(raw) : raw
104
98
  end
105
99
  alias :[] :read_attribute
106
100
 
107
101
  # Read a value from the attributes before type cast. If the value has not
108
102
  # yet been assigned then this will return the attribute's existing value
109
- # using read_attribute.
103
+ # using read_raw_attribute.
110
104
  #
111
105
  # @example Read an attribute before type cast.
112
106
  # person.read_attribute_before_type_cast(:price)
@@ -122,7 +116,7 @@ module Mongoid
122
116
  if attributes_before_type_cast.key?(attr)
123
117
  attributes_before_type_cast[attr]
124
118
  else
125
- read_attribute(attr)
119
+ read_raw_attribute(attr)
126
120
  end
127
121
  end
128
122
 
@@ -163,23 +157,31 @@ module Mongoid
163
157
  #
164
158
  # @since 1.0.0
165
159
  def write_attribute(name, value)
166
- as_writable_attribute!(name) do |access|
160
+ field_name = database_field_name(name)
161
+
162
+ if attribute_missing?(field_name)
163
+ raise ActiveModel::MissingAttributeError, "Missing attribute: '#{name}'"
164
+ end
165
+
166
+ if attribute_writable?(field_name)
167
167
  _assigning do
168
- validate_attribute_value(access, value)
169
- localized = fields[access].try(:localized?)
168
+ validate_attribute_value(field_name, value)
169
+ localized = fields[field_name].try(:localized?)
170
170
  attributes_before_type_cast[name.to_s] = value
171
- typed_value = typed_value_for(access, value)
172
- unless attributes[access] == typed_value || attribute_changed?(access)
173
- attribute_will_change!(access)
171
+ typed_value = typed_value_for(field_name, value)
172
+ unless attributes[field_name] == typed_value || attribute_changed?(field_name)
173
+ attribute_will_change!(field_name)
174
174
  end
175
175
  if localized
176
- attributes[access] ||= {}
177
- attributes[access].merge!(typed_value)
176
+ attributes[field_name] ||= {}
177
+ attributes[field_name].merge!(typed_value)
178
178
  else
179
- attributes[access] = typed_value
179
+ attributes[field_name] = typed_value
180
180
  end
181
181
  typed_value
182
182
  end
183
+ else
184
+ # TODO: MONGOID-5072
183
185
  end
184
186
  end
185
187
  alias :[]= :write_attribute
@@ -292,6 +294,20 @@ module Mongoid
292
294
  fields.key?(key) ? fields[key].mongoize(value) : value.mongoize
293
295
  end
294
296
 
297
+ private
298
+
299
+ def read_raw_attribute(name)
300
+ normalized = database_field_name(name.to_s)
301
+ if attribute_missing?(normalized)
302
+ raise ActiveModel::MissingAttributeError, "Missing attribute: '#{name}'"
303
+ end
304
+ if hash_dot_syntax?(normalized)
305
+ attributes.__nested__(normalized)
306
+ else
307
+ attributes[normalized]
308
+ end
309
+ end
310
+
295
311
  module ClassMethods
296
312
 
297
313
  # Alias the provided name to the original field. This will provide an
@@ -328,20 +344,28 @@ module Mongoid
328
344
 
329
345
  private
330
346
 
331
- # Validates an attribute value. This provides validation checking if
332
- # the value is valid for given a field.
333
- # For now, only Hash and Array fields are validated.
347
+ # Validates an attribute value as being assignable to the specified field.
348
+ #
349
+ # For now, only Hash and Array fields are validated, and the value is
350
+ # being checked to be of an appropriate type (i.e. either Hash or Array,
351
+ # respectively, or nil).
352
+ #
353
+ # This method takes the name of the field as stored in the document
354
+ # in the database, not (necessarily) the Ruby method name used to read/write
355
+ # the said field.
334
356
  #
335
- # @param [ String, Symbol ] access The name of the attribute to validate.
336
- # @param [ Object ] value The to be validated.
357
+ # @param [ String, Symbol ] field_name The name of the field.
358
+ # @param [ Object ] value The value to be validated.
337
359
  #
338
360
  # @since 3.0.10
339
- def validate_attribute_value(access, value)
340
- return unless fields[access] && value
361
+ def validate_attribute_value(field_name, value)
362
+ return if value.nil?
363
+ field = fields[field_name]
364
+ return unless field
341
365
  validatable_types = [ Hash, Array ]
342
- if validatable_types.include? fields[access].type
343
- unless value.is_a? fields[access].type
344
- raise Mongoid::Errors::InvalidValue.new(fields[access].type, value.class)
366
+ if validatable_types.include?(field.type)
367
+ unless value.is_a?(field.type)
368
+ raise Mongoid::Errors::InvalidValue.new(field.type, value.class)
345
369
  end
346
370
  end
347
371
  end
@@ -227,7 +227,7 @@ module Mongoid
227
227
  # @since 2.3.0
228
228
  def attribute_will_change!(attr)
229
229
  unless changed_attributes.key?(attr)
230
- changed_attributes[attr] = read_attribute(attr).__deep_copy__
230
+ changed_attributes[attr] = read_raw_attribute(attr).__deep_copy__
231
231
  end
232
232
  end
233
233
 
@@ -20,11 +20,12 @@ module Mongoid
20
20
  #
21
21
  # @since 6.0.0
22
22
  def with(options_or_context, &block)
23
+ original_context = PersistenceContext.get(self)
23
24
  original_cluster = persistence_context.cluster
24
25
  set_persistence_context(options_or_context)
25
26
  yield self
26
27
  ensure
27
- clear_persistence_context(original_cluster)
28
+ clear_persistence_context(original_cluster, original_context)
28
29
  end
29
30
 
30
31
  def collection(parent = nil)
@@ -38,7 +39,7 @@ module Mongoid
38
39
  def mongo_client
39
40
  persistence_context.client
40
41
  end
41
-
42
+
42
43
  def persistence_context
43
44
  PersistenceContext.get(self) ||
44
45
  PersistenceContext.get(self.class) ||
@@ -51,8 +52,8 @@ module Mongoid
51
52
  PersistenceContext.set(self, options_or_context)
52
53
  end
53
54
 
54
- def clear_persistence_context(original_cluster = nil)
55
- PersistenceContext.clear(self, original_cluster)
55
+ def clear_persistence_context(original_cluster = nil, context = nil)
56
+ PersistenceContext.clear(self, original_cluster, context)
56
57
  end
57
58
 
58
59
  module ClassMethods
@@ -92,11 +93,12 @@ module Mongoid
92
93
  #
93
94
  # @since 6.0.0
94
95
  def with(options, &block)
96
+ original_context = PersistenceContext.get(self)
95
97
  original_cluster = persistence_context.cluster
96
98
  PersistenceContext.set(self, options)
97
99
  yield self
98
100
  ensure
99
- PersistenceContext.clear(self, original_cluster)
101
+ PersistenceContext.clear(self, original_cluster, original_context)
100
102
  end
101
103
 
102
104
  def persistence_context
@@ -38,12 +38,20 @@ module Mongoid
38
38
  #
39
39
  # @since 6.4.0
40
40
  def with_session(options = {})
41
- raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting) if Threaded.get_session
41
+ if Threaded.get_session
42
+ raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting)
43
+ end
42
44
  session = persistence_context.client.start_session(options)
43
45
  Threaded.set_session(session)
44
46
  yield(session)
45
47
  rescue Mongo::Error::InvalidSession => ex
46
- if ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
48
+ if
49
+ # Driver 2.13.0+
50
+ defined?(Mongo::Error::SessionsNotSupported) &&
51
+ Mongo::Error::SessionsNotSupported === ex ||
52
+ # Legacy drivers
53
+ ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
54
+ then
47
55
  raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
48
56
  end
49
57
  raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
@@ -89,12 +97,20 @@ module Mongoid
89
97
  #
90
98
  # @since 6.4.0
91
99
  def with_session(options = {})
92
- raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting) if Threaded.get_session
100
+ if Threaded.get_session
101
+ raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting)
102
+ end
93
103
  session = persistence_context.client.start_session(options)
94
104
  Threaded.set_session(session)
95
105
  yield(session)
96
106
  rescue Mongo::Error::InvalidSession => ex
97
- if ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
107
+ if
108
+ # Driver 2.13.0+
109
+ defined?(Mongo::Error::SessionsNotSupported) &&
110
+ Mongo::Error::SessionsNotSupported === ex ||
111
+ # Legacy drivers
112
+ ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
113
+ then
98
114
  raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
99
115
  end
100
116
  raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
@@ -43,7 +43,7 @@ module Mongoid
43
43
  include Inspectable
44
44
  include Matchable
45
45
  include Persistable
46
- include Relations
46
+ include Association
47
47
  include Reloadable
48
48
  include Scopable
49
49
  include Selectable
@@ -70,7 +70,7 @@ module Mongoid
70
70
  Interceptable,
71
71
  Matchable,
72
72
  Persistable,
73
- Relations,
73
+ Association,
74
74
  Reloadable,
75
75
  Scopable,
76
76
  Serializable,
@@ -83,8 +83,8 @@ module Mongoid
83
83
  Traversable,
84
84
  Validatable,
85
85
  Equality,
86
- Relations::Synchronization,
87
- Relations::Macros,
86
+ Association::Referenced::Syncable,
87
+ Association::Macros,
88
88
  ActiveModel::Model,
89
89
  ActiveModel::Validations
90
90
  ]
@@ -6,35 +6,48 @@ module Mongoid
6
6
  module Environment
7
7
  extend self
8
8
 
9
- # Get the name of the environment that we are running under. This first
10
- # looks for Rails, then Sinatra, then a RACK_ENV environment variable,
11
- # and if none of those are found raises an error.
9
+ # Get the name of the environment that Mongoid is running under.
10
+ #
11
+ # Uses the following sources in order:
12
+ # - If +::Rails+ is defined, +Rails.env+.
13
+ # - If +::Sinatra+ is defined, +Sinatra::Base.environment+.
14
+ # - +RACK_ENV+
15
+ # - +MONGOID_ENV*
12
16
  #
13
17
  # @example Get the env name.
14
18
  # Environment.env_name
15
19
  #
16
- # @raise [ Errors::NoEnvironment ] If no environment was set.
20
+ # @raise [ Errors::NoEnvironment ] If environment name cannot be
21
+ # determined because none of the sources was set.
17
22
  #
18
23
  # @return [ String ] The name of the current environment.
19
24
  #
20
25
  # @since 2.3.0
26
+ # @api public
21
27
  def env_name
22
- return Rails.env if defined?(Rails) && Rails.respond_to?(:env)
23
- return Sinatra::Base.environment.to_s if defined?(Sinatra)
24
- ENV["RACK_ENV"] || ENV["MONGOID_ENV"] || raise(Errors::NoEnvironment.new)
28
+ if defined?(::Rails)
29
+ return ::Rails.env
30
+ end
31
+ if defined?(::Sinatra)
32
+ return ::Sinatra::Base.environment.to_s
33
+ end
34
+ ENV["RACK_ENV"] || ENV["MONGOID_ENV"] or raise Errors::NoEnvironment
25
35
  end
26
36
 
27
37
  # Load the yaml from the provided path and return the settings for the
28
- # current environment.
38
+ # specified environment, or for the current Mongoid environment.
29
39
  #
30
40
  # @example Load the yaml.
31
41
  # Environment.load_yaml("/work/mongoid.yml")
32
42
  #
33
43
  # @param [ String ] path The location of the file.
44
+ # @param [ String | Symbol ] environment Optional environment name to
45
+ # override the current Mongoid environment.
34
46
  #
35
47
  # @return [ Hash ] The settings.
36
48
  #
37
49
  # @since 2.3.0
50
+ # @api private
38
51
  def load_yaml(path, environment = nil)
39
52
  env = environment ? environment.to_s : env_name
40
53
  YAML.load(ERB.new(File.new(path).read).result)[env]
@@ -27,6 +27,7 @@ module Mongoid
27
27
  option :log_level, default: :info
28
28
  option :belongs_to_required_by_default, default: true
29
29
  option :app_name, default: nil
30
+ option :background_indexing, default: false
30
31
 
31
32
  # Has Mongoid been configured? This is checking that at least a valid
32
33
  # client config exists.
@@ -118,7 +118,7 @@ module Mongoid
118
118
  # @since 3.0.0
119
119
  def push_all(pushes)
120
120
  push_each_updates = collect_operations(pushes).each.inject({}) do |ops, (field, elements)|
121
- ops.merge!(field => {'$each' => elements})
121
+ ops.merge!(field => { '$each' => elements })
122
122
  end
123
123
  view.update_many("$push" => push_each_updates)
124
124
  end
@@ -242,7 +242,7 @@ module Mongoid
242
242
  # @since 3.0.0
243
243
  def documents
244
244
  results["results"].map do |attributes|
245
- doc = Factory.from_db(criteria.klass, attributes["obj"], criteria.options[:fields])
245
+ doc = Factory.from_db(criteria.klass, attributes["obj"], criteria)
246
246
  doc.attributes["geo_near_distance"] = attributes["dis"]
247
247
  doc
248
248
  end
@@ -1,13 +1,13 @@
1
1
  # encoding: utf-8
2
2
  require "mongoid/contextual/aggregable/memory"
3
- require "mongoid/relations/eager"
3
+ require "mongoid/association/eager_loadable"
4
4
 
5
5
  module Mongoid
6
6
  module Contextual
7
7
  class Memory
8
8
  include Enumerable
9
9
  include Aggregable::Memory
10
- include Relations::Eager
10
+ include Association::EagerLoadable
11
11
  include Queryable
12
12
  include Positional
13
13
 
@@ -130,7 +130,7 @@ module Mongoid
130
130
  # @return [ Document ] The first document.
131
131
  #
132
132
  # @since 3.0.0
133
- def first
133
+ def first(*args)
134
134
  eager_load([documents.first]).first
135
135
  end
136
136
  alias :one :first
@@ -155,6 +155,22 @@ module Mongoid
155
155
  apply_options
156
156
  end
157
157
 
158
+ # Increment a value on all documents.
159
+ #
160
+ # @example Perform the increment.
161
+ # context.inc(likes: 10)
162
+ #
163
+ # @param [ Hash ] incs The operations.
164
+ #
165
+ # @return [ Enumerator ] The enumerator.
166
+ #
167
+ # @since 7.0.0
168
+ def inc(*args)
169
+ each do |document|
170
+ document.inc *args
171
+ end
172
+ end
173
+
158
174
  # Get the last document in the database for the criteria's selector.
159
175
  #
160
176
  # @example Get the last document.
@@ -446,6 +462,8 @@ module Mongoid
446
462
  doc.destroyed = true
447
463
  end
448
464
 
465
+ private
466
+
449
467
  def _session
450
468
  @criteria.send(:_session)
451
469
  end