mongoid 7.1.8 → 7.2.3

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 (437) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -3
  3. data.tar.gz.sig +0 -0
  4. data/README.md +9 -2
  5. data/lib/config/locales/en.yml +37 -1
  6. data/lib/mongoid.rb +23 -0
  7. data/lib/mongoid/association/depending.rb +1 -6
  8. data/lib/mongoid/association/many.rb +3 -3
  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 +36 -1
  12. data/lib/mongoid/association/referenced/has_many/proxy.rb +8 -1
  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/clients/factory.rb +17 -0
  17. data/lib/mongoid/composable.rb +1 -0
  18. data/lib/mongoid/config.rb +3 -0
  19. data/lib/mongoid/contextual/mongo.rb +23 -4
  20. data/lib/mongoid/copyable.rb +7 -3
  21. data/lib/mongoid/criteria.rb +57 -7
  22. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  23. data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
  24. data/lib/mongoid/criteria/queryable/selectable.rb +21 -6
  25. data/lib/mongoid/criteria/queryable/selector.rb +3 -3
  26. data/lib/mongoid/criteria/queryable/storable.rb +3 -3
  27. data/lib/mongoid/document.rb +15 -3
  28. data/lib/mongoid/errors.rb +7 -0
  29. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  30. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  31. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  32. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  33. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  34. data/lib/mongoid/errors/invalid_query.rb +41 -0
  35. data/lib/mongoid/extensions.rb +1 -0
  36. data/lib/mongoid/factory.rb +27 -10
  37. data/lib/mongoid/fields.rb +3 -0
  38. data/lib/mongoid/fields/validators/macro.rb +22 -9
  39. data/lib/mongoid/findable.rb +50 -14
  40. data/lib/mongoid/indexable.rb +2 -2
  41. data/lib/mongoid/matchable.rb +1 -149
  42. data/lib/mongoid/matcher.rb +103 -0
  43. data/lib/mongoid/matcher/all.rb +22 -0
  44. data/lib/mongoid/matcher/and.rb +21 -0
  45. data/lib/mongoid/matcher/elem_match.rb +36 -0
  46. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  47. data/lib/mongoid/matcher/eq.rb +11 -0
  48. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  49. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  50. data/lib/mongoid/matcher/exists.rb +15 -0
  51. data/lib/mongoid/matcher/expression.rb +31 -0
  52. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  53. data/lib/mongoid/matcher/field_expression.rb +62 -0
  54. data/lib/mongoid/matcher/field_operator.rb +48 -0
  55. data/lib/mongoid/matcher/gt.rb +17 -0
  56. data/lib/mongoid/matcher/gte.rb +17 -0
  57. data/lib/mongoid/matcher/in.rb +25 -0
  58. data/lib/mongoid/matcher/lt.rb +17 -0
  59. data/lib/mongoid/matcher/lte.rb +17 -0
  60. data/lib/mongoid/matcher/ne.rb +16 -0
  61. data/lib/mongoid/matcher/nin.rb +11 -0
  62. data/lib/mongoid/matcher/nor.rb +25 -0
  63. data/lib/mongoid/matcher/not.rb +29 -0
  64. data/lib/mongoid/matcher/or.rb +21 -0
  65. data/lib/mongoid/matcher/regex.rb +41 -0
  66. data/lib/mongoid/matcher/size.rb +26 -0
  67. data/lib/mongoid/persistable/deletable.rb +1 -1
  68. data/lib/mongoid/query_cache.rb +64 -62
  69. data/lib/mongoid/reloadable.rb +2 -2
  70. data/lib/mongoid/serializable.rb +1 -1
  71. data/lib/mongoid/stringified_symbol.rb +53 -0
  72. data/lib/mongoid/traversable.rb +111 -4
  73. data/lib/mongoid/version.rb +1 -1
  74. data/spec/README.md +19 -4
  75. data/spec/integration/associations/embedded_spec.rb +94 -0
  76. data/spec/integration/associations/has_many_spec.rb +67 -14
  77. data/spec/integration/associations/has_one_spec.rb +67 -14
  78. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  79. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  80. data/spec/integration/discriminator_key_spec.rb +354 -0
  81. data/spec/integration/discriminator_value_spec.rb +207 -0
  82. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  83. data/spec/integration/matcher_operator_data/all.yml +140 -0
  84. data/spec/integration/matcher_operator_data/and.yml +93 -0
  85. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  86. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  87. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  88. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  89. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  90. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  91. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  92. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  93. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  94. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  95. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  96. data/spec/integration/matcher_operator_data/in.yml +194 -0
  97. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  98. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  99. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  100. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  101. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  102. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  103. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  104. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  105. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  106. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  107. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  108. data/spec/integration/matcher_operator_data/not.yml +196 -0
  109. data/spec/integration/matcher_operator_data/or.yml +137 -0
  110. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  111. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  112. data/spec/integration/matcher_operator_data/size.yml +174 -0
  113. data/spec/integration/matcher_operator_spec.rb +100 -0
  114. data/spec/integration/matcher_spec.rb +189 -0
  115. data/spec/integration/server_query_spec.rb +142 -0
  116. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  117. data/spec/mongoid/association/depending_spec.rb +78 -26
  118. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  119. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  120. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  121. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
  122. data/spec/mongoid/association/referenced/has_many_models.rb +21 -0
  123. data/spec/mongoid/association/referenced/has_one_models.rb +21 -0
  124. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
  125. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  126. data/spec/mongoid/atomic_spec.rb +23 -0
  127. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  128. data/spec/mongoid/clients/factory_spec.rb +37 -0
  129. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  130. data/spec/mongoid/config_spec.rb +28 -0
  131. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  132. data/spec/mongoid/copyable_spec.rb +197 -18
  133. data/spec/mongoid/copyable_spec_models.rb +28 -0
  134. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  135. data/spec/mongoid/criteria_spec.rb +204 -39
  136. data/spec/mongoid/document_fields_spec.rb +26 -0
  137. data/spec/mongoid/document_spec.rb +89 -15
  138. data/spec/mongoid/equality_spec.rb +0 -1
  139. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  140. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  141. data/spec/mongoid/factory_spec.rb +261 -28
  142. data/spec/mongoid/fields_spec.rb +48 -2
  143. data/spec/mongoid/findable_spec.rb +32 -0
  144. data/spec/mongoid/indexable_spec.rb +28 -2
  145. data/spec/mongoid/inspectable_spec.rb +29 -2
  146. data/spec/mongoid/interceptable_spec.rb +2 -2
  147. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  148. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  149. data/spec/mongoid/matcher/extract_attribute_spec.rb +37 -0
  150. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  151. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  152. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  153. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  154. data/spec/mongoid/query_cache_spec.rb +442 -41
  155. data/spec/mongoid/reloadable_spec.rb +72 -0
  156. data/spec/mongoid/serializable_spec.rb +21 -3
  157. data/spec/mongoid/traversable_spec.rb +1100 -0
  158. data/spec/spec_helper.rb +2 -2
  159. data/spec/support/constraints.rb +24 -0
  160. data/spec/support/helpers.rb +1 -1
  161. data/spec/{app → support}/models/account.rb +0 -0
  162. data/spec/{app → support}/models/acolyte.rb +0 -0
  163. data/spec/{app → support}/models/actor.rb +1 -1
  164. data/spec/{app → support}/models/actress.rb +0 -0
  165. data/spec/{app → support}/models/address.rb +0 -0
  166. data/spec/{app → support}/models/address_component.rb +0 -0
  167. data/spec/{app → support}/models/address_number.rb +0 -0
  168. data/spec/{app → support}/models/agency.rb +0 -0
  169. data/spec/{app → support}/models/agent.rb +0 -0
  170. data/spec/{app → support}/models/album.rb +0 -0
  171. data/spec/{app → support}/models/alert.rb +0 -0
  172. data/spec/{app → support}/models/animal.rb +0 -0
  173. data/spec/{app → support}/models/answer.rb +0 -0
  174. data/spec/{app → support}/models/appointment.rb +0 -0
  175. data/spec/support/models/armrest.rb +10 -0
  176. data/spec/{app → support}/models/array_field.rb +0 -0
  177. data/spec/{app → support}/models/article.rb +0 -0
  178. data/spec/{app → support}/models/artist.rb +0 -0
  179. data/spec/{app → support}/models/artwork.rb +0 -0
  180. data/spec/{app → support}/models/audio.rb +0 -0
  181. data/spec/{app → support}/models/augmentation.rb +0 -0
  182. data/spec/{app → support}/models/author.rb +0 -0
  183. data/spec/{app → support}/models/baby.rb +0 -0
  184. data/spec/{app → support}/models/band.rb +0 -0
  185. data/spec/{app → support}/models/bar.rb +0 -0
  186. data/spec/{app → support}/models/basic.rb +0 -0
  187. data/spec/{app → support}/models/bed.rb +0 -0
  188. data/spec/{app → support}/models/big_palette.rb +0 -0
  189. data/spec/{app → support}/models/birthday.rb +0 -0
  190. data/spec/{app → support}/models/bomb.rb +0 -0
  191. data/spec/{app → support}/models/book.rb +0 -0
  192. data/spec/{app → support}/models/breed.rb +0 -0
  193. data/spec/{app → support}/models/browser.rb +1 -1
  194. data/spec/{app → support}/models/building.rb +0 -0
  195. data/spec/{app → support}/models/building_address.rb +0 -0
  196. data/spec/{app → support}/models/bus.rb +0 -0
  197. data/spec/{app → support}/models/business.rb +0 -0
  198. data/spec/{app → support}/models/callback_test.rb +0 -0
  199. data/spec/{app → support}/models/canvas.rb +1 -1
  200. data/spec/{app → support}/models/car.rb +0 -0
  201. data/spec/{app → support}/models/cat.rb +0 -0
  202. data/spec/{app → support}/models/category.rb +0 -0
  203. data/spec/{app → support}/models/child.rb +0 -0
  204. data/spec/{app → support}/models/child_doc.rb +0 -0
  205. data/spec/{app → support}/models/church.rb +0 -0
  206. data/spec/{app → support}/models/circle.rb +0 -0
  207. data/spec/{app → support}/models/circuit.rb +0 -0
  208. data/spec/{app → support}/models/circus.rb +0 -0
  209. data/spec/{app → support}/models/code.rb +0 -0
  210. data/spec/{app → support}/models/coding.rb +1 -1
  211. data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  212. data/spec/{app → support}/models/comment.rb +0 -0
  213. data/spec/{app → support}/models/company.rb +0 -0
  214. data/spec/{app → support}/models/consumption_period.rb +0 -0
  215. data/spec/{app → support}/models/contextable_item.rb +0 -0
  216. data/spec/{app → support}/models/contractor.rb +0 -0
  217. data/spec/{app → support}/models/cookie.rb +0 -0
  218. data/spec/{app → support}/models/country_code.rb +0 -0
  219. data/spec/{app → support}/models/courier_job.rb +0 -0
  220. data/spec/support/models/crate.rb +13 -0
  221. data/spec/{app → support}/models/customer.rb +0 -0
  222. data/spec/{app → support}/models/customer_address.rb +0 -0
  223. data/spec/support/models/deed.rb +8 -0
  224. data/spec/{app → support}/models/definition.rb +0 -0
  225. data/spec/{app → support}/models/delegating_patient.rb +0 -0
  226. data/spec/{app → support}/models/description.rb +0 -0
  227. data/spec/{app → support}/models/dictionary.rb +0 -0
  228. data/spec/{app → support}/models/division.rb +0 -0
  229. data/spec/{app → support}/models/doctor.rb +0 -0
  230. data/spec/{app → support}/models/dog.rb +0 -0
  231. data/spec/{app → support}/models/dokument.rb +0 -0
  232. data/spec/{app → support}/models/draft.rb +0 -0
  233. data/spec/{app → support}/models/dragon.rb +0 -0
  234. data/spec/{app → support}/models/driver.rb +1 -1
  235. data/spec/{app → support}/models/drug.rb +0 -0
  236. data/spec/{app → support}/models/dungeon.rb +0 -0
  237. data/spec/{app → support}/models/edit.rb +0 -0
  238. data/spec/{app → support}/models/email.rb +0 -0
  239. data/spec/{app → support}/models/employer.rb +0 -0
  240. data/spec/{app → support}/models/entry.rb +0 -0
  241. data/spec/{app → support}/models/eraser.rb +0 -0
  242. data/spec/{app → support}/models/even.rb +0 -0
  243. data/spec/{app → support}/models/event.rb +0 -0
  244. data/spec/{app → support}/models/exhibition.rb +0 -0
  245. data/spec/{app → support}/models/exhibitor.rb +0 -0
  246. data/spec/{app → support}/models/explosion.rb +0 -0
  247. data/spec/{app → support}/models/eye.rb +0 -0
  248. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  249. data/spec/{app → support}/models/face.rb +0 -0
  250. data/spec/{app → support}/models/favorite.rb +0 -0
  251. data/spec/{app → support}/models/filesystem.rb +0 -0
  252. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  253. data/spec/{app → support}/models/firefox.rb +0 -0
  254. data/spec/{app → support}/models/fish.rb +0 -0
  255. data/spec/{app → support}/models/folder.rb +0 -0
  256. data/spec/{app → support}/models/folder_item.rb +0 -0
  257. data/spec/{app → support}/models/fruits.rb +0 -0
  258. data/spec/{app → support}/models/game.rb +0 -0
  259. data/spec/{app → support}/models/ghost.rb +0 -0
  260. data/spec/support/models/guitar.rb +5 -0
  261. data/spec/{app → support}/models/home.rb +0 -0
  262. data/spec/{app → support}/models/house.rb +0 -0
  263. data/spec/{app → support}/models/html_writer.rb +0 -0
  264. data/spec/{app → support}/models/id_key.rb +0 -0
  265. data/spec/support/models/idnodef.rb +8 -0
  266. data/spec/{app → support}/models/image.rb +0 -0
  267. data/spec/{app → support}/models/implant.rb +0 -0
  268. data/spec/support/models/instrument.rb +9 -0
  269. data/spec/{app → support}/models/item.rb +1 -1
  270. data/spec/{app → support}/models/jar.rb +0 -0
  271. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  272. data/spec/{app → support}/models/kangaroo.rb +0 -0
  273. data/spec/{app → support}/models/label.rb +0 -0
  274. data/spec/{app → support}/models/language.rb +0 -0
  275. data/spec/{app → support}/models/lat_lng.rb +0 -0
  276. data/spec/{app → support}/models/league.rb +0 -0
  277. data/spec/{app → support}/models/learner.rb +0 -0
  278. data/spec/{app → support}/models/line_item.rb +0 -0
  279. data/spec/{app → support}/models/location.rb +0 -0
  280. data/spec/{app → support}/models/login.rb +0 -0
  281. data/spec/{app → support}/models/manufacturer.rb +0 -0
  282. data/spec/{app → support}/models/meat.rb +0 -0
  283. data/spec/{app → support}/models/membership.rb +0 -0
  284. data/spec/{app → support}/models/message.rb +0 -0
  285. data/spec/{app → support}/models/minim.rb +0 -0
  286. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  287. data/spec/support/models/mop.rb +26 -0
  288. data/spec/{app → support}/models/movie.rb +0 -0
  289. data/spec/{app → support}/models/my_hash.rb +0 -0
  290. data/spec/{app → support}/models/name.rb +0 -0
  291. data/spec/{app → support}/models/name_only.rb +0 -0
  292. data/spec/{app → support}/models/node.rb +0 -0
  293. data/spec/{app → support}/models/note.rb +0 -0
  294. data/spec/{app → support}/models/odd.rb +0 -0
  295. data/spec/support/models/order.rb +11 -0
  296. data/spec/{app → support}/models/ordered_post.rb +0 -0
  297. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  298. data/spec/{app → support}/models/oscar.rb +0 -0
  299. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  300. data/spec/{app → support}/models/override.rb +0 -0
  301. data/spec/{app → support}/models/ownable.rb +0 -0
  302. data/spec/{app → support}/models/owner.rb +2 -0
  303. data/spec/{app → support}/models/pack.rb +0 -0
  304. data/spec/{app → support}/models/page.rb +0 -0
  305. data/spec/{app → support}/models/page_question.rb +0 -0
  306. data/spec/{app → support}/models/palette.rb +1 -1
  307. data/spec/{app → support}/models/parent.rb +0 -0
  308. data/spec/{app → support}/models/parent_doc.rb +0 -0
  309. data/spec/{app → support}/models/passport.rb +0 -0
  310. data/spec/{app → support}/models/patient.rb +0 -0
  311. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  312. data/spec/{app → support}/models/pencil.rb +0 -0
  313. data/spec/{app → support}/models/person.rb +1 -1
  314. data/spec/{app → support}/models/pet.rb +0 -0
  315. data/spec/{app → support}/models/pet_owner.rb +0 -0
  316. data/spec/{app → support}/models/phone.rb +0 -0
  317. data/spec/support/models/piano.rb +5 -0
  318. data/spec/{app → support}/models/pizza.rb +0 -0
  319. data/spec/{app → support}/models/player.rb +0 -0
  320. data/spec/{app → support}/models/post.rb +0 -0
  321. data/spec/{app → support}/models/post_genre.rb +0 -0
  322. data/spec/{app → support}/models/powerup.rb +0 -0
  323. data/spec/{app → support}/models/preference.rb +0 -0
  324. data/spec/{app → support}/models/princess.rb +0 -0
  325. data/spec/{app → support}/models/product.rb +0 -0
  326. data/spec/support/models/profile.rb +18 -0
  327. data/spec/{app → support}/models/pronunciation.rb +0 -0
  328. data/spec/{app → support}/models/pub.rb +0 -0
  329. data/spec/support/models/publication.rb +5 -0
  330. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  331. data/spec/{app → support}/models/publication/review.rb +0 -0
  332. data/spec/{app → support}/models/purchase.rb +0 -0
  333. data/spec/{app → support}/models/question.rb +0 -0
  334. data/spec/{app → support}/models/quiz.rb +0 -0
  335. data/spec/{app → support}/models/rating.rb +0 -0
  336. data/spec/{app → support}/models/record.rb +0 -0
  337. data/spec/{app → support}/models/registry.rb +0 -0
  338. data/spec/{app → support}/models/role.rb +0 -0
  339. data/spec/{app → support}/models/root_category.rb +0 -0
  340. data/spec/{app → support}/models/sandwich.rb +0 -0
  341. data/spec/{app → support}/models/scheduler.rb +0 -0
  342. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  343. data/spec/support/models/seat.rb +25 -0
  344. data/spec/{app → support}/models/seo.rb +0 -0
  345. data/spec/{app → support}/models/series.rb +0 -0
  346. data/spec/{app → support}/models/server.rb +0 -0
  347. data/spec/{app → support}/models/service.rb +0 -0
  348. data/spec/{app → support}/models/shape.rb +2 -2
  349. data/spec/{app → support}/models/shelf.rb +0 -0
  350. data/spec/{app → support}/models/shipment_address.rb +0 -0
  351. data/spec/{app → support}/models/shipping_container.rb +0 -0
  352. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  353. data/spec/{app → support}/models/shop.rb +0 -0
  354. data/spec/{app → support}/models/short_agent.rb +0 -0
  355. data/spec/{app → support}/models/short_quiz.rb +0 -0
  356. data/spec/{app → support}/models/simple.rb +0 -0
  357. data/spec/{app → support}/models/slave.rb +0 -0
  358. data/spec/{app → support}/models/song.rb +0 -0
  359. data/spec/{app → support}/models/sound.rb +0 -0
  360. data/spec/{app → support}/models/square.rb +0 -0
  361. data/spec/{app → support}/models/staff.rb +0 -0
  362. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  363. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  364. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  365. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  366. data/spec/{app → support}/models/strategy.rb +0 -0
  367. data/spec/{app → support}/models/sub_item.rb +0 -0
  368. data/spec/{app → support}/models/subscription.rb +0 -0
  369. data/spec/{app → support}/models/survey.rb +0 -0
  370. data/spec/{app → support}/models/symptom.rb +0 -0
  371. data/spec/support/models/system_role.rb +7 -0
  372. data/spec/{app → support}/models/tag.rb +0 -0
  373. data/spec/{app → support}/models/target.rb +0 -0
  374. data/spec/{app → support}/models/template.rb +0 -0
  375. data/spec/{app → support}/models/thing.rb +0 -0
  376. data/spec/{app → support}/models/title.rb +0 -0
  377. data/spec/{app → support}/models/tool.rb +2 -2
  378. data/spec/{app → support}/models/topping.rb +0 -0
  379. data/spec/support/models/toy.rb +10 -0
  380. data/spec/{app → support}/models/track.rb +0 -0
  381. data/spec/{app → support}/models/translation.rb +0 -0
  382. data/spec/{app → support}/models/tree.rb +0 -0
  383. data/spec/{app → support}/models/truck.rb +2 -0
  384. data/spec/{app → support}/models/updatable.rb +0 -0
  385. data/spec/{app → support}/models/user.rb +0 -0
  386. data/spec/{app → support}/models/user_account.rb +0 -0
  387. data/spec/{app → support}/models/validation_callback.rb +0 -0
  388. data/spec/{app → support}/models/vehicle.rb +7 -2
  389. data/spec/{app → support}/models/version.rb +0 -0
  390. data/spec/{app → support}/models/vertex.rb +0 -0
  391. data/spec/{app → support}/models/vet_visit.rb +0 -0
  392. data/spec/{app → support}/models/video.rb +0 -0
  393. data/spec/{app → support}/models/video_game.rb +0 -0
  394. data/spec/{app → support}/models/weapon.rb +0 -0
  395. data/spec/{app → support}/models/wiki_page.rb +0 -0
  396. data/spec/{app → support}/models/word.rb +0 -0
  397. data/spec/{app → support}/models/word_origin.rb +0 -0
  398. data/spec/{app → support}/models/writer.rb +2 -2
  399. data/spec/support/spec_config.rb +1 -1
  400. metadata +617 -508
  401. metadata.gz.sig +3 -4
  402. data/lib/mongoid/matchable/all.rb +0 -30
  403. data/lib/mongoid/matchable/and.rb +0 -32
  404. data/lib/mongoid/matchable/default.rb +0 -121
  405. data/lib/mongoid/matchable/elem_match.rb +0 -36
  406. data/lib/mongoid/matchable/eq.rb +0 -23
  407. data/lib/mongoid/matchable/exists.rb +0 -25
  408. data/lib/mongoid/matchable/gt.rb +0 -25
  409. data/lib/mongoid/matchable/gte.rb +0 -25
  410. data/lib/mongoid/matchable/in.rb +0 -26
  411. data/lib/mongoid/matchable/lt.rb +0 -25
  412. data/lib/mongoid/matchable/lte.rb +0 -25
  413. data/lib/mongoid/matchable/ne.rb +0 -23
  414. data/lib/mongoid/matchable/nin.rb +0 -24
  415. data/lib/mongoid/matchable/nor.rb +0 -38
  416. data/lib/mongoid/matchable/or.rb +0 -35
  417. data/lib/mongoid/matchable/regexp.rb +0 -30
  418. data/lib/mongoid/matchable/size.rb +0 -23
  419. data/spec/app/models/publication.rb +0 -5
  420. data/spec/mongoid/matchable/all_spec.rb +0 -34
  421. data/spec/mongoid/matchable/and_spec.rb +0 -190
  422. data/spec/mongoid/matchable/default_spec.rb +0 -140
  423. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  424. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  425. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  426. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  427. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  428. data/spec/mongoid/matchable/in_spec.rb +0 -52
  429. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  430. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  431. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  432. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  433. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  434. data/spec/mongoid/matchable/or_spec.rb +0 -134
  435. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  436. data/spec/mongoid/matchable/size_spec.rb +0 -28
  437. data/spec/mongoid/matchable_spec.rb +0 -856
