mongoid 7.1.11 → 7.2.0

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 (485) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +10 -3
  4. data/lib/config/locales/en.yml +37 -14
  5. data/lib/mongoid/association/depending.rb +1 -6
  6. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +1 -1
  7. data/lib/mongoid/association/many.rb +3 -3
  8. data/lib/mongoid/association/proxy.rb +1 -1
  9. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  10. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  11. data/lib/mongoid/association/referenced/has_many/enumerable.rb +37 -2
  12. data/lib/mongoid/association/referenced/has_many/proxy.rb +9 -2
  13. data/lib/mongoid/association/referenced/has_one/buildable.rb +9 -1
  14. data/lib/mongoid/atomic/modifiers.rb +1 -1
  15. data/lib/mongoid/attributes/dynamic.rb +1 -1
  16. data/lib/mongoid/attributes.rb +1 -8
  17. data/lib/mongoid/clients/factory.rb +17 -0
  18. data/lib/mongoid/composable.rb +1 -0
  19. data/lib/mongoid/config/environment.rb +1 -9
  20. data/lib/mongoid/config.rb +3 -0
  21. data/lib/mongoid/contextual/atomic.rb +2 -7
  22. data/lib/mongoid/contextual/mongo.rb +23 -4
  23. data/lib/mongoid/contextual/none.rb +0 -3
  24. data/lib/mongoid/copyable.rb +7 -3
  25. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  26. data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
  27. data/lib/mongoid/criteria/queryable/selectable.rb +23 -8
  28. data/lib/mongoid/criteria/queryable/selector.rb +7 -3
  29. data/lib/mongoid/criteria/queryable/storable.rb +7 -7
  30. data/lib/mongoid/criteria.rb +58 -8
  31. data/lib/mongoid/document.rb +19 -9
  32. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  33. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  34. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  35. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  36. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  37. data/lib/mongoid/errors/invalid_query.rb +41 -0
  38. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  39. data/lib/mongoid/errors.rb +7 -2
  40. data/lib/mongoid/extensions.rb +1 -0
  41. data/lib/mongoid/factory.rb +27 -10
  42. data/lib/mongoid/fields/validators/macro.rb +22 -9
  43. data/lib/mongoid/fields.rb +3 -0
  44. data/lib/mongoid/findable.rb +50 -14
  45. data/lib/mongoid/indexable.rb +2 -2
  46. data/lib/mongoid/interceptable.rb +2 -4
  47. data/lib/mongoid/matchable.rb +1 -149
  48. data/lib/mongoid/matcher/all.rb +22 -0
  49. data/lib/mongoid/matcher/and.rb +21 -0
  50. data/lib/mongoid/matcher/elem_match.rb +35 -0
  51. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  52. data/lib/mongoid/matcher/eq.rb +11 -0
  53. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  54. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  55. data/lib/mongoid/matcher/exists.rb +15 -0
  56. data/lib/mongoid/matcher/expression.rb +40 -0
  57. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  58. data/lib/mongoid/matcher/field_expression.rb +63 -0
  59. data/lib/mongoid/matcher/field_operator.rb +52 -0
  60. data/lib/mongoid/matcher/gt.rb +17 -0
  61. data/lib/mongoid/matcher/gte.rb +17 -0
  62. data/lib/mongoid/matcher/in.rb +25 -0
  63. data/lib/mongoid/matcher/lt.rb +17 -0
  64. data/lib/mongoid/matcher/lte.rb +17 -0
  65. data/lib/mongoid/matcher/ne.rb +16 -0
  66. data/lib/mongoid/matcher/nin.rb +11 -0
  67. data/lib/mongoid/matcher/nor.rb +25 -0
  68. data/lib/mongoid/matcher/not.rb +29 -0
  69. data/lib/mongoid/matcher/or.rb +21 -0
  70. data/lib/mongoid/matcher/regex.rb +41 -0
  71. data/lib/mongoid/matcher/size.rb +26 -0
  72. data/lib/mongoid/matcher.rb +127 -0
  73. data/lib/mongoid/persistable/deletable.rb +1 -1
  74. data/lib/mongoid/persistence_context.rb +1 -3
  75. data/lib/mongoid/query_cache.rb +64 -62
  76. data/lib/mongoid/reloadable.rb +2 -7
  77. data/lib/mongoid/serializable.rb +1 -1
  78. data/lib/mongoid/stringified_symbol.rb +53 -0
  79. data/lib/mongoid/tasks/database.rb +1 -1
  80. data/lib/mongoid/traversable.rb +111 -4
  81. data/lib/mongoid/validatable/associated.rb +1 -1
  82. data/lib/mongoid/validatable/presence.rb +3 -3
  83. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  84. data/lib/mongoid/version.rb +1 -1
  85. data/lib/mongoid.rb +23 -1
  86. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -8
  87. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +1 -1
  88. data/spec/README.md +19 -4
  89. data/spec/integration/app_spec.rb +84 -174
  90. data/spec/integration/associations/embedded_spec.rb +94 -0
  91. data/spec/integration/associations/has_many_spec.rb +67 -14
  92. data/spec/integration/associations/has_one_spec.rb +67 -14
  93. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  94. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  95. data/spec/integration/discriminator_key_spec.rb +354 -0
  96. data/spec/integration/discriminator_value_spec.rb +207 -0
  97. data/spec/integration/document_spec.rb +0 -21
  98. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  99. data/spec/integration/matcher_operator_data/all.yml +140 -0
  100. data/spec/integration/matcher_operator_data/and.yml +93 -0
  101. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  102. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  103. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  104. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  105. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  106. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  107. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  108. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  109. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  110. data/spec/integration/matcher_operator_data/in.yml +194 -0
  111. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  112. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  113. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  114. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  115. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  116. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  117. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  118. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  119. data/spec/integration/matcher_operator_data/not.yml +196 -0
  120. data/spec/integration/matcher_operator_data/or.yml +137 -0
  121. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  122. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  123. data/spec/integration/matcher_operator_data/size.yml +174 -0
  124. data/spec/integration/matcher_operator_spec.rb +100 -0
  125. data/spec/integration/matcher_spec.rb +189 -0
  126. data/spec/integration/server_query_spec.rb +142 -0
  127. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  128. data/spec/lite_spec_helper.rb +4 -3
  129. data/spec/mongoid/association/depending_spec.rb +78 -26
  130. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +0 -50
  131. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +37 -17
  132. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  133. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  134. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +0 -17
  135. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
  136. data/spec/mongoid/association/referenced/has_many_models.rb +21 -0
  137. data/spec/mongoid/association/referenced/has_one_models.rb +21 -0
  138. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
  139. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  140. data/spec/mongoid/atomic/paths_spec.rb +0 -41
  141. data/spec/mongoid/atomic_spec.rb +23 -0
  142. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  143. data/spec/mongoid/attributes_spec.rb +0 -241
  144. data/spec/mongoid/clients/factory_spec.rb +35 -9
  145. data/spec/mongoid/clients/options_spec.rb +3 -11
  146. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  147. data/spec/mongoid/config/environment_spec.rb +8 -86
  148. data/spec/mongoid/config_spec.rb +28 -0
  149. data/spec/mongoid/contextual/atomic_spec.rb +29 -81
  150. data/spec/mongoid/contextual/geo_near_spec.rb +1 -1
  151. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  152. data/spec/mongoid/copyable_spec.rb +197 -18
  153. data/spec/mongoid/copyable_spec_models.rb +28 -0
  154. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +0 -36
  155. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  156. data/spec/mongoid/criteria_spec.rb +204 -43
  157. data/spec/mongoid/document_query_spec.rb +0 -51
  158. data/spec/mongoid/document_spec.rb +90 -36
  159. data/spec/mongoid/equality_spec.rb +0 -1
  160. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  161. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -20
  162. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  163. data/spec/mongoid/factory_spec.rb +261 -28
  164. data/spec/mongoid/fields_spec.rb +48 -2
  165. data/spec/mongoid/findable_spec.rb +32 -0
  166. data/spec/mongoid/indexable_spec.rb +28 -2
  167. data/spec/mongoid/inspectable_spec.rb +29 -2
  168. data/spec/mongoid/interceptable_spec.rb +2 -2
  169. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  170. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  171. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  172. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  173. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  174. data/spec/mongoid/persistable/settable_spec.rb +0 -30
  175. data/spec/mongoid/persistable/updatable_spec.rb +0 -2
  176. data/spec/mongoid/persistable_spec.rb +2 -2
  177. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  178. data/spec/mongoid/query_cache_spec.rb +442 -41
  179. data/spec/mongoid/reloadable_spec.rb +72 -0
  180. data/spec/mongoid/serializable_spec.rb +21 -3
  181. data/spec/mongoid/traversable_spec.rb +1100 -0
  182. data/spec/shared/lib/mrss/constraints.rb +10 -92
  183. data/spec/shared/lib/mrss/lite_constraints.rb +0 -16
  184. data/spec/shared/lib/mrss/spec_organizer.rb +2 -32
  185. data/spec/spec_helper.rb +3 -3
  186. data/spec/support/constraints.rb +24 -0
  187. data/spec/support/helpers.rb +1 -1
  188. data/spec/{app → support}/models/actor.rb +1 -1
  189. data/spec/{app → support}/models/address.rb +0 -4
  190. data/spec/support/models/armrest.rb +10 -0
  191. data/spec/{app → support}/models/browser.rb +1 -1
  192. data/spec/{app → support}/models/canvas.rb +1 -1
  193. data/spec/{app → support}/models/coding.rb +1 -1
  194. data/spec/support/models/crate.rb +13 -0
  195. data/spec/support/models/deed.rb +8 -0
  196. data/spec/{app → support}/models/dictionary.rb +0 -6
  197. data/spec/{app → support}/models/driver.rb +1 -1
  198. data/spec/support/models/guitar.rb +5 -0
  199. data/spec/support/models/idnodef.rb +8 -0
  200. data/spec/support/models/instrument.rb +9 -0
  201. data/spec/{app → support}/models/item.rb +1 -1
  202. data/spec/{app → support}/models/mop.rb +0 -10
  203. data/spec/support/models/order.rb +11 -0
  204. data/spec/{app → support}/models/owner.rb +2 -0
  205. data/spec/{app → support}/models/palette.rb +1 -1
  206. data/spec/{app → support}/models/person.rb +1 -10
  207. data/spec/support/models/piano.rb +5 -0
  208. data/spec/support/models/profile.rb +18 -0
  209. data/spec/support/models/publication.rb +5 -0
  210. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  211. data/spec/support/models/seat.rb +25 -0
  212. data/spec/{app → support}/models/shape.rb +2 -2
  213. data/spec/support/models/system_role.rb +7 -0
  214. data/spec/{app → support}/models/tool.rb +2 -2
  215. data/spec/support/models/toy.rb +10 -0
  216. data/spec/{app → support}/models/truck.rb +2 -0
  217. data/spec/{app → support}/models/vehicle.rb +7 -2
  218. data/spec/{app → support}/models/writer.rb +2 -2
  219. data/spec/support/spec_config.rb +1 -9
  220. data.tar.gz.sig +0 -0
  221. metadata +839 -820
  222. metadata.gz.sig +2 -2
  223. data/lib/mongoid/errors/empty_config_file.rb +0 -26
  224. data/lib/mongoid/errors/invalid_config_file.rb +0 -26
  225. data/lib/mongoid/matchable/all.rb +0 -30
  226. data/lib/mongoid/matchable/and.rb +0 -32
  227. data/lib/mongoid/matchable/default.rb +0 -121
  228. data/lib/mongoid/matchable/elem_match.rb +0 -36
  229. data/lib/mongoid/matchable/eq.rb +0 -23
  230. data/lib/mongoid/matchable/exists.rb +0 -25
  231. data/lib/mongoid/matchable/gt.rb +0 -25
  232. data/lib/mongoid/matchable/gte.rb +0 -25
  233. data/lib/mongoid/matchable/in.rb +0 -26
  234. data/lib/mongoid/matchable/lt.rb +0 -25
  235. data/lib/mongoid/matchable/lte.rb +0 -25
  236. data/lib/mongoid/matchable/ne.rb +0 -23
  237. data/lib/mongoid/matchable/nin.rb +0 -24
  238. data/lib/mongoid/matchable/nor.rb +0 -38
  239. data/lib/mongoid/matchable/or.rb +0 -35
  240. data/lib/mongoid/matchable/regexp.rb +0 -30
  241. data/lib/mongoid/matchable/size.rb +0 -23
  242. data/spec/app/models/customer.rb +0 -11
  243. data/spec/app/models/customer_address.rb +0 -12
  244. data/spec/app/models/publication.rb +0 -5
  245. data/spec/integration/callbacks_models.rb +0 -49
  246. data/spec/integration/callbacks_spec.rb +0 -216
  247. data/spec/integration/contextual/empty_spec.rb +0 -142
  248. data/spec/mongoid/errors/invalid_config_file_spec.rb +0 -32
  249. data/spec/mongoid/matchable/all_spec.rb +0 -34
  250. data/spec/mongoid/matchable/and_spec.rb +0 -190
  251. data/spec/mongoid/matchable/default_spec.rb +0 -140
  252. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  253. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  254. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  255. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  256. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  257. data/spec/mongoid/matchable/in_spec.rb +0 -52
  258. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  259. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  260. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  261. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  262. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  263. data/spec/mongoid/matchable/or_spec.rb +0 -134
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  265. data/spec/mongoid/matchable/size_spec.rb +0 -28
  266. data/spec/mongoid/matchable_spec.rb +0 -856
  267. data/spec/shared/bin/get-mongodb-download-url +0 -17
  268. data/spec/shared/bin/s3-copy +0 -45
  269. data/spec/shared/bin/s3-upload +0 -69
  270. data/spec/shared/lib/mrss/cluster_config.rb +0 -226
  271. data/spec/shared/lib/mrss/docker_runner.rb +0 -271
  272. data/spec/shared/lib/mrss/event_subscriber.rb +0 -200
  273. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  274. data/spec/shared/lib/mrss/utils.rb +0 -15
  275. data/spec/shared/share/Dockerfile.erb +0 -323
  276. data/spec/shared/share/haproxy-1.conf +0 -16
  277. data/spec/shared/share/haproxy-2.conf +0 -17
  278. data/spec/shared/shlib/distro.sh +0 -73
  279. data/spec/shared/shlib/server.sh +0 -367
  280. data/spec/shared/shlib/set_env.sh +0 -131
  281. /data/spec/{app → support}/models/account.rb +0 -0
  282. /data/spec/{app → support}/models/acolyte.rb +0 -0
  283. /data/spec/{app → support}/models/actress.rb +0 -0
  284. /data/spec/{app → support}/models/address_component.rb +0 -0
  285. /data/spec/{app → support}/models/address_number.rb +0 -0
  286. /data/spec/{app → support}/models/agency.rb +0 -0
  287. /data/spec/{app → support}/models/agent.rb +0 -0
  288. /data/spec/{app → support}/models/album.rb +0 -0
  289. /data/spec/{app → support}/models/alert.rb +0 -0
  290. /data/spec/{app → support}/models/animal.rb +0 -0
  291. /data/spec/{app → support}/models/answer.rb +0 -0
  292. /data/spec/{app → support}/models/appointment.rb +0 -0
  293. /data/spec/{app → support}/models/array_field.rb +0 -0
  294. /data/spec/{app → support}/models/article.rb +0 -0
  295. /data/spec/{app → support}/models/artist.rb +0 -0
  296. /data/spec/{app → support}/models/artwork.rb +0 -0
  297. /data/spec/{app → support}/models/audio.rb +0 -0
  298. /data/spec/{app → support}/models/augmentation.rb +0 -0
  299. /data/spec/{app → support}/models/author.rb +0 -0
  300. /data/spec/{app → support}/models/baby.rb +0 -0
  301. /data/spec/{app → support}/models/band.rb +0 -0
  302. /data/spec/{app → support}/models/bar.rb +0 -0
  303. /data/spec/{app → support}/models/basic.rb +0 -0
  304. /data/spec/{app → support}/models/bed.rb +0 -0
  305. /data/spec/{app → support}/models/big_palette.rb +0 -0
  306. /data/spec/{app → support}/models/birthday.rb +0 -0
  307. /data/spec/{app → support}/models/bomb.rb +0 -0
  308. /data/spec/{app → support}/models/book.rb +0 -0
  309. /data/spec/{app → support}/models/breed.rb +0 -0
  310. /data/spec/{app → support}/models/building.rb +0 -0
  311. /data/spec/{app → support}/models/building_address.rb +0 -0
  312. /data/spec/{app → support}/models/bus.rb +0 -0
  313. /data/spec/{app → support}/models/business.rb +0 -0
  314. /data/spec/{app → support}/models/callback_test.rb +0 -0
  315. /data/spec/{app → support}/models/car.rb +0 -0
  316. /data/spec/{app → support}/models/cat.rb +0 -0
  317. /data/spec/{app → support}/models/category.rb +0 -0
  318. /data/spec/{app → support}/models/child.rb +0 -0
  319. /data/spec/{app → support}/models/child_doc.rb +0 -0
  320. /data/spec/{app → support}/models/church.rb +0 -0
  321. /data/spec/{app → support}/models/circle.rb +0 -0
  322. /data/spec/{app → support}/models/circuit.rb +0 -0
  323. /data/spec/{app → support}/models/circus.rb +0 -0
  324. /data/spec/{app → support}/models/code.rb +0 -0
  325. /data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  326. /data/spec/{app → support}/models/comment.rb +0 -0
  327. /data/spec/{app → support}/models/company.rb +0 -0
  328. /data/spec/{app → support}/models/consumption_period.rb +0 -0
  329. /data/spec/{app → support}/models/contextable_item.rb +0 -0
  330. /data/spec/{app → support}/models/contractor.rb +0 -0
  331. /data/spec/{app → support}/models/cookie.rb +0 -0
  332. /data/spec/{app → support}/models/country_code.rb +0 -0
  333. /data/spec/{app → support}/models/courier_job.rb +0 -0
  334. /data/spec/{app → support}/models/definition.rb +0 -0
  335. /data/spec/{app → support}/models/delegating_patient.rb +0 -0
  336. /data/spec/{app → support}/models/description.rb +0 -0
  337. /data/spec/{app → support}/models/division.rb +0 -0
  338. /data/spec/{app → support}/models/doctor.rb +0 -0
  339. /data/spec/{app → support}/models/dog.rb +0 -0
  340. /data/spec/{app → support}/models/dokument.rb +0 -0
  341. /data/spec/{app → support}/models/draft.rb +0 -0
  342. /data/spec/{app → support}/models/dragon.rb +0 -0
  343. /data/spec/{app → support}/models/drug.rb +0 -0
  344. /data/spec/{app → support}/models/dungeon.rb +0 -0
  345. /data/spec/{app → support}/models/edit.rb +0 -0
  346. /data/spec/{app → support}/models/email.rb +0 -0
  347. /data/spec/{app → support}/models/employer.rb +0 -0
  348. /data/spec/{app → support}/models/entry.rb +0 -0
  349. /data/spec/{app → support}/models/eraser.rb +0 -0
  350. /data/spec/{app → support}/models/even.rb +0 -0
  351. /data/spec/{app → support}/models/event.rb +0 -0
  352. /data/spec/{app → support}/models/exhibition.rb +0 -0
  353. /data/spec/{app → support}/models/exhibitor.rb +0 -0
  354. /data/spec/{app → support}/models/explosion.rb +0 -0
  355. /data/spec/{app → support}/models/eye.rb +0 -0
  356. /data/spec/{app → support}/models/eye_bowl.rb +0 -0
  357. /data/spec/{app → support}/models/face.rb +0 -0
  358. /data/spec/{app → support}/models/favorite.rb +0 -0
  359. /data/spec/{app → support}/models/filesystem.rb +0 -0
  360. /data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  361. /data/spec/{app → support}/models/firefox.rb +0 -0
  362. /data/spec/{app → support}/models/fish.rb +0 -0
  363. /data/spec/{app → support}/models/folder.rb +0 -0
  364. /data/spec/{app → support}/models/folder_item.rb +0 -0
  365. /data/spec/{app → support}/models/fruits.rb +0 -0
  366. /data/spec/{app → support}/models/game.rb +0 -0
  367. /data/spec/{app → support}/models/ghost.rb +0 -0
  368. /data/spec/{app → support}/models/home.rb +0 -0
  369. /data/spec/{app → support}/models/house.rb +0 -0
  370. /data/spec/{app → support}/models/html_writer.rb +0 -0
  371. /data/spec/{app → support}/models/id_key.rb +0 -0
  372. /data/spec/{app → support}/models/image.rb +0 -0
  373. /data/spec/{app → support}/models/implant.rb +0 -0
  374. /data/spec/{app → support}/models/jar.rb +0 -0
  375. /data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  376. /data/spec/{app → support}/models/kangaroo.rb +0 -0
  377. /data/spec/{app → support}/models/label.rb +0 -0
  378. /data/spec/{app → support}/models/language.rb +0 -0
  379. /data/spec/{app → support}/models/lat_lng.rb +0 -0
  380. /data/spec/{app → support}/models/league.rb +0 -0
  381. /data/spec/{app → support}/models/learner.rb +0 -0
  382. /data/spec/{app → support}/models/line_item.rb +0 -0
  383. /data/spec/{app → support}/models/location.rb +0 -0
  384. /data/spec/{app → support}/models/login.rb +0 -0
  385. /data/spec/{app → support}/models/manufacturer.rb +0 -0
  386. /data/spec/{app → support}/models/meat.rb +0 -0
  387. /data/spec/{app → support}/models/membership.rb +0 -0
  388. /data/spec/{app → support}/models/message.rb +0 -0
  389. /data/spec/{app → support}/models/minim.rb +0 -0
  390. /data/spec/{app → support}/models/mixed_drink.rb +0 -0
  391. /data/spec/{app → support}/models/movie.rb +0 -0
  392. /data/spec/{app → support}/models/my_hash.rb +0 -0
  393. /data/spec/{app → support}/models/name.rb +0 -0
  394. /data/spec/{app → support}/models/name_only.rb +0 -0
  395. /data/spec/{app → support}/models/node.rb +0 -0
  396. /data/spec/{app → support}/models/note.rb +0 -0
  397. /data/spec/{app → support}/models/odd.rb +0 -0
  398. /data/spec/{app → support}/models/ordered_post.rb +0 -0
  399. /data/spec/{app → support}/models/ordered_preference.rb +0 -0
  400. /data/spec/{app → support}/models/oscar.rb +0 -0
  401. /data/spec/{app → support}/models/other_owner_object.rb +0 -0
  402. /data/spec/{app → support}/models/override.rb +0 -0
  403. /data/spec/{app → support}/models/ownable.rb +0 -0
  404. /data/spec/{app → support}/models/pack.rb +0 -0
  405. /data/spec/{app → support}/models/page.rb +0 -0
  406. /data/spec/{app → support}/models/page_question.rb +0 -0
  407. /data/spec/{app → support}/models/parent.rb +0 -0
  408. /data/spec/{app → support}/models/parent_doc.rb +0 -0
  409. /data/spec/{app → support}/models/passport.rb +0 -0
  410. /data/spec/{app → support}/models/patient.rb +0 -0
  411. /data/spec/{app → support}/models/pdf_writer.rb +0 -0
  412. /data/spec/{app → support}/models/pencil.rb +0 -0
  413. /data/spec/{app → support}/models/pet.rb +0 -0
  414. /data/spec/{app → support}/models/pet_owner.rb +0 -0
  415. /data/spec/{app → support}/models/phone.rb +0 -0
  416. /data/spec/{app → support}/models/pizza.rb +0 -0
  417. /data/spec/{app → support}/models/player.rb +0 -0
  418. /data/spec/{app → support}/models/post.rb +0 -0
  419. /data/spec/{app → support}/models/post_genre.rb +0 -0
  420. /data/spec/{app → support}/models/powerup.rb +0 -0
  421. /data/spec/{app → support}/models/preference.rb +0 -0
  422. /data/spec/{app → support}/models/princess.rb +0 -0
  423. /data/spec/{app → support}/models/product.rb +0 -0
  424. /data/spec/{app → support}/models/pronunciation.rb +0 -0
  425. /data/spec/{app → support}/models/pub.rb +0 -0
  426. /data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  427. /data/spec/{app → support}/models/publication/review.rb +0 -0
  428. /data/spec/{app → support}/models/purchase.rb +0 -0
  429. /data/spec/{app → support}/models/question.rb +0 -0
  430. /data/spec/{app → support}/models/quiz.rb +0 -0
  431. /data/spec/{app → support}/models/rating.rb +0 -0
  432. /data/spec/{app → support}/models/record.rb +0 -0
  433. /data/spec/{app → support}/models/registry.rb +0 -0
  434. /data/spec/{app → support}/models/role.rb +0 -0
  435. /data/spec/{app → support}/models/root_category.rb +0 -0
  436. /data/spec/{app → support}/models/sandwich.rb +0 -0
  437. /data/spec/{app → support}/models/scheduler.rb +0 -0
  438. /data/spec/{app → support}/models/seo.rb +0 -0
  439. /data/spec/{app → support}/models/series.rb +0 -0
  440. /data/spec/{app → support}/models/server.rb +0 -0
  441. /data/spec/{app → support}/models/service.rb +0 -0
  442. /data/spec/{app → support}/models/shelf.rb +0 -0
  443. /data/spec/{app → support}/models/shipment_address.rb +0 -0
  444. /data/spec/{app → support}/models/shipping_container.rb +0 -0
  445. /data/spec/{app → support}/models/shipping_pack.rb +0 -0
  446. /data/spec/{app → support}/models/shop.rb +0 -0
  447. /data/spec/{app → support}/models/short_agent.rb +0 -0
  448. /data/spec/{app → support}/models/short_quiz.rb +0 -0
  449. /data/spec/{app → support}/models/simple.rb +0 -0
  450. /data/spec/{app → support}/models/slave.rb +0 -0
  451. /data/spec/{app → support}/models/song.rb +0 -0
  452. /data/spec/{app → support}/models/sound.rb +0 -0
  453. /data/spec/{app → support}/models/square.rb +0 -0
  454. /data/spec/{app → support}/models/staff.rb +0 -0
  455. /data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  456. /data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  457. /data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  458. /data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  459. /data/spec/{app → support}/models/strategy.rb +0 -0
  460. /data/spec/{app → support}/models/sub_item.rb +0 -0
  461. /data/spec/{app → support}/models/subscription.rb +0 -0
  462. /data/spec/{app → support}/models/survey.rb +0 -0
  463. /data/spec/{app → support}/models/symptom.rb +0 -0
  464. /data/spec/{app → support}/models/tag.rb +0 -0
  465. /data/spec/{app → support}/models/target.rb +0 -0
  466. /data/spec/{app → support}/models/template.rb +0 -0
  467. /data/spec/{app → support}/models/thing.rb +0 -0
  468. /data/spec/{app → support}/models/title.rb +0 -0
  469. /data/spec/{app → support}/models/topping.rb +0 -0
  470. /data/spec/{app → support}/models/track.rb +0 -0
  471. /data/spec/{app → support}/models/translation.rb +0 -0
  472. /data/spec/{app → support}/models/tree.rb +0 -0
  473. /data/spec/{app → support}/models/updatable.rb +0 -0
  474. /data/spec/{app → support}/models/user.rb +0 -0
  475. /data/spec/{app → support}/models/user_account.rb +0 -0
  476. /data/spec/{app → support}/models/validation_callback.rb +0 -0
  477. /data/spec/{app → support}/models/version.rb +0 -0
  478. /data/spec/{app → support}/models/vertex.rb +0 -0
  479. /data/spec/{app → support}/models/vet_visit.rb +0 -0
  480. /data/spec/{app → support}/models/video.rb +0 -0
  481. /data/spec/{app → support}/models/video_game.rb +0 -0
  482. /data/spec/{app → support}/models/weapon.rb +0 -0
  483. /data/spec/{app → support}/models/wiki_page.rb +0 -0
  484. /data/spec/{app → support}/models/word.rb +0 -0
  485. /data/spec/{app → support}/models/word_origin.rb +0 -0
