mongoid 7.6.0 → 8.0.1

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 (313) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -0
  3. data/README.md +3 -3
  4. data/Rakefile +21 -85
  5. data/lib/config/locales/en.yml +46 -30
  6. data/lib/mongoid/association/accessors.rb +32 -3
  7. data/lib/mongoid/association/bindable.rb +48 -0
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/eager_loadable.rb +29 -7
  10. data/lib/mongoid/association/embedded/batchable.rb +28 -5
  11. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  12. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  13. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  14. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  15. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  16. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  17. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  18. data/lib/mongoid/association/macros.rb +2 -1
  19. data/lib/mongoid/association/many.rb +5 -0
  20. data/lib/mongoid/association/nested/many.rb +2 -1
  21. data/lib/mongoid/association/proxy.rb +12 -0
  22. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  23. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  24. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  25. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  26. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  27. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  28. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  29. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  30. data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
  31. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  32. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  33. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  34. data/lib/mongoid/association/relatable.rb +38 -4
  35. data/lib/mongoid/attributes/processing.rb +9 -2
  36. data/lib/mongoid/attributes.rb +30 -27
  37. data/lib/mongoid/cacheable.rb +2 -2
  38. data/lib/mongoid/changeable.rb +37 -2
  39. data/lib/mongoid/clients/options.rb +4 -0
  40. data/lib/mongoid/clients/sessions.rb +2 -14
  41. data/lib/mongoid/config.rb +15 -11
  42. data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
  43. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  44. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  45. data/lib/mongoid/contextual/memory.rb +55 -28
  46. data/lib/mongoid/contextual/mongo.rb +173 -287
  47. data/lib/mongoid/contextual/none.rb +33 -15
  48. data/lib/mongoid/copyable.rb +32 -8
  49. data/lib/mongoid/criteria/includable.rb +24 -20
  50. data/lib/mongoid/criteria/marshalable.rb +10 -2
  51. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  52. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  53. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  54. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  55. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  56. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  57. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  58. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  59. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  60. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  61. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  62. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  63. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  64. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  65. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  66. data/lib/mongoid/criteria/queryable/selectable.rb +2 -24
  67. data/lib/mongoid/criteria/queryable/selector.rb +90 -5
  68. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  69. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  70. data/lib/mongoid/criteria/queryable.rb +11 -6
  71. data/lib/mongoid/criteria.rb +1 -28
  72. data/lib/mongoid/deprecable.rb +36 -0
  73. data/lib/mongoid/deprecation.rb +25 -0
  74. data/lib/mongoid/document.rb +88 -33
  75. data/lib/mongoid/equality.rb +4 -4
  76. data/lib/mongoid/errors/document_not_found.rb +6 -2
  77. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  78. data/lib/mongoid/errors/invalid_field.rb +5 -1
  79. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  80. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  81. data/lib/mongoid/errors.rb +2 -2
  82. data/lib/mongoid/extensions/array.rb +8 -6
  83. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  84. data/lib/mongoid/extensions/binary.rb +42 -0
  85. data/lib/mongoid/extensions/boolean.rb +8 -2
  86. data/lib/mongoid/extensions/date.rb +26 -20
  87. data/lib/mongoid/extensions/date_time.rb +1 -1
  88. data/lib/mongoid/extensions/float.rb +4 -5
  89. data/lib/mongoid/extensions/hash.rb +12 -5
  90. data/lib/mongoid/extensions/integer.rb +4 -5
  91. data/lib/mongoid/extensions/object.rb +2 -0
  92. data/lib/mongoid/extensions/range.rb +41 -10
  93. data/lib/mongoid/extensions/regexp.rb +11 -4
  94. data/lib/mongoid/extensions/set.rb +11 -4
  95. data/lib/mongoid/extensions/string.rb +2 -13
  96. data/lib/mongoid/extensions/symbol.rb +3 -14
  97. data/lib/mongoid/extensions/time.rb +27 -16
  98. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  99. data/lib/mongoid/extensions.rb +1 -0
  100. data/lib/mongoid/factory.rb +42 -7
  101. data/lib/mongoid/fields/foreign_key.rb +7 -0
  102. data/lib/mongoid/fields/validators/macro.rb +3 -9
  103. data/lib/mongoid/fields.rb +49 -7
  104. data/lib/mongoid/findable.rb +21 -16
  105. data/lib/mongoid/indexable/specification.rb +1 -1
  106. data/lib/mongoid/indexable/validators/options.rb +4 -1
  107. data/lib/mongoid/interceptable.rb +69 -9
  108. data/lib/mongoid/persistable/creatable.rb +14 -5
  109. data/lib/mongoid/persistable/updatable.rb +12 -5
  110. data/lib/mongoid/persistence_context.rb +8 -42
  111. data/lib/mongoid/query_cache.rb +6 -258
  112. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  113. data/lib/mongoid/reloadable.rb +7 -3
  114. data/lib/mongoid/scopable.rb +9 -11
  115. data/lib/mongoid/selectable.rb +1 -2
  116. data/lib/mongoid/shardable.rb +11 -35
  117. data/lib/mongoid/stateful.rb +27 -1
  118. data/lib/mongoid/timestamps/created.rb +1 -1
  119. data/lib/mongoid/timestamps/updated.rb +1 -1
  120. data/lib/mongoid/touchable.rb +2 -3
  121. data/lib/mongoid/traversable.rb +1 -0
  122. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  123. data/lib/mongoid/version.rb +1 -5
  124. data/lib/mongoid/warnings.rb +3 -4
  125. data/lib/mongoid.rb +1 -0
  126. data/spec/config/mongoid.yml +16 -0
  127. data/spec/integration/app_spec.rb +8 -12
  128. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  129. data/spec/integration/associations/embedded_spec.rb +15 -0
  130. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  131. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  132. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  133. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  134. data/spec/integration/associations/has_one_spec.rb +97 -1
  135. data/spec/integration/associations/scope_option_spec.rb +1 -1
  136. data/spec/integration/callbacks_models.rb +95 -1
  137. data/spec/integration/callbacks_spec.rb +226 -4
  138. data/spec/integration/criteria/range_spec.rb +95 -1
  139. data/spec/integration/discriminator_key_spec.rb +115 -76
  140. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  141. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  142. data/spec/integration/matcher_examples_spec.rb +20 -13
  143. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  144. data/spec/integration/matcher_operator_spec.rb +3 -5
  145. data/spec/integration/persistence/range_field_spec.rb +350 -0
  146. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  147. data/spec/mongoid/association/depending_spec.rb +9 -9
  148. data/spec/mongoid/association/eager_spec.rb +2 -1
  149. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  150. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  151. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  152. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  153. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
  154. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  155. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  156. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  157. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  158. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  159. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  160. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  161. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  162. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  163. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  164. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  165. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -5
  166. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  167. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  168. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  169. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  170. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +62 -13
  171. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  172. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  173. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  174. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  175. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  176. data/spec/mongoid/association/syncable_spec.rb +14 -0
  177. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  178. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  179. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  180. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  181. data/spec/mongoid/attributes_spec.rb +480 -27
  182. data/spec/mongoid/cacheable_spec.rb +3 -3
  183. data/spec/mongoid/changeable_spec.rb +130 -13
  184. data/spec/mongoid/clients/factory_spec.rb +23 -30
  185. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  186. data/spec/mongoid/clients_spec.rb +2 -2
  187. data/spec/mongoid/config_spec.rb +52 -15
  188. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  189. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  190. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  191. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  192. data/spec/mongoid/contextual/memory_spec.rb +521 -14
  193. data/spec/mongoid/contextual/mongo_spec.rb +566 -426
  194. data/spec/mongoid/contextual/none_spec.rb +11 -19
  195. data/spec/mongoid/copyable_spec.rb +451 -2
  196. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  197. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  198. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  199. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  200. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  201. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  202. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +1 -2
  203. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  204. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  205. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +1 -2
  206. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  207. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  208. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  209. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  210. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  211. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  212. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  213. data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
  214. data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
  215. data/spec/mongoid/criteria_spec.rb +469 -1201
  216. data/spec/mongoid/document_fields_spec.rb +173 -24
  217. data/spec/mongoid/document_spec.rb +32 -41
  218. data/spec/mongoid/equality_spec.rb +12 -12
  219. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  220. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  221. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  222. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  223. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  224. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  225. data/spec/mongoid/extensions/array_spec.rb +16 -2
  226. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  227. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  228. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  229. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  230. data/spec/mongoid/extensions/date_spec.rb +71 -1
  231. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  232. data/spec/mongoid/extensions/float_spec.rb +48 -76
  233. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  234. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  235. data/spec/mongoid/extensions/range_spec.rb +255 -54
  236. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  237. data/spec/mongoid/extensions/set_spec.rb +106 -0
  238. data/spec/mongoid/extensions/string_spec.rb +53 -25
  239. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  240. data/spec/mongoid/extensions/time_spec.rb +634 -66
  241. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  242. data/spec/mongoid/factory_spec.rb +61 -1
  243. data/spec/mongoid/fields_spec.rb +321 -50
  244. data/spec/mongoid/findable_spec.rb +64 -29
  245. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  246. data/spec/mongoid/indexable_spec.rb +16 -19
  247. data/spec/mongoid/interceptable_spec.rb +584 -5
  248. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  249. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  250. data/spec/mongoid/mongoizable_spec.rb +285 -0
  251. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  252. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  253. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  254. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  255. data/spec/mongoid/persistence_context_spec.rb +24 -0
  256. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  257. data/spec/mongoid/query_cache_spec.rb +1 -156
  258. data/spec/mongoid/reloadable_spec.rb +35 -2
  259. data/spec/mongoid/scopable_spec.rb +36 -34
  260. data/spec/mongoid/serializable_spec.rb +14 -7
  261. data/spec/mongoid/shardable_models.rb +0 -14
  262. data/spec/mongoid/shardable_spec.rb +61 -153
  263. data/spec/mongoid/stateful_spec.rb +28 -0
  264. data/spec/mongoid/timestamps_spec.rb +390 -0
  265. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  266. data/spec/mongoid/touchable_spec.rb +116 -0
  267. data/spec/mongoid/touchable_spec_models.rb +12 -8
  268. data/spec/mongoid/traversable_spec.rb +4 -11
  269. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  270. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  271. data/spec/mongoid/warnings_spec.rb +35 -0
  272. data/spec/mongoid_spec.rb +1 -7
  273. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  274. data/spec/rails/mongoid_spec.rb +4 -16
  275. data/spec/shared/lib/mrss/docker_runner.rb +1 -8
  276. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  277. data/spec/shared/lib/mrss/lite_constraints.rb +2 -10
  278. data/spec/shared/lib/mrss/server_version_registry.rb +24 -17
  279. data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
  280. data/spec/shared/lib/mrss/utils.rb +6 -28
  281. data/spec/shared/share/Dockerfile.erb +107 -33
  282. data/spec/shared/shlib/distro.sh +0 -10
  283. data/spec/shared/shlib/server.sh +33 -64
  284. data/spec/shared/shlib/set_env.sh +71 -12
  285. data/spec/support/constraints.rb +24 -0
  286. data/spec/support/expectations.rb +17 -20
  287. data/spec/support/macros.rb +30 -0
  288. data/spec/support/models/augmentation.rb +12 -0
  289. data/spec/support/models/band.rb +3 -0
  290. data/spec/support/models/catalog.rb +24 -0
  291. data/spec/support/models/circus.rb +3 -0
  292. data/spec/support/models/fanatic.rb +8 -0
  293. data/spec/support/models/implant.rb +9 -0
  294. data/spec/support/models/label.rb +2 -0
  295. data/spec/support/models/passport.rb +9 -0
  296. data/spec/support/models/person.rb +1 -0
  297. data/spec/support/models/player.rb +2 -0
  298. data/spec/support/models/powerup.rb +12 -0
  299. data/spec/support/models/registry.rb +1 -0
  300. data/spec/support/models/school.rb +14 -0
  301. data/spec/support/models/shield.rb +18 -0
  302. data/spec/support/models/student.rb +14 -0
  303. data/spec/support/models/weapon.rb +12 -0
  304. data.tar.gz.sig +0 -0
  305. metadata +695 -641
  306. metadata.gz.sig +0 -0
  307. data/lib/mongoid/errors/eager_load.rb +0 -23
  308. data/lib/mongoid/errors/invalid_value.rb +0 -17
  309. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  310. data/spec/shared/CANDIDATE.md +0 -28
  311. data/spec/shared/lib/mrss/release/candidate.rb +0 -281
  312. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  313. data/spec/shared/lib/tasks/candidate.rake +0 -64
