mongoid 5.4.1 → 6.0.0.beta

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 (264) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/config/locales/en.yml +23 -16
  5. data/lib/mongoid.rb +4 -9
  6. data/lib/mongoid/atomic.rb +1 -1
  7. data/lib/mongoid/atomic/modifiers.rb +8 -12
  8. data/lib/mongoid/attributes.rb +9 -11
  9. data/lib/mongoid/attributes/dynamic.rb +5 -6
  10. data/lib/mongoid/attributes/nested.rb +1 -1
  11. data/lib/mongoid/attributes/processing.rb +4 -0
  12. data/lib/mongoid/attributes/readonly.rb +22 -0
  13. data/lib/mongoid/cacheable.rb +36 -0
  14. data/lib/mongoid/changeable.rb +37 -1
  15. data/lib/mongoid/clients.rb +0 -63
  16. data/lib/mongoid/clients/factory.rb +0 -2
  17. data/lib/mongoid/clients/options.rb +54 -249
  18. data/lib/mongoid/clients/storage_options.rb +1 -69
  19. data/lib/mongoid/composable.rb +26 -2
  20. data/lib/mongoid/config.rb +1 -1
  21. data/lib/mongoid/config/options.rb +1 -1
  22. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
  23. data/lib/mongoid/contextual/atomic.rb +6 -9
  24. data/lib/mongoid/contextual/geo_near.rb +2 -3
  25. data/lib/mongoid/contextual/map_reduce.rb +97 -24
  26. data/lib/mongoid/contextual/memory.rb +7 -4
  27. data/lib/mongoid/contextual/mongo.rb +63 -54
  28. data/lib/mongoid/contextual/none.rb +2 -2
  29. data/lib/mongoid/copyable.rb +19 -19
  30. data/lib/mongoid/criteria.rb +5 -4
  31. data/lib/mongoid/criteria/findable.rb +2 -3
  32. data/lib/mongoid/criteria/includable.rb +63 -16
  33. data/lib/mongoid/criteria/marshalable.rb +2 -2
  34. data/lib/mongoid/criteria/modifiable.rb +17 -1
  35. data/lib/mongoid/criteria/options.rb +25 -0
  36. data/lib/mongoid/criteria/queryable.rb +86 -0
  37. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  38. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  39. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  40. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  41. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  42. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  43. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  44. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  45. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  46. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  47. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  48. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  49. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
  50. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  51. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  52. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  53. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  54. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  55. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  56. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  57. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  58. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  59. data/lib/mongoid/criteria/queryable/optional.rb +411 -0
  60. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  61. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  62. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  63. data/lib/mongoid/criteria/queryable/selector.rb +196 -0
  64. data/lib/mongoid/criteria/queryable/smash.rb +103 -0
  65. data/lib/mongoid/document.rb +9 -23
  66. data/lib/mongoid/errors.rb +2 -1
  67. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  68. data/lib/mongoid/errors/delete_restriction.rb +2 -2
  69. data/lib/mongoid/errors/invalid_field.rb +2 -2
  70. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  71. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  72. data/lib/mongoid/errors/inverse_not_found.rb +1 -1
  73. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  74. data/lib/mongoid/evolvable.rb +1 -1
  75. data/lib/mongoid/extensions.rb +0 -5
  76. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  77. data/lib/mongoid/extensions/date.rb +4 -1
  78. data/lib/mongoid/extensions/hash.rb +2 -3
  79. data/lib/mongoid/extensions/object.rb +2 -2
  80. data/lib/mongoid/extensions/string.rb +4 -3
  81. data/lib/mongoid/extensions/time.rb +5 -2
  82. data/lib/mongoid/factory.rb +1 -0
  83. data/lib/mongoid/fields/foreign_key.rb +2 -2
  84. data/lib/mongoid/fields/localized.rb +3 -8
  85. data/lib/mongoid/fields/validators/macro.rb +18 -0
  86. data/lib/mongoid/findable.rb +3 -3
  87. data/lib/mongoid/indexable.rb +17 -16
  88. data/lib/mongoid/indexable/specification.rb +1 -1
  89. data/lib/mongoid/indexable/validators/options.rb +1 -2
  90. data/lib/mongoid/interceptable.rb +6 -17
  91. data/lib/mongoid/loggable.rb +1 -1
  92. data/lib/mongoid/matchable.rb +3 -10
  93. data/lib/mongoid/matchable/gt.rb +2 -0
  94. data/lib/mongoid/matchable/gte.rb +2 -0
  95. data/lib/mongoid/matchable/lt.rb +2 -0
  96. data/lib/mongoid/matchable/lte.rb +2 -0
  97. data/lib/mongoid/persistable.rb +6 -5
  98. data/lib/mongoid/persistable/creatable.rb +2 -0
  99. data/lib/mongoid/persistable/deletable.rb +7 -3
  100. data/lib/mongoid/persistable/settable.rb +3 -16
  101. data/lib/mongoid/persistable/updatable.rb +10 -12
  102. data/lib/mongoid/persistence_context.rb +216 -0
  103. data/lib/mongoid/query_cache.rb +5 -30
  104. data/lib/mongoid/relations/accessors.rb +6 -2
  105. data/lib/mongoid/relations/auto_save.rb +12 -4
  106. data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
  107. data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
  108. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
  109. data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
  110. data/lib/mongoid/relations/builders.rb +2 -2
  111. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  112. data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
  113. data/lib/mongoid/relations/conversions.rb +1 -1
  114. data/lib/mongoid/relations/counter_cache.rb +28 -18
  115. data/lib/mongoid/relations/eager.rb +19 -7
  116. data/lib/mongoid/relations/eager/base.rb +5 -5
  117. data/lib/mongoid/relations/embedded/batchable.rb +9 -33
  118. data/lib/mongoid/relations/embedded/in.rb +16 -2
  119. data/lib/mongoid/relations/embedded/many.rb +23 -8
  120. data/lib/mongoid/relations/embedded/one.rb +17 -2
  121. data/lib/mongoid/relations/macros.rb +9 -2
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/nested_builder.rb +1 -1
  124. data/lib/mongoid/relations/options.rb +2 -2
  125. data/lib/mongoid/relations/proxy.rb +2 -33
  126. data/lib/mongoid/relations/referenced/in.rb +23 -11
  127. data/lib/mongoid/relations/referenced/many.rb +24 -16
  128. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  129. data/lib/mongoid/relations/referenced/one.rb +17 -1
  130. data/lib/mongoid/relations/reflections.rb +3 -5
  131. data/lib/mongoid/relations/touchable.rb +1 -1
  132. data/lib/mongoid/reloadable.rb +1 -1
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +2 -3
  135. data/lib/mongoid/tasks/database.rb +1 -2
  136. data/lib/mongoid/threaded.rb +4 -4
  137. data/lib/mongoid/traversable.rb +1 -1
  138. data/lib/mongoid/validatable.rb +1 -1
  139. data/lib/mongoid/validatable/macros.rb +2 -4
  140. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  141. data/lib/mongoid/version.rb +1 -1
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
  143. data/spec/app/models/album.rb +5 -1
  144. data/spec/app/models/artist.rb +21 -0
  145. data/spec/app/models/band.rb +0 -1
  146. data/spec/app/models/church.rb +0 -2
  147. data/spec/app/models/ordered_post.rb +5 -0
  148. data/spec/app/models/oscar.rb +1 -2
  149. data/spec/app/models/person.rb +3 -1
  150. data/spec/app/models/post.rb +0 -1
  151. data/spec/app/models/princess.rb +2 -0
  152. data/spec/app/models/record.rb +1 -0
  153. data/spec/app/models/thing.rb +1 -1
  154. data/spec/config/mongoid.yml +1 -5
  155. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  156. data/spec/mongoid/atomic_spec.rb +17 -17
  157. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  158. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  159. data/spec/mongoid/attributes_spec.rb +63 -0
  160. data/spec/mongoid/cacheable_spec.rb +112 -0
  161. data/spec/mongoid/changeable_spec.rb +58 -0
  162. data/spec/mongoid/clients/factory_spec.rb +3 -11
  163. data/spec/mongoid/clients/options_spec.rb +378 -96
  164. data/spec/mongoid/clients_spec.rb +207 -170
  165. data/spec/mongoid/composable_spec.rb +7 -0
  166. data/spec/mongoid/config_spec.rb +41 -21
  167. data/spec/mongoid/contextual/atomic_spec.rb +77 -343
  168. data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
  169. data/spec/mongoid/contextual/memory_spec.rb +56 -316
  170. data/spec/mongoid/contextual/mongo_spec.rb +104 -378
  171. data/spec/mongoid/copyable_spec.rb +8 -15
  172. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  173. data/spec/mongoid/criteria/options_spec.rb +29 -0
  174. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  175. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  176. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  177. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  178. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  179. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  180. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  181. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  182. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  183. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  184. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  185. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  186. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  187. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  188. data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
  189. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  190. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  191. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  192. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  193. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  194. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  195. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  196. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  197. data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
  198. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  199. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  200. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  201. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
  202. data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
  203. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  204. data/spec/mongoid/criteria_spec.rb +45 -63
  205. data/spec/mongoid/document_spec.rb +21 -88
  206. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  207. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  208. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  209. data/spec/mongoid/extensions/date_spec.rb +2 -6
  210. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  211. data/spec/mongoid/extensions/float_spec.rb +8 -1
  212. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  213. data/spec/mongoid/extensions/object_spec.rb +11 -0
  214. data/spec/mongoid/extensions/string_spec.rb +21 -0
  215. data/spec/mongoid/extensions/time_spec.rb +4 -8
  216. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  217. data/spec/mongoid/fields/localized_spec.rb +0 -91
  218. data/spec/mongoid/findable_spec.rb +46 -1
  219. data/spec/mongoid/indexable_spec.rb +6 -46
  220. data/spec/mongoid/interceptable_spec.rb +49 -10
  221. data/spec/mongoid/matchable/gt_spec.rb +11 -0
  222. data/spec/mongoid/matchable/gte_spec.rb +10 -0
  223. data/spec/mongoid/matchable/lt_spec.rb +11 -0
  224. data/spec/mongoid/matchable/lte_spec.rb +11 -0
  225. data/spec/mongoid/matchable_spec.rb +1 -51
  226. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  227. data/spec/mongoid/persistable/deletable_spec.rb +1 -1
  228. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  229. data/spec/mongoid/persistable/savable_spec.rb +30 -30
  230. data/spec/mongoid/persistable/settable_spec.rb +0 -185
  231. data/spec/mongoid/persistable/updatable_spec.rb +166 -5
  232. data/spec/mongoid/persistence_context_spec.rb +654 -0
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +89 -65
  235. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  236. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  237. data/spec/mongoid/relations/builders_spec.rb +37 -10
  238. data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
  239. data/spec/mongoid/relations/cyclic_spec.rb +0 -22
  240. data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
  241. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  242. data/spec/mongoid/relations/macros_spec.rb +395 -7
  243. data/spec/mongoid/relations/proxy_spec.rb +3 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
  247. data/spec/mongoid/relations/reflections_spec.rb +9 -9
  248. data/spec/mongoid/reloadable_spec.rb +51 -0
  249. data/spec/mongoid/scopable_spec.rb +0 -12
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +10 -10
  255. metadata +536 -479
  256. metadata.gz.sig +0 -0
  257. data/lib/mongoid/clients/thread_options.rb +0 -19
  258. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
  259. data/lib/mongoid/extensions/decimal128.rb +0 -39
  260. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  261. data/lib/mongoid/matchable/regexp.rb +0 -27
  262. data/spec/app/models/post_genre.rb +0 -6
  263. data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -1,6 +1,7 @@