@@ -219,32 +219,44 @@ module Mongoid
219
219
  # Source: https://docs.mongodb.com/manual/reference/operator/query/box/
220
220
  #
221
221
  # @example Add a geo intersect criterion for a line.
222
- # query.geo_spacial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
222
+ # query.geo_spatial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
223
223
  #
224
224
  # @example Add a geo intersect criterion for a point.
225
- # query.geo_spacial(:location.intersects_point => [[ 1, 10 ]])
225
+ # query.geo_spatial(:location.intersects_point => [[ 1, 10 ]])
226
226
  #
227
227
  # @example Add a geo intersect criterion for a polygon.
228
- # query.geo_spacial(:location.intersects_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
228
+ # query.geo_spatial(:location.intersects_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
229
229
  #
230
230
  # @example Add a geo within criterion for a polygon.
231
- # query.geo_spacial(:location.within_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
231
+ # query.geo_spatial(:location.within_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
232
232
  #
233
233
  # @example Add a geo within criterion for a box.
234
- # query.geo_spacial(:location.within_box => [[ 1, 10 ], [ 2, 10 ])
234
+ # query.geo_spatial(:location.within_box => [[ 1, 10 ], [ 2, 10 ])
235
235
  #
236
236
  # @param [ Hash ] criterion The criterion.
