mongoid 7.6.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 (333) 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 -56
  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/depending.rb +4 -8
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +28 -5
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  13. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  14. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  15. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  16. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  17. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  18. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  19. data/lib/mongoid/association/macros.rb +2 -1
  20. data/lib/mongoid/association/many.rb +5 -0
  21. data/lib/mongoid/association/nested/many.rb +5 -39
  22. data/lib/mongoid/association/nested/nested_buildable.rb +0 -14
  23. data/lib/mongoid/association/proxy.rb +12 -0
  24. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  25. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  26. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  27. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  28. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  29. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  30. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  31. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  32. data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -107
  33. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  34. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  35. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  36. data/lib/mongoid/association/relatable.rb +38 -4
  37. data/lib/mongoid/attributes/processing.rb +9 -2
  38. data/lib/mongoid/attributes.rb +30 -27
  39. data/lib/mongoid/cacheable.rb +2 -2
  40. data/lib/mongoid/changeable.rb +37 -2
  41. data/lib/mongoid/clients/factory.rb +0 -4
  42. data/lib/mongoid/clients/options.rb +4 -0
  43. data/lib/mongoid/clients/sessions.rb +2 -14
  44. data/lib/mongoid/config.rb +15 -73
  45. data/lib/mongoid/contextual/aggregable/memory.rb +22 -20
  46. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  47. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  48. data/lib/mongoid/contextual/memory.rb +63 -47
  49. data/lib/mongoid/contextual/mongo.rb +173 -287
  50. data/lib/mongoid/contextual/none.rb +33 -15
  51. data/lib/mongoid/copyable.rb +32 -8
  52. data/lib/mongoid/criteria/includable.rb +24 -20
  53. data/lib/mongoid/criteria/marshalable.rb +10 -2
  54. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  55. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  56. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  57. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  58. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  59. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  60. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  61. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  62. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  63. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  64. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  65. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  66. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  67. data/lib/mongoid/criteria/queryable/mergeable.rb +0 -12
  68. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  69. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  70. data/lib/mongoid/criteria/queryable/selectable.rb +2 -133
  71. data/lib/mongoid/criteria/queryable/selector.rb +90 -5
  72. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  73. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  74. data/lib/mongoid/criteria/queryable.rb +11 -6
  75. data/lib/mongoid/criteria.rb +1 -28
  76. data/lib/mongoid/deprecable.rb +36 -0
  77. data/lib/mongoid/deprecation.rb +25 -0
  78. data/lib/mongoid/document.rb +88 -33
  79. data/lib/mongoid/equality.rb +4 -4
  80. data/lib/mongoid/errors/document_not_found.rb +6 -2
  81. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  82. data/lib/mongoid/errors/invalid_field.rb +5 -1
  83. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  84. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  85. data/lib/mongoid/errors.rb +2 -3
  86. data/lib/mongoid/extensions/array.rb +8 -6
  87. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  88. data/lib/mongoid/extensions/binary.rb +42 -0
  89. data/lib/mongoid/extensions/boolean.rb +8 -2
  90. data/lib/mongoid/extensions/date.rb +26 -20
  91. data/lib/mongoid/extensions/date_time.rb +1 -1
  92. data/lib/mongoid/extensions/float.rb +4 -5
  93. data/lib/mongoid/extensions/hash.rb +13 -32
  94. data/lib/mongoid/extensions/integer.rb +4 -5
  95. data/lib/mongoid/extensions/object.rb +2 -0
  96. data/lib/mongoid/extensions/range.rb +41 -10
  97. data/lib/mongoid/extensions/regexp.rb +11 -4
  98. data/lib/mongoid/extensions/set.rb +11 -4
  99. data/lib/mongoid/extensions/string.rb +2 -13
  100. data/lib/mongoid/extensions/symbol.rb +3 -14
  101. data/lib/mongoid/extensions/time.rb +27 -16
  102. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  103. data/lib/mongoid/extensions.rb +1 -0
  104. data/lib/mongoid/factory.rb +42 -7
  105. data/lib/mongoid/fields/foreign_key.rb +7 -0
  106. data/lib/mongoid/fields/validators/macro.rb +3 -9
  107. data/lib/mongoid/fields.rb +49 -7
  108. data/lib/mongoid/findable.rb +21 -16
  109. data/lib/mongoid/indexable/specification.rb +1 -1
  110. data/lib/mongoid/indexable/validators/options.rb +4 -1
  111. data/lib/mongoid/interceptable.rb +69 -9
  112. data/lib/mongoid/matchable.rb +1 -6
  113. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +5 -3
  114. data/lib/mongoid/matcher/regex.rb +9 -8
  115. data/lib/mongoid/matcher.rb +0 -1
  116. data/lib/mongoid/persistable/creatable.rb +14 -5
  117. data/lib/mongoid/persistable/updatable.rb +12 -5
  118. data/lib/mongoid/persistence_context.rb +8 -42
  119. data/lib/mongoid/query_cache.rb +6 -258
  120. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  121. data/lib/mongoid/reloadable.rb +7 -3
  122. data/lib/mongoid/scopable.rb +9 -11
  123. data/lib/mongoid/selectable.rb +1 -2
  124. data/lib/mongoid/shardable.rb +11 -35
  125. data/lib/mongoid/stateful.rb +27 -1
  126. data/lib/mongoid/threaded.rb +0 -3
  127. data/lib/mongoid/timestamps/created.rb +1 -1
  128. data/lib/mongoid/timestamps/updated.rb +1 -1
  129. data/lib/mongoid/touchable.rb +2 -3
  130. data/lib/mongoid/traversable.rb +1 -0
  131. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  132. data/lib/mongoid/version.rb +1 -5
  133. data/lib/mongoid/warnings.rb +3 -5
  134. data/lib/mongoid.rb +1 -0
  135. data/spec/config/mongoid.yml +16 -0
  136. data/spec/integration/app_spec.rb +8 -20
  137. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  138. data/spec/integration/associations/embedded_spec.rb +15 -0
  139. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  140. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  141. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  142. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  143. data/spec/integration/associations/has_one_spec.rb +97 -1
  144. data/spec/integration/associations/scope_option_spec.rb +1 -1
  145. data/spec/integration/callbacks_models.rb +95 -1
  146. data/spec/integration/callbacks_spec.rb +226 -4
  147. data/spec/integration/criteria/range_spec.rb +95 -1
  148. data/spec/integration/discriminator_key_spec.rb +115 -76
  149. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  150. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  151. data/spec/integration/matcher_examples_spec.rb +20 -13
  152. data/spec/integration/matcher_operator_data/regex.yml +0 -21
  153. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  154. data/spec/integration/matcher_operator_spec.rb +3 -5
  155. data/spec/integration/persistence/range_field_spec.rb +350 -0
  156. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  157. data/spec/mongoid/association/depending_spec.rb +9 -9
  158. data/spec/mongoid/association/eager_spec.rb +2 -1
  159. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  160. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  161. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  162. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  163. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
  164. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  165. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  166. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  167. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  168. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  169. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  170. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  171. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  172. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  173. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  174. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  175. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +36 -51
  176. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  177. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  178. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  179. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  180. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +60 -156
  181. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  182. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  183. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  184. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  185. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  186. data/spec/mongoid/association/syncable_spec.rb +14 -0
  187. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  188. data/spec/mongoid/attributes/nested_spec.rb +73 -198
  189. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  190. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  191. data/spec/mongoid/attributes_spec.rb +480 -27
  192. data/spec/mongoid/cacheable_spec.rb +3 -3
  193. data/spec/mongoid/changeable_spec.rb +130 -13
  194. data/spec/mongoid/clients/factory_spec.rb +22 -60
  195. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  196. data/spec/mongoid/clients_spec.rb +2 -2
  197. data/spec/mongoid/config_spec.rb +52 -15
  198. data/spec/mongoid/contextual/aggregable/memory_spec.rb +371 -231
  199. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  200. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  201. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  202. data/spec/mongoid/contextual/memory_spec.rb +467 -156
  203. data/spec/mongoid/contextual/mongo_spec.rb +566 -426
  204. data/spec/mongoid/contextual/none_spec.rb +11 -19
  205. data/spec/mongoid/copyable_spec.rb +451 -2
  206. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  207. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  208. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  209. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  210. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  211. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  212. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +1 -2
  213. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  214. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  215. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +1 -2
  216. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  217. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  218. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  219. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  220. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  221. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -2
  222. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  223. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +0 -200
  224. data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
  225. data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
  226. data/spec/mongoid/criteria_spec.rb +469 -1203
  227. data/spec/mongoid/document_fields_spec.rb +173 -24
  228. data/spec/mongoid/document_spec.rb +32 -41
  229. data/spec/mongoid/equality_spec.rb +12 -12
  230. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  231. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  232. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  233. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  234. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  235. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  236. data/spec/mongoid/extensions/array_spec.rb +16 -2
  237. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  238. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  239. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  240. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  241. data/spec/mongoid/extensions/date_spec.rb +71 -1
  242. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  243. data/spec/mongoid/extensions/float_spec.rb +48 -76
  244. data/spec/mongoid/extensions/hash_spec.rb +30 -236
  245. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  246. data/spec/mongoid/extensions/range_spec.rb +255 -54
  247. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  248. data/spec/mongoid/extensions/set_spec.rb +106 -0
  249. data/spec/mongoid/extensions/string_spec.rb +53 -25
  250. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  251. data/spec/mongoid/extensions/time_spec.rb +634 -66
  252. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  253. data/spec/mongoid/factory_spec.rb +61 -1
  254. data/spec/mongoid/fields_spec.rb +321 -50
  255. data/spec/mongoid/findable_spec.rb +64 -29
  256. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  257. data/spec/mongoid/indexable_spec.rb +16 -19
  258. data/spec/mongoid/interceptable_spec.rb +584 -5
  259. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  260. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  261. data/spec/mongoid/mongoizable_spec.rb +285 -0
  262. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  263. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  264. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  265. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  266. data/spec/mongoid/persistence_context_spec.rb +24 -0
  267. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  268. data/spec/mongoid/query_cache_spec.rb +1 -156
  269. data/spec/mongoid/reloadable_spec.rb +35 -2
  270. data/spec/mongoid/scopable_spec.rb +36 -34
  271. data/spec/mongoid/serializable_spec.rb +14 -7
  272. data/spec/mongoid/shardable_models.rb +0 -14
  273. data/spec/mongoid/shardable_spec.rb +61 -153
  274. data/spec/mongoid/stateful_spec.rb +28 -0
  275. data/spec/mongoid/timestamps_spec.rb +390 -0
  276. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  277. data/spec/mongoid/touchable_spec.rb +116 -0
  278. data/spec/mongoid/touchable_spec_models.rb +12 -8
  279. data/spec/mongoid/traversable_spec.rb +4 -11
  280. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  281. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  282. data/spec/mongoid/warnings_spec.rb +35 -0
  283. data/spec/mongoid_spec.rb +1 -7
  284. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  285. data/spec/rails/mongoid_spec.rb +4 -16
  286. data/spec/shared/lib/mrss/cluster_config.rb +40 -5
  287. data/spec/shared/lib/mrss/constraints.rb +46 -7
  288. data/spec/shared/lib/mrss/docker_runner.rb +21 -17
  289. data/spec/shared/lib/mrss/eg_config_utils.rb +31 -0
  290. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  291. data/spec/shared/lib/mrss/lite_constraints.rb +2 -10
  292. data/spec/shared/lib/mrss/server_version_registry.rb +29 -18
  293. data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
  294. data/spec/shared/lib/mrss/utils.rb +6 -28
  295. data/spec/shared/share/Dockerfile.erb +114 -38
  296. data/spec/shared/shlib/distro.sh +0 -10
  297. data/spec/shared/shlib/server.sh +83 -64
  298. data/spec/shared/shlib/set_env.sh +81 -16
  299. data/spec/support/constraints.rb +24 -0
  300. data/spec/support/expectations.rb +17 -20
  301. data/spec/support/macros.rb +30 -0
  302. data/spec/support/models/augmentation.rb +12 -0
  303. data/spec/support/models/band.rb +3 -0
  304. data/spec/support/models/catalog.rb +24 -0
  305. data/spec/support/models/circus.rb +3 -0
  306. data/spec/support/models/fanatic.rb +8 -0
  307. data/spec/support/models/implant.rb +9 -0
  308. data/spec/support/models/label.rb +2 -0
  309. data/spec/support/models/passport.rb +9 -0
  310. data/spec/support/models/person.rb +1 -0
  311. data/spec/support/models/player.rb +2 -0
  312. data/spec/support/models/powerup.rb +12 -0
  313. data/spec/support/models/registry.rb +1 -0
  314. data/spec/support/models/school.rb +14 -0
  315. data/spec/support/models/shield.rb +18 -0
  316. data/spec/support/models/student.rb +14 -0
  317. data/spec/support/models/weapon.rb +12 -0
  318. data.tar.gz.sig +0 -0
  319. metadata +695 -650
  320. metadata.gz.sig +0 -0
  321. data/lib/mongoid/errors/eager_load.rb +0 -23
  322. data/lib/mongoid/errors/in_memory_regexp_timeout.rb +0 -26
  323. data/lib/mongoid/errors/invalid_value.rb +0 -17
  324. data/lib/mongoid/field_readable.rb +0 -70
  325. data/lib/mongoid/matcher/regexp_budget.rb +0 -389
  326. data/spec/integration/matcher_regexp_timeout_spec.rb +0 -215
  327. data/spec/integration/query_operator_guard_spec.rb +0 -89
  328. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  329. data/spec/mongoid/matcher/regexp_budget_spec.rb +0 -570
  330. data/spec/shared/CANDIDATE.md +0 -28
  331. data/spec/shared/lib/mrss/release/candidate.rb +0 -287
  332. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  333. data/spec/shared/lib/tasks/candidate.rake +0 -64
