mongoid 5.4.0 → 6.4.8

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 (301) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +26 -0
  5. data/lib/config/locales/en.yml +40 -0
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic.rb +5 -5
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/attributes.rb +22 -21
  10. data/lib/mongoid/cacheable.rb +36 -0
  11. data/lib/mongoid/changeable.rb +36 -0
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/sessions.rb +113 -0
  14. data/lib/mongoid/clients/storage_options.rb +2 -69
  15. data/lib/mongoid/clients.rb +10 -63
  16. data/lib/mongoid/composable.rb +29 -2
  17. data/lib/mongoid/config.rb +1 -0
  18. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  19. data/lib/mongoid/contextual/atomic.rb +4 -4
  20. data/lib/mongoid/contextual/map_reduce.rb +7 -3
  21. data/lib/mongoid/contextual/memory.rb +9 -4
  22. data/lib/mongoid/contextual/mongo.rb +65 -30
  23. data/lib/mongoid/contextual/none.rb +12 -0
  24. data/lib/mongoid/copyable.rb +13 -6
  25. data/lib/mongoid/criteria/marshalable.rb +2 -2
  26. data/lib/mongoid/criteria/modifiable.rb +29 -3
  27. data/lib/mongoid/criteria/options.rb +25 -0
  28. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  29. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  30. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  31. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  32. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  33. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  34. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  35. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  36. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  37. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  38. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  39. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
  40. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  41. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  42. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  43. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  45. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  46. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  47. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  48. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  49. data/lib/mongoid/criteria/queryable/mergeable.rb +273 -0
  50. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  51. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  52. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  53. data/lib/mongoid/criteria/queryable/selectable.rb +689 -0
  54. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  55. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  56. data/lib/mongoid/criteria/queryable.rb +87 -0
  57. data/lib/mongoid/criteria.rb +6 -2
  58. data/lib/mongoid/document.rb +34 -41
  59. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  60. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  61. data/lib/mongoid/errors/invalid_field.rb +2 -2
  62. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  63. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  64. data/lib/mongoid/errors/invalid_session_use.rb +24 -0
  65. data/lib/mongoid/errors.rb +3 -0
  66. data/lib/mongoid/evolvable.rb +1 -1
  67. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  68. data/lib/mongoid/extensions/date.rb +4 -1
  69. data/lib/mongoid/extensions/decimal128.rb +3 -3
  70. data/lib/mongoid/extensions/hash.rb +1 -0
  71. data/lib/mongoid/extensions/regexp.rb +1 -0
  72. data/lib/mongoid/extensions/string.rb +6 -3
  73. data/lib/mongoid/extensions/time.rb +4 -1
  74. data/lib/mongoid/extensions.rb +0 -4
  75. data/lib/mongoid/factory.rb +2 -1
  76. data/lib/mongoid/fields/validators/macro.rb +18 -0
  77. data/lib/mongoid/findable.rb +2 -2
  78. data/lib/mongoid/indexable.rb +16 -14
  79. data/lib/mongoid/interceptable.rb +9 -22
  80. data/lib/mongoid/matchable/all.rb +2 -2
  81. data/lib/mongoid/matchable/and.rb +3 -3
  82. data/lib/mongoid/matchable/default.rb +2 -2
  83. data/lib/mongoid/matchable/elem_match.rb +28 -0
  84. data/lib/mongoid/matchable/exists.rb +2 -2
  85. data/lib/mongoid/matchable/gt.rb +4 -2
  86. data/lib/mongoid/matchable/gte.rb +4 -2
  87. data/lib/mongoid/matchable/in.rb +2 -2
  88. data/lib/mongoid/matchable/lt.rb +4 -2
  89. data/lib/mongoid/matchable/lte.rb +4 -2
  90. data/lib/mongoid/matchable/ne.rb +2 -2
  91. data/lib/mongoid/matchable/nin.rb +2 -2
  92. data/lib/mongoid/matchable/nor.rb +37 -0
  93. data/lib/mongoid/matchable/or.rb +3 -3
  94. data/lib/mongoid/matchable/regexp.rb +3 -3
  95. data/lib/mongoid/matchable/size.rb +2 -2
  96. data/lib/mongoid/matchable.rb +16 -7
  97. data/lib/mongoid/persistable/creatable.rb +5 -3
  98. data/lib/mongoid/persistable/deletable.rb +5 -3
  99. data/lib/mongoid/persistable/destroyable.rb +1 -5
  100. data/lib/mongoid/persistable/settable.rb +5 -5
  101. data/lib/mongoid/persistable/updatable.rb +7 -14
  102. data/lib/mongoid/persistable/upsertable.rb +2 -1
  103. data/lib/mongoid/persistable.rb +4 -6
  104. data/lib/mongoid/persistence_context.rb +220 -0
  105. data/lib/mongoid/query_cache.rb +67 -23
  106. data/lib/mongoid/railtie.rb +17 -1
  107. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  108. data/lib/mongoid/relations/accessors.rb +3 -0
  109. data/lib/mongoid/relations/auto_save.rb +12 -4
  110. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  111. data/lib/mongoid/relations/counter_cache.rb +15 -5
  112. data/lib/mongoid/relations/eager/base.rb +3 -3
  113. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  114. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  115. data/lib/mongoid/relations/eager.rb +6 -11
  116. data/lib/mongoid/relations/embedded/batchable.rb +20 -18
  117. data/lib/mongoid/relations/embedded/in.rb +13 -1
  118. data/lib/mongoid/relations/embedded/many.rb +51 -10
  119. data/lib/mongoid/relations/embedded/one.rb +14 -1
  120. data/lib/mongoid/relations/macros.rb +9 -1
  121. data/lib/mongoid/relations/many.rb +4 -0
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/options.rb +2 -2
  124. data/lib/mongoid/relations/proxy.rb +1 -31
  125. data/lib/mongoid/relations/referenced/in.rb +19 -10
  126. data/lib/mongoid/relations/referenced/many.rb +30 -26
  127. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  128. data/lib/mongoid/relations/referenced/one.rb +15 -1
  129. data/lib/mongoid/relations/synchronization.rb +12 -12
  130. data/lib/mongoid/relations/targets/enumerable.rb +24 -4
  131. data/lib/mongoid/relations/touchable.rb +7 -4
  132. data/lib/mongoid/reloadable.rb +2 -2
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +1 -1
  135. data/lib/mongoid/stateful.rb +1 -0
  136. data/lib/mongoid/tasks/database.rb +3 -2
  137. data/lib/mongoid/threaded.rb +74 -0
  138. data/lib/mongoid/traversable.rb +1 -1
  139. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  140. data/lib/mongoid/version.rb +1 -1
  141. data/lib/mongoid.rb +6 -6
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +18 -3
  143. data/spec/app/models/agent.rb +2 -0
  144. data/spec/app/models/album.rb +5 -1
  145. data/spec/app/models/array_field.rb +7 -0
  146. data/spec/app/models/artist.rb +21 -0
  147. data/spec/app/models/band.rb +3 -0
  148. data/spec/app/models/book.rb +2 -1
  149. data/spec/app/models/delegating_patient.rb +16 -0
  150. data/spec/app/models/dokument.rb +1 -0
  151. data/spec/app/models/ordered_post.rb +5 -0
  152. data/spec/app/models/oscar.rb +1 -2
  153. data/spec/app/models/page.rb +1 -1
  154. data/spec/app/models/person.rb +3 -3
  155. data/spec/app/models/princess.rb +2 -0
  156. data/spec/app/models/record.rb +1 -0
  157. data/spec/app/models/subscription.rb +1 -0
  158. data/spec/app/models/thing.rb +1 -1
  159. data/spec/config/mongoid.yml +15 -0
  160. data/spec/integration/document_spec.rb +22 -0
  161. data/spec/mongoid/atomic/modifiers_spec.rb +3 -3
  162. data/spec/mongoid/atomic_spec.rb +5 -5
  163. data/spec/mongoid/attributes/nested_spec.rb +18 -14
  164. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  165. data/spec/mongoid/attributes_spec.rb +90 -5
  166. data/spec/mongoid/cacheable_spec.rb +112 -0
  167. data/spec/mongoid/changeable_spec.rb +58 -0
  168. data/spec/mongoid/clients/factory_spec.rb +80 -28
  169. data/spec/mongoid/clients/options_spec.rb +396 -95
  170. data/spec/mongoid/clients/sessions_spec.rb +334 -0
  171. data/spec/mongoid/clients_spec.rb +243 -101
  172. data/spec/mongoid/composable_spec.rb +7 -0
  173. data/spec/mongoid/config_spec.rb +67 -11
  174. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  175. data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
  176. data/spec/mongoid/contextual/mongo_spec.rb +275 -22
  177. data/spec/mongoid/contextual/none_spec.rb +15 -0
  178. data/spec/mongoid/copyable_spec.rb +13 -4
  179. data/spec/mongoid/criteria/modifiable_spec.rb +297 -16
  180. data/spec/mongoid/criteria/options_spec.rb +29 -0
  181. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  182. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  183. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  184. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  185. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  186. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  187. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  188. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  189. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  190. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  191. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  192. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  193. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  194. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  195. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  196. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  197. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  198. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  199. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  200. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  201. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  202. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  203. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  204. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  205. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  206. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  207. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  208. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  209. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4242 -0
  210. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  211. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  212. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  213. data/spec/mongoid/criteria_spec.rb +156 -22
  214. data/spec/mongoid/document_spec.rb +100 -90
  215. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  216. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  217. data/spec/mongoid/extensions/big_decimal_spec.rb +321 -19
  218. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  219. data/spec/mongoid/extensions/date_spec.rb +2 -6
  220. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  221. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  222. data/spec/mongoid/extensions/float_spec.rb +8 -1
  223. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  224. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  225. data/spec/mongoid/extensions/object_spec.rb +11 -0
  226. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  227. data/spec/mongoid/extensions/string_spec.rb +53 -4
  228. data/spec/mongoid/extensions/time_spec.rb +2 -6
  229. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  230. data/spec/mongoid/factory_spec.rb +11 -0
  231. data/spec/mongoid/fields_spec.rb +1 -1
  232. data/spec/mongoid/findable_spec.rb +47 -2
  233. data/spec/mongoid/indexable_spec.rb +15 -3
  234. data/spec/mongoid/interceptable_spec.rb +85 -19
  235. data/spec/mongoid/matchable/all_spec.rb +4 -4
  236. data/spec/mongoid/matchable/and_spec.rb +10 -10
  237. data/spec/mongoid/matchable/default_spec.rb +12 -12
  238. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  239. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  240. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  241. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  242. data/spec/mongoid/matchable/in_spec.rb +5 -5
  243. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  244. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  245. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  246. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  247. data/spec/mongoid/matchable/nor_spec.rb +209 -0
  248. data/spec/mongoid/matchable/or_spec.rb +7 -7
  249. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  250. data/spec/mongoid/matchable/size_spec.rb +3 -3
  251. data/spec/mongoid/matchable_spec.rb +199 -54
  252. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  253. data/spec/mongoid/persistable/deletable_spec.rb +35 -1
  254. data/spec/mongoid/persistable/destroyable_spec.rb +25 -2
  255. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  256. data/spec/mongoid/persistable/savable_spec.rb +34 -29
  257. data/spec/mongoid/persistable/settable_spec.rb +77 -27
  258. data/spec/mongoid/persistable/updatable_spec.rb +182 -3
  259. data/spec/mongoid/persistable_spec.rb +16 -16
  260. data/spec/mongoid/persistence_context_spec.rb +694 -0
  261. data/spec/mongoid/positional_spec.rb +1 -1
  262. data/spec/mongoid/query_cache_spec.rb +170 -12
  263. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  264. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  265. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  266. data/spec/mongoid/relations/builders_spec.rb +37 -10
  267. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  268. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  269. data/spec/mongoid/relations/eager_spec.rb +40 -0
  270. data/spec/mongoid/relations/embedded/many_spec.rb +305 -59
  271. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  272. data/spec/mongoid/relations/macros_spec.rb +415 -7
  273. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  274. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  275. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  276. data/spec/mongoid/relations/referenced/many_spec.rb +35 -25
  277. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  278. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  279. data/spec/mongoid/relations/targets/enumerable_spec.rb +108 -0
  280. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  281. data/spec/mongoid/reloadable_spec.rb +51 -0
  282. data/spec/mongoid/scopable_spec.rb +13 -0
  283. data/spec/mongoid/serializable_spec.rb +0 -50
  284. data/spec/mongoid/threaded_spec.rb +68 -0
  285. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  286. data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
  287. data/spec/mongoid/validatable_spec.rb +16 -0
  288. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  289. data/spec/spec_helper.rb +101 -8
  290. data/spec/support/cluster_config.rb +158 -0
  291. data/spec/support/constraints.rb +101 -0
  292. data/spec/support/macros.rb +20 -0
  293. data/spec/support/session_registry.rb +50 -0
  294. data/spec/support/spec_config.rb +42 -0
  295. data.tar.gz.sig +0 -0
  296. metadata +163 -61
  297. metadata.gz.sig +0 -0
  298. data/lib/mongoid/clients/thread_options.rb +0 -19
  299. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  300. data/lib/mongoid/railties/document.rb +0 -12
  301. data/spec/mongoid/railties/document_spec.rb +0 -24
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
 