237
237
  #
238
238
  # @return [ Selectable ] The cloned selectable.
239
+ def geo_spatial(criterion)
240
+ if criterion.nil?
241
+ raise Errors::CriteriaArgumentRequired, :geo_spatial
242
+ end
243
+
244
+ __merge__(criterion)
245
+ end
246
+
247
+ # Alias for +geo_spatial+.
239
248
  #
240
- # @since 2.0.0
249
+ # @deprecated
241
250
  def geo_spacial(criterion)
251
+ # Duplicate method body so that we can raise this exception with
252
+ # geo_spacial as the indicated operator rather than geo_spatial.
242
253
  if criterion.nil?
243
254
  raise Errors::CriteriaArgumentRequired, :geo_spacial
244
255
  end
245
256
 
246
257
  __merge__(criterion)
247
258
  end
259
+
248
260
  key :intersects_line, :override, "$geoIntersects", "$geometry" do |value|
249
261
  { "type" => LINE_STRING, "coordinates" => value }
250
262
  end
@@ -585,7 +597,7 @@ module Mongoid
585
597
  end
586
598
  _mongoid_expand_keys(new_s).each do |k, v|
587
599
  k = k.to_s
588
- if c.selector[k] || k.start_with?('$')
600
+ if c.selector[k] || k[0] == ?$
589
601
  c = c.send(:__multi__, [{'$nor' => [{k => v}]}], '$and')