@@ -100,21 +100,8 @@ module Mongoid
100
100
  # @param [ Hash ] attrs The attributes to set up the document with.
101
101
  #
102
102
  # @return [ Document ] A new document.
103
- def initialize(attrs = nil)
104
- @__parent = nil
105
- _building do
106
- @new_record = true
107
- @attributes ||= {}
108
- apply_pre_processed_defaults
109
- apply_default_scoping
110
- process_attributes(attrs) do
111
- yield(self) if block_given?
112
- end
113
- apply_post_processed_defaults
114
- # @todo: #2586: Need to have access to parent document in these
115
- # callbacks.
116
- run_callbacks(:initialize) unless _initialize_callbacks.empty?
117
- end
103
+ def initialize(attrs = nil, &block)
104
+ construct_document(attrs, execute_callbacks: true, &block)
118
105
  end
119
106
 
120
107
  # Return the model name of the document.
@@ -137,18 +124,6 @@ module Mongoid
137
124
  (persisted? || destroyed?) ? [ _id.to_s ] : nil
138
125
  end
139
126
 
140
- # Return an array with this +Document+ only in it.
141
- #
142
- # @example Return the document in an array.
143
- # document.to_a
144
- #
145
- # @return [ Array<Document> ] An array with the document as its only item.
146
- #
147
- # @deprecated
148
- def to_a
149
- [ self ]
150
- end
151
-
152
127
  # Return a hash of the entire document hierarchy from this document and
