mongoid 7.5.2 → 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 (292) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/lib/config/locales/en.yml +46 -30
  5. data/lib/mongoid/association/accessors.rb +32 -3
  6. data/lib/mongoid/association/bindable.rb +48 -0
  7. data/lib/mongoid/association/builders.rb +4 -2
  8. data/lib/mongoid/association/eager_loadable.rb +29 -7
  9. data/lib/mongoid/association/embedded/batchable.rb +48 -8
  10. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  11. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  12. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  13. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  14. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  15. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  16. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  17. data/lib/mongoid/association/macros.rb +2 -1
  18. data/lib/mongoid/association/many.rb +5 -0
  19. data/lib/mongoid/association/nested/many.rb +2 -1
  20. data/lib/mongoid/association/proxy.rb +12 -0
  21. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  22. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  23. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  24. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  25. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  26. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  27. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  28. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  29. data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
  30. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  31. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  32. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  33. data/lib/mongoid/association/relatable.rb +38 -4
  34. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
  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 -245
  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 +89 -4
  68. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  69. data/lib/mongoid/criteria/queryable.rb +11 -6
  70. data/lib/mongoid/criteria.rb +1 -28
  71. data/lib/mongoid/deprecable.rb +36 -0
  72. data/lib/mongoid/deprecation.rb +25 -0
  73. data/lib/mongoid/document.rb +88 -33
  74. data/lib/mongoid/equality.rb +4 -4
  75. data/lib/mongoid/errors/document_not_found.rb +6 -2
  76. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  77. data/lib/mongoid/errors/invalid_field.rb +5 -1
  78. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  79. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  80. data/lib/mongoid/errors.rb +2 -2
  81. data/lib/mongoid/extensions/array.rb +8 -6
  82. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  83. data/lib/mongoid/extensions/binary.rb +42 -0
  84. data/lib/mongoid/extensions/boolean.rb +8 -2
  85. data/lib/mongoid/extensions/date.rb +26 -20
  86. data/lib/mongoid/extensions/date_time.rb +1 -1
  87. data/lib/mongoid/extensions/float.rb +4 -5
  88. data/lib/mongoid/extensions/hash.rb +12 -5
  89. data/lib/mongoid/extensions/integer.rb +4 -5
  90. data/lib/mongoid/extensions/object.rb +2 -0
  91. data/lib/mongoid/extensions/range.rb +41 -10
  92. data/lib/mongoid/extensions/regexp.rb +11 -4
  93. data/lib/mongoid/extensions/set.rb +11 -4
  94. data/lib/mongoid/extensions/string.rb +2 -13
  95. data/lib/mongoid/extensions/symbol.rb +3 -14
  96. data/lib/mongoid/extensions/time.rb +27 -16
  97. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  98. data/lib/mongoid/extensions.rb +1 -0
  99. data/lib/mongoid/factory.rb +42 -7
  100. data/lib/mongoid/fields/foreign_key.rb +7 -0
  101. data/lib/mongoid/fields/validators/macro.rb +3 -9
  102. data/lib/mongoid/fields.rb +49 -7
  103. data/lib/mongoid/findable.rb +21 -16
  104. data/lib/mongoid/indexable/specification.rb +1 -1
  105. data/lib/mongoid/indexable/validators/options.rb +4 -1
  106. data/lib/mongoid/interceptable.rb +69 -9
  107. data/lib/mongoid/persistable/creatable.rb +14 -5
  108. data/lib/mongoid/persistable/updatable.rb +12 -5
  109. data/lib/mongoid/persistence_context.rb +8 -42
  110. data/lib/mongoid/query_cache.rb +6 -258
  111. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  112. data/lib/mongoid/reloadable.rb +7 -3
  113. data/lib/mongoid/scopable.rb +9 -11
  114. data/lib/mongoid/selectable.rb +1 -2
  115. data/lib/mongoid/stateful.rb +27 -1
  116. data/lib/mongoid/timestamps/created.rb +1 -1
  117. data/lib/mongoid/timestamps/updated.rb +1 -1
  118. data/lib/mongoid/touchable.rb +2 -3
  119. data/lib/mongoid/traversable.rb +1 -0
  120. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  121. data/lib/mongoid/version.rb +1 -1
  122. data/lib/mongoid/warnings.rb +3 -4
  123. data/lib/mongoid.rb +1 -0
  124. data/spec/config/mongoid.yml +16 -0
  125. data/spec/integration/app_spec.rb +8 -12
  126. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  127. data/spec/integration/associations/embedded_spec.rb +15 -0
  128. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  129. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  130. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  131. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  132. data/spec/integration/associations/has_one_spec.rb +97 -1
  133. data/spec/integration/associations/scope_option_spec.rb +1 -1
  134. data/spec/integration/callbacks_models.rb +95 -1
  135. data/spec/integration/callbacks_spec.rb +226 -4
  136. data/spec/integration/criteria/range_spec.rb +95 -1
  137. data/spec/integration/discriminator_key_spec.rb +115 -76
  138. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  139. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  140. data/spec/integration/matcher_examples_spec.rb +20 -13
  141. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  142. data/spec/integration/matcher_operator_spec.rb +3 -5
  143. data/spec/integration/persistence/range_field_spec.rb +350 -0
  144. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  145. data/spec/mongoid/association/depending_spec.rb +9 -9
  146. data/spec/mongoid/association/eager_spec.rb +2 -1
  147. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  148. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  149. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  150. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  151. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
  152. data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
  153. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  154. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  155. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  156. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  157. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  158. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  159. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  160. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  161. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  162. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  163. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -5
  164. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  165. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  166. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  167. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  168. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +62 -13
  169. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  170. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  171. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  172. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  173. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  174. data/spec/mongoid/association/syncable_spec.rb +14 -0
  175. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  176. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  177. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  178. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  179. data/spec/mongoid/attributes_spec.rb +480 -27
  180. data/spec/mongoid/cacheable_spec.rb +3 -3
  181. data/spec/mongoid/changeable_spec.rb +130 -13
  182. data/spec/mongoid/clients/factory_spec.rb +23 -30
  183. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  184. data/spec/mongoid/clients_spec.rb +2 -2
  185. data/spec/mongoid/config_spec.rb +52 -14
  186. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  187. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  188. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  189. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  190. data/spec/mongoid/contextual/memory_spec.rb +521 -14
  191. data/spec/mongoid/contextual/mongo_spec.rb +564 -394
  192. data/spec/mongoid/contextual/none_spec.rb +11 -19
  193. data/spec/mongoid/copyable_spec.rb +451 -1
  194. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  195. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  196. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  197. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  198. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  199. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  200. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  201. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  202. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  203. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  204. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  205. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  206. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  207. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  208. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  209. data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
  210. data/spec/mongoid/criteria_spec.rb +469 -1201
  211. data/spec/mongoid/document_fields_spec.rb +173 -24
  212. data/spec/mongoid/document_spec.rb +32 -41
  213. data/spec/mongoid/equality_spec.rb +12 -12
  214. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  215. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  216. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  217. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  218. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  219. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  220. data/spec/mongoid/extensions/array_spec.rb +16 -2
  221. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  222. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  223. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  224. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  225. data/spec/mongoid/extensions/date_spec.rb +71 -1
  226. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  227. data/spec/mongoid/extensions/float_spec.rb +48 -76
  228. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  229. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  230. data/spec/mongoid/extensions/range_spec.rb +255 -54
  231. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  232. data/spec/mongoid/extensions/set_spec.rb +106 -0
  233. data/spec/mongoid/extensions/string_spec.rb +53 -25
  234. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  235. data/spec/mongoid/extensions/time_spec.rb +634 -66
  236. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  237. data/spec/mongoid/factory_spec.rb +61 -1
  238. data/spec/mongoid/fields_spec.rb +321 -50
  239. data/spec/mongoid/findable_spec.rb +64 -29
  240. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  241. data/spec/mongoid/indexable_spec.rb +16 -19
  242. data/spec/mongoid/interceptable_spec.rb +584 -5
  243. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  244. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  245. data/spec/mongoid/mongoizable_spec.rb +285 -0
  246. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  247. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  248. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  249. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  250. data/spec/mongoid/persistence_context_spec.rb +24 -0
  251. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  252. data/spec/mongoid/query_cache_spec.rb +0 -154
  253. data/spec/mongoid/reloadable_spec.rb +35 -2
  254. data/spec/mongoid/scopable_spec.rb +36 -34
  255. data/spec/mongoid/shardable_spec.rb +14 -0
  256. data/spec/mongoid/stateful_spec.rb +28 -0
  257. data/spec/mongoid/timestamps_spec.rb +390 -0
  258. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  259. data/spec/mongoid/touchable_spec.rb +116 -0
  260. data/spec/mongoid/touchable_spec_models.rb +12 -8
  261. data/spec/mongoid/traversable_spec.rb +4 -11
  262. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  263. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  264. data/spec/mongoid/warnings_spec.rb +35 -0
  265. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  266. data/spec/rails/mongoid_spec.rb +4 -16
  267. data/spec/shared/lib/mrss/docker_runner.rb +0 -4
  268. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  269. data/spec/support/constraints.rb +24 -0
  270. data/spec/support/macros.rb +30 -0
  271. data/spec/support/models/augmentation.rb +12 -0
  272. data/spec/support/models/band.rb +3 -0
  273. data/spec/support/models/catalog.rb +24 -0
  274. data/spec/support/models/circus.rb +3 -0
  275. data/spec/support/models/fanatic.rb +8 -0
  276. data/spec/support/models/implant.rb +9 -0
  277. data/spec/support/models/label.rb +2 -0
  278. data/spec/support/models/passport.rb +9 -0
  279. data/spec/support/models/person.rb +1 -0
  280. data/spec/support/models/player.rb +2 -0
  281. data/spec/support/models/powerup.rb +12 -0
  282. data/spec/support/models/registry.rb +1 -0
  283. data/spec/support/models/school.rb +14 -0
  284. data/spec/support/models/shield.rb +18 -0
  285. data/spec/support/models/student.rb +14 -0
  286. data/spec/support/models/weapon.rb +12 -0
  287. data.tar.gz.sig +0 -0
  288. metadata +667 -631
  289. metadata.gz.sig +0 -0
  290. data/lib/mongoid/errors/eager_load.rb +0 -23
  291. data/lib/mongoid/errors/invalid_value.rb +0 -17
  292. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -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