590
602
  else
591
603
  if v.is_a?(Hash)
@@ -872,9 +884,12 @@ module Mongoid
872
884
  end
873
885
 
874
886
  clone.tap do |query|
887
+ unless Hash === criterion
888
+ raise Errors::InvalidQuery, "Expression must be a Hash: #{Errors::InvalidQuery.truncate_expr(criterion)}"
889
+ end
875
890
  criterion.each do |field, value|
876
891
  field_s = field.to_s
877
- if field_s.start_with?('$')
892
+ if field_s[0] == ?$
878
893
  # Query expression-level operator, like $and or $where
879
894
  query.add_operator_expression(field_s, value)
880
895
  else
@@ -84,16 +84,16 @@ module Mongoid
84
84
  # Evolves a multi-list selection, like an $and or $or criterion, and
85
85
  # performs the necessary serialization.
86
86
  #
87
- # @api private
88
- #
89
87
  # @example Evolve the multi-selection.
90
88
  # selector.evolve_multi([{ field: "value" }])
91
89
  #
92
- # @param [ Array<Hash> ] value The multi-selection.
90
+ # @param [ Array<Hash> ] specs The multi-selection.
93
91
  #
94
92
  # @return [ Array<Hash> ] The serialized values.
95
93
  #
96
94
  # @since 1.0.0