3
3
  describe Mongoid::Matchable do
4
4
 
5
- describe "#matches?" do
5
+ describe "#_matches?" do
6
6
 
7
7
  context "when document is embeded" do
8
8
 
@@ -26,7 +26,7 @@ describe Mongoid::Matchable do
26
26
  end
27
27
 
28
28
  it "returns false" do
29
- expect(document.locations.first.matches?(selector)).to be false
29
+ expect(document.locations.first._matches?(selector)).to be false
30
30
  end
31
31
 
32
32
  context "when just change the selector order" do
@@ -36,7 +36,7 @@ describe Mongoid::Matchable do
36
36
  end
37
37
 
38
38
  it "returns false " do
39
- expect(document.locations.first.matches?(selector)).to be false
39
+ expect(document.locations.first._matches?(selector)).to be false
40
40
  end
41
41
  end
42
42
  end
@@ -50,7 +50,7 @@ describe Mongoid::Matchable do
50
50
  end
51
51
 
52
52
  it "returns true" do
53
- expect(document.locations.first.matches?(selector)).to be true
53
+ expect(document.locations.first._matches?(selector)).to be true
54
54
  end
55
55
  end
56
56
 
@@ -61,7 +61,7 @@ describe Mongoid::Matchable do
61
61
  end
62
62
 