153
128
  # below. Used when the attributes are needed for everything and not just
154
129
  # the current document.
@@ -182,7 +157,7 @@ module Mongoid
182
157
  def as_json(options = nil)
183
158
  rv = super
184
159
  if options && options[:compact]
185
- Mongoid.logger.warn('#as_json :compact option is deprecated. Please call #compact on the returned Hash object instead.')
160
+ Mongoid::Warnings.warn_as_json_compact_deprecated
186
161
  rv = rv.compact
187
162
  end
188
163
  rv
@@ -230,6 +205,38 @@ module Mongoid
230
205
 
231
206
  private
232
207
 
208
+ # Does the construction of a document.
209
+ #
210
+ # @param [ Hash ] attrs The attributes to set up the document with.
211
+ # @param [ true | false ] execute_callbacks Flag specifies whether callbacks
212
+ # should be run.
213
+ #
214
+ # @return [ Document ] A new document.
215
+ #
216
+ # @api private
217
+ def construct_document(attrs = nil, execute_callbacks: true)
218
+ @__parent = nil
219
+ _building do
220
+ @new_record = true
221
+ @attributes ||= {}
222
+ apply_pre_processed_defaults
223
+ apply_default_scoping
224
+ process_attributes(attrs) do
225
+ yield(self) if block_given?
226
+ end
227
+ @attributes_before_type_cast = @attributes.merge(attributes_before_type_cast)
228
+
229
+ if execute_callbacks
230
+ apply_post_processed_defaults
231
+ run_callbacks(:initialize) unless _initialize_callbacks.empty?
232
+ else
233
+ pending_callbacks << :apply_post_processed_defaults
234
+ pending_callbacks << :initialize
235
+ end
236
+ end
237
+ self
238
+ end
239
+
233
240
  # Returns the logger