1
1
  class Record
2
2
  include Mongoid::Document
3
3
  field :name, type: String
4
+ field :producers, type: Array
4
5
 
5
6
  field :before_create_called, type: Mongoid::Boolean, default: false
6
7
  field :before_save_called, type: Mongoid::Boolean, default: false
@@ -4,6 +4,6 @@ class Thing
4
4
  embedded_in :actor
5
5
 
6
6
  def dont_do_it
7
- false
7
+ throw(:abort)
8
8
  end
9
9
  end
@@ -13,10 +13,6 @@ test:
13
13
  tag_sets:
14
14
  - use: web
15
15
  max_pool_size: 1
16
- reports:
17
- database: reports
18
- hosts:
19
- - <%=ENV["MONGOID_SPEC_HOST"]%>:<%=ENV["MONGOID_SPEC_PORT"]%>
20
16
  options:
21
17
  include_root_in_json: false
22
18
  include_type_for_serialization: false
@@ -26,4 +22,4 @@ test:
26
22
  use_activesupport_time_zone: true
27
23
  use_utc: false
28
24
  log_level: :warn
29
- app_name: 'testing'
25
+ belongs_to_required_by_default: false
@@ -211,10 +211,10 @@ describe Mongoid::Atomic::Modifiers do
211
211
 