63
63
  it "returns false" do
64
- expect(document.locations.first.matches?(selector)).to be false
64
+ expect(document.locations.first._matches?(selector)).to be false
65
65
  end
66
66
  end
67
67
 
@@ -72,7 +72,7 @@ describe Mongoid::Matchable do
72
72
  end
73
73
 
74
74
  it "returns false" do
75
- expect(document.locations.first.matches?(selector)).to be false
75
+ expect(document.locations.first._matches?(selector)).to be false
76
76
  end
77
77
  end
78
78
  end
@@ -86,9 +86,9 @@ describe Mongoid::Matchable do
86
86
  let(:selector) do
87
87
  { "occupants.0" => "Tim" }
88
88
  end
89
-
89
+
90
90
  it "returns true" do
91
- expect(document.locations.first.matches?(selector)).to be true
91
+ expect(document.locations.first._matches?(selector)).to be true
92
92
  end
93
93
  end
94
94
 
@@ -99,7 +99,7 @@ describe Mongoid::Matchable do
99
99
  end
100
100
 
101
101
  it "returns false" do
102
- expect(document.locations.first.matches?(selector)).to be false
102
+ expect(document.locations.first._matches?(selector)).to be false
103
103
  end
104
104
  end
105
105
  end
@@ -113,7 +113,7 @@ describe Mongoid::Matchable do
113
113
  end