234
241
  #
235
242
  # @return [ Logger ] The configured logger or a default Logger instance.
@@ -247,6 +254,14 @@ module Mongoid
247
254
  @model_cache_key ||= self.class.model_name.cache_key
248
255
  end
249
256
 
257
+ # Returns a hash of the attributes.
258
+ #
259
+ # Note this method modifies the attributes hash that already exists on the
260
+ # class and returns it. This means that the hash returned by this method
261
+ # refers to the same hash as calling #attributes on the instance. See
262
+ # MONGOID-4476 for an explanation on how this is used.
263
+ #
264
+ # @return [ Hash ] The attributes hash.
250
265
  def as_attributes
251
266
  return attributes if frozen?
252
267
  embedded_relations.each_pair do |name, meta|
@@ -275,11 +290,26 @@ module Mongoid
275
290
  # @param [ Hash ] attrs The hash of attributes to instantiate with.
276
291
  # @param [ Integer ] selected_fields The selected fields from the
277
292
  # criteria.
293
+ # @param [ true | false ] execute_callbacks Flag specifies whether callbacks
294
+ # should be run.
295
+ #
296
+ # @return [ Document ] A new document.
297
+ def instantiate(attrs = nil, selected_fields = nil, &block)
298
+ instantiate_document(attrs, selected_fields, execute_callbacks: true, &block)
299
+ end
300
+
301
+ # Instantiate the document.
302
+ #
303
+ # @param [ Hash ] attrs The hash of attributes to instantiate with.
304
+ # @param [ Integer ] selected_fields The selected fields from the
305
+ # criteria.
306
+ # @param [ true | false ] execute_callbacks Flag specifies whether callbacks
307
+ # should be run.
278
308
  #