95
+ #
96
+ # @api private
97
97
  def evolve_multi(specs)
98
98
  unless specs.is_a?(Array)
99
99
  raise ArgumentError, "specs is not an array: #{specs.inspect}"
@@ -123,6 +123,10 @@ module Mongoid
123
123
  # {'foo' => {'$lt' => 5}}. This step should be done after all
124
124
  # value-based processing is complete.
125
125
  if key.is_a?(Key)
126
+ if serializer && evolved_value != value
127
+ raise NotImplementedError, "This method is not prepared to handle key being a Key and serializer being not nil"
128
+ end
129
+
126
130
  evolved_value = key.transform_value(evolved_value)
127
131
  end
128
132
 
@@ -38,7 +38,7 @@ module Mongoid
38
38
  raise ArgumentError, "Field must be a string: #{field}"
39
39
  end
40
40
 
41
- if field.start_with?('$')
41
+ if field[0] == ?$
42
42
  raise ArgumentError, "Field cannot be an operator (i.e. begin with $): #{field}"
43
43
  end
44
44
 
@@ -48,7 +48,7 @@ module Mongoid
48
48
  if value.is_a?(Hash) && selector[field].is_a?(Hash) &&
49
49
  value.keys.all? { |key|
50
50
  key_s = key.to_s
51
- key_s.start_with?('$') && !selector[field].key?(key_s)
51
+ key_s[0] == ?$ && !selector[field].key?(key_s)
52
52
  }