114
114
 
115
115
  it "returns true" do
116
- expect(document.locations.first.matches?(selector)).to be true
116
+ expect(document.locations.first._matches?(selector)).to be true
117
117
  end
118
118
  end
119
119
 
@@ -124,7 +124,7 @@ describe Mongoid::Matchable do
124
124
  end
125
125
 
126
126
  it "returns false" do
127
- expect(document.locations.first.matches?(selector)).to be false
127
+ expect(document.locations.first._matches?(selector)).to be false
128
128
  end
129
129
  end
130
130
 
@@ -135,11 +135,131 @@ describe Mongoid::Matchable do
135
135
  end
136
136
 
137
137
  it "returns false" do
138
- expect(document.locations.first.matches?(selector)).to be false
138
+ expect(document.locations.first._matches?(selector)).to be false
139
139
  end
140
140
  end
141
141
  end
142
142
 
143
+ context "when using $elemMatch" do
144
+
145
+ context "one predicate" do
146
+
147
+ let(:selector) do
148
+ {
149
+ "occupants" => {"$elemMatch" => {"name" => "Tim"}}
150
+ }
151
+ end
152
+
153
+ context "and there is a matching sub document" do
154
+
155
+ it "returns true" do
156
+ expect(document.locations.first._matches?(selector)).to be true
157
+ end
158
+
159
+ context "using $in" do
160
+ let(:selector) do
161
+ {
162
+ "occupants" => {"$elemMatch" => {"name" => {"$in" => ["Tim", "Alice"]}}}
163
+ }
164
+ end
165
+
166
+ it "returns true" do
167
+ expect(document.locations.first._matches?(selector)).to be true
168
+ end
169
+ end
170
+ end
171
+
172
+ context "and there is not a matching sub document" do
173
+
174
+ let(:selector) do
175
+ {
176
+ "occupants" => {"$elemMatch" => {"name" => "Lyle"}}
177
+ }
178
+ end
179
+
180
+ it "returns false" do
181
+ expect(document.locations.first._matches?(selector)).to be false
182
+ end
183
+
184
+ context "using $in" do
185
+ let(:selector) do
186
+ {
187
+ "occupants" => {"$elemMatch" => {"name" => {"$in" => ["Lyfe", "Alice"]}}}
188
+ }
189
+ end
190
+
191
+ it "returns false" do
192
+ expect(document.locations.first._matches?(selector)).to be false
193
+ end
194
+ end
195
+ end
196
+ end
197
+
198
+ context "multiple predicates" do
199
+
200
+ before do
201
+ document.locations = [
202
+ Location.new(
203
+ name: 'No.1',
204
+ info: { 'door' => 'Red'},
205
+ occupants: [{'name' => 'Tim', 'eye_color' => 'brown'}, {'name' => 'Alice', 'eye_color' => 'blue'}]
206
+ )
207
+ ]
208
+ end
209
+
210
+ let(:selector) do
211
+ {
212
+ "occupants" => {"$elemMatch" => {"name" => "Tim", "eye_color" => "brown"}}
213
+ }
214
+ end
215
+
216
+ context "and there is a matching sub document" do
217
+
218
+ it "returns true" do
219
+ expect(document.locations.first._matches?(selector)).to be true
220
+ end
221
+
222
+ context "using $in and $ne in the $elemMatch to include the element" do
223
+
224
+ let(:selector) do
225
+ {
226
+ "occupants" => {"$elemMatch" => {"name" => {"$in" => ["Tim"]}, "eye_color" => {"$ne" => "blue"}}}
227
+ }
228
+ end
229
+
230
+ it "returns true" do
231
+ expect(document.locations.first._matches?(selector)).to be true
232
+ end
233
+ end
234
+ end
235
+
236
+ context "and there is not a matching sub document" do
237
+
238
+ let(:selector) do
239
+ {
240
+ "occupants" => {"$elemMatch" => {"name" => "Tim", "eye_color" => "blue"}}
241
+ }
242
+ end
243
+
244
+ it "returns false" do
245
+ expect(document.locations.first._matches?(selector)).to be false
246
+ end
247
+
248
+ context "using $ne in the $elemMatch to exclude the element" do
249
+
250
+ let(:selector) do
251
+ {
252
+ "occupants" => {"$elemMatch" => {"name" => {"$in" => ["Tim"]}, "eye_color" => {"$ne" => "brown"}}}
253
+ }
254
+ end
255
+
256
+ it "returns false" do
257
+ expect(document.locations.first._matches?(selector)).to be false
258
+ end
259
+ end
260
+ end
261
+ end
262
+ end
143
263
  end
