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
@@ -0,0 +1,103 @@
1
+ module Mongoid
2
+
3
+ # @api private
4
+ module Matcher
5
+
6
+ # Extracts field values in the document at the specified key.
7
+ #
8
+ # The document can be a Hash or a model instance.
9
+ #
10
+ # The key is a valid MongoDB dot notation key. The following use cases are
11
+ # supported:
12
+ #
13
+ # - Simple field traversal (`foo`) - retrieves the field `foo` in the
14
+ # current document.
15
+ # - Hash/embedded document field traversal (`foo.bar`) - retrieves the
16
+ # field `foo` in the current document, then retrieves the field `bar`
17
+ # from the value of `foo`. Each path segment could descend into an
18
+ # embedded document or a hash field.
19
+ # - Array element retrieval (`foo.N`) - retrieves the Nth array element
20
+ # from the field `foo` which must be an array. N must be a non-negative
21
+ # integer.
22
+ # - Array traversal (`foo.bar`) - if `foo` is an array field, and
23
+ # the elements of `foo` are hashes or embedded documents, this returns
24
+ # an array of values of the `bar` field in each of the hashes in the
25
+ # `foo` array.
26
+ #
27
+ # The return value is a two-element array. The first element is the value
28
+ # retrieved, or an array of values. The second element is a boolean flag
29
+ # indicating whether an array was expanded at any point during the key
30
+ # traversal (because the respective document field was an array).
31
+ #
32
+ # @param [ Document | Hash ] document The document to extract from.
33
+ # @param [ String ] key The key path to extract.
34
+ #
35
+ # @return [ Array<true | false, Object | Array, true | false> ]
36
+ # Whether the value existed in the document, the extracted value
37
+ # and the array expansion flag.
38
+ module_function def extract_attribute(document, key)
39
+ if document.respond_to?(:as_attributes, true)
40
+ # If a document has hash fields, as_attributes would keep those fields
41
+ # as Hash instances which do not offer indifferent access.
42
+ # Convert to BSON::Document to get indifferent access on hash fields.
43
+ document = BSON::Document.new(document.send(:as_attributes))
44
+ end
45
+
46
+ current = [document]
47
+
48
+ key.to_s.split('.').each do |field|
49
+ new = []
50
+ current.each do |doc|
51
+ case doc
52
+ when Hash
53
+ if doc.key?(field)
54
+ new << doc[field]
55
+ end
56
+ when Array
57
+ if (index = field.to_i).to_s == field
58
+ if doc.length > index
59
+ new << doc[index]
60
+ end
61
+ end
62
+ doc.each do |subdoc|
63
+ if Hash === subdoc
64
+ if subdoc.key?(field)
65
+ new << subdoc[field]
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ current = new
72
+ break if current.empty?
73
+ end
74
+
75
+ current
76
+ end
77
+ end
78
+ end
79
+
80
+ require 'mongoid/matcher/all'
81
+ require 'mongoid/matcher/and'
82
+ require 'mongoid/matcher/elem_match'
83
+ require 'mongoid/matcher/elem_match_expression'
84
+ require 'mongoid/matcher/eq'
85
+ require 'mongoid/matcher/eq_impl'
86
+ require 'mongoid/matcher/eq_impl_with_regexp'
87
+ require 'mongoid/matcher/exists'
88
+ require 'mongoid/matcher/expression'
89
+ require 'mongoid/matcher/field_expression'
90
+ require 'mongoid/matcher/gt'
91
+ require 'mongoid/matcher/gte'
92
+ require 'mongoid/matcher/in'
93
+ require 'mongoid/matcher/lt'
94
+ require 'mongoid/matcher/lte'
95
+ require 'mongoid/matcher/ne'
96
+ require 'mongoid/matcher/nin'
97
+ require 'mongoid/matcher/nor'
98
+ require 'mongoid/matcher/not'
99
+ require 'mongoid/matcher/or'
100
+ require 'mongoid/matcher/regex'
101
+ require 'mongoid/matcher/size'
102
+ require 'mongoid/matcher/expression_operator'
103
+ require 'mongoid/matcher/field_operator'
@@ -0,0 +1,22 @@
1
+ module Mongoid
2
+ module Matcher
3
+
4
+ # @api private
5
+ module All
6
+ module_function def matches?(exists, value, condition)
7
+ unless Array === condition
8
+ raise Errors::InvalidQuery, "$all argument must be an array: #{Errors::InvalidQuery.truncate_expr(condition)}"
9
+ end
10
+
11
+ !condition.empty? && condition.all? do |c|
12
+ case c
13
+ when ::Regexp, BSON::Regexp::Raw
14
+ Regex.matches_array_or_scalar?(value, c)
15
+ else
16
+ EqImpl.matches?(true, value, c, '$all')
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ module Mongoid
2
+ module Matcher
3
+
4
+ # @api private
5
+ module And
6
+ module_function def matches?(document, expr)
7
+ unless expr.is_a?(Array)
8
+ raise Errors::InvalidQuery, "$and argument must be an array: #{Errors::InvalidQuery.truncate_expr(expr)}"
9
+ end
10
+
11
+ if expr.empty?
12
+ raise Errors::InvalidQuery, "$and argument must be a non-empty array: #{Errors::InvalidQuery.truncate_expr(expr)}"
13
+ end
14
+
15
+ expr.all? do |sub_expr|
16
+ Expression.matches?(document, sub_expr)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,36 @@
1
+ module Mongoid
2
+ module Matcher
3
+
4
+ # @api private
5
+ module ElemMatch
6
+ module_function def matches?(exists, value, condition)
7
+ unless Hash === condition
8
+ raise Errors::InvalidQuery, "$elemMatch requires a Hash operand: #{Errors::InvalidQuery.truncate_expr(condition)}"
9
+ end
10
+ if Array === value && !value.empty?
11
+ value.any? do |v|
12
+ ElemMatchExpression.matches?(v, condition)
13
+ end
14
+ else
15
+ # Validate the condition is valid, even though we will never attempt
16
+ # matching it.
17
+ condition.each do |k, v|
18
+ k = k.to_s
19
+ if k.start_with?('$')
20
+ begin
21
+ ExpressionOperator.get(k)
22
+ rescue Mongoid::Errors::InvalidExpressionOperator
23
+ begin
24
+ FieldOperator.get(k)
25
+ rescue Mongoid::Errors::InvalidFieldOperator => exc
26
+ raise Mongoid::Errors::InvalidElemMatchOperator.new(exc.operator)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ false
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,20 @@
1
+ module Mongoid
2
+ module Matcher
3
+
4
+ # $elemMatch argument can be a top-level expression and some specific
5
+ # operator combinations like $not with a regular expression.
6
+ #
7
+ # @api private
8
+ module ElemMatchExpression
9
+ module_function def matches?(document, expr)
10
+ Expression.matches?(document, expr)
11
+ rescue Mongoid::Errors::InvalidExpressionOperator
12
+ begin
13
+ FieldExpression.matches?(true, document, expr)
14
+ rescue Mongoid::Errors::InvalidFieldOperator => exc
15
+ raise Mongoid::Errors::InvalidElemMatchOperator.new(exc.operator)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ module Mongoid
2
+ module Matcher
3
+
4
+ # @api private
5
+ module Eq
6
+ module_function def matches?(exists, value, condition)
7
+ EqImpl.matches?(exists, value, condition, '$eq')
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,32 @@
1
+ module Mongoid
2
+ module Matcher
3
+
4
+ # This module is used by $eq and other operators that need to perform
5
+ # the matching that $eq performs (for example, $ne which negates the result
6
+ # of $eq). Unlike $eq this module takes an original operator as an
7
+ # additional argument to +matches?+ to provide the correct exception
8
+ # messages reflecting the operator that was first invoked.
9
+ #
10
+ # @api private
11
+ module EqImpl
12
+ module_function def matches?(exists, value, condition, original_operator)
13
+ case condition
14
+ when Range
15
+ # Since $ne invokes $eq, the exception message needs to handle
16
+ # both operators.
17
+ raise Errors::InvalidQuery, "Range is not supported as an argument to '#{original_operator}'"
18
+ =begin
19
+ if value.is_a?(Array)
20
+ value.any? { |elt| condition.include?(elt) }
21
+ else
22
+ condition.include?(value)
23
+ end
24
+ =end
25
+ else
26
+ value == condition ||
27
+ value.is_a?(Array) && value.include?(condition)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,21 @@
1
+ module Mongoid
2
+ module Matcher
3
+
4
+ # This is an internal equality implementation that performs exact
5
+ # comparisons and regular expression matches.
6
+ #
7
+ # @api private
8
+ module EqImplWithRegexp
9
+ module_function def matches?(original_operator, value, condition)
10
+ case condition
11
+ when Regexp
12
+ value =~ condition
13
+ when ::BSON::Regexp::Raw
14
+ value =~ condition.compile
15
+ else
16
+ value == condition
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module Mongoid
2
+ module Matcher
3
+
4
+ # @api private
5
+ module Exists
6
+ module_function def matches?(exists, value, condition)
7
+ case condition
8
+ when Range
9
+ raise Errors::InvalidQuery, "$exists argument cannot be a Range: #{Errors::InvalidQuery.truncate_expr(condition)}"
10
+ end
11
+ exists == (condition || false)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,31 @@
1
+ module Mongoid
2
+ module Matcher
3
+
4
+ # @api private
5
+ module Expression
6
+ module_function def matches?(document, expr)
7
+ if expr.nil?
8
+ raise Errors::InvalidQuery, "Nil condition in expression context"
9
+ end
10
+ unless Hash === expr
11
+ raise Errors::InvalidQuery, "MQL query must be provided as a Hash"
12
+ end
13
+ expr.all? do |k, expr_v|
14
+ k = k.to_s
15
+ if k.start_with?('$')
16
+ ExpressionOperator.get(k).matches?(document, expr_v)
17
+ else
18
+ values = Matcher.extract_attribute(document, k)
19
+ if values.length > 0
20
+ values.any? do |v|
21
+ FieldExpression.matches?(true, v, expr_v)
22
+ end
23
+ else
24
+ FieldExpression.matches?(false, nil, expr_v)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,19 @@
1
+ module Mongoid
2
+ module Matcher
3
+
4
+ # @api private
5
+ module ExpressionOperator
6
+ MAP = {
7
+ '$and' => And,
8
+ '$nor' => Nor,
9
+ '$or' => Or,
10
+ }.freeze
11
+
12
+ module_function def get(op)
13
+ MAP.fetch(op)
14
+ rescue KeyError
15
+ raise Errors::InvalidExpressionOperator.new(op)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,62 @@
1
+ module Mongoid
2
+ module Matcher
3
+
4
+ # @api private
5
+ module FieldExpression
6
+ module_function def matches?(exists, value, condition)
7
+ if condition.is_a?(Hash)
8
+ condition.all? do |k, cond_v|
9
+ k = k.to_s
10
+ if k.start_with?('$')
11
+ if %w($regex $options).include?(k)
12
+ unless condition.key?('$regex')
13
+ raise Errors::InvalidQuery, "$regex is required if $options is given: #{Errors::InvalidQuery.truncate_expr(condition)}"
14
+ end
15
+
16
+ if k == '$regex'
17
+ if options = condition['$options']
18
+ cond_v = case cond_v
19
+ when Regexp
20
+ BSON::Regexp::Raw.new(cond_v.source, options)
21
+ when BSON::Regexp::Raw
22
+ BSON::Regexp::Raw.new(cond_v.pattern, options)
23
+ else
24
+ BSON::Regexp::Raw.new(cond_v, options)
25
+ end
26
+ elsif String === cond_v
27
+ cond_v = BSON::Regexp::Raw.new(cond_v)
28
+ end
29
+
30
+ FieldOperator.get(k).matches?(exists, value, cond_v)
31
+ else
32
+ # $options are matched as part of $regex
33
+ true
34
+ end
35
+ else
36
+ FieldOperator.get(k).matches?(exists, value, cond_v)
37
+ end
38
+ elsif Hash === value
39
+ sub_values = Matcher.extract_attribute(value, k)
40
+ if sub_values.length > 0
41
+ sub_values.any? do |sub_v|
42
+ Eq.matches?(true, sub_v, cond_v)
43
+ end
44
+ else
45
+ Eq.matches?(false, nil, cond_v)
46
+ end
47
+ else
48
+ false
49
+ end
50
+ end
51
+ else
52
+ case condition
53
+ when ::Regexp, BSON::Regexp::Raw
54
+ Regex.matches_array_or_scalar?(value, condition)
55
+ else
56
+ Eq.matches?(exists, value, condition)
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,48 @@
1
+ module Mongoid
2
+ module Matcher
3
+
4
+ # @api private
5
+ module FieldOperator
6
+ MAP = {
7
+ '$all' => All,
8
+ '$elemMatch' => ElemMatch,
9
+ '$eq' => Eq,
10
+ '$exists' => Exists,
11
+ '$gt' => Gt,
12
+ '$gte' => Gte,
13
+ '$in' => In,
14
+ '$lt' => Lt,
15
+ '$lte' => Lte,
16
+ '$nin' => Nin,
17
+ '$ne' => Ne,
18
+ '$not' => Not,
19
+ '$regex' => Regex,
20
+ '$size' => Size,
21
+ }.freeze
22
+
23
+ module_function def get(op)
24
+ MAP.fetch(op)
25
+ rescue KeyError
26
+ raise Errors::InvalidFieldOperator.new(op)
27
+ end
28
+
29
+ module_function def apply_array_field_operator(exists, value, condition)
30
+ if Array === value
31
+ value.any? { |v| yield v }
32
+ else
33
+ yield value
34
+ end
35
+ end
36
+
37
+ module_function def apply_comparison_operator(operator, left, right)
38
+ left.send(operator, right)
39
+ rescue ArgumentError, NoMethodError, TypeError
40
+ # We silence bogus comparison attempts, e.g. number to string
41
+ # comparisons.
42
+ # Several different exceptions may be produced depending on the types
43
+ # involved.
44
+ false
45
+ end
46
+ end
47
+ end
48
+ end