@@ -6,6 +6,7 @@ module CopyableSpec
6
6
  include Mongoid::Document
7
7
 
8
8
  embeds_many :locations
9
+ embeds_many :influencers
9
10
  end
10
11
 
11
12
  class Location
@@ -17,4 +18,31 @@ module CopyableSpec
17
18
  class Building
18
19
  include Mongoid::Document
19
20
  end
21
+
22
+ class Influencer
23
+ include Mongoid::Document
24
+
25
+ embeds_many :blurbs
26
+ end
27
+
28
+ class Youtuber < Influencer
29
+ end
30
+
31
+ class Blurb
32
+ include Mongoid::Document
33
+ end
34
+
35
+ # Do not include Attributes::Dynamic
36
+ class Reg
37
+ include Mongoid::Document
38
+
39
+ field :name, type: String
40
+ end
41
+
42
+ class Dyn
43
+ include Mongoid::Document
44
+ include Mongoid::Attributes::Dynamic
45
+
46
+ field :name, type: String
47
+ end
20
48
  end
@@ -732,108 +732,89 @@ describe Mongoid::Criteria::Queryable::Selectable do
732
732
  end
733
733
  end
734
734
 
735
- describe "#geo_spacial" do
735
+ %i(geo_spatial geo_spacial).each do |meth|
736
+ describe "#geo_spacial" do
736
737
 