144
264
 
145
265
  context "when performing simple matching" do
@@ -155,7 +275,7 @@ describe Mongoid::Matchable do
155
275
  end
156
276
 
157
277
  it "returns true" do
158
- expect(document.matches?(selector)).to be true
278
+ expect(document._matches?(selector)).to be true
159
279
  end
160
280
  end
161
281
 
@@ -166,7 +286,7 @@ describe Mongoid::Matchable do
166
286
  end
167
287
 
168
288
  it "returns false" do
169
- expect(document.matches?(selector)).to be false
289
+ expect(document._matches?(selector)).to be false
170
290
  end
171
291
  end
172
292
 
@@ -177,7 +297,7 @@ describe Mongoid::Matchable do
177
297
  end
178
298
 
179
299
  it "returns true" do
180
- expect(document.matches?(selector)).to be true
300
+ expect(document._matches?(selector)).to be true
181
301
  end
182
302
  end
183
303
 
@@ -188,7 +308,7 @@ describe Mongoid::Matchable do
188
308
  end
189
309
 
190
310
  it "returns true" do
191
- expect(document.matches?(selector)).to be true
311
+ expect(document._matches?(selector)).to be true
192
312
  end
193
313
  end
194
314
  end
@@ -213,7 +333,7 @@ describe Mongoid::Matchable do
213
333
  end
214
334
 
215
335
  it "returns true" do
216
- expect(document.matches?(selector)).to be true
336
+ expect(document._matches?(selector)).to be true
217
337
  end
218
338
  end
219
339
 
@@ -224,7 +344,7 @@ describe Mongoid::Matchable do
224
344
  end
225
345
 
226
346
  it "returns false" do
227
- expect(document.matches?(selector)).to be false
347
+ expect(document._matches?(selector)).to be false
228
348
  end
229
349
  end
230
350
  end
@@ -238,7 +358,7 @@ describe Mongoid::Matchable do
238
358
  end
239
359
 
240
360
  it "returns true" do