53
53
  then
54
54
  # Multiple operators can be combined on the same field by
@@ -74,7 +74,7 @@ module Mongoid
74
74
  #
75
75
  # This method takes the operator and the operator value expression
76
76
  # separately for callers' convenience. It can be considered to
77
- # handle storing the hash `{operator => op_expr}`.
77
+ # handle storing the hash +{operator => op_expr}+.
78
78
  #
79
79
  # If the selector consists of a single condition which is the specified
80
80
  # operator (on the top level), the new condition given in op_expr is
@@ -115,7 +115,7 @@ module Mongoid
115
115
  end
116
116
 
117
117
  unless op_expr.is_a?(Array)
118
- raise ArgumentError, "Operator value expression must be an array: #{op_expr}"
118
+ raise Errors::InvalidQuery, "#{operator} argument must be an array: #{Errors::InvalidQuery.truncate_expr(op_expr)}"
119
119
  end
120
120
 
121
121
  if selector.length == 1 && selector.keys.first == operator
@@ -141,7 +141,7 @@ module Mongoid
141
141
  #
142
142
  # This method takes the operator and the operator value expression
143
143
  # separately for callers' convenience. It can be considered to
144
- # handle storing the hash `{operator => op_expr}`.
144
+ # handle storing the hash +{operator => op_expr}+.
145
145
  #
146
146
  # The operator value can be of any type.
147
147
  #
@@ -185,7 +185,7 @@ module Mongoid
185
185
  raise ArgumentError, "Operator must be a string: #{operator}"
186
186
  end
187
187
 
188
- unless operator.start_with?('$')
188
+ unless operator[0] == ?$
189
189
  raise ArgumentError, "Operator must begin with $: #{operator}"
190
190
  end
191
191
 
@@ -220,7 +220,7 @@ module Mongoid
220
220
  raise ArgumentError, "Field must be a string: #{field}"
221
221
  end
222
222
 
223
- if field.start_with?('$')
223
+ if field[0] == ?$
224
224
  add_operator_expression(field, value)
225
225
  else
226
226
  add_field_expression(field, value)
@@ -20,9 +20,17 @@ module Mongoid
20
20
  # against the database.
21
21
  class Criteria
22
22
  include Enumerable
23
+
24
+ # @api private
25
+ alias :_enumerable_find :find
26
+
23
27
  include Contextual
24
28
  include Queryable
25
29
  include Findable
30
+
31
+ # @api private
32
+ alias :_findable_find :find
33
+
26
34
  include Inspectable
27
35
  include Includable
28
36
  include Marshalable
@@ -55,6 +63,48 @@ module Mongoid
55
63
  entries == other
56
64
  end
57
65
 
66
+ # Finds one or many documents given the provided _id values, or filters
67
+ # the documents in the current scope in the application process space
68
+ # after loading them if needed.
69
+ #
70
+ # If this method is not given a block, it delegates to +Findable#find+
71
+ # and finds one or many documents for the provided _id values.
72
+ #
73
+ # If this method is given a block, it delegates to +Enumerable#find+ and
74
+ # returns the first document of those found by the current Crieria object
75
+ # for which the block returns a truthy value.
76
+ #
77
+ # Note that the "default proc" argument of Enumerable is not specially
78
+ # treated by Mongoid - the decision between delegating to +Findable+ vs
79
+ # +Enumerable+ is made solely based on whether +find+ is passed a block.
80
+ #
81
+ # @example Finds a document by its _id, invokes Findable#find.
82
+ # critera.find("1234")
83
+ #
84
+ # @example Finds the first matching document using a block, invokes Enumerable#find.
85
+ # criteria.find { |item| item.name == "Depeche Mode" }
86
+ #
87
+ # @example Finds the first matching document using a block using the default Proc, invokes Enumerable#find.
88
+ # criteria.find(-> { "Default Band" }) { |item| item.name == "Milwaukee Mode" }
89
+ #
90
+ # @example Tries to find a document whose _id is the stringification of the provided Proc, typically failing.
91
+ # enumerator = criteria.find(-> { "Default Band" })
92
+ #
93
+ # @return [ Document | Array<Document> | nil ] A document or matching documents.
94
+ #
95
+ # @raise Errors::DocumentNotFound If the parameters were _id values and
96
+ # not all documents are found and the +raise_not_found_error+
97
+ # Mongoid configuration option is truthy.
98
+ #
99
+ # @see https://ruby-doc.org/core/Enumerable.html#method-i-find
100
+ def find(*args, &block)
101
+ if block_given?
102
+ _enumerable_find(*args, &block)
103
+ else
104
+ _findable_find(*args)
105
+ end
106
+ end
107
+
58
108
  # Needed to properly get a criteria back as json
59
109
  #
60
110
  # @example Get the criteria as json.
@@ -169,7 +219,7 @@ module Mongoid
169
219
  # @since 2.0.0
170
220
  def field_list
171
221
  if options[:fields]
172
- options[:fields].keys.reject{ |key| key == "_type" }
222
+ options[:fields].keys.reject{ |key| key == klass.discriminator_key }
173
223
  else
174
224
  []
175
225
  end
@@ -292,7 +342,7 @@ module Mongoid
292
342
  args.unshift(:_id)
293
343
  end
294
344
  if klass.hereditary?
295
- super(*args.push(:_type))
345
+ super(*args.push(klass.discriminator_key.to_sym))
296
346
  else
297
347
  super(*args)
298
348
  end
@@ -379,7 +429,7 @@ module Mongoid
379
429
  #
380
430
  # @return [ Criteria ] The cloned criteria.
381
431
  def type(types)
382
- any_in(_type: Array(types))
432
+ any_in(self.discriminator_key.to_sym => Array(types))
383
433
  end
384
434
 
385
435
  # This is the general entry point for most MongoDB queries. This either
@@ -518,7 +568,7 @@ module Mongoid
518
568
  # @return [ Object ] The result of the method call.
519
569
  #
520
570
  # @since 1.0.0
521
- ruby2_keywords def method_missing(name, *args, &block)
571
+ def method_missing(name, *args, &block)
522
572
  if klass.respond_to?(name)
523
573
  klass.send(:with_scope, self) do
524
574
  klass.send(name, *args, &block)
@@ -555,8 +605,8 @@ module Mongoid
555
605
  # @since 3.0.3