279
309
  # @return [ Document ] A new document.
280
310
  #
281
311
  # @api private
282
- def instantiate(attrs = nil, selected_fields = nil)
312
+ def instantiate_document(attrs = nil, selected_fields = nil, execute_callbacks: true)
283
313
  attributes = if Mongoid.legacy_attributes
284
314
  attrs
285
315
  else
@@ -289,13 +319,38 @@ module Mongoid
289
319
  doc = allocate
290
320
  doc.__selected_fields = selected_fields
291
321
  doc.instance_variable_set(:@attributes, attributes)
292
- doc.apply_defaults
293
- yield(doc) if block_given?
294
- doc.run_callbacks(:find) unless doc._find_callbacks.empty?
295
- doc.run_callbacks(:initialize) unless doc._initialize_callbacks.empty?
322
+ # TODO: remove the to_h when the legacy_attributes flag is removed.
323
+ # The to_h ensures that we don't accidentally make attributes_before_type_cast
324
+ # a BSON::Document.
325
+ doc.instance_variable_set(:@attributes_before_type_cast, attributes&.to_h.dup)
326
+
327
+ if execute_callbacks
328
+ doc.apply_defaults
329
+ yield(doc) if block_given?
330
+ doc.run_callbacks(:find) unless doc._find_callbacks.empty?
331
+ doc.run_callbacks(:initialize) unless doc._initialize_callbacks.empty?
332
+ else
333
+ yield(doc) if block_given?
334
+ doc.pending_callbacks += [:apply_defaults, :find, :initialize]
335
+ end
336
+
296
337
  doc
297
338
  end
298
339
 
340
+ # Allocates and constructs a document.
341
+ #
342
+ # @param [ Hash ] attrs The attributes to set up the document with.
343
+ # @param [ true | false ] execute_callbacks Flag specifies whether callbacks
344
+ # should be run.
345
+ #
346
+ # @return [ Document ] A new document.
347
+ #
348
+ # @api private
349
+ def construct_document(attrs = nil, execute_callbacks: true)
350
+ doc = allocate
351
+ doc.send(:construct_document, attrs, execute_callbacks: execute_callbacks)
352
+ end
353
+
299
354
  # Returns all types to query for when using this class as the base.
300
355
  #
301
356
  # @example Get the types.
@@ -44,9 +44,9 @@ module Mongoid
44
44
  # @return [ true, false ] True if the classes are equal, false if not.
45
45
  def ===(other)
46
46
  if Mongoid.legacy_triple_equals
47
- other.class == Class ? self.class === other : self == other
48
- else
49
47
  super
48
+ else
49
+ other.class == Class ? self.class === other : self == other
50
50
  end
51
51
  end
52
52
 
@@ -73,9 +73,9 @@ module Mongoid
73
73
  # @return [ true, false ] True if the classes are equal, false if not.
74
74
  def ===(other)
75
75
  if Mongoid.legacy_triple_equals
76
- other.class == Class ? self <= other : other.is_a?(self)
77
- else
78
76
  other.is_a?(self)
77
+ else
78
+ other.class == Class ? self <= other : other.is_a?(self)
79
79
  end
80
80
  end
81
81
  end
@@ -20,7 +20,8 @@ module Mongoid
20
20
  #
21
21
  # @param [ Class ] klass The model class.
22
22
  # @param [ Hash, Array, Object ] params The attributes or ids.
23
- # @param [ Array ] unmatched The unmatched ids, if appropriate
23
+ # @param [ Array, Hash ] unmatched The unmatched ids, if appropriate. If
24
+ # there is a shard key this will be a hash.
24
25
  def initialize(klass, params, unmatched = nil)
25
26
  if !unmatched && !params.is_a?(Hash)
26
27
  unmatched = Array(params) if params
@@ -35,7 +36,8 @@ module Mongoid
35
36
  searched: searched(params),
36
37
  attributes: params,
37
38
  total: total(params),
38
- missing: missing(unmatched)
39
+ missing: missing(unmatched),
40
+ shard_key: shard_key(unmatched)
39
41
  }
40
42
  )
41
43
  )
@@ -54,6 +56,8 @@ module Mongoid
54
56
  def missing(unmatched)
55
57
  if unmatched.is_a?(::Array)
56
58
  unmatched.join(", ")
59
+ elsif unmatched.is_a?(::Hash)
60
+ unmatched[:_id] || unmatched["_id"]
57
61
  else
