mongoid 7.1.5 → 7.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +9 -2
  5. data/Rakefile +33 -7
  6. data/lib/config/locales/en.yml +37 -1
  7. data/lib/mongoid.rb +23 -0
  8. data/lib/mongoid/association/depending.rb +1 -6
  9. data/lib/mongoid/association/many.rb +3 -3
  10. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  11. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  12. data/lib/mongoid/association/referenced/has_many/enumerable.rb +36 -1
  13. data/lib/mongoid/association/referenced/has_many/proxy.rb +8 -1
  14. data/lib/mongoid/association/referenced/has_one/buildable.rb +9 -1
  15. data/lib/mongoid/association/referenced/has_one/proxy.rb +6 -1
  16. data/lib/mongoid/atomic/modifiers.rb +1 -1
  17. data/lib/mongoid/attributes/dynamic.rb +1 -1
  18. data/lib/mongoid/clients/factory.rb +17 -0
  19. data/lib/mongoid/composable.rb +1 -0
  20. data/lib/mongoid/config.rb +3 -0
  21. data/lib/mongoid/contextual/mongo.rb +23 -4
  22. data/lib/mongoid/copyable.rb +7 -3
  23. data/lib/mongoid/criteria.rb +57 -7
  24. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  25. data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
  26. data/lib/mongoid/criteria/queryable/selectable.rb +21 -6
  27. data/lib/mongoid/criteria/queryable/selector.rb +3 -7
  28. data/lib/mongoid/criteria/queryable/storable.rb +3 -3
  29. data/lib/mongoid/document.rb +18 -5
  30. data/lib/mongoid/errors.rb +7 -0
  31. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  32. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  33. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  34. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  35. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  36. data/lib/mongoid/errors/invalid_query.rb +41 -0
  37. data/lib/mongoid/extensions.rb +1 -0
  38. data/lib/mongoid/factory.rb +27 -10
  39. data/lib/mongoid/fields.rb +3 -0
  40. data/lib/mongoid/fields/validators/macro.rb +22 -9
  41. data/lib/mongoid/findable.rb +50 -14
  42. data/lib/mongoid/indexable.rb +2 -2
  43. data/lib/mongoid/interceptable.rb +3 -1
  44. data/lib/mongoid/matchable.rb +1 -149
  45. data/lib/mongoid/matcher.rb +127 -0
  46. data/lib/mongoid/matcher/all.rb +22 -0
  47. data/lib/mongoid/matcher/and.rb +21 -0
  48. data/lib/mongoid/matcher/elem_match.rb +35 -0
  49. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  50. data/lib/mongoid/matcher/eq.rb +11 -0
  51. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  52. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  53. data/lib/mongoid/matcher/exists.rb +15 -0
  54. data/lib/mongoid/matcher/expression.rb +40 -0
  55. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  56. data/lib/mongoid/matcher/field_expression.rb +63 -0
  57. data/lib/mongoid/matcher/field_operator.rb +48 -0
  58. data/lib/mongoid/matcher/gt.rb +17 -0
  59. data/lib/mongoid/matcher/gte.rb +17 -0
  60. data/lib/mongoid/matcher/in.rb +25 -0
  61. data/lib/mongoid/matcher/lt.rb +17 -0
  62. data/lib/mongoid/matcher/lte.rb +17 -0
  63. data/lib/mongoid/matcher/ne.rb +16 -0
  64. data/lib/mongoid/matcher/nin.rb +11 -0
  65. data/lib/mongoid/matcher/nor.rb +25 -0
  66. data/lib/mongoid/matcher/not.rb +29 -0
  67. data/lib/mongoid/matcher/or.rb +21 -0
  68. data/lib/mongoid/matcher/regex.rb +41 -0
  69. data/lib/mongoid/matcher/size.rb +26 -0
  70. data/lib/mongoid/persistable/deletable.rb +1 -1
  71. data/lib/mongoid/query_cache.rb +64 -62
  72. data/lib/mongoid/reloadable.rb +2 -2
  73. data/lib/mongoid/serializable.rb +1 -1
  74. data/lib/mongoid/stringified_symbol.rb +53 -0
  75. data/lib/mongoid/traversable.rb +111 -4
  76. data/lib/mongoid/version.rb +1 -1
  77. data/spec/README.md +19 -4
  78. data/spec/integration/app_spec.rb +46 -13
  79. data/spec/integration/associations/embedded_spec.rb +94 -0
  80. data/spec/integration/associations/embeds_many_spec.rb +24 -0
  81. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  82. data/spec/integration/associations/has_many_spec.rb +108 -13
  83. data/spec/integration/associations/has_one_spec.rb +108 -13
  84. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  85. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  86. data/spec/integration/callbacks_models.rb +49 -0
  87. data/spec/integration/callbacks_spec.rb +216 -0
  88. data/spec/integration/discriminator_key_spec.rb +354 -0
  89. data/spec/integration/discriminator_value_spec.rb +207 -0
  90. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  91. data/spec/integration/matcher_operator_data/all.yml +140 -0
  92. data/spec/integration/matcher_operator_data/and.yml +93 -0
  93. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  94. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  95. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  96. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  97. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  98. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  99. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  100. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  101. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  102. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  103. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  104. data/spec/integration/matcher_operator_data/in.yml +194 -0
  105. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  106. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  107. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  108. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  109. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  110. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  111. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  112. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  113. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  114. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  115. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  116. data/spec/integration/matcher_operator_data/not.yml +196 -0
  117. data/spec/integration/matcher_operator_data/or.yml +137 -0
  118. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  119. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  120. data/spec/integration/matcher_operator_data/size.yml +174 -0
  121. data/spec/integration/matcher_operator_spec.rb +100 -0
  122. data/spec/integration/matcher_spec.rb +189 -0
  123. data/spec/integration/server_query_spec.rb +142 -0
  124. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  125. data/spec/lite_spec_helper.rb +4 -3
  126. data/spec/mongoid/association/depending_spec.rb +78 -26
  127. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +50 -0
  128. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  129. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  130. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  131. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
  132. data/spec/mongoid/association/referenced/has_many_models.rb +21 -0
  133. data/spec/mongoid/association/referenced/has_one_models.rb +21 -0
  134. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
  135. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  136. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  137. data/spec/mongoid/atomic_spec.rb +23 -0
  138. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  139. data/spec/mongoid/clients/factory_spec.rb +37 -0
  140. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  141. data/spec/mongoid/config_spec.rb +28 -0
  142. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  143. data/spec/mongoid/copyable_spec.rb +197 -18
  144. data/spec/mongoid/copyable_spec_models.rb +28 -0
  145. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +36 -0
  146. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  147. data/spec/mongoid/criteria_spec.rb +204 -39
  148. data/spec/mongoid/document_spec.rb +89 -15
  149. data/spec/mongoid/equality_spec.rb +0 -1
  150. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  151. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  152. data/spec/mongoid/factory_spec.rb +261 -28
  153. data/spec/mongoid/fields_spec.rb +48 -2
  154. data/spec/mongoid/findable_spec.rb +32 -0
  155. data/spec/mongoid/indexable_spec.rb +28 -2
  156. data/spec/mongoid/inspectable_spec.rb +29 -2
  157. data/spec/mongoid/interceptable_spec.rb +2 -2
  158. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  159. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  160. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  161. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  162. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  163. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  164. data/spec/mongoid/query_cache_spec.rb +442 -41
  165. data/spec/mongoid/reloadable_spec.rb +72 -0
  166. data/spec/mongoid/serializable_spec.rb +21 -3
  167. data/spec/mongoid/traversable_spec.rb +1100 -0
  168. data/spec/shared/LICENSE +20 -0
  169. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  170. data/spec/shared/lib/mrss/cluster_config.rb +211 -0
  171. data/spec/shared/lib/mrss/constraints.rb +330 -0
  172. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  173. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  174. data/spec/shared/lib/mrss/server_version_registry.rb +69 -0
  175. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  176. data/spec/shared/share/Dockerfile.erb +229 -0
  177. data/spec/shared/shlib/distro.sh +73 -0
  178. data/spec/shared/shlib/server.sh +270 -0
  179. data/spec/shared/shlib/set_env.sh +128 -0
  180. data/spec/spec_helper.rb +4 -2
  181. data/spec/support/constraints.rb +20 -222
  182. data/spec/support/helpers.rb +1 -1
  183. data/spec/{app → support}/models/account.rb +0 -0
  184. data/spec/{app → support}/models/acolyte.rb +0 -0
  185. data/spec/{app → support}/models/actor.rb +1 -1
  186. data/spec/{app → support}/models/actress.rb +0 -0
  187. data/spec/{app → support}/models/address.rb +0 -0
  188. data/spec/{app → support}/models/address_component.rb +0 -0
  189. data/spec/{app → support}/models/address_number.rb +0 -0
  190. data/spec/{app → support}/models/agency.rb +0 -0
  191. data/spec/{app → support}/models/agent.rb +0 -0
  192. data/spec/{app → support}/models/album.rb +0 -0
  193. data/spec/{app → support}/models/alert.rb +0 -0
  194. data/spec/{app → support}/models/animal.rb +0 -0
  195. data/spec/{app → support}/models/answer.rb +0 -0
  196. data/spec/{app → support}/models/appointment.rb +0 -0
  197. data/spec/support/models/armrest.rb +10 -0
  198. data/spec/{app → support}/models/array_field.rb +0 -0
  199. data/spec/{app → support}/models/article.rb +0 -0
  200. data/spec/{app → support}/models/artist.rb +0 -0
  201. data/spec/{app → support}/models/artwork.rb +0 -0
  202. data/spec/{app → support}/models/audio.rb +0 -0
  203. data/spec/{app → support}/models/augmentation.rb +0 -0
  204. data/spec/{app → support}/models/author.rb +0 -0
  205. data/spec/{app → support}/models/baby.rb +0 -0
  206. data/spec/{app → support}/models/band.rb +0 -0
  207. data/spec/{app → support}/models/bar.rb +0 -0
  208. data/spec/{app → support}/models/basic.rb +0 -0
  209. data/spec/{app → support}/models/bed.rb +0 -0
  210. data/spec/{app → support}/models/big_palette.rb +0 -0
  211. data/spec/{app → support}/models/birthday.rb +0 -0
  212. data/spec/{app → support}/models/bomb.rb +0 -0
  213. data/spec/{app → support}/models/book.rb +0 -0
  214. data/spec/{app → support}/models/breed.rb +0 -0
  215. data/spec/{app → support}/models/browser.rb +1 -1
  216. data/spec/{app → support}/models/building.rb +0 -0
  217. data/spec/{app → support}/models/building_address.rb +0 -0
  218. data/spec/{app → support}/models/bus.rb +0 -0
  219. data/spec/{app → support}/models/business.rb +0 -0
  220. data/spec/{app → support}/models/callback_test.rb +0 -0
  221. data/spec/{app → support}/models/canvas.rb +1 -1
  222. data/spec/{app → support}/models/car.rb +0 -0
  223. data/spec/{app → support}/models/cat.rb +0 -0
  224. data/spec/{app → support}/models/category.rb +0 -0
  225. data/spec/{app → support}/models/child.rb +0 -0
  226. data/spec/{app → support}/models/child_doc.rb +0 -0
  227. data/spec/{app → support}/models/church.rb +0 -0
  228. data/spec/{app → support}/models/circle.rb +0 -0
  229. data/spec/{app → support}/models/circuit.rb +0 -0
  230. data/spec/{app → support}/models/circus.rb +0 -0
  231. data/spec/{app → support}/models/code.rb +0 -0
  232. data/spec/{app → support}/models/coding.rb +1 -1
  233. data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  234. data/spec/{app → support}/models/comment.rb +0 -0
  235. data/spec/{app → support}/models/company.rb +0 -0
  236. data/spec/{app → support}/models/consumption_period.rb +0 -0
  237. data/spec/{app → support}/models/contextable_item.rb +0 -0
  238. data/spec/{app → support}/models/contractor.rb +0 -0
  239. data/spec/{app → support}/models/cookie.rb +0 -0
  240. data/spec/{app → support}/models/country_code.rb +0 -0
  241. data/spec/{app → support}/models/courier_job.rb +0 -0
  242. data/spec/support/models/crate.rb +13 -0
  243. data/spec/support/models/customer.rb +11 -0
  244. data/spec/support/models/customer_address.rb +12 -0
  245. data/spec/support/models/deed.rb +8 -0
  246. data/spec/{app → support}/models/definition.rb +0 -0
  247. data/spec/{app → support}/models/delegating_patient.rb +0 -0
  248. data/spec/{app → support}/models/description.rb +0 -0
  249. data/spec/{app → support}/models/dictionary.rb +6 -0
  250. data/spec/{app → support}/models/division.rb +0 -0
  251. data/spec/{app → support}/models/doctor.rb +0 -0
  252. data/spec/{app → support}/models/dog.rb +0 -0
  253. data/spec/{app → support}/models/dokument.rb +0 -0
  254. data/spec/{app → support}/models/draft.rb +0 -0
  255. data/spec/{app → support}/models/dragon.rb +0 -0
  256. data/spec/{app → support}/models/driver.rb +1 -1
  257. data/spec/{app → support}/models/drug.rb +0 -0
  258. data/spec/{app → support}/models/dungeon.rb +0 -0
  259. data/spec/{app → support}/models/edit.rb +0 -0
  260. data/spec/{app → support}/models/email.rb +0 -0
  261. data/spec/{app → support}/models/employer.rb +0 -0
  262. data/spec/{app → support}/models/entry.rb +0 -0
  263. data/spec/{app → support}/models/eraser.rb +0 -0
  264. data/spec/{app → support}/models/even.rb +0 -0
  265. data/spec/{app → support}/models/event.rb +0 -0
  266. data/spec/{app → support}/models/exhibition.rb +0 -0
  267. data/spec/{app → support}/models/exhibitor.rb +0 -0
  268. data/spec/{app → support}/models/explosion.rb +0 -0
  269. data/spec/{app → support}/models/eye.rb +0 -0
  270. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  271. data/spec/{app → support}/models/face.rb +0 -0
  272. data/spec/{app → support}/models/favorite.rb +0 -0
  273. data/spec/{app → support}/models/filesystem.rb +0 -0
  274. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  275. data/spec/{app → support}/models/firefox.rb +0 -0
  276. data/spec/{app → support}/models/fish.rb +0 -0
  277. data/spec/{app → support}/models/folder.rb +0 -0
  278. data/spec/{app → support}/models/folder_item.rb +0 -0
  279. data/spec/{app → support}/models/fruits.rb +0 -0
  280. data/spec/{app → support}/models/game.rb +0 -0
  281. data/spec/{app → support}/models/ghost.rb +0 -0
  282. data/spec/support/models/guitar.rb +5 -0
  283. data/spec/{app → support}/models/home.rb +0 -0
  284. data/spec/{app → support}/models/house.rb +0 -0
  285. data/spec/{app → support}/models/html_writer.rb +0 -0
  286. data/spec/{app → support}/models/id_key.rb +0 -0
  287. data/spec/support/models/idnodef.rb +8 -0
  288. data/spec/{app → support}/models/image.rb +0 -0
  289. data/spec/{app → support}/models/implant.rb +0 -0
  290. data/spec/support/models/instrument.rb +9 -0
  291. data/spec/{app → support}/models/item.rb +1 -1
  292. data/spec/{app → support}/models/jar.rb +0 -0
  293. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  294. data/spec/{app → support}/models/kangaroo.rb +0 -0
  295. data/spec/{app → support}/models/label.rb +0 -0
  296. data/spec/{app → support}/models/language.rb +0 -0
  297. data/spec/{app → support}/models/lat_lng.rb +0 -0
  298. data/spec/{app → support}/models/league.rb +0 -0
  299. data/spec/{app → support}/models/learner.rb +0 -0
  300. data/spec/{app → support}/models/line_item.rb +0 -0
  301. data/spec/{app → support}/models/location.rb +0 -0
  302. data/spec/{app → support}/models/login.rb +0 -0
  303. data/spec/{app → support}/models/manufacturer.rb +0 -0
  304. data/spec/{app → support}/models/meat.rb +0 -0
  305. data/spec/{app → support}/models/membership.rb +0 -0
  306. data/spec/{app → support}/models/message.rb +0 -0
  307. data/spec/{app → support}/models/minim.rb +0 -0
  308. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  309. data/spec/support/models/mop.rb +16 -0
  310. data/spec/{app → support}/models/movie.rb +0 -0
  311. data/spec/{app → support}/models/my_hash.rb +0 -0
  312. data/spec/{app → support}/models/name.rb +0 -0
  313. data/spec/{app → support}/models/name_only.rb +0 -0
  314. data/spec/{app → support}/models/node.rb +0 -0
  315. data/spec/{app → support}/models/note.rb +0 -0
  316. data/spec/{app → support}/models/odd.rb +0 -0
  317. data/spec/support/models/order.rb +11 -0
  318. data/spec/{app → support}/models/ordered_post.rb +0 -0
  319. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  320. data/spec/{app → support}/models/oscar.rb +0 -0
  321. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  322. data/spec/{app → support}/models/override.rb +0 -0
  323. data/spec/{app → support}/models/ownable.rb +0 -0
  324. data/spec/{app → support}/models/owner.rb +2 -0
  325. data/spec/{app → support}/models/pack.rb +0 -0
  326. data/spec/{app → support}/models/page.rb +0 -0
  327. data/spec/{app → support}/models/page_question.rb +0 -0
  328. data/spec/{app → support}/models/palette.rb +1 -1
  329. data/spec/{app → support}/models/parent.rb +0 -0
  330. data/spec/{app → support}/models/parent_doc.rb +0 -0
  331. data/spec/{app → support}/models/passport.rb +0 -0
  332. data/spec/{app → support}/models/patient.rb +0 -0
  333. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  334. data/spec/{app → support}/models/pencil.rb +0 -0
  335. data/spec/{app → support}/models/person.rb +3 -1
  336. data/spec/{app → support}/models/pet.rb +0 -0
  337. data/spec/{app → support}/models/pet_owner.rb +0 -0
  338. data/spec/{app → support}/models/phone.rb +0 -0
  339. data/spec/support/models/piano.rb +5 -0
  340. data/spec/{app → support}/models/pizza.rb +0 -0
  341. data/spec/{app → support}/models/player.rb +0 -0
  342. data/spec/{app → support}/models/post.rb +0 -0
  343. data/spec/{app → support}/models/post_genre.rb +0 -0
  344. data/spec/{app → support}/models/powerup.rb +0 -0
  345. data/spec/{app → support}/models/preference.rb +0 -0
  346. data/spec/{app → support}/models/princess.rb +0 -0
  347. data/spec/{app → support}/models/product.rb +0 -0
  348. data/spec/support/models/profile.rb +18 -0
  349. data/spec/{app → support}/models/pronunciation.rb +0 -0
  350. data/spec/{app → support}/models/pub.rb +0 -0
  351. data/spec/support/models/publication.rb +5 -0
  352. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  353. data/spec/{app → support}/models/publication/review.rb +0 -0
  354. data/spec/{app → support}/models/purchase.rb +0 -0
  355. data/spec/{app → support}/models/question.rb +0 -0
  356. data/spec/{app → support}/models/quiz.rb +0 -0
  357. data/spec/{app → support}/models/rating.rb +0 -0
  358. data/spec/{app → support}/models/record.rb +0 -0
  359. data/spec/{app → support}/models/registry.rb +0 -0
  360. data/spec/{app → support}/models/role.rb +0 -0
  361. data/spec/{app → support}/models/root_category.rb +0 -0
  362. data/spec/{app → support}/models/sandwich.rb +0 -0
  363. data/spec/{app → support}/models/scheduler.rb +0 -0
  364. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  365. data/spec/support/models/seat.rb +25 -0
  366. data/spec/{app → support}/models/seo.rb +0 -0
  367. data/spec/{app → support}/models/series.rb +1 -0
  368. data/spec/{app → support}/models/server.rb +0 -0
  369. data/spec/{app → support}/models/service.rb +0 -0
  370. data/spec/{app → support}/models/shape.rb +2 -2
  371. data/spec/{app → support}/models/shelf.rb +0 -0
  372. data/spec/{app → support}/models/shipment_address.rb +0 -0
  373. data/spec/{app → support}/models/shipping_container.rb +0 -0
  374. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  375. data/spec/{app → support}/models/shop.rb +0 -0
  376. data/spec/{app → support}/models/short_agent.rb +0 -0
  377. data/spec/{app → support}/models/short_quiz.rb +0 -0
  378. data/spec/{app → support}/models/simple.rb +0 -0
  379. data/spec/{app → support}/models/slave.rb +0 -0
  380. data/spec/{app → support}/models/song.rb +0 -0
  381. data/spec/{app → support}/models/sound.rb +0 -0
  382. data/spec/{app → support}/models/square.rb +0 -0
  383. data/spec/{app → support}/models/staff.rb +0 -0
  384. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  385. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  386. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  387. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  388. data/spec/{app → support}/models/strategy.rb +0 -0
  389. data/spec/{app → support}/models/sub_item.rb +0 -0
  390. data/spec/{app → support}/models/subscription.rb +0 -0
  391. data/spec/{app → support}/models/survey.rb +0 -0
  392. data/spec/{app → support}/models/symptom.rb +0 -0
  393. data/spec/support/models/system_role.rb +7 -0
  394. data/spec/{app → support}/models/tag.rb +0 -0
  395. data/spec/{app → support}/models/target.rb +0 -0
  396. data/spec/{app → support}/models/template.rb +0 -0
  397. data/spec/{app → support}/models/thing.rb +0 -0
  398. data/spec/{app → support}/models/title.rb +0 -0
  399. data/spec/{app → support}/models/tool.rb +2 -2
  400. data/spec/{app → support}/models/topping.rb +0 -0
  401. data/spec/support/models/toy.rb +10 -0
  402. data/spec/{app → support}/models/track.rb +0 -0
  403. data/spec/{app → support}/models/translation.rb +0 -0
  404. data/spec/{app → support}/models/tree.rb +0 -0
  405. data/spec/{app → support}/models/truck.rb +2 -0
  406. data/spec/{app → support}/models/updatable.rb +0 -0
  407. data/spec/{app → support}/models/user.rb +0 -0
  408. data/spec/{app → support}/models/user_account.rb +0 -0
  409. data/spec/{app → support}/models/validation_callback.rb +0 -0
  410. data/spec/{app → support}/models/vehicle.rb +7 -2
  411. data/spec/{app → support}/models/version.rb +0 -0
  412. data/spec/{app → support}/models/vertex.rb +0 -0
  413. data/spec/{app → support}/models/vet_visit.rb +0 -0
  414. data/spec/{app → support}/models/video.rb +0 -0
  415. data/spec/{app → support}/models/video_game.rb +0 -0
  416. data/spec/{app → support}/models/weapon.rb +0 -0
  417. data/spec/{app → support}/models/wiki_page.rb +1 -0
  418. data/spec/{app → support}/models/word.rb +0 -0
  419. data/spec/{app → support}/models/word_origin.rb +0 -0
  420. data/spec/{app → support}/models/writer.rb +2 -2
  421. data/spec/support/spec_config.rb +1 -1
  422. metadata +895 -755
  423. metadata.gz.sig +0 -0
  424. data/lib/mongoid/matchable/all.rb +0 -30
  425. data/lib/mongoid/matchable/and.rb +0 -32
  426. data/lib/mongoid/matchable/default.rb +0 -121
  427. data/lib/mongoid/matchable/elem_match.rb +0 -36
  428. data/lib/mongoid/matchable/eq.rb +0 -23
  429. data/lib/mongoid/matchable/exists.rb +0 -25
  430. data/lib/mongoid/matchable/gt.rb +0 -25
  431. data/lib/mongoid/matchable/gte.rb +0 -25
  432. data/lib/mongoid/matchable/in.rb +0 -26
  433. data/lib/mongoid/matchable/lt.rb +0 -25
  434. data/lib/mongoid/matchable/lte.rb +0 -25
  435. data/lib/mongoid/matchable/ne.rb +0 -23
  436. data/lib/mongoid/matchable/nin.rb +0 -24
  437. data/lib/mongoid/matchable/nor.rb +0 -38
  438. data/lib/mongoid/matchable/or.rb +0 -35
  439. data/lib/mongoid/matchable/regexp.rb +0 -30
  440. data/lib/mongoid/matchable/size.rb +0 -23
  441. data/spec/app/models/publication.rb +0 -5
  442. data/spec/mongoid/matchable/all_spec.rb +0 -34
  443. data/spec/mongoid/matchable/and_spec.rb +0 -190
  444. data/spec/mongoid/matchable/default_spec.rb +0 -140
  445. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  446. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  447. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  448. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  449. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  450. data/spec/mongoid/matchable/in_spec.rb +0 -52
  451. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  452. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  453. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  454. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  455. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  456. data/spec/mongoid/matchable/or_spec.rb +0 -134
  457. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  458. data/spec/mongoid/matchable/size_spec.rb +0 -28
  459. data/spec/mongoid/matchable_spec.rb +0 -856
  460. data/spec/support/child_process_helper.rb +0 -76
  461. data/spec/support/lite_constraints.rb +0 -22