@@ -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,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mongoid
4
- VERSION = "7.5.2"
4
+ VERSION = "8.0.1"
5
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
@@ -265,4 +265,19 @@ describe 'embedded associations' do
265
265
  end
266
266
  end
267
267
  end
268
+
269
+ context "when summing properties on an embedded child" do
270
+ let(:user) { EmmUser.new }
271
+ before do
272
+ user.orders.build(amount: 200)
273
+ expect(user.orders.sum(:amount)).to eq(200)
274
+
275
+ user.orders.delete_all
276
+ user.orders.build(amount: 500)
277
+ end
278
+
279
+ it "the cache is cleared after deletion" do
280
+ expect(user.orders.sum(:amount)).to eq(500)
281
+ end
282
+ end
268
283
  end
@@ -172,8 +172,6 @@ describe 'embeds_many associations' do
172
172
  # Mongoid uses the new value of `x` in the $pullAll query,
173
173
  # which doesn't match the document that is in the database,
174
174
  # resulting in the empty array assignment not taking effect.
175
- pending 'MONGOID-5037'
176
-
177
175
  canvas.shapes.first.x = 1
178
176
  canvas.shapes = []
179
177
  canvas.save!
@@ -203,4 +201,19 @@ describe 'embeds_many associations' do
203
201
  end
204
202
  end
205
203
  end
204
+
205
+ context 'when an anonymous class defines an embeds_many association' do
206
+ let(:klass) do
207
+ Class.new do
208
+ include Mongoid::Document
209
+ embeds_many :addresses
210
+ end
211
+ end
212
+
213
+ it 'loads the association correctly' do
214
+ expect { klass }.to_not raise_error
215
+ expect { klass.new.addresses }.to_not raise_error
216
+ expect(klass.new.addresses.build).to be_a Address
217
+ end
218
+ end
206
219
  end
@@ -20,4 +20,22 @@ describe 'embeds_one associations' do
20
20
  end
21
21
  end
22
22
  end
23
+
24
+ context 'when an anonymous class defines an embeds_one association' do
25
+ let(:klass) do
26
+ Class.new do
27
+ include Mongoid::Document
28
+ embeds_one :address
29
+ end
30
+ end
31
+
32
+ it 'loads the association correctly' do
33
+ expect { klass }.to_not raise_error
34
+ expect { klass.new.address }.to_not raise_error
35
+ instance = klass.new
36
+ address = Address.new
37
+ instance.address = address
38
+ expect(instance.address).to eq address
39
+ end
40
+ end
23
41
  end