556
606
  def type_selectable?
557
607
  klass.hereditary? &&
558
- !selector.keys.include?("_type") &&
559
- !selector.keys.include?(:_type)
608
+ !selector.keys.include?(self.discriminator_key) &&
609
+ !selector.keys.include?(self.discriminator_key.to_sym)
560
610
  end
561
611
 
562
612
  # Get the selector for type selection.
@@ -572,9 +622,9 @@ module Mongoid
572
622
  def type_selection
573
623
  klasses = klass._types
574
624
  if klasses.size > 1
575
- { _type: { "$in" => klass._types }}
625
+ { klass.discriminator_key.to_sym => { "$in" => klass._types }}
576
626
  else
577
- { _type: klass._types[0] }
627
+ { klass.discriminator_key.to_sym => klass._types[0] }
578
628
  end
579
629
  end
580
630
 
@@ -194,8 +194,8 @@ module Mongoid
194
194
  #
195
195
  # @param [ Hash ] options The options.
196
196
  #
197
- # @option options [ true, false ] :compact (Deprecated) Whether to include fields
198
- # with nil values in the json document.
197
+ # @option options [ true, false ] :compact Whether to include fields with
198
+ # nil values in the json document.
199
199
  #
200
200
  # @return [ Hash ] The document as json.
201
201
  #
@@ -203,7 +203,6 @@ module Mongoid
203
203
  def as_json(options = nil)
204
204
  rv = super
205
205
  if options && options[:compact]
206
- Mongoid.logger.warn('#as_json :compact option is deprecated. Please call #compact on the returned Hash object instead.')
207
206
  rv = rv.compact
208
207
  end
209
208
  rv
@@ -230,13 +229,12 @@ module Mongoid
230
229
  became = klass.new(clone_document)
231
230
  became._id = _id
232
231
  became.instance_variable_set(:@changed_attributes, changed_attributes)
233
- new_errors = ActiveModel::Errors.new(became)
234
- new_errors.copy!(errors)
235
- became.instance_variable_set(:@errors, new_errors)
232
+ became.instance_variable_set(:@errors, ActiveModel::Errors.new(became))
233
+ became.errors.instance_variable_set(:@messages, errors.instance_variable_get(:@messages))
236
234
  became.instance_variable_set(:@new_record, new_record?)
237
235
  became.instance_variable_set(:@destroyed, destroyed?)
238
- became.changed_attributes["_type"] = self.class.to_s
239
- became._type = klass.to_s
236
+ became.changed_attributes[klass.discriminator_key] = self.class.discriminator_value
237
+ became[klass.discriminator_key] = klass.discriminator_value
240
238
 
241
239
  # mark embedded docs as persisted
242
240
  embedded_relations.each_pair do |name, meta|
@@ -355,7 +353,19 @@ module Mongoid
355
353
  #
356
354
  # @since 1.0.0
357
355
  def _types
358
- @_type ||= (descendants + [ self ]).uniq.map(&:to_s)
356
+ @_type ||= (descendants + [ self ]).uniq.map(&:discriminator_value)
357
+ end
358
+
359
+ # Clear the @_type cache. This is generally called when changing the discriminator
360
+ # key/value on a class.
361
+ #
362
+ # @example Get the types.
363
+ # document._mongoid_clear_types
364
+ #
365
+ # @api private
366
+ def _mongoid_clear_types
367
+ @_type = nil
368
+ superclass._mongoid_clear_types if hereditary?
359
369
  end
360
370
 