241
- expect(document.matches?(selector)).to be true
361
+ expect(document._matches?(selector)).to be true
242
362
  end
243
363
  end
244
364
 
@@ -249,7 +369,7 @@ describe Mongoid::Matchable do
249
369
  end
250
370
 
251
371
  it "returns false" do
252
- expect(document.matches?(selector)).to be false
372
+ expect(document._matches?(selector)).to be false
253
373
  end
254
374
  end
255
375
  end
@@ -263,7 +383,7 @@ describe Mongoid::Matchable do
263
383
  end
264
384
 
265
385
  it "returns true" do
266
- expect(document.matches?(selector)).to be true
386
+ expect(document._matches?(selector)).to be true
267
387
  end
268
388
  end
269
389
 
@@ -274,7 +394,7 @@ describe Mongoid::Matchable do
274
394
  end
275
395
 
276
396
  it "returns false" do
277
- expect(document.matches?(selector)).to be false
397
+ expect(document._matches?(selector)).to be false
278
398
  end
279
399
  end
280
400
  end
@@ -288,7 +408,7 @@ describe Mongoid::Matchable do
288
408
  end
289
409
 
290
410
  it "returns true" do
291
- expect(document.matches?(selector)).to be true
411
+ expect(document._matches?(selector)).to be true
292
412
  end
293
413
  end
294
414
 
@@ -299,7 +419,7 @@ describe Mongoid::Matchable do
299
419
  end
300
420
 
301
421
  it "returns false" do
302
- expect(document.matches?(selector)).to be false
422
+ expect(document._matches?(selector)).to be false
303
423
  end
304
424
  end
305
425
  end
@@ -313,7 +433,7 @@ describe Mongoid::Matchable do
313
433
  end
314
434
 
315
435
  it "returns true" do
316
- expect(document.matches?(selector)).to be true
436
+ expect(document._matches?(selector)).to be true
317
437
  end
318
438
  end
319
439
 
@@ -324,7 +444,7 @@ describe Mongoid::Matchable do
324
444
  end
325
445
 
326
446
  it "returns false" do
327
- expect(document.matches?(selector)).to be false
447
+ expect(document._matches?(selector)).to be false
328
448
  end
329
449
  end
330
450
  end
@@ -338,7 +458,7 @@ describe Mongoid::Matchable do
338
458
  end
339
459
 
340
460
  it "returns true" do
341
- expect(document.matches?(selector)).to be true
461
+ expect(document._matches?(selector)).to be true
342
462
  end
343
463
  end
344
464
 
@@ -349,7 +469,7 @@ describe Mongoid::Matchable do
349
469
  end
350
470
 
351
471
  it "returns false" do
352
- expect(document.matches?(selector)).to be false
472
+ expect(document._matches?(selector)).to be false
353
473
  end
354
474
  end
355
475
  end
@@ -367,7 +487,7 @@ describe Mongoid::Matchable do
367
487
  end
368
488
 
369
489
  it "returns true" do
370
- expect(document.matches?(selector)).to be true
490
+ expect(document._matches?(selector)).to be true
371
491
  end
372
492
  end
373
493
 
@@ -380,7 +500,7 @@ describe Mongoid::Matchable do
380
500
  end
381
501
 
382
502
  it "returns false" do
383
- expect(document.matches?(selector)).to be false
503
+ expect(document._matches?(selector)).to be false
384
504
  end
385
505
  end
386
506
  end
@@ -400,7 +520,7 @@ describe Mongoid::Matchable do
400
520
  end
401
521
 
402
522
  it "returns true" do
403
- expect(document.matches?(selector)).to be true
523
+ expect(document._matches?(selector)).to be true
404
524
  end
405
525
  end
406
526
 
@@ -413,7 +533,7 @@ describe Mongoid::Matchable do
413
533
  end
414
534
 
415
535
  it "returns false" do
416
- expect(document.matches?(selector)).to be false
536
+ expect(document._matches?(selector)).to be false
417
537
  end
418
538
  end
419
539
  end
@@ -429,7 +549,7 @@ describe Mongoid::Matchable do
429
549
  end
430
550
 
431
551
  it "returns true" do
432
- expect(document.matches?(selector)).to be true
552
+ expect(document._matches?(selector)).to be true
433
553
  end
434
554
  end
435
555
 
@@ -442,7 +562,7 @@ describe Mongoid::Matchable do
442
562
  end
443
563
 
444
564
  it "returns false" do
445
- expect(document.matches?(selector)).to be false
565
+ expect(document._matches?(selector)).to be false
446
566
  end
447
567
  end
448
568
  end