@@ -1,134 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- require "spec_helper"
5
-
6
- describe Mongoid::Matchable::Or do
7
-
8
- let(:person) do
9
- Person.new
10
- end
11
-
12
- let(:matcher) do
13
- described_class.new("value", person)
14
- end
15
-
16
- describe "#_matches?" do
17
-
18
- context "when provided a simple expression" do
19
-
20
- context "when any of the values are equal" do
21
-
22
- let(:matches) do
23
- matcher._matches?(
24
- [ { title: "Sir" }, { title: "King" } ]
25
- )
26
- end
27
-
28
- before do
29
- person.title = "Sir"
30
- end
31
-
32
- it "returns true" do
33
- expect(matches).to be true
34
- end
35
- end
36
-
37
- context "when none of the values are equal" do
38
-
39
- it "returns false" do
40
- expect(matcher._matches?([])).to be false
41
- end
42
- end
43
-
44
- context "when the expression is a $not" do
45
-
46
- let(:matches) do
47
- matcher._matches?([ { title: {:$not => /Foobar/ } }])
48
- end
49
-
50
- context "when the value matches" do
51
-
52
- it "returns true" do
53
- expect(matches).to be true
54
- end
55
- end
56
-
57
- context "when the value does not match" do
58
-
59
- before do
60
- person.title = "Foobar baz"
61
- end
62
-
63
- it "returns false" do
64
- expect(matches).to be false
65
- end
66
- end
67
- end
68
- end
69
-
70
- context "when provided a complex expression" do
71
-
72
- context "when any of the values are equal" do
73
-
74
- let(:matches) do
75
- matcher._matches?(
76
- [
77
- { title: { "$in" => [ "Sir", "Madam" ] } },
78
- { title: "King" }
79
- ]
80
- )
81
- end
82
-
83
- before do
84
- person.title = "Sir"
85
- end
86
-
87
- it "returns true" do
88
- expect(matches).to be true
89
- end
90
- end
91
-
92
- context "when none of the values are equal" do
93
-
94
- let(:matches) do
95
- matcher._matches?(
96
- [
97
- { title: { "$in" => [ "Prince", "Madam" ] } },
98
- { title: "King" }
99
- ]
100
- )
101
- end
102
-
103
- before do
104
- person.title = "Sir"
105
- end
106
-
107
- it "returns false" do
108
- expect(matches).to be false
109
- end
110
- end
111
-
112
- context "when expression contain multiple fields" do
113
-
114
- let(:matches) do
115
- matcher._matches?(
116
- [
117
- { title: "Sir", age: 23 },
118
- { title: "King", age: 100 }
119
- ]
120
- )
121
- end
122
-
123
- before do
124
- person.title = "Sir"
125
- person.age = 100
126
- end
127
-
128
- it "returns false" do
129
- expect(matches).to be false
130
- end
131
- end
132
- end
133
- end
134
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- require "spec_helper"
5
-
6
- describe Mongoid::Matchable::Regexp do
7
-
8
- let(:matcher) do
9
- described_class.new(attribute)
10
- end
11
-
12
- let(:attribute) do
13
- 'Emily'
14
- end
15
-
16
- describe '#_matches?' do
17
-
18
- context 'when a BSON::Regexp::Raw object is passed' do
19
-
20
- let(:regexp) do
21
- BSON::Regexp::Raw.new("\\AEm")
22
- end
23
-
24
- it 'compiles the regexp object to a native regexp for the matching' do
25
- expect(matcher._matches?(regexp)).to be(true)
26
- end
27
-
28
- context 'when the value does not match the attribute' do
29
-
30
- let(:attribute) do
31
- 'ily'
32
- end
33
-
34
- it 'compiles the regexp object to a native regexp for the matching' do
35
- expect(matcher._matches?(regexp)).to be(false)
36
- end
37
- end
38
- end
39
-
40
- context 'when a native Regexp object is passed' do
41
-
42
- let(:regexp) do
43
- /\AEm/
44
- end
45
-
46
- it 'calls super with the native regexp' do
47
- expect(matcher._matches?(regexp)).to be(true)
48
- end
49
-
50
- context 'when the value does not match the attribute' do
51
-
52
- let(:attribute) do
53
- 'ily'
54
- end
55
-
56
- it 'compiles the regexp object to a native regexp for the matching' do
57
- expect(matcher._matches?(regexp)).to be(false)
58
- end
59
- end
60
- end
61
- end
62
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- require "spec_helper"
5
-
6
- describe Mongoid::Matchable::Size do
7
-
8
- let(:matcher) do
9
- described_class.new(["first", "second"])
10
- end
11
-
12
- describe "#_matches?" do
13
-
14
- context "when the attribute is the same size" do
15
-
16
- it "returns true" do
17
- expect(matcher._matches?("$size" => 2)).to be true
18
- end
19
- end
20
-
21
- context "when the attribute is not the same size" do
22
-
23
- it "returns false" do
24
- expect(matcher._matches?("$size" => 5)).to be false
25
- end
26
- end
27
- end
28
- end
@@ -1,856 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- require "spec_helper"
5
-
6
- describe Mongoid::Matchable do
7
-
8
- describe "#_matches?" do
9
-
10
- context "when document is embeded" do
11
-
12
- let(:document) do
13
- Address.new(street: "Clarkenwell Road")
14
- end
15
- let(:occupants){[{'name' => 'Tim'}]}
16
-
17
- before do
18
- document.locations << Location.new(
19
- name: 'No.1',
20
- info: { 'door' => 'Red'},
21
- occupants: occupants
22
- )
23
- end
24
-
25
- context "when the attributes do not match" do
26
-
27
- let(:selector) do
28
- { name: { "$in" => ["No.2"], "$ne" => nil } }
29
- end
30
-
31
- it "returns false" do
32
- expect(document.locations.first._matches?(selector)).to be false
33
- end
34
-
35
- context "when just change the selector order" do
36
-
37
- let(:selector) do
38
- { name: { "$ne" => nil, "$in" => ["No.2"] } }
39
- end
40
-
41
- it "returns false " do
42
- expect(document.locations.first._matches?(selector)).to be false
43
- end
44
- end
45
- end
46
-
47
- context "when matching embedded hash values" do
48
-
49
- context "when the contents match" do
50
-
51
- let(:selector) do
52
- { "info.door" => "Red" }
53
- end
54
-
55
- it "returns true" do
56
- expect(document.locations.first._matches?(selector)).to be true
57
- end
58
- end
59
-
60
- context "when the contents do not match" do
61
-
62
- let(:selector) do
63
- { "info.door" => "Blue" }
64
- end
65
-
66
- it "returns false" do
67
- expect(document.locations.first._matches?(selector)).to be false
68
- end
69
- end
70
-
71
- context "when the contents do not exist" do
72
-
73
- let(:selector) do
74
- { "info.something_else" => "Red" }
75
- end
76
-
77
- it "returns false" do
78
- expect(document.locations.first._matches?(selector)).to be false
79
- end
80
- end
81
- end
82
-
83
- context "when matching index of an array" do
84
-
85
- let(:occupants){["Tim","Logan"]}
86
-
87
- context "when the contents match" do
88
-
89
- let(:selector) do
90
- { "occupants.0" => "Tim" }
91
- end
92
-
93
- it "returns true" do
94
- expect(document.locations.first._matches?(selector)).to be true
95
- end
96
- end
97
-
98
- context "when the contents do not match" do
99
-
100
- let(:selector) do
101
- { "occupants.0" => "Logan" }
102
- end
103
-
104
- it "returns false" do
105
- expect(document.locations.first._matches?(selector)).to be false
106
- end
107
- end
108
- end
109
-
110
- context "when matching values of multiple embedded hashes" do
111
-
112
- context "when the contents match" do
113
-
114
- let(:selector) do
115
- { "occupants.name" => "Tim" }
116
- end
117
-
118
- it "returns true" do
119
- expect(document.locations.first._matches?(selector)).to be true
120
- end
121
- end
122
-
123
- context "when the contents do not match" do
124
-
125
- let(:selector) do
126
- { "occupants.name" => "Lyle" }
127
- end
128
-
129
- it "returns false" do
130
- expect(document.locations.first._matches?(selector)).to be false
131
- end
132
- end
133
-
134
- context "when the contents do not exist" do
135
-
136
- let(:selector) do
137
- { "occupants.something_else" => "Tim" }
138
- end
139
-
140
- it "returns false" do
141
- expect(document.locations.first._matches?(selector)).to be false
142
- end
143
- end
144
- end
145
-
146
- context "when using $elemMatch" do
147
-
148
- context "one predicate" do
149
-
150
- let(:selector) do
151
- {
152
- "occupants" => {"$elemMatch" => {"name" => "Tim"}}
153
- }
154
- end
155
-
156
- context "and there is a matching sub document" do
157
-
158
- it "returns true" do
159
- expect(document.locations.first._matches?(selector)).to be true
160
- end
161
-
162
- context "using $in" do
163
- let(:selector) do
164
- {
165
- "occupants" => {"$elemMatch" => {"name" => {"$in" => ["Tim", "Alice"]}}}
166
- }
167
- end
168
-
169
- it "returns true" do
170
- expect(document.locations.first._matches?(selector)).to be true
171
- end
172
- end
173
- end
174
-
175
- context "and there is not a matching sub document" do
176
-
177
- let(:selector) do
178
- {
179
- "occupants" => {"$elemMatch" => {"name" => "Lyle"}}
180
- }
181
- end
182
-
183
- it "returns false" do
184
- expect(document.locations.first._matches?(selector)).to be false
185
- end
186
-
187
- context "using $in" do
188
- let(:selector) do
189
- {
190
- "occupants" => {"$elemMatch" => {"name" => {"$in" => ["Lyfe", "Alice"]}}}
191
- }
192
- end
193
-
194
- it "returns false" do
195
- expect(document.locations.first._matches?(selector)).to be false
196
- end
197
- end
198
- end
199
- end
200
-
201
- context "multiple predicates" do
202
-
203
- before do
204
- document.locations = [
205
- Location.new(
206
- name: 'No.1',
207
- info: { 'door' => 'Red'},
208
- occupants: [{'name' => 'Tim', 'eye_color' => 'brown'}, {'name' => 'Alice', 'eye_color' => 'blue'}]
209
- )
210
- ]
211
- end
212
-
213
- let(:selector) do
214
- {
215
- "occupants" => {"$elemMatch" => {"name" => "Tim", "eye_color" => "brown"}}
216
- }
217
- end
218
-
219
- context "and there is a matching sub document" do
220
-
221
- it "returns true" do
222
- expect(document.locations.first._matches?(selector)).to be true
223
- end
224
-
225
- context "using $in and $ne in the $elemMatch to include the element" do
226
-
227
- let(:selector) do
228
- {
229
- "occupants" => {"$elemMatch" => {"name" => {"$in" => ["Tim"]}, "eye_color" => {"$ne" => "blue"}}}
230
- }
231
- end
232
-
233
- it "returns true" do
234
- expect(document.locations.first._matches?(selector)).to be true
235
- end
236
- end
237
- end
238
-
239
- context "and there is not a matching sub document" do
240
-
241
- let(:selector) do
242
- {
243
- "occupants" => {"$elemMatch" => {"name" => "Tim", "eye_color" => "blue"}}
244
- }
245
- end
246
-
247
- it "returns false" do
248
- expect(document.locations.first._matches?(selector)).to be false
249
- end
250
-
251
- context "using $ne in the $elemMatch to exclude the element" do
252
-
253
- let(:selector) do
254
- {
255
- "occupants" => {"$elemMatch" => {"name" => {"$in" => ["Tim"]}, "eye_color" => {"$ne" => "brown"}}}
256
- }
257
- end
258
-
259
- it "returns false" do
260
- expect(document.locations.first._matches?(selector)).to be false
261
- end
262
- end
263
- end
264
- end
265
- end
266
- end
267
-
268
- context "when performing simple matching" do
269
-
270
- let(:document) do
271
- Address.new(street: "Clarkenwell Road")
272
- end
273
-
274
- context "when the attributes match" do
275
-
276
- let(:selector) do
277
- { street: "Clarkenwell Road" }
278
- end
279
-
280
- it "returns true" do
281
- expect(document._matches?(selector)).to be true
282
- end
283
- end
284
-
285
- context "when the attributes dont match" do
286
-
287
- let(:selector) do
288
- { street: "Broadway Ave" }
289
- end
290
-
291
- it "returns false" do
292
- expect(document._matches?(selector)).to be false
293
- end
294
- end
295
-
296
- context 'when a BSON::Regexp::Raw object is used' do
297
-
298
- let(:selector) do
299
- { street: BSON::Regexp::Raw.new("\\AClarkenwell") }
300
- end
301
-
302
- it "returns true" do
303
- expect(document._matches?(selector)).to be true
304
- end
305
- end
306
-
307
- context 'when a native Regexp object is used' do
308
-
309
- let(:selector) do
310
- { street: /\AClarkenwell/ }
311
- end
312
-
313
- it "returns true" do
314
- expect(document._matches?(selector)).to be true
315
- end
316
- end
317
- end
318
-
319
- context "when performing complex matching" do
320
-
321
- let(:document) do
322
- Address.new(
323
- services: ["first", "second", "third"],
324
- number: 100,
325
- map: { key: "value" },
326
- street: "Clarkenwell Road"
327
- )
328
- end
329
-
330
- context "with an $all selector" do
331
-
332
- context "when the attribute includes all of the values" do
333
-
334
- let(:selector) do
335
- { services: { "$all" => [ "first", "second" ] } }
336
- end
337
-
338
- it "returns true" do
339
- expect(document._matches?(selector)).to be true
340
- end
341
- end
342
-
343
- context "when the attributes doesn't include all of the values" do
344
-
345
- let(:selector) do
346
- { services: { "$all" => [ "second", "third", "fourth" ] } }
347
- end
348
-
349
- it "returns false" do
350
- expect(document._matches?(selector)).to be false
351
- end
352
- end
353
- end
354
-
355
- context "with an $exists selector" do
356
-
357
- context "when the attributes match" do
358
-
359
- let(:selector) do
360
- { services: { "$exists" => true } }
361
- end
362
-
363
- it "returns true" do
364
- expect(document._matches?(selector)).to be true
365
- end
366
- end
367
-
368
- context "when the attributes do not match" do
369
-
370
- let(:selector) do
371
- { services: { "$exists" => false } }
372
- end
373
-
374
- it "returns false" do
375
- expect(document._matches?(selector)).to be false
376
- end
377
- end
378
- end
379
-
380
- context "with a $gt selector" do
381
-
382
- context "when the attributes match" do
383
-
384
- let(:selector) do
385
- { number: { "$gt" => 50 } }
386
- end
387
-
388
- it "returns true" do
389
- expect(document._matches?(selector)).to be true
390
- end
391
- end
392
-
393
- context "when the attributes do not match" do
394
-
395
- let(:selector) do
396
- { number: { "$gt" => 200 } }
397
- end
398
-
399
- it "returns false" do
400
- expect(document._matches?(selector)).to be false
401
- end
402
- end
403
- end
404
-
405
- context "with a $gt selector as a symbol" do
406
-
407
- context "when the attributes match" do
408
-
409
- let(:selector) do
410
- { number: { :$gt => 50 } }
411
- end
412
-
413
- it "returns true" do
414
- expect(document._matches?(selector)).to be true
415
- end
416
- end
417
-
418
- context "when the attributes do not match" do
419
-
420
- let(:selector) do
421
- { number: { :$gt => 200 } }
422
- end
423
-
424
- it "returns false" do
425
- expect(document._matches?(selector)).to be false
426
- end
427
- end
428
- end
429
-
430
- context "with a $gte selector" do
431
-
432
- context "when the attributes match" do
433
-
434
- let(:selector) do
435
- { number: { "$gte" => 100 } }
436
- end
437
-
438
- it "returns true" do
439
- expect(document._matches?(selector)).to be true
440
- end
441
- end
442
-
443
- context "when the attributes do not match" do
444
-
445
- let(:selector) do
446
- { number: { "$gte" => 200 } }
447
- end
448
-
449
- it "returns false" do
450
- expect(document._matches?(selector)).to be false
451
- end
452
- end
453
- end
454
-
455
- context "with an $in selector on Array" do
456
-
457
- context "when the attributes match" do
458
-
459
- let(:selector) do
460
- { services: { "$in" => [ /\Afir.*\z/, "second" ] } }
461
- end
462
-
463
- it "returns true" do
464
- expect(document._matches?(selector)).to be true
465
- end
466
- end
467
-
468
- context "when the attributes do not match" do
469
-
470
- let(:selector) do
471
- { number: { "$in" => [ "none" ] } }
472
- end
473
-
474
- it "returns false" do
475
- expect(document._matches?(selector)).to be false
476
- end
477
- end
478
- end
479
-
480
- context "with a $not selector" do
481
-
482
- context "regexes" do
483
-
484
- context "when the predicate matches" do
485
-
486
- let(:selector) do
487
- {
488
- street: {"$not" => /Avenue/}
489
- }
490
- end
491
-
492
- it "returns true" do
493
- expect(document._matches?(selector)).to be true
494
- end
495
- end
496
-
497
- context "when the predicate does not match" do
498
-
499
- let(:selector) do
500
- {
501
- street: {"$not" => /Road/}
502
- }
503
- end
504
-
505
- it "returns false" do
506
- expect(document._matches?(selector)).to be false
507
- end
508
- end
509
- end
510
-
511
- context "other operators" do
512
-
513
- context "numerical comparisons" do
514
-
515
- context "$lt and $gt" do
516
-
517
- context "when the predicate matches" do
518
-
519
- let(:selector) do
520
- {
521
- number: {"$not" => {"$lt" => 0}}
522
- }
523
- end
524
-
525
- it "returns true" do
526
- expect(document._matches?(selector)).to be true
527
- end
528
- end
529
-
530
- context "when the predicate does not match" do
531
-
532
- let(:selector) do
533
- {
534
- number: {"$not" => {"$gt" => 50}}
535
- }
536
- end
537
-
538
- it "returns false" do
539
- expect(document._matches?(selector)).to be false
540
- end
541
- end
542
- end
543
-
544
- context "$in" do
545
-
546
- context "when the predicate matches" do
547
-
548
- let(:selector) do
549
- {
550
- number: {"$not" => {"$in" => [10]}}
551
- }
552
- end
553
-
554
- it "returns true" do
555
- expect(document._matches?(selector)).to be true
556
- end
557
- end
558
-
559
- context "when the predicate does not match" do
560
-
561
- let(:selector) do
562
- {
563
- number: {"$not" => {"$in" => [100]}}
564
- }
565
- end
566
-
567
- it "returns false" do
568
- expect(document._matches?(selector)).to be false
569
- end
570
- end
571
- end
572
- end
573
- end
574
-
575
- context "symbol keys" do
576
-
577
- context "when the predicate matches" do
578
-
579
- let(:selector) do
580
- {
581
- street: {:$not => /Avenue/}
582
- }
583
- end
584
-
585
- it "returns true" do
586
- expect(document._matches?(selector)).to be true
587
- end
588
- end
589
-
590
- context "when the predicate does not match" do
591
-
592
- let(:selector) do
593
- {
594
- street: {:$not => /Road/}
595
- }
596
- end
597
-
598
- it "returns false" do
599
- expect(document._matches?(selector)).to be false
600
- end
601
- end
602
- end
603
- end
604
-
605
- context "with an $in selector" do
606
-
607
- context "when the attributes match" do
608
-
609
- let(:selector) do
610
- { number: { "$in" => [ 100, 200 ] } }
611
- end
612
-
613
- it "returns true" do
614
- expect(document._matches?(selector)).to be true
615
- end
616
- end
617
-
618
- context "when the attributes do not match" do
619
-
620
- let(:selector) do
621
- { number: { "$in" => [ 200, 300 ] } }
622
- end
623
-
624
- it "returns false" do
625
- expect(document._matches?(selector)).to be false
626
- end
627
- end
628
- end
629
-
630
- context "with a $lt selector" do
631
-
632
- context "when the attributes match" do
633
-
634
- let(:selector) do
635
- { number: { "$lt" => 200 } }
636
- end
637
-
638
- it "returns true" do
639
- expect(document._matches?(selector)).to be true
640
- end
641
- end
642
-
643
- context "when the attributes do not match" do
644
-
645
- let(:selector) do
646
- { number: { "$lt" => 50 } }
647
- end
648
-
649
- it "returns false" do
650
- expect(document._matches?(selector)).to be false
651
- end
652
- end
653
- end
654
-
655
- context "with a $lte selector" do
656
-
657
- context "when the attributes match" do
658
-
659
- let(:selector) do
660
- { number: { "$lte" => 200 } }
661
- end
662
-
663
- it "returns true" do
664
- expect(document._matches?(selector)).to be true
665
- end
666
- end
667
-
668
- context "when the attributes do not match" do
669
-
670
- let(:selector) do
671
- { number: { "$lte" => 50 } }
672
- end
673
-
674
- it "returns false" do
675
- expect(document._matches?(selector)).to be false
676
- end
677
- end
678
- end
679
-
680
- context "with an $ne selector" do
681
-
682
- context "when the attributes match" do
683
-
684
- let(:selector) do
685
- { number: { "$ne" => 200 } }
686
- end
687
-
688
- it "returns true" do
689
- expect(document._matches?(selector)).to be true
690
- end
691
- end
692
-
693
- context "when the attributes do not match" do
694
-
695
- let(:selector) do
696
- { number: { "$ne" => 100 } }
697
- end
698
-
699
- it "returns false" do
700
- expect(document._matches?(selector)).to be false
701
- end
702
- end
703
- end
704
-
705
- context "with a $nin selector on Array" do
706
-
707
- context "when the attributes match" do
708
-
709
- let(:selector) do
710
- { services: { "$nin" => [ "none" ] } }
711
- end
712
-
713
- it "returns true" do
714
- expect(document._matches?(selector)).to be true
715
- end
716
- end
717
-
718
- context "when the attributes do not match" do
719
-
720
- let(:selector) do
721
- { services: { "$nin" => [ "first" ] } }
722
- end
723
-
724
- it "returns false" do
725
- expect(document._matches?(selector)).to be false
726
- end
727
- end
728
- end
729
-
730
- context "with a $nin selector" do
731
-
732
- context "when the attributes match" do
733
-
734
- let(:selector) do
735
- { number: { "$nin" => [ 1, 2, 3 ] } }
736
- end
737
-
738
- it "returns true" do
739
- expect(document._matches?(selector)).to be true
740
- end
741
- end
742
-
743
- context "when the attributes do not match" do
744
-
745
- let(:selector) do
746
- { number: { "$nin" => [ 100 ] } }
747
- end
748
-
749
- it "returns false" do
750
- expect(document._matches?(selector)).to be false
751
- end
752
- end
753
- end
754
-
755
- context "with an $or selector" do
756
-
757
- context "when the attributes match" do
758
-
759
- let(:selector) do
760
- { "$or" => [ { number: 10 }, { number: { "$gt" => 99 } } ] }
761
- end
762
-
763
- it "returns true" do
764
- expect(document._matches?(selector)).to be true
765
- end
766
- end
767
-
768
- context "when the attributes do not match" do
769
-
770
- let(:selector) do
771
- { "$or" => [ { number: 10 }, { number: { "$lt" => 99 } } ] }
772
- end
773
-
774
- it "returns false" do
775
- expect(document._matches?(selector)).to be false
776
- end
777
- end
778
- end
779
-
780
- context "with an $nor selector" do
781
-
782
- context "when the attributes match" do
783
-
784
- let(:selector) do
785
- { "$nor" => [ { number: 10 }, { number: { "$gt" => 199 } } ] }
786
- end
787
-
788
- it "returns true" do
789
- expect(document._matches?(selector)).to be true
790
- end
791
- end
792
-
793
- context "when the attributes do not match" do
794
-
795
- let(:selector) do
796
- { "$nor" => [ { number: 10 }, { number: { "$gt" => 99 } } ] }
797
- end
798
-
799
- it "returns false" do
800
- expect(document._matches?(selector)).to be false
801
- end
802
- end
803
- end
804
-
805
- context "with a $size selector" do
806
-
807
- context "when the attributes match" do
808
-
809
- let(:selector) do
810
- { services: { "$size" => 3 } }
811
- end
812
-
813
- it "returns true" do
814
- expect(document._matches?(selector)).to be true
815
- end
816
- end
817
-
818
- context "when the attributes do not match" do
819
-
820
- let(:selector) do
821
- { services: { "$size" => 5 } }
822
- end
823
-
824
- it "returns false" do
825
- expect(document._matches?(selector)).to be false
826
- end
827
- end
828
- end
829
-
830
- context "with a hash value" do
831
-
832
- context "when the attributes match" do
833
-
834
- let(:selector) do
835
- { map: { key: "value" } }
836
- end
837
-
838
- it "returns true" do
839
- expect(document._matches?(selector)).to be true
840
- end
841
- end
842
-
843
- context "when the attributes do not match" do
844
-
845
- let(:selector) do
846
- { map: { key: "value2" } }
847
- end
848
-
849
- it "returns false" do
850
- expect(document._matches?(selector)).to be false
851
- end
852
- end
853
- end
854
- end
855
- end
856
- end