@@ -4,28 +4,8 @@ module Mongoid
4
4
 
5
5
  # A cache of database queries on a per-request basis.
6
6
  module QueryCache
7
- # @api private
8
- LEGACY_WARNING = <<~DOC
9
- You are using the legacy Mongoid query cache which has known issues.
10
- Please upgrade the `mongo' gem to at least 2.14.0 to use the improved driver query cache.
11
- Refer to: https://docs.mongodb.com/mongoid/current/tutorials/mongoid-queries/#the-improved-driver-query-cache
12
- DOC
13
7
 
14
8
  class << self
15
- # Get the cached queries.
16
- #
17
- # @example Get the cached queries from the current thread.
18
- # QueryCache.cache_table
19
- #
20
- # @return [ Hash ] The hash of cached queries.
21
- # @api private
22
- def cache_table
23
- if defined?(Mongo::QueryCache)
24
- raise NotImplementedError, "Mongoid does not expose driver's query cache table"
25
- else
26
- Thread.current["[mongoid]:query_cache"] ||= {}
27
- end
28
- end
29
9
 
30
10
  # Clear the query cache.
31
11
  #
@@ -34,11 +14,7 @@ module Mongoid
34
14
  #
35
15
  # @return [ nil ] Always nil.
36
16
  def clear_cache
37
- if defined?(Mongo::QueryCache)
38
- Mongo::QueryCache.clear
39
- else
40
- Thread.current["[mongoid]:query_cache"] = nil
41
- end
17
+ Mongo::QueryCache.clear
42
18
  end
43
19
 
44
20
  # Set whether the cache is enabled.
@@ -48,11 +24,7 @@ module Mongoid
48
24
  #
49
25
  # @param [ true, false ] value The enabled value.
50
26
  def enabled=(value)
51
- if defined?(Mongo::QueryCache)
52
- Mongo::QueryCache.enabled = value
53
- else
54
- Thread.current["[mongoid]:query_cache:enabled"] = value
55
- end
27
+ Mongo::QueryCache.enabled = value
56
28
  end
57
29
 
58
30
  # Is the query cache enabled on the current thread?
@@ -62,11 +34,7 @@ module Mongoid
62
34
  #
63
35
  # @return [ true, false ] If the cache is enabled.
64
36
  def enabled?
65
- if defined?(Mongo::QueryCache)
66
- Mongo::QueryCache.enabled?
67
- else
68
- !!Thread.current["[mongoid]:query_cache:enabled"]
69
- end
37
+ Mongo::QueryCache.enabled?
70
38
  end
71
39
 
72
40
  # Execute the block while using the query cache.
@@ -76,21 +44,7 @@ module Mongoid
76
44
  #
77
45
  # @return [ Object ] The result of the block.
78
46
  def cache(&block)
79
- if defined?(Mongo::QueryCache)
80
- Mongo::QueryCache.cache(&block)
81
- else
82
- @legacy_query_cache_warned ||= begin
83
- Mongoid.logger.warn(LEGACY_WARNING)
84
- true
85
- end
86
- enabled = QueryCache.enabled?
87
- QueryCache.enabled = true
88
- begin
89
- yield
90
- ensure
91
- QueryCache.enabled = enabled
92
- end
93
- end
47
+ Mongo::QueryCache.cache(&block)
94
48
  end
95
49
 
96
50
  # Execute the block with the query cache disabled.
@@ -100,217 +54,11 @@ module Mongoid
100
54
  #
101
55
  # @return [ Object ] The result of the block.
102
56
  def uncached(&block)
103
- if defined?(Mongo::QueryCache)
104
- Mongo::QueryCache.uncached(&block)
105
- else
106
- enabled = QueryCache.enabled?
107
- QueryCache.enabled = false
108
- begin
109
- yield
110
- ensure
111
- QueryCache.enabled = enabled
112
- end
113
- end
114
- end
115
- end
116
-
117
- if defined?(Mongo::QueryCache::Middleware)
118
- Middleware = Mongo::QueryCache::Middleware
119
- else
120
- # The middleware to be added to a rack application in order to activate the
121
- # query cache.
122
- class Middleware
123
-
124
- # Instantiate the middleware.
125
- #
126
- # @example Create the new middleware.
127
- # Middleware.new(app)
128
- #
129
- # @param [ Object ] app The rack application stack.
130
- def initialize(app)
131
- @app = app
132
- end
133
-
134
- # Execute the request, wrapping in a query cache.
135
- #
136
- # @example Execute the request.
137
- # middleware.call(env)
138
- #
139
- # @param [ Object ] env The environment.
140
- #
141
- # @return [ Object ] The result of the call.
142
- def call(env)
143
- QueryCache.cache do
144
- @app.call(env)
145
- end
146
- ensure
147
- QueryCache.clear_cache
148
- end
149
- end
150
- end
151
-
152
- # A Cursor that attempts to load documents from memory first before hitting
153
- # the database if the same query has already been executed.
154
- # @deprecated This class is only used with driver versions 2.13 and lower.
155
- class CachedCursor < Mongo::Cursor
156
-
157
- # We iterate over the cached documents if they exist already in the
158
- # cursor otherwise proceed as normal.
159
- #
160
- # @example Iterate over the documents.
161
- # cursor.each do |doc|
162
- # # ...
163
- # end
164
- def each
165
- if @cached_documents
166
- @cached_documents.each do |doc|
167
- yield doc
168
- end
169
- else
170
- super
171
- end
172
- end
173
-
174
- # Get a human-readable string representation of +Cursor+.
175
- #
176
- # @example Inspect the cursor.
177
- # cursor.inspect
178
- #
179
- # @return [ String ] A string representation of a +Cursor+ instance.
180
- def inspect
181
- "#<Mongoid::QueryCache::CachedCursor:0x#{object_id} @view=#{@view.inspect}>"
182
- end
183
-
184
- private
185
-
186
- def process(result)
187
- documents = super
188
- if @cursor_id.zero? && !@after_first_batch
189
- @cached_documents ||= []
190
- @cached_documents.concat(documents)
191
- end
192
- @after_first_batch = true
193
- documents
194
- end
195
- end
196
-
197
- # Included to add behavior for clearing out the query cache on certain
198
- # operations.
199
- # @deprecated This module is only used with driver versions 2.13 and lower.
200
- module Base
201
-
202
- def alias_query_cache_clear(*method_names)
203
- method_names.each do |method_name|
204
- define_method("#{method_name}_with_clear_cache") do |*args|
205
- QueryCache.clear_cache
206
- send("#{method_name}_without_clear_cache", *args)
207
- end
208
-
209
- alias_method "#{method_name}_without_clear_cache", method_name
210
- alias_method method_name, "#{method_name}_with_clear_cache"
211
- end
57
+ Mongo::QueryCache.uncached(&block)
212
58
  end
213
59
  end
214
60
 
215
- # Contains enhancements to the Mongo::Collection::View in order to get a
216
- # cached cursor or a regular cursor on iteration.
217
- # @deprecated This module is only used with driver versions 2.13 and lower.
218
- module View
219
- extend ActiveSupport::Concern
220
-
221
- included do
222
- extend QueryCache::Base
223
- alias_query_cache_clear :delete_one,
224
- :delete_many,
225
- :update_one,
226
- :update_many,
227
- :replace_one,
228
- :find_one_and_delete,
229
- :find_one_and_replace,
230
- :find_one_and_update
231
- end
232
-
233
- # Override the default enumeration to handle if the cursor can be cached
234
- # or not.
235
- #
236
- # @example Iterate over the view.
237
- # view.each do |doc|
238
- # # ...
239
- # end
240
- def each
241
- if system_collection? || !QueryCache.enabled? || (respond_to?(:write?, true) && write?)
242
- super
243
- else
244
- @cursor = nil
245
- unless @cursor = cached_cursor
246
- session = client.send(:get_session, @options)
247
- read_with_retry(session, server_selector) do |server|
248
- result = send_initial_query(server, session)
249
- if result.cursor_id == 0 || result.cursor_id.nil?
250
- @cursor = CachedCursor.new(view, result, server, session: session)
251
- QueryCache.cache_table[cache_key] = @cursor
252
- else
253
- @cursor = Mongo::Cursor.new(view, result, server, session: session)
254
- end
255
- end
256
- end
257
- if block_given?
258
- if limit
259
- @cursor.to_a[0...limit].each do |doc|
260
- yield doc
261
- end
262
- else
263
- @cursor.each do |doc|
264
- yield doc
265
- end
266
- end
267
- else
268
- @cursor.to_enum
269
- end
270
- end
271
- end
272
-
273
- private
274
-
275
- def cached_cursor
276
- if limit
277
- key = [ collection.namespace, selector, nil, skip, sort, projection, collation ]
278
- cursor = QueryCache.cache_table[key]
279
- end
280
- cursor || QueryCache.cache_table[cache_key]
281
- end
282
-
283
- def cache_key
284
- [ collection.namespace, selector, limit, skip, sort, projection, collation ]
285
- end
286
-
287
- def system_collection?
288
- collection.name.start_with?('system.')
289
- end
290
- end
291
-
292
- # Adds behavior to the query cache for collections.
293
- # @deprecated This module is only used with driver versions 2.13 and lower.
294
- module Collection
295
- extend ActiveSupport::Concern
296
-
297
- included do
298
- extend QueryCache::Base
299
- alias_query_cache_clear :insert_one, :insert_many
300
- end
301
- end
302
-
303
- # Bypass the query cache when reloading a document.
304
- module Document
305
- def reload
306
- QueryCache.uncached { super }
307
- end
308
- end
61
+ Middleware = Mongo::QueryCache::Middleware
309
62
  end
310
63
  end
311
64
 
312
- unless defined?(Mongo::QueryCache)
313
- Mongo::Collection.__send__(:include, Mongoid::QueryCache::Collection)
314
- Mongo::Collection::View.__send__(:include, Mongoid::QueryCache::View)
315
- Mongoid::Document.__send__(:include, Mongoid::QueryCache::Document)
316
- end
@@ -62,7 +62,7 @@ module Mongoid
62
62
  def started _; end
63
63
 
64
64
  def _completed e
65
- Collector.runtime += e.duration
65
+ Collector.runtime += e.duration * 1000
66
66
  end
67
67
  alias :succeeded :_completed
68
68
  alias :failed :_completed
@@ -23,11 +23,15 @@ module Mongoid
23
23
 
24
24
  reloaded = _reload
25
25
  if Mongoid.raise_not_found_error && (reloaded.nil? || reloaded.empty?)
26
- raise Errors::DocumentNotFound.new(self.class, _id, _id)
26
+ shard_keys = atomic_selector.with_indifferent_access.slice(*shard_key_fields, :_id)
27
+ raise Errors::DocumentNotFound.new(self.class, _id, shard_keys)
27
28
  end
28
29
  @attributes = reloaded
29
- @attributes_before_type_cast = {}
30
- changed_attributes.clear
30
+ @attributes_before_type_cast = @attributes.dup
31
+ @changed_attributes = {}
32
+ @previous_changes = {}
33
+ @previous_attributes = {}
34
+ @previously_new_record = false
31
35
  reset_readonly
32
36
  apply_defaults
33
37
  reload_relations
@@ -289,17 +289,15 @@ module Mongoid
289
289
  # @return [ Method ] The defined method.
290
290
  def define_scope_method(name)
291
291
  singleton_class.class_eval do
292
- ruby2_keywords(
293
- define_method(name) do |*args|
294
- scoping = _declared_scopes[name]
295
- scope = instance_exec(*args, &scoping[:scope])
296
- extension = scoping[:extension]
297
- to_merge = scope || queryable
298
- criteria = to_merge.empty_and_chainable? ? to_merge : with_default_scope.merge(to_merge)
299
- criteria.extend(extension)
300
- criteria
301
- end
302
- )
292
+ define_method(name) do |*args|
293
+ scoping = _declared_scopes[name]
294
+ scope = instance_exec(*args, &scoping[:scope])
295
+ extension = scoping[:extension]
296
+ to_merge = scope || queryable
297
+ criteria = to_merge.empty_and_chainable? ? to_merge : with_default_scope.merge(to_merge)
298
+ criteria.extend(extension)
299
+ criteria
300
+ end
303
301
  end
304
302
  end
305
303
 
@@ -15,8 +15,7 @@ module Mongoid
15
15
  #
16
16
  # @return [ Hash ] The document's selector.
17
17
  def atomic_selector
18
- @atomic_selector ||=
19
- (embedded? ? embedded_atomic_selector : root_atomic_selector_in_db)
18
+ embedded? ? embedded_atomic_selector : root_atomic_selector_in_db
20
19
  end
21
20
 
22
21
  private
@@ -47,22 +47,18 @@ module Mongoid
47
47
  self.class.shard_key_fields
48
48
  end
49
49
 
50
- # Returns the selector that would match the defined shard keys. If
51
- # `prefer_persisted` is false (the default), it uses the current values
52
- # of the specified shard keys, otherwise, it will try to use whatever value
53
- # was most recently persisted.
54
- #
55
- # @param [ true | false ] prefer_persisted Whether to use the current
56
- # value of the shard key fields, or to use their most recently persisted
57
- # values.
50
+ # Returns the selector that would match the current version of this
51
+ # document.
58
52
  #
59
53
  # @return [ Hash ] The shard key selector.
60
54
  #
61
55
  # @api private
62
- def shard_key_selector(prefer_persisted: false)
63
- shard_key_fields.each_with_object({}) do |field, selector|
64
- selector[field.to_s] = shard_key_field_value(field.to_s, prefer_persisted: prefer_persisted)
56
+ def shard_key_selector
57
+ selector = {}
58
+ shard_key_fields.each do |field|
59
+ selector[field.to_s] = send(field)
65
60
  end
61
+ selector
66
62
  end
67
63
 
68
64
  # Returns the selector that would match the existing version of this
@@ -76,31 +72,11 @@ module Mongoid
76
72
  #
77
73
  # @api private
78
74
  def shard_key_selector_in_db
79
- shard_key_selector(prefer_persisted: true)
80
- end
81
-
82
- # Returns the value for the named shard key. If the field identifies
83
- # an embedded document, the key will be parsed and recursively evaluated.
84
- # If `prefer_persisted` is true, the value last persisted to the database
85
- # will be returned, regardless of what the current value of the attribute
86
- # may be.
87
- #
88
- # @param [String] field The name of the field to evaluate
89
- # @param [ true|false ] prefer_persisted Whether or not to prefer the
90
- # persisted value over the current value.
91
- #
92
- # @return [ Object ] The value of the named field.
93
- #
94
- # @api private
95
- def shard_key_field_value(field, prefer_persisted:)
96
- if field.include?(".")
97
- relation, remaining = field.split(".", 2)
98
- send(relation)&.shard_key_field_value(remaining, prefer_persisted: prefer_persisted)
99
- elsif prefer_persisted && !new_record?
100
- attribute_was(field)
101
- else
102
- send(field)
75
+ selector = {}
76
+ shard_key_fields.each do |field|
77
+ selector[field.to_s] = new_record? ? send(field) : attribute_was(field)
103
78
  end
79
+ selector
104
80
  end
105
81
 
106
82
  module ClassMethods
@@ -6,7 +6,15 @@ module Mongoid
6
6
  # document can transition through.
7
7
  module Stateful
8
8
 
9
- attr_writer :destroyed, :flagged_for_destroy, :new_record
9
+ attr_writer :destroyed, :flagged_for_destroy, :previously_new_record
10
+
11
+ def new_record=(new_value)
12
+ @new_record ||= false
13
+ if @new_record && !new_value
14
+ @previously_new_record = true
15
+ end
16
+ @new_record = new_value
17
+ end
10
18
 
11
19
  # Returns true if the +Document+ has not been persisted to the database,
12
20
  # false if it has. This is determined by the variable @new_record
@@ -20,6 +28,15 @@ module Mongoid
20
28
  @new_record ||= false
21
29
  end
22
30
 
31
+ # Returns true if this document was just created -- that is, prior to the last
32
+ # save, the object didn't exist in the database and new_record? would have
33
+ # returned true.
34
+ #
35
+ # @return [ true, false ] True if was just created, false if not.
36
+ def previously_new_record?
37
+ @previously_new_record ||= false
38
+ end
39
+
23
40
  # Checks if the document has been saved to the database. Returns false
24
41
  # if the document has been destroyed.
25
42
  #
@@ -31,6 +48,15 @@ module Mongoid
31
48
  !new_record? && !destroyed?
32
49
  end
33
50
 
51
+ # Checks if the document was previously saved to the database
52
+ # but now it has been deleted.
53
+ #
54
+ # @return [ true, false ] True if was persisted but now destroyed,
55
+ # otherwise false.
56
+ def previously_persisted?
57
+ !new_record? && destroyed?
58
+ end
59
+
34
60
  # Returns whether or not the document has been flagged for deletion, but
35
61
  # not destroyed yet. Used for atomic pulls of child documents.
36
62
  #
@@ -23,7 +23,7 @@ module Mongoid
23
23
  # person.set_created_at
24
24
  def set_created_at
25
25
  if !timeless? && !created_at
26
- time = Time.now.utc
26
+ time = Time.configured.now
27
27
  self.updated_at = time if is_a?(Updated) && !updated_at_changed?
28
28
  self.created_at = time
29
29
  end
@@ -24,7 +24,7 @@ module Mongoid
24
24
  # person.set_updated_at
25
25
  def set_updated_at
26
26
  if able_to_set_updated_at?
27
- self.updated_at = Time.now.utc unless updated_at_changed?
27
+ self.updated_at = Time.configured.now unless updated_at_changed?
28
28
  end
29
29
 
30
30
  clear_timeless_option
@@ -19,10 +19,10 @@ module Mongoid
19
19
  #
20
20
  # @param [ Symbol ] field The name of an additional field to update.
21
21
  #
22
- # @return [ true/false ] false if record is new_record otherwise true.
22
+ # @return [ true/false ] false if document is new_record otherwise true.
23
23
  def touch(field = nil)
24
24
  return false if _root.new_record?
25
- current = Time.now
25
+ current = Time.configured.now
26
26
  field = database_field_name(field)
27
27
  write_attribute(:updated_at, current) if respond_to?("updated_at=")
28
28
  write_attribute(field, current) if field
@@ -60,7 +60,6 @@ module Mongoid
60
60
 
61
61
  # Callbacks are invoked on the composition root first and on the
62
62
  # leaf-most embedded document last.
63
- # TODO add tests, see MONGOID-5015.
64
63
  run_callbacks(:touch)
65
64
  true
66
65
  end
@@ -233,6 +233,7 @@ module Mongoid
233
233
  def remove_child(child)
234
234
  name = child.association_name
235
235
  if child.embedded_one?
236
+ self.attributes.delete(child._association.store_as)
236
237
  remove_ivar(name)
237
238
  else
238
239
  relation = send(name)
@@ -16,7 +16,7 @@ module Mongoid
16
16
  # end
17
17
  #
18
18
  # It is also possible to limit the uniqueness constraint to a set of
19
- # records matching certain conditions:
19
+ # documents matching certain conditions:
20
20
  # class Person
21
21
  # include Mongoid::Document
22
22
  # field :title
@@ -242,6 +242,7 @@ module Mongoid
242
242
  relation = document._parent.send(document.association_name)
243
243
  criteria = create_criteria(relation, document, attribute, value)
244
244
  criteria = criteria.merge(options[:conditions].call) if options[:conditions]
245
+ criteria = criteria.limit(2)
245
246
  add_error(document, attribute, value) if criteria.count > 1
246
247
  end
247
248
 
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mongoid
4
- # The current version of Mongoid
5
- #
6
- # Note that this file is automatically updated via `rake candidate:create`.
7
- # Manual changes to this file will be overwritten by that rake task.
8
- VERSION = '7.6.0'
4
+ VERSION = "8.0.1"
9
5
  end
@@ -21,9 +21,8 @@ module Mongoid
21
21
  end
22
22
  end
23
23
 
24
- warning :id_sort_deprecated, 'The :id_sort option has been deprecated. Use Mongo#take to get a document without a sort on _id.'
25
- warning :criteria_cache_deprecated, 'The criteria cache has been deprecated and will be removed in Mongoid 8. Please enable the Mongoid QueryCache to have caching functionality.'
26
- warning :map_field_deprecated, 'The field argument to the Mongo#map method has been deprecated, please pass in a block instead. Support will be dropped in Mongoid 8.'
24
+ warning :geo_haystack_deprecated, 'The geoHaystack type is deprecated.'
25
+ warning :as_json_compact_deprecated, '#as_json :compact option is deprecated. Please call #compact on the returned Hash object instead.'
26
+ warning :symbol_type_deprecated, 'The BSON Symbol type is deprecated by MongoDB. Please use String or StringifiedSymbol field types instead of the Symbol field type'
27
27
  end
28
28
  end
29
-
data/lib/mongoid.rb CHANGED
@@ -16,6 +16,7 @@ require "mongo"
16
16
  require 'mongo/active_support'
17
17
 
18
18
  require "mongoid/version"
19
+ require "mongoid/deprecable"
19
20
  require "mongoid/config"
20
21
  require "mongoid/persistence_context"
21
22
  require "mongoid/loggable"
@@ -40,6 +40,22 @@ test:
40
40
  app_name: 'testing'
41
41
  background_indexing: false
42
42
  join_contexts: false
43
+ driver_options:
44
+ broken_view_options: false
45
+ # Don't set validate_update_replace here, as it is used to check if the
46
+ # default driver options are kept in Mongoid.
47
+ test_nil:
48
+ clients:
49
+ default:
50
+ database: mongoid_test
51
+ hosts:
52
+ <% SpecConfig.instance.addresses.each do |address| %>
53
+ - <%= address %>
54
+ <% end %>
55
+ driver_options:
56
+ broken_view_options:
57
+ validate_update_replace: false
58
+
43
59
  test_with_max_staleness:
44
60
  clients:
45
61
  default:
@@ -163,6 +163,14 @@ describe 'Mongoid application tests' do
163
163
  before do
164
164
  Dir.chdir(APP_PATH) do
165
165
  remove_bundler_req
166
+
167
+ if BSON::Environment.jruby?
168
+ # Remove existing Gemfile.lock - see
169
+ # https://github.com/rubygems/rubygems/issues/3231
170
+ require 'fileutils'
171
+ FileUtils.rm_f('Gemfile.lock')
172
+ end
173
+
166
174
  check_call(%w(bundle install), env: env)
167
175
  write_mongoid_yml
168
176
  end
@@ -287,18 +295,6 @@ describe 'Mongoid application tests' do
287
295
  f << lines.join
288
296
  end
289
297
  end
290
-
291
- if rails_version == '5.1'
292
- secrets = {
293
- 'development' => {
294
- 'secret_key_base' => 'abracadabra',
295
- 'my_secret_token' => 'very_secret',
296
- },
297
- }
298
- File.open('config/secrets.yml', 'w') do |f|
299
- f << YAML.dump(secrets)
300
- end
301
- end
302
298
  end
303
299
 
304
300
  def remove_bundler_req
@@ -12,4 +12,22 @@ describe 'belongs_to associations' do
12
12
  expect(child).to be_valid
13
13
  end
14
14
  end
15
+
16
+ context 'when an anonymous class defines a belongs_to association' do
17
+ let(:klass) do
18
+ Class.new do
19
+ include Mongoid::Document
20
+ belongs_to :movie
21
+ end
22
+ end
23
+
24
+ it 'loads the association correctly' do
25
+ expect { klass }.to_not raise_error
26
+ expect { klass.new.movie }.to_not raise_error
27
+ instance = klass.new
28
+ movie = Movie.new
29
+ instance.movie = movie
30
+ expect(instance.movie).to eq movie
31
+ end
32
+ end
15
33
  end