@@ -460,7 +580,7 @@ describe Mongoid::Matchable do
460
580
  end
461
581
 
462
582
  it "returns true" do
463
- expect(document.matches?(selector)).to be true
583
+ expect(document._matches?(selector)).to be true
464
584
  end
465
585
  end
466
586
 
@@ -473,7 +593,7 @@ describe Mongoid::Matchable do
473
593
  end
474
594
 
475
595
  it "returns false" do
476
- expect(document.matches?(selector)).to be false
596
+ expect(document._matches?(selector)).to be false
477
597
  end
478
598
  end
479
599
  end
@@ -488,7 +608,7 @@ describe Mongoid::Matchable do
488
608
  end
489
609
 
490
610
  it "returns true" do
491
- expect(document.matches?(selector)).to be true
611
+ expect(document._matches?(selector)).to be true
492
612
  end
493
613
  end
494
614
 
@@ -499,7 +619,7 @@ describe Mongoid::Matchable do
499
619
  end
500
620
 
501
621
  it "returns false" do
502
- expect(document.matches?(selector)).to be false
622
+ expect(document._matches?(selector)).to be false
503
623
  end
504
624
  end
505
625
  end
@@ -513,7 +633,7 @@ describe Mongoid::Matchable do
513
633
  end
514
634
 
515
635
  it "returns true" do
516
- expect(document.matches?(selector)).to be true
636
+ expect(document._matches?(selector)).to be true
517
637
  end
518
638
  end
519
639
 
@@ -524,7 +644,7 @@ describe Mongoid::Matchable do
524
644
  end
525
645
 
526
646
  it "returns false" do
527
- expect(document.matches?(selector)).to be false
647
+ expect(document._matches?(selector)).to be false
528
648
  end
529
649
  end
530
650
  end
@@ -538,7 +658,7 @@ describe Mongoid::Matchable do
538
658
  end
539
659
 
540
660
  it "returns true" do
541
- expect(document.matches?(selector)).to be true
661
+ expect(document._matches?(selector)).to be true
542
662
  end
543
663
  end
544
664
 
@@ -549,7 +669,7 @@ describe Mongoid::Matchable do
549
669
  end
550
670
 
551
671
  it "returns false" do
552
- expect(document.matches?(selector)).to be false
672
+ expect(document._matches?(selector)).to be false
553
673
  end
554
674
  end
555
675
  end
@@ -563,7 +683,7 @@ describe Mongoid::Matchable do
563
683
  end
564
684
 
565
685
  it "returns true" do
566
- expect(document.matches?(selector)).to be true
686
+ expect(document._matches?(selector)).to be true
567
687
  end
568
688
  end
569
689
 
@@ -574,7 +694,7 @@ describe Mongoid::Matchable do
574
694
  end
575
695
 
576
696
  it "returns false" do
577
- expect(document.matches?(selector)).to be false
697
+ expect(document._matches?(selector)).to be false
578
698
  end
579
699
  end
580
700
  end
@@ -588,7 +708,7 @@ describe Mongoid::Matchable do
588
708
  end
589
709
 
590
710
  it "returns true" do
591
- expect(document.matches?(selector)).to be true
711
+ expect(document._matches?(selector)).to be true
592
712
  end
593
713
  end
594
714
 
@@ -599,7 +719,7 @@ describe Mongoid::Matchable do
599
719
  end
600
720
 
601
721
  it "returns false" do
602
- expect(document.matches?(selector)).to be false
722
+ expect(document._matches?(selector)).to be false
603
723
  end
604
724
  end
605
725
  end
@@ -613,7 +733,7 @@ describe Mongoid::Matchable do
613
733
  end
614
734
 
615
735
  it "returns true" do
616
- expect(document.matches?(selector)).to be true
736
+ expect(document._matches?(selector)).to be true
617
737
  end
618
738
  end
619
739
 
@@ -624,7 +744,7 @@ describe Mongoid::Matchable do
624
744
  end
625
745
 
626
746
  it "returns false" do
627
- expect(document.matches?(selector)).to be false
747
+ expect(document._matches?(selector)).to be false
628
748
  end
629
749
  end
630
750
  end
@@ -638,7 +758,7 @@ describe Mongoid::Matchable do
638
758
  end
639
759
 
640
760
  it "returns true" do
641
- expect(document.matches?(selector)).to be true
761
+ expect(document._matches?(selector)).to be true
642
762
  end
643
763
  end
644
764
 
@@ -649,7 +769,32 @@ describe Mongoid::Matchable do
649
769
  end
650
770
 
651
771
  it "returns false" do