737
- let(:query_method) { :geo_spacial }
738
+ let(:query_method) { meth }
738
739
 
739
- it_behaves_like 'requires an argument'
740
- it_behaves_like 'requires a non-nil argument'
740
+ it_behaves_like 'requires an argument'
741
+ it_behaves_like 'requires a non-nil argument'
741
742
 
742
- context "when provided a criterion" do
743
+ context "when provided a criterion" do
743
744
 
744
- context "when the geometry is a point intersection" do
745
+ context "when the geometry is a point intersection" do
745
746
 
746
- let(:selection) do
747
- query.geo_spacial(:location.intersects_point => [ 1, 10 ])
748
- end
747
+ let(:selection) do
748
+ query.public_send(query_method, :location.intersects_point => [ 1, 10 ])
749
+ end
749
750
 
750
- it "adds the $geoIntersects expression" do
751
- expect(selection.selector).to eq({
752
- "location" => {
753
- "$geoIntersects" => {
754
- "$geometry" => {
755
- "type" => "Point",
756
- "coordinates" => [ 1, 10 ]
751
+ it "adds the $geoIntersects expression" do
752
+ expect(selection.selector).to eq({
753
+ "location" => {
754
+ "$geoIntersects" => {
755
+ "$geometry" => {
756
+ "type" => "Point",
757
+ "coordinates" => [ 1, 10 ]
758
+ }
757
759
  }
758
760
  }
759
- }
760
- })
761
- end
761
+ })
762
+ end
762
763
 
763
- it_behaves_like "returns a cloned query"
764
- end
764
+ it_behaves_like "returns a cloned query"
765
+ end
765
766
 
766
- context "when the geometry is a line intersection" do
767
+ context "when the geometry is a line intersection" do
767
768
 
768
- let(:selection) do
769
- query.geo_spacial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
770
- end
769
+ let(:selection) do
770
+ query.public_send(query_method, :location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
771
+ end
771
772
 
772
- it "adds the $geoIntersects expression" do
773
- expect(selection.selector).to eq({
774
- "location" => {
775
- "$geoIntersects" => {
776
- "$geometry" => {
777
- "type" => "LineString",
778
- "coordinates" => [[ 1, 10 ], [ 2, 10 ]]
773
+ it "adds the $geoIntersects expression" do
774
+ expect(selection.selector).to eq({
775
+ "location" => {
776
+ "$geoIntersects" => {
777
+ "$geometry" => {
778
+ "type" => "LineString",
779
+ "coordinates" => [[ 1, 10 ], [ 2, 10 ]]
780
+ }
779
781
  }
780
782
  }
781
- }
782
- })
783
- end
783
+ })
784
+ end
784
785
 
785
- it_behaves_like "returns a cloned query"
786
- end
786
+ it_behaves_like "returns a cloned query"
787
+ end
787
788
 
788
- context "when the geometry is a polygon intersection" do
789
+ context "when the geometry is a polygon intersection" do
789
790
 
790
- let(:selection) do
791
- query.geo_spacial(
792
- :location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
793
- )
794
- end
791
+ let(:selection) do
792
+ query.public_send(query_method,
793
+ :location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
794
+ )
795
+ end
795
796
 
796
- it "adds the $geoIntersects expression" do
797
- expect(selection.selector).to eq({
798
- "location" => {
799
- "$geoIntersects" => {
800
- "$geometry" => {
801
- "type" => "Polygon",
802
- "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
797
+ it "adds the $geoIntersects expression" do
798
+ expect(selection.selector).to eq({
799
+ "location" => {
800
+ "$geoIntersects" => {
801
+ "$geometry" => {
802
+ "type" => "Polygon",
803
+ "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
804
+ }
803
805
  }
804
806
  }
805
- }
806
- })
807
- end
808
-
809
- it_behaves_like "returns a cloned query"
810
- end
811
-
812
- context "when the geometry is within a polygon" do
807
+ })
808
+ end
813
809
 
814
- let(:selection) do
815
- query.geo_spacial(
816
- :location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
817
- )
810
+ it_behaves_like "returns a cloned query"
818
811
  end
819
812
 
820
- it "adds the $geoIntersects expression" do
821
- expect(selection.selector).to eq({
822
- "location" => {
823
- "$geoWithin" => {
824
- "$geometry" => {
825
- "type" => "Polygon",
826
- "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
827
- }
828
- }
829
- }
830
- })
831
- end
813
+ context "when the geometry is within a polygon" do
832
814
 
833
- context "when used with the $box operator ($geoWithin query) " do
834
815
  let(:selection) do
835
- query.geo_spacial(
836
- :location.within_box => [[ 1, 10 ], [ 2, 10 ]]
816
+ query.public_send(query_method,
817
+ :location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
837
818
  )
838
819
  end
839
820
 
@@ -841,16 +822,37 @@ describe Mongoid::Criteria::Queryable::Selectable do
841
822
  expect(selection.selector).to eq({
842
823
  "location" => {
843
824
  "$geoWithin" => {
844
- "$box" => [
845
- [ 1, 10 ], [ 2, 10 ]
846
- ]
825
+ "$geometry" => {
826
+ "type" => "Polygon",
827
+ "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
828
+ }
847
829
  }
848
830
  }
849
831
  })
850
832
  end
851
- end
852
833
 
853
- it_behaves_like "returns a cloned query"
834
+ context "when used with the $box operator ($geoWithin query) " do
835
+ let(:selection) do
836
+ query.public_send(query_method,
837
+ :location.within_box => [[ 1, 10 ], [ 2, 10 ]]
838
+ )
839
+ end
840
+
841
+ it "adds the $geoIntersects expression" do
842
+ expect(selection.selector).to eq({
843
+ "location" => {
844
+ "$geoWithin" => {
845
+ "$box" => [
846
+ [ 1, 10 ], [ 2, 10 ]
847
+ ]
848
+ }
849
+ }
850
+ })
851
+ end
852
+ end
853
+
854
+ it_behaves_like "returns a cloned query"
855
+ end
854
856
  end
855
857
  end
856
858
  end
@@ -786,12 +786,72 @@ describe Mongoid::Criteria do
786
786
 
787
787
  describe "#field_list" do
788
788
 
789
+ context "when using the default discriminator key" do
790
+ let(:criteria) do
791
+ Doctor.only(:_id)
792
+ end
793
+
794
+ it "returns the fields with required _id minus type" do
795
+ expect(criteria.field_list).to eq([ "_id" ])
796
+ end
797
+ end
798
+
799
+ context "when using a custom discriminator key" do
800
+ before do
801
+ Person.discriminator_key = "dkey"
802
+ end
803
+
804
+ after do
805
+ Person.discriminator_key = nil
806
+ end
807
+
808
+ let(:criteria) do
809
+ Doctor.only(:_id, :_type)
810
+ end
811
+
812
+ it "returns the fields with type without dkey" do
813
+ expect(criteria.field_list).to eq([ "_id", "_type" ])
814
+ end
815
+ end
816
+ end
817
+
818
+ describe "#find" do
819
+ let!(:depeche) do
820
+ Band.create!(name: "Depeche Mode")
821
+ end
822
+
789
823
  let(:criteria) do
790
- Band.only(:name)
824
+ Band.where(name: "Depeche Mode")
791
825
  end
792
826
 
793
- it "returns the fields with required _id minus type" do
794
- expect(criteria.field_list).to eq([ "_id", "name" ])
827
+ context "when given a block" do
828
+ it "behaves as Enumerable" do
829
+ result = criteria.find { |c| c.name == "Depeche Mode" }
830
+ expect(result).to eq(depeche)
831
+ end
832
+ end
833
+
834
+ context "when given a Proc and a block" do
835
+ it "behaves as Enumerable" do
836
+ result = criteria.find(-> {"default"}) { |c| c.name == "Not Depeche Mode" }
837
+ expect(result).to eq("default")
838
+ end
839
+ end
840
+
841
+ context "when given a Proc" do
842
+ it "behaves as Enumerable" do
843
+ lambda do
844
+ criteria.find(-> {"default"})
845
+ # Proc is not serializable to a BSON type
846
+ end.should raise_error(BSON::Error::UnserializableClass)
847
+ end
848
+ end
849
+
850
+ context "when given an id" do
851
+ it "behaves as Findable" do
852
+ result = criteria.find(depeche.id)
853
+ expect(result).to eq(depeche)
854
+ end
795
855
  end
796
856
  end
797
857
 
@@ -2804,13 +2864,36 @@ describe Mongoid::Criteria do
2804
2864
  end
2805
2865
 
2806
2866
  context "when using inheritance" do
2867
+ context "when using the default discriminator key" do
2868
+ let(:criteria) do
2869
+ Doctor.only(:_id)
2870
+ end
2807
2871
 
2808
- let(:criteria) do
2809
- Doctor.only(:_id)
2872
+ it "adds _type to the fields" do
2873
+ expect(criteria.options[:fields]).to include("_type")
2874
+ end
2810
2875
  end
2811
2876
 
2812
- it "adds _type to the fields" do
2813
- expect(criteria.options[:fields]["_type"]).to eq(1)
2877
+ context "when setting a custom discriminator key" do
2878
+ before do
2879
+ Person.discriminator_key = "dkey"
2880
+ end
2881
+
2882
+ after do
2883
+ Person.discriminator_key = nil
2884
+ end
2885
+
2886
+ let(:criteria) do
2887
+ Doctor.only(:_id)
2888
+ end
2889
+
2890
+ it "adds custom discriminator key to the fields" do
2891
+ expect(criteria.options[:fields]).to include("dkey")
2892
+ end
2893
+
2894
+ it "does not add _type to the fields" do
2895
+ expect(criteria.options[:fields]).to_not include("_type")
2896
+ end
2814
2897
  end
2815
2898
  end
2816
2899
 
@@ -3386,34 +3469,75 @@ describe Mongoid::Criteria do
3386
3469
  end
3387
3470
 
3388
3471
  describe "#type" do
3472
+ context "when using the default discriminator_key" do
3473
+ context "when the type is a string" do
3389
3474
 
3390
- context "when the type is a string" do
3475
+ let!(:browser) do
3476
+ Browser.create
3477
+ end
3391
3478
 
3392
- let!(:browser) do
3393
- Browser.create
3394
- end
3479
+ let(:criteria) do
3480
+ Canvas.all.type("Browser")
3481
+ end
3395
3482
 
3396
- let(:criteria) do
3397
- Canvas.all.type("Browser")
3483
+ it "returns documents with the provided type" do
3484
+ expect(criteria).to eq([ browser ])
3485
+ end
3398
3486
  end
3399
3487
 
3400
- it "returns documents with the provided type" do
3401
- expect(criteria).to eq([ browser ])
3488
+ context "when the type is an Array of type" do
3489
+
3490
+ let!(:browser) do
3491
+ Firefox.create
3492
+ end
3493
+
3494
+ let(:criteria) do
3495
+ Canvas.all.type([ "Browser", "Firefox" ])
3496
+ end
3497
+
3498
+ it "returns documents with the provided types" do
3499
+ expect(criteria).to eq([ browser ])
3500
+ end
3402
3501
  end
3403
3502
  end
3404
3503
 
3405
- context "when the type is an Array of type" do
3504
+ context "when using a custom discriminator_key" do
3505
+ before do
3506
+ Canvas.discriminator_key = "dkey"
3507
+ end
3406
3508
 
3407
- let!(:browser) do
3408
- Firefox.create
3509
+ after do
3510
+ Canvas.discriminator_key = nil
3409
3511
  end
3410
3512
 
3411
- let(:criteria) do
3412
- Canvas.all.type([ "Browser", "Firefox" ])
3513
+ context "when the type is a string" do
3514
+
3515
+ let!(:browser) do
3516
+ Browser.create
3517
+ end
3518
+
3519
+ let(:criteria) do
3520
+ Canvas.all.type("Browser")
3521
+ end
3522
+
3523
+ it "returns documents with the provided type" do
3524
+ expect(criteria).to eq([ browser ])
3525
+ end
3413
3526
  end
3414
3527
 
3415
- it "returns documents with the provided types" do
3416
- expect(criteria).to eq([ browser ])
3528
+ context "when the type is an Array of type" do
3529
+
3530
+ let!(:browser) do
3531
+ Firefox.create
3532
+ end
3533
+
3534
+ let(:criteria) do
3535
+ Canvas.all.type([ "Browser", "Firefox" ])
3536
+ end
3537
+
3538
+ it "returns documents with the provided types" do
3539
+ expect(criteria).to eq([ browser ])
3540
+ end
3417
3541
  end
3418
3542
  end
3419
3543
  end
@@ -3735,7 +3859,7 @@ describe Mongoid::Criteria do
3735
3859
  end
3736
3860
  end
3737
3861
 
3738
- describe "#geo_spacial" do
3862
+ describe "#geo_spatial" do
3739
3863
 
3740
3864
  context "when checking within a polygon" do
3741
3865
 
@@ -3748,7 +3872,7 @@ describe Mongoid::Criteria do
3748
3872
  end
3749
3873
 
3750
3874
  let(:criteria) do
3751
- Bar.geo_spacial(
3875
+ Bar.geo_spatial(
3752
3876
  :location.within_polygon => [[[ 50, 10 ], [ 50, 20 ], [ 60, 20 ], [ 60, 10 ], [ 50, 10 ]]]
3753
3877
  )
3754
3878
  end
@@ -3832,34 +3956,75 @@ describe Mongoid::Criteria do
3832
3956
  end
3833
3957
 
3834
3958
  describe "#type_selection" do
3959
+ context "when using the default discriminator_key" do
3960
+ context "when only one subclass exists" do
3835
3961
 
3836
- context "when only one subclass exists" do
3962
+ let(:criteria) do
3963
+ described_class.new(Firefox)
3964
+ end
3837
3965
 
3838
- let(:criteria) do
3839
- described_class.new(Firefox)
3840
- end
3966
+ let(:selection) do
3967
+ criteria.send(:type_selection)
3968
+ end
3841
3969
 
3842
- let(:selection) do
3843
- criteria.send(:type_selection)
3970
+ it "does not use an $in query" do
3971
+ expect(selection).to eq({ _type: "Firefox" })
3972
+ end
3844
3973
  end
3845
3974
 
3846
- it "does not use an $in query" do
3847
- expect(selection).to eq({ _type: "Firefox" })
3975
+ context "when more than one subclass exists" do
3976
+
3977
+ let(:criteria) do
3978
+ described_class.new(Browser)
3979
+ end
3980
+
3981
+ let(:selection) do
3982
+ criteria.send(:type_selection)
3983
+ end
3984
+
3985
+ it "does not use an $in query" do
3986
+ expect(selection).to eq({ _type: { "$in" => [ "Firefox", "Browser" ]}})
3987
+ end
3848
3988
  end
3849
3989
  end
3850
3990
 
3851
- context "when more than one subclass exists" do
3991
+ context "when using a custom discriminator_key" do
3992
+ before do
3993
+ Canvas.discriminator_key = "dkey"
3994
+ end
3852
3995
 
3853
- let(:criteria) do
3854
- described_class.new(Browser)
3996
+ after do
3997
+ Canvas.discriminator_key = nil
3855
3998
  end
3856
3999
 
3857
- let(:selection) do
3858
- criteria.send(:type_selection)
4000
+ context "when only one subclass exists" do
4001
+
4002
+ let(:criteria) do
4003
+ described_class.new(Firefox)
4004
+ end
4005
+
4006
+ let(:selection) do
4007
+ criteria.send(:type_selection)
4008
+ end
4009
+
4010
+ it "does not use an $in query" do
4011
+ expect(selection).to eq({ dkey: "Firefox" })
4012
+ end
3859
4013
  end
3860
4014
 
3861
- it "does not use an $in query" do
3862
- expect(selection).to eq({ _type: { "$in" => [ "Firefox", "Browser" ]}})
4015
+ context "when more than one subclass exists" do
4016
+
4017
+ let(:criteria) do
4018
+ described_class.new(Browser)
4019
+ end
4020
+
4021
+ let(:selection) do
4022
+ criteria.send(:type_selection)
4023
+ end
4024
+
4025
+ it "does not use an $in query" do
4026
+ expect(selection).to eq({ dkey: { "$in" => [ "Firefox", "Browser" ]}})
4027
+ end
3863
4028
  end
3864
4029
  end
3865
4030
  end