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
@@ -754,127 +754,119 @@ describe Mongoid::Criteria::Queryable::Selectable do
754
754
  end
755
755
  end
756
756
 
757
- %i(geo_spatial geo_spacial).each do |meth|
758
- describe "#geo_spacial" do
757
+ describe "#geo_spatial" do
759
758
 
760
- let(:query_method) { meth }
759
+ let(:query_method) { :geo_spatial }
761
760
 
762
- it_behaves_like 'requires an argument'
763
- it_behaves_like 'requires a non-nil argument'
761
+ it_behaves_like 'requires an argument'
762
+ it_behaves_like 'requires a non-nil argument'
764
763
 
765
- context "when provided a criterion" do
764
+ context "when provided a criterion" do
766
765
 
767
- context "when the geometry is a point intersection" do
766
+ context "when the geometry is a point intersection" do
768
767
 
769
- let(:selection) do
770
- query.public_send(query_method, :location.intersects_point => [ 1, 10 ])
771
- end
768
+ let(:selection) do
769
+ query.geo_spatial(:location.intersects_point => [ 1, 10 ])
770
+ end
772
771
 
773
- it "adds the $geoIntersects expression" do
774
- expect(selection.selector).to eq({
775
- "location" => {
776
- "$geoIntersects" => {
777
- "$geometry" => {
778
- "type" => "Point",
779
- "coordinates" => [ 1, 10 ]
780
- }
772
+ it "adds the $geoIntersects expression" do
773
+ expect(selection.selector).to eq({
774
+ "location" => {
775
+ "$geoIntersects" => {
776
+ "$geometry" => {
777
+ "type" => "Point",
778
+ "coordinates" => [ 1, 10 ]
781
779
  }
782
780
  }
783
- })
784
- end
785
-
786
- it_behaves_like "returns a cloned query"
781
+ }
782
+ })
787
783
  end
788
784
 
789
- context "when the geometry is a line intersection" do
785
+ it_behaves_like "returns a cloned query"
786
+ end
787
+
788
+ context "when the geometry is a line intersection" do
790
789
 
791
- let(:selection) do
792
- query.public_send(query_method, :location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
793
- end
790
+ let(:selection) do
791
+ query.geo_spatial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
792
+ end
794
793
 
795
- it "adds the $geoIntersects expression" do
796
- expect(selection.selector).to eq({
797
- "location" => {
798
- "$geoIntersects" => {
799
- "$geometry" => {
800
- "type" => "LineString",
801
- "coordinates" => [[ 1, 10 ], [ 2, 10 ]]
802
- }
794
+ it "adds the $geoIntersects expression" do
795
+ expect(selection.selector).to eq({
796
+ "location" => {
797
+ "$geoIntersects" => {
798
+ "$geometry" => {
799
+ "type" => "LineString",
800
+ "coordinates" => [[ 1, 10 ], [ 2, 10 ]]
803
801
  }
804
802
  }
805
- })
806
- end
807
-
808
- it_behaves_like "returns a cloned query"
803
+ }
804
+ })
809
805
  end
810
806
 
811
- context "when the geometry is a polygon intersection" do
807
+ it_behaves_like "returns a cloned query"
808
+ end
812
809
 
813
- let(:selection) do
814
- query.public_send(query_method,
815
- :location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
816
- )
817
- end
810
+ context "when the geometry is a polygon intersection" do
818
811
 
819
- it "adds the $geoIntersects expression" do
820
- expect(selection.selector).to eq({
821
- "location" => {
822
- "$geoIntersects" => {
823
- "$geometry" => {
824
- "type" => "Polygon",
825
- "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
826
- }
812
+ let(:selection) do
813
+ query.geo_spatial(:location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]])
814
+ end
815
+
816
+ it "adds the $geoIntersects expression" do
817
+ expect(selection.selector).to eq({
818
+ "location" => {
819
+ "$geoIntersects" => {
820
+ "$geometry" => {
821
+ "type" => "Polygon",
822
+ "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
827
823
  }
828
824
  }
829
- })
830
- end
825
+ }
826
+ })
827
+ end
828
+
829
+ it_behaves_like "returns a cloned query"
830
+ end
831
831
 
832
- it_behaves_like "returns a cloned query"
832
+ context "when the geometry is within a polygon" do
833
+
834
+ let(:selection) do
835
+ query.geo_spatial(:location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]])
833
836
  end
834
837
 
835
- context "when the geometry is within a polygon" do
838
+ it "adds the $geoIntersects expression" do
839
+ expect(selection.selector).to eq({
840
+ "location" => {
841
+ "$geoWithin" => {
842
+ "$geometry" => {
843
+ "type" => "Polygon",
844
+ "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
845
+ }
846
+ }
847
+ }
848
+ })
849
+ end
836
850
 
851
+ context "when used with the $box operator ($geoWithin query) " do
837
852
  let(:selection) do
838
- query.public_send(query_method,
839
- :location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
840
- )
853
+ query.geo_spatial(:location.within_box => [[ 1, 10 ], [ 2, 10 ]])
841
854
  end
842
855
 
843
856
  it "adds the $geoIntersects expression" do
844
857
  expect(selection.selector).to eq({
845
858
  "location" => {
846
859
  "$geoWithin" => {
847
- "$geometry" => {
848
- "type" => "Polygon",
849
- "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
850
- }
860
+ "$box" => [
861
+ [ 1, 10 ], [ 2, 10 ]
862
+ ]
851
863
  }
852
864
  }
853
865
  })
854
866
  end
855
-
856
- context "when used with the $box operator ($geoWithin query) " do
857
- let(:selection) do
858
- query.public_send(query_method,
859
- :location.within_box => [[ 1, 10 ], [ 2, 10 ]]
860
- )
861
- end
862
-
863
- it "adds the $geoIntersects expression" do
864
- expect(selection.selector).to eq({
865
- "location" => {
866
- "$geoWithin" => {
867
- "$box" => [
868
- [ 1, 10 ], [ 2, 10 ]
869
- ]
870
- }
871
- }
872
- })
873
- end
874
- end
875
-
876
- it_behaves_like "returns a cloned query"
877
867
  end
868
+
869
+ it_behaves_like "returns a cloned query"
878
870
  end
879
871
  end
880
872
  end
@@ -35,8 +35,6 @@ describe Mongoid::Criteria::Queryable::Selectable do
35
35
  it_behaves_like 'requires a non-nil argument'
36
36
 
37
37
  context "when provided a string" do
38
- # String criteria compile to $where, which requires the opt-in.
39
- config_override :allow_unsafe_query_operators, true
40
38
 
41
39
  let(:selection) do
42
40
  query.where("this.value = 10")
@@ -588,202 +586,4 @@ describe Mongoid::Criteria::Queryable::Selectable do
588
586
  end
589
587
  end
590
588
  end
591
-
592
- describe 'top-level operator injection guard' do
593
- context 'when allow_unsafe_query_operators is true' do
594
- config_override :allow_unsafe_query_operators, true
595
-
596
- context 'when passing $where' do
597
- it 'does not raise' do
598
- expect do
599
- query.where('$where' => 'this.name == "admin"')
600
- end.not_to raise_error
601
- end
602
- end
603
-
604
- context 'when passing a string criterion' do
605
- it 'does not raise' do
606
- expect do
607
- query.where('this.name == "admin"')
608
- end.not_to raise_error
609
- end
610
- end
611
-
612
- context 'when passing a string criterion to a negated query' do
613
- it 'does not raise' do
614
- expect do
615
- query.not.where('this.name == "admin"')
616
- end.not_to raise_error
617
- end
618
- end
619
-
620
- context 'when passing $function' do
621
- it 'does not raise' do
622
- expect do
623
- query.where('$function' => { body: 'function() { return true; }', args: [], lang: 'js' })
624
- end.not_to raise_error
625
- end
626
- end
627
- end
628
-
629
- context 'when allow_unsafe_query_operators is false' do
630
- config_override :allow_unsafe_query_operators, false
631
-
632
- context 'when passing $where' do
633
- it 'raises InvalidQuery' do
634
- expect do
635
- query.where('$where' => 'this.name == "admin"')
636
- end.to raise_error(Mongoid::Errors::InvalidQuery, /\$where/)
637
- end
638
- end
639
-
640
- context 'when passing $function' do
641
- it 'raises InvalidQuery' do
642
- expect do
643
- query.where('$function' => { body: 'function() { return true; }', args: [], lang: 'js' })
644
- end.to raise_error(Mongoid::Errors::InvalidQuery, /\$function/)
645
- end
646
- end
647
-
648
- context 'when the error mentions allow_unsafe_query_operators' do
649
- it 'includes the config opt-in in the message' do
650
- expect do
651
- query.where('$where' => 'true')
652
- end.to raise_error(Mongoid::Errors::InvalidQuery, /allow_unsafe_query_operators/)
653
- end
654
- end
655
-
656
- context 'when passing a string criterion' do
657
- it 'raises InvalidQuery' do
658
- expect do
659
- query.where('this.name == "admin"')
660
- end.to raise_error(Mongoid::Errors::InvalidQuery, /\$where/)
661
- end
662
-
663
- it 'includes the config opt-in in the message' do
664
- expect do
665
- query.where('this.name == "admin"')
666
- end.to raise_error(Mongoid::Errors::InvalidQuery, /allow_unsafe_query_operators/)
667
- end
668
- end
669
-
670
- context 'when passing a string criterion to a negated query' do
671
- it 'raises InvalidQuery' do
672
- expect do
673
- query.not.where('this.name == "admin"')
674
- end.to raise_error(Mongoid::Errors::InvalidQuery, /\$where/)
675
- end
676
- end
677
-
678
- %w[$and $or $nor $not $text $comment $expr $jsonSchema $alwaysFalse $alwaysTrue].each do |op|
679
- context "when passing #{op} (allowlisted)" do
680
- it 'does not raise' do
681
- value = case op
682
- when '$and', '$or', '$nor', '$not' then [ { 'x' => 1 } ]
683
- when '$text' then { '$search' => 'hi' }
684
- when '$expr' then { '$gt' => [ '$a', 1 ] }
685
- when '$jsonSchema' then { 'required' => [ 'x' ] }
686
- else true
687
- end
688
- expect { query.where(op => value) }.not_to raise_error
689
- end
690
- end
691
- end
692
- end
693
- end
694
-
695
- describe 'nested operator injection guard' do
696
- js = 'this.name == "admin"'
697
-
698
- function_expr = {
699
- '$function' => { 'body' => 'function() { return true; }', 'args' => [], 'lang' => 'js' }
700
- }.freeze
701
-
702
- accumulator_expr = {
703
- '$accumulator' => {
704
- 'init' => 'function() { return 0; }',
705
- 'accumulate' => 'function() { return 0; }',
706
- 'accumulateArgs' => [],
707
- 'merge' => 'function() { return 0; }',
708
- 'lang' => 'js'
709
- }
710
- }.freeze
711
-
712
- # Every path into the selector that does not route through #expr_query,
713
- # plus the nested forms that a top-level key check cannot see.
714
- unsafe_queries = {
715
- 'and with a $where key' => ->(query) { query.and('$where' => js) },
716
- 'or with a $where key' => ->(query) { query.or('$where' => js) },
717
- 'nor with a $where key' => ->(query) { query.nor('$where' => js) },
718
- 'not with a $where key' => ->(query) { query.not('$where' => js) },
719
- 'any_of with a $where key' => ->(query) { query.any_of('$where' => js) },
720
- # none_of is not available on this branch; it landed in 8.1 via MONGOID-5453.
721
- 'elem_match with a nested $where' => ->(query) { query.elem_match(a: { '$where' => js }) },
722
- 'where with $where inside $or' => ->(query) { query.where('$or' => [ { '$where' => js } ]) },
723
- 'where with $function inside $expr' => ->(query) { query.where('$expr' => function_expr) },
724
- 'where with $accumulator inside $expr' => ->(query) { query.where('$expr' => accumulator_expr) },
725
- 'where with $where three levels deep' => lambda { |query|
726
- query.where('$and' => [ { '$or' => [ { '$where' => js } ] } ])
727
- },
728
- 'where with a symbol $where key inside $or' => ->(query) { query.where('$or' => [ { :$where => js } ]) }
729
- }.freeze
730
-
731
- context 'when allow_unsafe_query_operators is false' do
732
- config_override :allow_unsafe_query_operators, false
733
-
734
- unsafe_queries.each do |description, builder|
735
- context "when querying with #{description}" do
736
- it 'raises InvalidQuery' do
737
- expect do
738
- builder.call(query)
739
- end.to raise_error(Mongoid::Errors::InvalidQuery, /\$where|\$function|\$accumulator/)
740
- end
741
- end
742
- end
743
-
744
- it 'includes the config opt-in in the message' do
745
- expect do
746
- query.or('$where' => js)
747
- end.to raise_error(Mongoid::Errors::InvalidQuery, /allow_unsafe_query_operators/)
748
- end
749
-
750
- context 'when the nested expression is safe' do
751
- it 'permits $or with field expressions' do
752
- expect do
753
- query.where('$or' => [ { 'a' => 1 }, { 'b' => { '$gt' => 2 } } ])
754
- end.not_to raise_error
755
- end
756
-
757
- it 'permits $expr with aggregation operators' do
758
- expect do
759
- query.where('$expr' => { '$gt' => [ '$a', '$b' ] })
760
- end.not_to raise_error
761
- end
762
-
763
- it 'permits a field whose name resembles a javascript operator' do
764
- expect do
765
- query.where('where' => js)
766
- end.not_to raise_error
767
- end
768
-
769
- it 'permits a value that resembles a javascript operator' do
770
- expect do
771
- query.where('name' => '$where')
772
- end.not_to raise_error
773
- end
774
- end
775
- end
776
-
777
- context 'when allow_unsafe_query_operators is true' do
778
- config_override :allow_unsafe_query_operators, true
779
-
780
- unsafe_queries.each do |description, builder|
781
- context "when querying with #{description}" do
782
- it 'does not raise' do
783
- expect { builder.call(query) }.not_to raise_error
784
- end
785
- end
786
- end
787
- end
788
- end
789
589
  end
@@ -44,7 +44,7 @@ describe Mongoid::Criteria::Queryable::Selector do
44
44
  end
45
45
  end
46
46
 
47
- context "when selector contains a $nin string" do
47
+ context "when selector contains a $nin" do
48
48
 
49
49
  let(:initial) do
50
50
  { "$nin" => ["foo"] }
@@ -72,35 +72,7 @@ describe Mongoid::Criteria::Queryable::Selector do
72
72
  end
73
73
  end
74
74
 
75
- context "when selector contains a $nin symbol" do
76
-
77
- let(:initial) do
78
- { :$nin => ["foo"] }
79
- end
80
-
81
- before do
82
- selector["field"] = initial
83
- end
84
-
85
- context "when merging in a new $nin" do
86
-
87
- let(:other) do
88
- { "field" => { :$nin => ["bar"] } }
89
- end
90
-
91
- before do
92
- selector.merge!(other)
93
- end
94
-
95
- it "combines the two $nin queries into one" do
96
- expect(selector).to eq({
97
- "field" => { :$nin => ["foo", "bar"] }
98
- })
99
- end
100
- end
101
- end
102
-
103
- context "when selector contains a $in string" do
75
+ context "when selector contains a $in" do
104
76
 
105
77
  let(:initial) do
106
78
  { "$in" => [1, 2] }
@@ -145,51 +117,6 @@ describe Mongoid::Criteria::Queryable::Selector do
145
117
  end
146
118
  end
147
119
 
148
- context "when selector contains a $in symbol" do
149
-
150
- let(:initial) do
151
- { :$in => [1, 2] }
152
- end
153
-
154
- before do
155
- selector["field"] = initial
156
- end
157
-
158
- context "when merging in a new $in with an intersecting value" do
159
-
160
- let(:other) do
161
- { "field" => { :$in => [1] } }
162
- end
163
-
164
- before do
165
- selector.merge!(other)
166
- end
167
-
168
- it "intersects the $in values" do
169
- expect(selector).to eq({
170
- "field" => { :$in => [1] }
171
- })
172
- end
173
- end
174
-
175
- context "when merging in a new $in with no intersecting values" do
176
-
177
- let(:other) do
178
- { "field" => { :$in => [3] } }
179
- end
180
-
181
- before do
182
- selector.merge!(other)
183
- end
184
-
185
- it "intersects the $in values" do
186
- expect(selector).to eq({
187
- "field" => { :$in => [] }
188
- })
189
- end
190
- end
191
- end
192
-
193
120
  context "when selector is not nested" do
194
121
 
195
122
  before do
@@ -460,8 +387,20 @@ describe Mongoid::Criteria::Queryable::Selector do
460
387
  selector.send(method, "key", array)
461
388
  end
462
389
 
463
- it "serializes each element in the array" do
464
- expect(selector["key"]).to eq([ big_one.to_s, big_two.to_s ])
390
+ context 'when serializing bigdecimal to string' do
391
+ config_override :map_big_decimal_to_decimal128, false
392
+
393
+ it "serializes each element in the array" do
394
+ expect(selector["key"]).to eq([ big_one.to_s, big_two.to_s ])
395
+ end
396
+ end
397
+
398
+ context 'when serializing bigdecimal to decimal128' do
399
+ config_override :map_big_decimal_to_decimal128, true
400
+
401
+ it "serializes each element in the array" do
402
+ expect(selector["key"]).to eq([ BSON::Decimal128.new(big_one), BSON::Decimal128.new(big_two)])
403
+ end
465
404
  end
466
405
  end
467
406
  end
@@ -210,79 +210,7 @@ describe Mongoid::Criteria::Queryable::Storable do
210
210
  }
211
211
  end
212
212
  end
213
-
214
- context 'when value is a hash combine values with different operator keys' do
215
- let(:base) do
216
- query.add_field_expression('foo', {'$in' => ['bar']})
217
- end
218
-
219
- let(:modified) do
220
- base.add_field_expression('foo', {'$nin' => ['zoom']})
221
- end
222
-
223
- it 'combines the conditions using $and' do
224
- modified.selector.should == {
225
- 'foo' => {
226
- '$in' => ['bar'],
227
- '$nin' => ['zoom']
228
- }
229
- }
230
- end
231
- end
232
-
233
- context 'when value is a hash with symbol operator key combine values with different operator keys' do
234
- let(:base) do
235
- query.add_field_expression('foo', {:$in => ['bar']})
236
- end
237
-
238
- let(:modified) do
239
- base.add_field_expression('foo', {:$nin => ['zoom']})
240
- end
241
-
242
- it 'combines the conditions using $and' do
243
- modified.selector.should == {
244
- 'foo' => {
245
- :$in => ['bar'],
246
- :$nin => ['zoom']
247
- }
248
- }
249
- end
250
- end
251
-
252
- context 'when value is a hash add values with same operator keys using $and' do
253
- let(:base) do
254
- query.add_field_expression('foo', {'$in' => ['bar']})
255
- end
256
-
257
- let(:modified) do
258
- base.add_field_expression('foo', {'$in' => ['zoom']})
259
- end
260
-
261
- it 'adds the new condition using $and' do
262
- modified.selector.should == {
263
- 'foo' => {'$in' => ['bar']},
264
- '$and' => ['foo' => {'$in' => ['zoom']}]
265
- }
266
- end
267
- end
268
-
269
- context 'when value is a hash with symbol operator key add values with same operator keys using $and' do
270
- let(:base) do
271
- query.add_field_expression('foo', {:$in => ['bar']})
272
- end
273
-
274
- let(:modified) do
275
- base.add_field_expression('foo', {:$in => ['zoom']})
276
- end
277
-
278
- it 'adds the new condition using $and' do
279
- modified.selector.should == {
280
- 'foo' => {:$in => ['bar']},
281
- '$and' => ['foo' => {:$in => ['zoom']}]
282
- }
283
- end
284
213
  end
285
- end
286
214
 
287
215
  describe '#add_operator_expression' do
288
216
  let(:query_method) { :add_operator_expression }