652
- expect(document.matches?(selector)).to be false
772
+ expect(document._matches?(selector)).to be false
773
+ end
774
+ end
775
+ end
776
+
777
+ context "with an $nor selector" do
778
+
779
+ context "when the attributes match" do
780
+
781
+ let(:selector) do
782
+ { "$nor" => [ { number: 10 }, { number: { "$gt" => 199 } } ] }
783
+ end
784
+
785
+ it "returns true" do
786
+ expect(document._matches?(selector)).to be true
787
+ end
788
+ end
789
+
790
+ context "when the attributes do not match" do
791
+
792
+ let(:selector) do
793
+ { "$nor" => [ { number: 10 }, { number: { "$gt" => 99 } } ] }
794
+ end
795
+
796
+ it "returns false" do
797
+ expect(document._matches?(selector)).to be false
653
798
  end
654
799
  end
655
800
  end
@@ -663,7 +808,7 @@ describe Mongoid::Matchable do
663
808
  end
664
809
 
665
810
  it "returns true" do
666
- expect(document.matches?(selector)).to be true
811
+ expect(document._matches?(selector)).to be true
667
812
  end
668
813
  end
669
814
 
@@ -674,7 +819,7 @@ describe Mongoid::Matchable do
674
819
  end
675
820
 
676
821
  it "returns false" do
677
- expect(document.matches?(selector)).to be false
822
+ expect(document._matches?(selector)).to be false
678
823
  end
679
824
  end
680
825
  end
@@ -688,7 +833,7 @@ describe Mongoid::Matchable do
688
833
  end
689
834
 
690
835
  it "returns true" do
691
- expect(document.matches?(selector)).to be true
836
+ expect(document._matches?(selector)).to be true
692
837
  end
693
838
  end
694
839
 
@@ -699,7 +844,7 @@ describe Mongoid::Matchable do
699
844
  end
700
845
 
701
846
  it "returns false" do
702
- expect(document.matches?(selector)).to be false
847
+ expect(document._matches?(selector)).to be false
703
848
  end
704
849
  end
705
850
  end
@@ -523,13 +523,18 @@ describe Mongoid::Persistable::Creatable do
523
523
  context "when a unique index exists" do
524
524
 
525
525
  before do
526
+ Person.index({ ssn: 1 }, { unique: true })
526
527
  Person.create_indexes
527
528
  end
528
529
 
530
+ after do
531
+ Person.collection.drop
532
+ end
533
+
529
534
  it "raises an error" do
530
535
  expect {
531
536
  4.times { Person.create!(ssn: "555-55-1029") }
532
- }.to raise_error
537
+ }.to raise_error(Mongo::Error::OperationFailure)
533
538
  end
534
539
  end
535
540
  end
@@ -562,7 +567,7 @@ describe Mongoid::Persistable::Creatable do
562
567
  end
563
568
  end
564
569
 
565
- context "when a callback returns false" do
570
+ context "when a callback aborts the chain" do
566
571
 
567
572
  it "raises a callback error" do
568
573
  expect { Oscar.create! }.to raise_error(Mongoid::Errors::Callback)
@@ -30,7 +30,7 @@ describe Mongoid::Persistable::Deletable do
30
30
  it "deletes the document from the collection" do
31
31
  expect {
32
32
  Person.find(person.id)
33
- }.to raise_error
33
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
34
34
  end
35
35
 
36
36
  it "returns true" do
@@ -213,6 +213,40 @@ describe Mongoid::Persistable::Deletable do
213
213
  expect(removed).to eq(1)
214
214
  end
215
215
  end
216
+
217
+ context "when the conditions need to be mongoized" do
218
+
219
+ let!(:removed) do
220
+ Person.delete_all(id: person.id)
221
+ end
222
+
223
+ it "removes the matching documents" do
224
+ expect(Person.count).to eq(1)
225
+ end
226
+
227
+ it "returns the number of documents removed" do
228
+ expect(removed).to eq(1)
229
+ end
230
+ end
231
+
232
+ context 'when the write concern is unacknowledged' do
233
+
234
+ before do
235
+ Person.create(title: 'miss')
236
+ end
237
+
238
+ let!(:deleted) do
239
+ Person.with(write: { w: 0 }) { |klass| klass.delete_all(title: "sir") }
240
+ end
241
+
242
+ it "removes the matching documents" do
243
+ expect(Person.where(title: 'miss').count).to eq(1)
244
+ end
245
+
246
+ it "returns 0" do
247
+ expect(deleted).to eq(0)
248
+ end
249
+ end
216
250
  end
217
251
  end
218
252
  end