361
371
  # Set the i18n scope to overwrite ActiveModel.
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module Mongoid
5
+ module Errors
6
+
7
+ # Creates the exception raised when trying to set or get the
8
+ # discriminator key on a child class.
9
+ #
10
+ # @param [ String ] class_name The class name.
11
+ # @param [ String ] operator The class' superclass.
12
+ #
13
+ # @api private
14
+ class InvalidDiscriminatorKeyTarget < MongoidError
15
+ def initialize(class_name, superclass)
16
+ super(
17
+ compose_message(
18
+ "invalid_discriminator_key_target",
19
+ { class_name: class_name, superclass: superclass }
20
+ )
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module Mongoid
5
+ module Errors
6
+
7
+ # Raised when invalid field-level operator is passed to the $elemMatch
8
+ # embedded matcher.
9
+ class InvalidElemMatchOperator < InvalidQuery
10
+
11
+ # @api private
12
+ VALID_OPERATORS = %w(
13
+ and all eq exists gt gte in lt lte ne nin nor not or regex size
14
+ ).freeze
15
+
16
+ # Creates the exception.
17
+ #
18
+ # @param [ String ] operator The operator that was used.
19
+ #
20
+ # @api private
21
+ def initialize(operator)
22
+ @operator = operator
23
+ super(compose_message("invalid_elem_match_operator",
24
+ operator: operator,
25
+ valid_operators: VALID_OPERATORS.map { |op| "'$#{op}'" }.join(', '),
26
+ ))
27
+ end
28
+
29
+ # @return [ String ] The operator that was used.
30
+ attr_reader :operator
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module Mongoid
5
+ module Errors
6
+
7
+ class InvalidEstimatedCountCriteria < MongoidError
8
+
9
+ # Creates the exception raised when trying to call estimated_count
10
+ # on a filtered criteria.
11
+ #
12
+ # @param [ String ] class_name The klass of the criteria used to call
13
+ # estimated count.
14
+ #
15
+ # @api private
16
+ def initialize(class_name)
17
+ super(
18
+ compose_message(
19
+ "invalid_estimated_count_criteria",
20
+ { class_name: class_name }
21
+ )
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module Mongoid
5
+ module Errors
6
+
7
+ # Raised when invalid expression-level operator is passed to an
8
+ # embedded matcher.
9
+ class InvalidExpressionOperator < InvalidQuery
10
+
11
+ # Creates the exception.
12
+ #
13
+ # @param [ String ] operator The operator that was used.
14
+ #
15
+ # @api private
16
+ def initialize(operator)
17
+ @operator = operator
18
+ super(compose_message("invalid_expression_operator",
19
+ operator: operator,
20
+ valid_operators: "'$and', '$nor', '$or'",
21
+ ))
22
+ end
23
+
24
+ # @return [ String ] The operator that was used.
25
+ attr_reader :operator
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module Mongoid
5
+ module Errors
6
+
7
+ # Raised when invalid field-level operator is passed to an
8
+ # embedded matcher.
9
+ class InvalidFieldOperator < InvalidQuery
10
+
11
+ # @api private
12
+ VALID_OPERATORS = %w(
13
+ all elemMatch eq exists gt gte in lt lte ne nin not regex size
14
+ ).freeze
15
+
16
+ # Creates the exception.
17
+ #
18
+ # @param [ String ] operator The operator that was used.
19
+ #
20
+ # @api private
21
+ def initialize(operator)
22
+ @operator = operator
23
+ super(compose_message("invalid_field_operator",
24
+ operator: operator,
25
+ valid_operators: VALID_OPERATORS.map { |op| "'$#{op}'" }.join(', '),
26
+ ))
27
+ end
28
+
29
+ # @return [ String ] The operator that was used.
30
+ attr_reader :operator
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module Mongoid
5
+ module Errors
6
+
7
+ # Raised when invalid query is passed to an embedded matcher, or an
8
+ # invalid query fragment is passed to the query builder (Criteria object).
9
+ class InvalidQuery < MongoidError
10
+
11
+ # Create the new invalid query error.
12
+ #
13
+ # @api private
14
+ def initialize(msg)
15
+ super
16
+ end
17
+
18
+ # Stringifies the argument using #inspect and truncates the result to
19
+ # about 100 characters.
20
+ #
21
+ # @param [ Object ] expr An expression to stringify and truncate.
22
+ #
23
+ # @api private
24
+ def self.truncate_expr(expr)
25
+ unless expr.is_a?(String)
26
+ expr = expr.inspect
27
+ end
28
+
29
+ if expr.length > 103
30
+ expr = if expr =~ /\A<#((?:.|\n)*)>\z/
31
+ "<##{expr.slice(0, 97)}...>"
32
+ else
33
+ expr.slice(0, 100) + '...'
34
+ end
35
+ end
36
+
37
+ expr
38
+ end
39
+ end
40
+ end
41
+ end
@@ -48,7 +48,7 @@ module Mongoid
48
48
  #
49
49
  # @return [ String ] A localized error message string.
50
50
  def translate(key, options)
51
- ::I18n.translate("#{BASE_KEY}.#{key}", **options)
51
+ ::I18n.translate("#{BASE_KEY}.#{key}", options)
52
52
  end
53
53
 
54
54
  # Create the problem.
@@ -8,10 +8,8 @@ require "mongoid/errors/criteria_argument_required"
8
8
  require "mongoid/errors/document_not_destroyed"
9
9
  require "mongoid/errors/document_not_found"
10
10
  require "mongoid/errors/eager_load"
11
- require "mongoid/errors/empty_config_file"
12
11
  require "mongoid/errors/in_memory_collation_not_supported"
13
12
  require "mongoid/errors/invalid_collection"
14
- 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"
@@ -22,6 +20,13 @@ require "mongoid/errors/invalid_index"
22
20
  require "mongoid/errors/invalid_options"
23
21
  require "mongoid/errors/invalid_path"
24
22
  require "mongoid/errors/invalid_persistence_option"
23
+ require "mongoid/errors/invalid_query"
24
+ # Must be after invalid_query.
25
+ require "mongoid/errors/invalid_discriminator_key_target"
26
+ require "mongoid/errors/invalid_elem_match_operator"
27
+ require "mongoid/errors/invalid_estimated_count_criteria"
28
+ require "mongoid/errors/invalid_expression_operator"
29
+ require "mongoid/errors/invalid_field_operator"
25
30
  require "mongoid/errors/invalid_relation"
26
31
  require "mongoid/errors/invalid_relation_option"
27
32
  require "mongoid/errors/invalid_scope"
@@ -38,6 +38,7 @@ require "mongoid/extensions/range"
38
38
  require "mongoid/extensions/regexp"
39
39
  require "mongoid/extensions/set"
40
40
  require "mongoid/extensions/string"
41
+ require "mongoid/stringified_symbol"
41
42
  require "mongoid/extensions/symbol"
42
43
  require "mongoid/extensions/time"
43
44
  require "mongoid/extensions/time_with_zone"
@@ -7,10 +7,18 @@ module Mongoid
7
7
  module Factory
8
8
  extend self
9
9
 
10
+ # @deprecated
10
11
  TYPE = "_type".freeze
11
12
 
12
13
  # Builds a new +Document+ from the supplied attributes.
13
14
  #
15
+ # This method either instantiats klass or a descendant of klass if the attributes include
16
+ # klass' discriminator key.
17
+ #
18
+ # If the attributes contain the discriminator key (which is _type by default) and the
19
+ # discriminator value does not correspond to a descendant of klass then this method
20
+ # would create an instance of klass.
21
+ #
14
22
  # @example Build the document.
15
23
  # Mongoid::Factory.build(Person, { "name" => "Durran" })
16
24
  #
@@ -20,9 +28,10 @@ module Mongoid
20
28
  # @return [ Document ] The instantiated document.
21
29
  def build(klass, attributes = nil)
22
30
  attributes ||= {}
23
- type = attributes[TYPE] || attributes[TYPE.to_sym]
24
- if type && klass._types.include?(type)
25
- type.constantize.new(attributes)
31
+ dvalue = attributes[klass.discriminator_key] || attributes[klass.discriminator_key.to_sym]
32
+ type = klass.get_discriminator_mapping(dvalue)
33
+ if type
34
+ type.new(attributes)
26
35
  else
27
36
  klass.new(attributes)
28
37
  end
@@ -31,6 +40,10 @@ module Mongoid
31
40
  # Builds a new +Document+ from the supplied attributes loaded from the
32
41
  # database.
33
42
  #
43
+ # If the attributes contain the discriminator key (which is _type by default) and the
44
+ # discriminator value does not correspond to a descendant of klass then this method
45
+ # raises an UnknownModel error.
46
+ #
34
47
  # If a criteria object is given, it is used in two ways:
35
48
  # 1. If the criteria has a list of fields specified via #only,
36
49
  # only those fields are populated in the returned document.
@@ -54,7 +67,7 @@ module Mongoid
54
67
  if criteria
55
68
  selected_fields ||= criteria.options[:fields]
56
69
  end
57
- type = (attributes || {})[TYPE]
70
+ type = (attributes || {})[klass.discriminator_key]
58
71
  if type.blank?
59
72
  obj = klass.instantiate(attributes, selected_fields)
60
73
  if criteria && criteria.association && criteria.parent_document
@@ -62,13 +75,17 @@ module Mongoid
62
75
  end
63
76
  obj
64
77
  else
65
- camelized = type.camelize
78
+ constantized = klass.get_discriminator_mapping(type)
66
79
 
67
- # Check if the class exists
68
- begin
69
- constantized = camelized.constantize
70
- rescue NameError
71
- raise Errors::UnknownModel.new(camelized, type)
80
+ unless constantized
81
+ camelized = type.camelize
82
+
83
+ # Check if the class exists
84
+ begin
85
+ constantized = camelized.constantize
86
+ rescue NameError
87
+ raise Errors::UnknownModel.new(camelized, type)
88
+ end
72
89
  end
73
90
 
74
91
  # Check if the class is a Document class