58
62
  unmatched
59
63
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+ module Errors
5
+
6
+ # This error is raised when trying to use the setter for a field that starts
7
+ # with a dollar sign ($) or contains a dot/period (.).
8
+ class InvalidDotDollarAssignment < MongoidError
9
+
10
+ # Create the new error.
11
+ #
12
+ # @param [ Class ] klass The class of the document.
13
+ # @param [ Class ] attr The attribute attempted to be written.
14
+ #
15
+ # @api private
16
+ def initialize(klass, attr)
17
+ super(
18
+ compose_message("invalid_dot_dollar_assignment", { klass: klass, attr: attr })
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
@@ -12,14 +12,18 @@ module Mongoid
12
12
  # @example Create the error.
13
13
  # InvalidField.new(person, :crazy_method_name)
14
14
  #
15
+ # @api private
16
+ #
15
17
  # @param [ Class ] klass The document class.
18
+ # @param [ Symbol ] field The field name.
16
19
  # @param [ Symbol ] name The method name.
17
- def initialize(klass, name)
20
+ def initialize(klass, field, name)
18
21
  super(
19
22
  compose_message(
20
23
  "invalid_field",
21
24
  {
22
25
  name: name,
26
+ field: field,
23
27
  origin: origin(klass, name),
24
28
  file: location(klass, name)[0],
25
29
  line: location(klass, name)[1]
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+ module Errors
5
+
6
+ # This error is raised when trying to define a field using a :type option value
7
+ # that is not present in the field type mapping.
8
+ class InvalidFieldType < MongoidError
9
+
10
+ # Create the new error.
11
+ #
12
+ # @example Instantiate the error.
13
+ # InvalidFieldType.new('Person', 'first_name', 'stringgy')
14
+ #
15
+ # @param [ String ] klass The model class.
16
+ # @param [ String ] field The field on which the invalid type is used.
17
+ # @param [ Symbol | String ] type The value of the field :type option.
18
+ def initialize(klass, field, type)
19
+ super(
20
+ compose_message('invalid_field_type',
21
+ klass: klass, field: field, type_inspection: type.inspect)
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
@@ -3,7 +3,7 @@
3
3
  module Mongoid
4
4
  module Errors
5
5
 
6
- # This error is raised when trying to create set nested records above the
6
+ # This error is raised when trying to create set nested documents above the
7
7
  # specified :limit
8
8
  #
9
9
  # @example Create the error.
@@ -6,16 +6,15 @@ require "mongoid/errors/callback"
6
6
  require "mongoid/errors/criteria_argument_required"
7
7
  require "mongoid/errors/document_not_destroyed"
8
8
  require "mongoid/errors/document_not_found"
9
- require "mongoid/errors/eager_load"
10
9
  require "mongoid/errors/empty_config_file"
11
10
  require "mongoid/errors/in_memory_collation_not_supported"
12
- require "mongoid/errors/in_memory_regexp_timeout"
13
11
  require "mongoid/errors/invalid_collection"
14
12
  require "mongoid/errors/invalid_config_file"
15
13
  require "mongoid/errors/invalid_config_option"
16
14
  require "mongoid/errors/invalid_dependent_strategy"
17
15
  require "mongoid/errors/invalid_field"
18
16
  require "mongoid/errors/invalid_field_option"
17
+ require "mongoid/errors/invalid_field_type"
19
18
  require "mongoid/errors/invalid_find"
20
19
  require "mongoid/errors/invalid_includes"
21
20
  require "mongoid/errors/invalid_index"
@@ -25,6 +24,7 @@ require "mongoid/errors/invalid_persistence_option"
25
24
  require "mongoid/errors/invalid_query"
26
25
  # Must be after invalid_query.
27
26
  require "mongoid/errors/invalid_discriminator_key_target"
27
+ require "mongoid/errors/invalid_dot_dollar_assignment"
28
28
  require "mongoid/errors/invalid_elem_match_operator"
29
29
  require "mongoid/errors/invalid_estimated_count_criteria"
30
30
  require "mongoid/errors/invalid_expression_operator"
@@ -37,7 +37,6 @@ require "mongoid/errors/invalid_set_polymorphic_relation"
37
37
  require "mongoid/errors/invalid_storage_options"
38
38
  require "mongoid/errors/invalid_storage_parent"
39
39
  require "mongoid/errors/invalid_time"
40
- require "mongoid/errors/invalid_value"
41
40
  require "mongoid/errors/inverse_not_found"
42
41
  require "mongoid/errors/mixed_relations"
43
42
  require "mongoid/errors/mixed_client_configuration"
@@ -87,7 +87,7 @@ module Mongoid
87
87
  # @example Mongoize the object.
88
88
  # object.mongoize
89
89
  #
90
- # @return [ Array ] The object.
90
+ # @return [ Array | nil ] The object or nil.
91
91
  def mongoize
92
92
  ::Array.mongoize(self)
93
93
  end
@@ -144,12 +144,12 @@ module Mongoid
144
144
  #
145
145
  # @param [ Object ] object The object to mongoize.
146
146
  #
147
- # @return [ Array ] The object mongoized.
147
+ # @return [ Array | nil ] The object mongoized or nil.
148
148
  def mongoize(object)
149
- if object.is_a?(::Array)
150
- evolve(object).collect{ |obj| obj.class.mongoize(obj) }
151
- else
152
- evolve(object)
149
+ return if object.nil?
150
+ case object
151
+ when ::Array, ::Set
152
+ object.map(&:mongoize)
153
153
  end
154
154
  end
155
155
 
@@ -169,3 +169,5 @@ end
169
169
 
170
170
  ::Array.__send__(:include, Mongoid::Extensions::Array)
171
171
  ::Array.extend(Mongoid::Extensions::Array::ClassMethods)
172
+
173
+ ::Mongoid.deprecate(Array, :blank_criteria)
@@ -20,9 +20,9 @@ module Mongoid
20
20
  # @example Mongoize the object.
21
21
  # object.mongoize
22
22
  #
23
- # @return [ Object ] The object.
23
+ # @return [ String | BSON::Decimal128 | nil ] The object or nil.
24
24
  def mongoize
25
- to_s
25
+ ::BigDecimal.mongoize(self)
26
26
  end
27
27
 
28
28
  # Is the BigDecimal a number?
@@ -39,26 +39,45 @@ module Mongoid
39
39
 
40
40
  # Convert the object from its mongo friendly ruby type to this type.
41
41
  #
42
- # @example Demongoize the object.
43
- # Object.demongoize(object)
44
- #
45
42
  # @param [ Object ] object The object to demongoize.
46
43
  #
47
- # @return [ BigDecimal, nil ] A BigDecimal derived from the object or nil.
44
+ # @return [ BigDecimal | nil ] A BigDecimal derived from the object or nil.
48
45
  def demongoize(object)
49
- object && object.numeric? ? BigDecimal(object.to_s) : nil
46
+ return if object.blank?
47
+ if object.is_a?(BSON::Decimal128)
48
+ object.to_big_decimal
49
+ elsif object.numeric?
50
+ BigDecimal(object.to_s)
51
+ elsif object.numeric?
52
+ object.to_d
53
+ end
50
54
  end
51
55
 
52
- # Mongoize an object of any type to how it's stored in the db as a String.
56
+ # Mongoize an object of any type to how it's stored in the db.
53
57
  #
54
58
  # @example Mongoize the object.
55
59
  # BigDecimal.mongoize(123)
56
60
  #
57
61
  # @param [ Object ] object The object to Mongoize
58
62
  #
59
- # @return [ String, nil ] A String representing the object or nil.
63
+ # @return [ String | BSON::Decimal128 | nil ] A String or Decimal128
64
+ # representing the object or nil. String if Mongoid.map_big_decimal_to_decimal128
65
+ # is false, BSON::Decimal128 otherwise.
60
66
  def mongoize(object)
61
- object && object.numeric? ? object.to_s : nil
67
+ return if object.blank?
68
+ if Mongoid.map_big_decimal_to_decimal128
69
+ if object.is_a?(BSON::Decimal128)
70
+ object
71
+ elsif object.is_a?(BigDecimal)
72
+ BSON::Decimal128.new(object)
73
+ elsif object.numeric?
74
+ BSON::Decimal128.new(object.to_s)
75
+ end
76
+ else
77
+ if object.is_a?(BSON::Decimal128) || object.numeric?
78
+ object.to_s
79
+ end
80
+ end
62
81
  end
63
82
  end
64
83
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+ module Extensions
5
+ module Binary
6
+
7
+ # Turn the object from the ruby type we deal with to a Mongo friendly
8
+ # type.
9
+ #
10
+ # @example Mongoize the object.
11
+ # object.mongoize
12
+ #
13
+ # @return [ BSON::Binary | nil ] The object.
14
+ def mongoize
15
+ BSON::Binary.mongoize(self)
16
+ end
17
+
18
+ module ClassMethods
19
+
20
+ # Mongoize an object of any type to how it's stored in the db.
21
+ #
22
+ # @example Mongoize the object.
23
+ # BigDecimal.mongoize(123)
24
+ #
25
+ # @param [ Object ] object The object to Mongoize
26
+ #
27
+ # @return [ BSON::Binary | nil ] A Binary representing the object or nil.
28
+ def mongoize(object)
29
+ return if object.nil?
30
+ case object
31
+ when BSON::Binary then object
32
+ when String, Symbol then BSON::Binary.new(object.to_s)
33
+ end
34
+ end
35
+ alias :demongoize :mongoize
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ BSON::Binary.__send__(:include, Mongoid::Extensions::Binary)
42
+ BSON::Binary.extend(Mongoid::Extensions::Binary::ClassMethods)
@@ -11,10 +11,16 @@ module Mongoid
11
11
  # @example Mongoize the object.
12
12
  # Boolean.mongoize("123.11")
13
13
  #
14
- # @return [ String ] The object mongoized.
14
+ # @return [ true | false | nil ] The object mongoized or nil.
15
15
  def mongoize(object)
16
- evolve(object)
16
+ return if object.nil?
17
+ if object.to_s =~ (/\A(true|t|yes|y|on|1|1.0)\z/i)
18
+ true
19
+ elsif object.to_s =~ (/\A(false|f|no|n|off|0|0.0)\z/i)
20
+ false
21
+ end
17
22
  end
23
+ alias :demongoize :mongoize
18
24
  end
19
25
  end
20
26
  end
@@ -4,12 +4,6 @@ module Mongoid
4
4
  module Extensions
5
5
  module Date
6
6
 
7
- # Constant for epoch - used when passing invalid times.
8
- #
9
- # @deprecated No longer used as a return value from #mongoize passed
10
- # an invalid date string.
11
- EPOCH = ::Date.new(1970, 1, 1)
12
-
13
7
  # Convert the date into a time.
14
8
  #
15
9
  # @example Convert the date to a time.
@@ -43,9 +37,20 @@ module Mongoid
43
37
  #
44
38
  # @param [ Time ] object The time from Mongo.
45
39
  #
46
- # @return [ Date ] The object as a date.
40
+ # @return [ Date | nil ] The object as a date or nil.
47
41
  def demongoize(object)
48
- ::Date.new(object.year, object.month, object.day) if object
42
+ return if object.nil?
43
+ if object.is_a?(String)
44
+ object = begin
45
+ object.__mongoize_time__
46
+ rescue ArgumentError
47
+ nil
48
+ end
49
+ end
50
+
51
+ if object.acts_like?(:time) || object.acts_like?(:date)
52
+ ::Date.new(object.year, object.month, object.day)
53
+ end
49
54
  end
50
55
 
51
56
  # Turn the object from the ruby type we deal with to a Mongo friendly
@@ -56,20 +61,21 @@ module Mongoid
56
61
  #
57
62
  # @param [ Object ] object The object to mongoize.
58
63
  #
59
- # @return [ Time ] The object mongoized.
64
+ # @return [ Time | nil ] The object mongoized or nil.
60
65
  def mongoize(object)
61
- unless object.blank?
62
- begin
63
- if object.is_a?(String)
64
- # https://jira.mongodb.org/browse/MONGOID-4460
65
- time = ::Time.parse(object)
66
- else
67
- time = object.__mongoize_time__
68
- end
69
- ::Time.utc(time.year, time.month, time.day)
70
- rescue ArgumentError
71
- nil
66
+ return if object.blank?
67
+ begin
68
+ if object.is_a?(String)
69
+ # https://jira.mongodb.org/browse/MONGOID-4460
70
+ time = ::Time.parse(object)
71
+ else
72
+ time = object.__mongoize_time__
72
73
  end
74
+ rescue ArgumentError
75
+ nil
76
+ end
77
+ if time.acts_like?(:time)
78
+ ::Time.utc(time.year, time.month, time.day)
73
79
  end
74
80
  end
75
81
  end
@@ -39,7 +39,7 @@ module Mongoid
39
39
  #
40
40
  # @param [ Time ] object The time from Mongo.
41
41
  #
42
- # @return [ DateTime ] The object as a date.
42
+ # @return [ DateTime | nil ] The object as a datetime or nil.
43
43
  def demongoize(object)
44
44
  ::Time.demongoize(object).try(:to_datetime)
45
45
  end
@@ -34,12 +34,11 @@ module Mongoid
34
34
  #
35
35
  # @param [ Object ] object The object to mongoize.
36
36
  #
37
- # @return [ String ] The object mongoized.
37
+ # @return [ Float | nil ] The object mongoized or nil.
38
38
  def mongoize(object)
39
- unless object.blank?
40
- __numeric__(object).to_f rescue 0.0
41
- else
42
- nil
39
+ return if object.blank?
40
+ if object.numeric?
41
+ object.to_f
43
42
  end
44
43
  end
45
44
  alias :demongoize :mongoize