212
212
  it "adds the push all modifiers" do
213
213
  expect(modifiers).to eq(
214
- { "$push" =>
215
- { "addresses" => { '$each' => [
214
+ { "$pushAll" =>
215
+ { "addresses" => [
216
216
  { "street" => "Oxford St" }
217
- ] }
217
+ ]
218
218
  }
219
219
  }
220
220
  )
@@ -238,11 +238,11 @@ describe Mongoid::Atomic::Modifiers do
238
238
 
239
239
  it "adds the push all modifiers" do
240
240
  expect(modifiers).to eq(
241
- { "$push" =>
242
- { "addresses" => { '$each' => [
241
+ { "$pushAll" =>
242
+ { "addresses" => [
243
243
  { "street" => "Hobrechtstr." },
244
244
  { "street" => "Pflugerstr." }
245
- ] }
245
+ ]
246
246
  }
247
247
  }
248
248
  )
@@ -270,10 +270,10 @@ describe Mongoid::Atomic::Modifiers do
270
270
  it "adds the push all modifiers to the conflicts hash" do
271
271
  expect(modifiers).to eq(
272
272
  { "$set" => { "addresses.0.street" => "Bond" },
273
- conflicts: { "$push" =>
274
- { "addresses" => { '$each' => [
273
+ conflicts: { "$pushAll" =>
274
+ { "addresses" => [
275
275
  { "street" => "Oxford St" }
276
- ] }
276
+ ]
277
277
  }
278
278
  }
279
279
  }
@@ -300,10 +300,10 @@ describe Mongoid::Atomic::Modifiers do
300
300
  expect(modifiers).to eq(
301
301
  { "$pullAll" => {
302
302
  "addresses" => { "street" => "Bond St" }},
303
- conflicts: { "$push" =>
304
- { "addresses" => { '$each' => [
303
+ conflicts: { "$pushAll" =>
304
+ { "addresses" => [
305
305
  { "street" => "Oxford St" }
306
- ] }
306
+ ]
307
307
  }
308
308
  }
309
309
  }
@@ -328,12 +328,12 @@ describe Mongoid::Atomic::Modifiers do
328
328
 
329
329
  it "adds the push all modifiers to the conflicts hash" do
330
330
  expect(modifiers).to eq(
331
- { "$push" => {
332
- "addresses.0.locations" => {'$each' => [{ "street" => "Bond St" }]}},
333
- conflicts: { "$push" =>
334
- { "addresses" => { '$each' => [
331
+ { "$pushAll" => {
332
+ "addresses.0.locations" => [{ "street" => "Bond St" }]},
333
+ conflicts: { "$pushAll" =>
334
+ { "addresses" => [
335
335
  { "street" => "Oxford St" }
336
- ] }
336
+ ]
337
337
  }
338
338
  }
339
339
  }
@@ -76,13 +76,13 @@ describe Mongoid::Atomic do
76
76
  person.addresses.build(street: "Oxford St")
77
77
  end
78
78
 
79
- it "returns a $set and $push and $each for modifications" do
79
+ it "returns a $set and $pushAll for modifications" do
80
80
  expect(person.atomic_updates).to eq(
81
81
  {
82
82
  "$set" => { "title" => "Sir" },
83
- "$push" => { "addresses" => {'$each' => [
83
+ "$pushAll" => { "addresses" => [
84
84
  { "_id" => "oxford-st", "street" => "Oxford St" }
85
- ] } }
85
+ ]}
86
86
  }
87
87
  )
88
88
  end
@@ -197,8 +197,8 @@ describe Mongoid::Atomic do
197
197
  "addresses.0.street" => "Bond St"
198
198
  },
199
199
  conflicts: {
200
- "$push" => {
201
- "addresses.0.locations" => { '$each' => [{ "_id" => location.id, "name" => "Home" }] }
200
+ "$pushAll" => {
201
+ "addresses.0.locations" => [{ "_id" => location.id, "name" => "Home" }]
202
202
  }
203
203
  }
204
204
  }
@@ -215,8 +215,8 @@ describe Mongoid::Atomic do
215
215
  "addresses.0.street" => "Bond St"
216
216
  },
217
217
  conflicts: {
218
- "$push" => {
219
- "addresses.0.locations" => { '$each' => [{ "_id" => location.id, "name" => "Home" }] }
218
+ "$pushAll" => {
219
+ "addresses.0.locations" => [{ "_id" => location.id, "name" => "Home" }]
220
220
  }
221
221
  }
222
222
  }
@@ -263,15 +263,15 @@ describe Mongoid::Atomic do
263
263
  "addresses.0.street" => "Bond St"
264
264
  },
265
265
  conflicts: {
266
- "$push" => {
267
- "addresses" => { '$each' => [{
266
+ "$pushAll" => {
267
+ "addresses" => [{
268
268
  "_id" => new_address.id,
269
269
  "street" => "Another",
270
270
  "locations" => [
271
271
  "_id" => location.id,
272
272
  "name" => "Home"
273
273
  ]
274
- }] }
274
+ }]
275
275
  }
276
276
  }
277
277
  }
@@ -310,15 +310,15 @@ describe Mongoid::Atomic do
310
310
  "$set" => {
311
311
  "title" => "Sir"
312
312
  },
313
- "$push" => {
314
- "addresses" => { '$each' => [{
313
+ "$pushAll" => {
314
+ "addresses" => [{
315
315
  "_id" => new_address.id,
316
316
  "street" => "Ipanema",
317
317
  "locations" => [
318
318
  "_id" => location.id,
319
319
  "name" => "Home"
320
320
  ]
321
- }] }
321
+ }]
322
322
  },
323
323
  conflicts: {
324
324
  "$set" => { "addresses.0.street"=>"Bond St" }
@@ -339,21 +339,21 @@ describe Mongoid::Atomic do
339
339
  address.locations.build(name: "Home")
340
340
  end
341
341
 
342
- it "returns the proper $sets and $pushs and $eaches for all levels" do
342
+ it "returns the proper $sets and $pushAlls for all levels" do
343
343
  expect(person.atomic_updates).to eq(
344
344
  {
345
345
  "$set" => {
346
346
  "title" => "Sir",
347
347
  },
348
- "$push" => {
349
- "addresses" => { "$each" => [{
348
+ "$pushAll" => {
349
+ "addresses" => [{
350
350
  "_id" => address.id,
351
351
  "street" => "Another",
352
352
  "locations" => [
353
353
  "_id" => location.id,
354
354
  "name" => "Home"
355
355
  ]
356
- }] }
356
+ }]
357
357
  }
358
358
  }
359
359
  )
@@ -1335,7 +1335,7 @@ describe Mongoid::Attributes::Nested do
1335
1335
  expect {
1336
1336
  person.addresses_attributes =
1337
1337
  { "foo" => { "id" => "test", "street" => "Test" } }
1338
- }.to raise_error
1338
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
1339
1339
  end
1340
1340
  end
1341
1341
  end
@@ -1434,7 +1434,7 @@ describe Mongoid::Attributes::Nested do
1434
1434
  Person.create(age: 42)
1435
1435
  end
1436
1436
 
1437
- context "when the child returns false in a before callback" do
1437
+ context "when the child halts the callback chain in a before callback" do
1438
1438
 
1439
1439
  context "when the child is not paranoid" do
1440
1440
 
@@ -1970,7 +1970,7 @@ describe Mongoid::Attributes::Nested do
1970
1970
  }
1971
1971
  end
1972
1972
 
1973
- it "ignores the the marked document" do
1973
+ it "ignores the marked document" do
1974
1974
  expect(person.addresses.size).to eq(1)
1975
1975
  end
1976
1976
 
@@ -2031,7 +2031,7 @@ describe Mongoid::Attributes::Nested do
2031
2031
  }
2032
2032
  end
2033
2033
 
2034
- it "adds the the marked document" do
2034
+ it "adds the marked document" do
2035
2035
  expect(person.addresses.first.street).to eq("Maybachufer")
2036
2036
  end
2037
2037
 
@@ -2091,7 +2091,7 @@ describe Mongoid::Attributes::Nested do
2091
2091
  }
2092
2092
  end
2093
2093
 
2094
- it "adds the the marked document" do
2094
+ it "adds the marked document" do
2095
2095
  expect(person.addresses.first.street).to eq("Maybachufer")
2096
2096
  end
2097
2097
 
@@ -3028,7 +3028,7 @@ describe Mongoid::Attributes::Nested do
3028
3028
  expect {
3029
3029
  person.posts_attributes =
3030
3030
  { "foo" => { "id" => "test", "title" => "Test" } }
3031
- }.to raise_error
3031
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
3032
3032
  end
3033
3033
  end
3034
3034
  end
@@ -3431,7 +3431,7 @@ describe Mongoid::Attributes::Nested do
3431
3431
  }
3432
3432
  end
3433
3433
 
3434
- it "ignores the the marked document" do
3434
+ it "ignores the marked document" do
3435
3435
  expect(person.posts.size).to eq(1)
3436
3436
  end
3437
3437
 
@@ -3492,7 +3492,7 @@ describe Mongoid::Attributes::Nested do
3492
3492
  }
3493
3493
  end
3494
3494
 
3495
- it "adds the the marked document" do
3495
+ it "adds the marked document" do
3496
3496
  expect(person.posts.first.title).to eq("New Blog")
3497
3497
  end
3498
3498
 
@@ -3552,7 +3552,7 @@ describe Mongoid::Attributes::Nested do
3552
3552
  }
3553
3553
  end
3554
3554
 
3555
- it "adds the the marked document" do
3555
+ it "adds the marked document" do
3556
3556
  expect(person.posts.first.title).to eq("New Blog")
3557
3557
  end
3558
3558
 
@@ -3745,7 +3745,7 @@ describe Mongoid::Attributes::Nested do
3745
3745
  expect {
3746
3746
  person.preferences_attributes =
3747
3747
  { "foo" => { "id" => "test", "name" => "Test" } }
3748
- }.to raise_error
3748
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
3749
3749
  end
3750
3750
  end
3751
3751
  end
@@ -4097,7 +4097,7 @@ describe Mongoid::Attributes::Nested do
4097
4097
  }
4098
4098
  end
4099
4099
 
4100
- it "ignores the the marked document" do
4100
+ it "ignores the marked document" do
4101
4101
  expect(person.preferences.size).to eq(1)
4102
4102
  end
4103
4103
 
@@ -4158,7 +4158,7 @@ describe Mongoid::Attributes::Nested do
4158
4158
  }
4159
4159
  end
4160
4160
 
4161
- it "adds the the marked document" do
4161
+ it "adds the marked document" do
4162
4162
  expect(person.preferences.first.name).to eq("New Blog")
4163
4163
  end
4164
4164
 
@@ -4218,7 +4218,7 @@ describe Mongoid::Attributes::Nested do
4218
4218
  }
4219
4219
  end
4220
4220
 
4221
- it "adds the the marked document" do
4221
+ it "adds the marked document" do
4222
4222
  expect(person.preferences.first.name).to eq("New Blog")
4223
4223
  end
4224
4224
 
@@ -4852,7 +4852,7 @@ describe Mongoid::Attributes::Nested do
4852
4852
  end
4853
4853
 
4854
4854
  it "the update raises an error" do
4855
- expect{ error_raising_update }.to raise_error
4855
+ expect{ error_raising_update }.to raise_error(Mongoid::Errors::Validations)
4856
4856
  end
4857
4857
 
4858
4858
  it "the update does not occur" do
@@ -2,49 +2,56 @@ require "spec_helper"
2
2
 
3
3
  describe Mongoid::Attributes::Readonly do
4
4
 
5
- describe ".attr_readonly" do
5
+ before do
6
+ Person.attr_readonly(*attributes)
7
+ end
6
8
 
7
- after do
8
- Person.readonly_attributes.clear
9
+ after do
10
+ Person.readonly_attributes.reject! do |a|
11
+ [ attributes ].flatten.include?(a.to_sym) ||
12
+ [ attributes ].flatten.include?(Person.aliased_fields.key(a).to_sym)
9
13
  end
14
+ end
15
+
16
+ describe ".attr_readonly" do
10
17
 
11
18
  context "when providing a single field" do
12
19
 
13
- before do
14
- Person.attr_readonly :title
20
+ let(:attributes) do
21
+ :title
15
22
  end
16
23
 
17
24
  it "adds the field to readonly attributes" do
18
- expect(Person.readonly_attributes.to_a).to eq([ "title" ])
25
+ expect(Person.readonly_attributes.to_a).to include("title")
19
26
  end
20
27
  end
21
28
 
22
29
  context "when providing a field alias" do
23
30
 
24
- before do
25
- Person.attr_readonly :aliased_timestamp
31
+ let(:attributes) do
32
+ :aliased_timestamp
26
33
  end
27
34
 
28
35
  it "adds the database field name to readonly attributes" do
29
- expect(Person.readonly_attributes.to_a).to eq([ "at" ])
36
+ expect(Person.readonly_attributes.to_a).to include("at")
30
37
  end
31
38
  end
32
39
 
33
40
  context "when providing multiple fields" do
34
41
 
35
- before do
36
- Person.attr_readonly :title, :terms
42
+ let(:attributes) do
43
+ [ :title, :terms ]
37
44
  end
38
45
 
39
46
  it "adds the fields to readonly attributes" do
40
- expect(Person.readonly_attributes.to_a).to eq([ "title", "terms" ])
47
+ expect(Person.readonly_attributes.to_a).to include("title", "terms")
41
48
  end
42
49
  end
43
50
 
44
51
  context "when creating a new document with a readonly field" do
45
52
 
46
- before do
47
- Person.attr_readonly :title, :terms, :aliased_timestamp
53
+ let(:attributes) do
54
+ [ :title, :terms, :aliased_timestamp ]
48
55
  end
49
56
 
50
57
  let(:person) do
@@ -78,8 +85,8 @@ describe Mongoid::Attributes::Readonly do
78
85
 
79
86
  context "when updating an existing readonly field" do
80
87
 
81
- before do
82
- Person.attr_readonly :title, :terms, :score, :aliased_timestamp
88
+ let(:attributes) do
89
+ [ :title, :terms, :score, :aliased_timestamp ]
83
90
  end
84
91
 
85
92
  let(:person) do
@@ -88,25 +95,31 @@ describe Mongoid::Attributes::Readonly do
88
95
 
89
96
  context "when updating via the setter" do
90
97
 
91
- before do
92
- person.title = "mr"
93
- person.aliased_timestamp = Time.at(43)
94
- person.save
95
- end
96
-
97
98
  it "does not update the first field" do
99
+ expect {
100
+ person.title = 'mr'
101
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
98
102
  expect(person.title).to eq("sir")
99
103
  end
100
104
 
101
105
  it "does not update the second field" do
106
+ expect {
107
+ person.aliased_timestamp = Time.at(43)
108
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
102
109
  expect(person.aliased_timestamp).to eq(Time.at(42))
103
110
  end
104
111
 
105
112
  it "does not persist the first field" do
113
+ expect {
114
+ person.title = 'mr'
115
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
106
116
  expect(person.reload.title).to eq("sir")
107
117
  end
108
118
 
109
119
  it "does not persist the second field" do
120
+ expect {
121
+ person.aliased_timestamp = Time.at(43)
122
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
110
123
  expect(person.reload.aliased_timestamp).to eq(Time.at(42))
111
124
  end
112
125
  end
@@ -114,6 +127,7 @@ describe Mongoid::Attributes::Readonly do
114
127
  context "when updating via inc" do
115
128
 
116
129
  context 'with single field operation' do
130
+
117
131
  it "raises an error " do
118
132
  expect {
119
133
  person.inc(score: 1)
@@ -122,6 +136,7 @@ describe Mongoid::Attributes::Readonly do
122
136
  end
123
137
 
124
138
  context 'with multiple fields operation' do
139
+
125
140
  it "raises an error " do
126
141
  expect {
127
142
  person.inc(score: 1, age: 1)
@@ -133,6 +148,7 @@ describe Mongoid::Attributes::Readonly do
133
148
  context "when updating via bit" do
134
149
 
135
150
  context 'with single field operation' do
151
+
136
152
  it "raises an error " do
137
153
  expect {
138
154
  person.bit(score: { or: 13 })
@@ -141,6 +157,7 @@ describe Mongoid::Attributes::Readonly do
141
157
  end
142
158
 
143
159
  context 'with multiple fields operation' do
160
+
144
161
  it "raises an error " do
145
162
  expect {
146
163
  person.bit(
@@ -153,98 +170,124 @@ describe Mongoid::Attributes::Readonly do
153
170
 
154
171
  context "when updating via []=" do
155
172
 
156
- before do
157
- person[:title] = "mr"
158
- person[:aliased_timestamp] = Time.at(43)
159
- person.save
160
- end
161
-
162
173
  it "does not update the first field" do
174
+ expect {
175
+ person[:title] = "mr"
176
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
163
177
  expect(person.title).to eq("sir")
164
178
  end
165
179
 
166
180
  it "does not update the second field" do
181
+ expect {
182
+ person[:aliased_timestamp] = Time.at(43)
183
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
167
184
  expect(person.aliased_timestamp).to eq(Time.at(42))
168
185
  end
169
186
 
170
187
  it "does not persist the first field" do
188
+ expect {
189
+ person[:title] = "mr"
190
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
171
191
  expect(person.reload.title).to eq("sir")
172
192
  end
173
193
 
174
194
  it "does not persist the second field" do
195
+ expect {
196
+ person[:aliased_timestamp] = Time.at(43)
197
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
175
198
  expect(person.reload.aliased_timestamp).to eq(Time.at(42))
176
199
  end
177
200
  end
178
201
 
179
202
  context "when updating via write_attribute" do
180
203
 
181
- before do
182
- person.write_attribute(:title, "mr")
183
- person.write_attribute(:aliased_timestamp, Time.at(43))
184
- person.save
185
- end
186
-
187
204
  it "does not update the first field" do
205
+ expect {
206
+ person.write_attribute(:title, "mr")
207
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
188
208
  expect(person.title).to eq("sir")
189
209
  end
190
210
 
191
211
  it "does not update the second field" do
212
+ expect {
213
+ person.write_attribute(:aliased_timestamp, Time.at(43))
214
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
192
215
  expect(person.aliased_timestamp).to eq(Time.at(42))
193
216
  end
194
217
 
195
218
  it "does not persist the first field" do
219
+ expect {
220
+ person.write_attribute(:title, "mr")
221
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
196
222
  expect(person.reload.title).to eq("sir")
197
223
  end
198
224
 
199
225
  it "does not persist the second field" do
226
+ expect {
227
+ person.write_attribute(:aliased_timestamp, Time.at(43))
228
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
200
229
  expect(person.reload.aliased_timestamp).to eq(Time.at(42))
201
230
  end
202
231
  end
203
232
 
204
233
  context "when updating via update_attributes" do
205
234
 
206
- before do
207
- person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
208
- person.save
209
- end
210
-
211
235
  it "does not update the first field" do
236
+ expect {
237
+ person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
238
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
212
239
  expect(person.title).to eq("sir")
213
240
  end
214
241
 
215
242
  it "does not update the second field" do
243
+ expect {
244
+ person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
245
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
216
246
  expect(person.aliased_timestamp).to eq(Time.at(42))
217
247
  end
218
248
 
219
249
  it "does not persist the first field" do
250
+ expect {
251
+ person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
252
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
220
253
  expect(person.reload.title).to eq("sir")
221
254
  end
222
255
 
223
256
  it "does not persist the second field" do
257
+ expect {
258
+ person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
259
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
224
260
  expect(person.reload.aliased_timestamp).to eq(Time.at(42))
225
261
  end
226
262
  end
227
263
 
228
264
  context "when updating via update_attributes!" do
229
265
 
230
- before do
231
- person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
232
- person.save
233
- end
234
-
235
266
  it "does not update the first field" do
267
+ expect {
268
+ person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
269
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
236
270
  expect(person.title).to eq("sir")
237
271
  end
238
272
 
239
273
  it "does not update the second field" do
274
+ expect {
275
+ person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
276
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
240
277
  expect(person.aliased_timestamp).to eq(Time.at(42))
241
278
  end
242
279
 
243
280
  it "does not persist the first field" do
281
+ expect {
282
+ person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
283
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
244
284
  expect(person.reload.title).to eq("sir")
245
285
  end
246
286
 
247
287
  it "does not persist the second field" do
288
+ expect {
289
+ person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
290
+ }.to raise_exception(Mongoid::Errors::ReadonlyAttribute)
248
291
  expect(person.reload.aliased_timestamp).to eq(Time.at(42))
249
292
  end
250
293
  end