mongoid 5.4.1 → 6.1.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 (260) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +3 -3
  3. data/lib/config/locales/en.yml +19 -0
  4. data/lib/mongoid.rb +4 -4
  5. data/lib/mongoid/atomic.rb +2 -2
  6. data/lib/mongoid/atomic/modifiers.rb +8 -12
  7. data/lib/mongoid/attributes.rb +22 -21
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/cacheable.rb +36 -0
  10. data/lib/mongoid/changeable.rb +36 -0
  11. data/lib/mongoid/clients.rb +8 -63
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/storage_options.rb +1 -69
  14. data/lib/mongoid/composable.rb +29 -3
  15. data/lib/mongoid/config.rb +1 -0
  16. data/lib/mongoid/contextual/atomic.rb +5 -8
  17. data/lib/mongoid/contextual/map_reduce.rb +0 -4
  18. data/lib/mongoid/contextual/memory.rb +2 -2
  19. data/lib/mongoid/contextual/mongo.rb +40 -22
  20. data/lib/mongoid/contextual/none.rb +12 -0
  21. data/lib/mongoid/copyable.rb +13 -6
  22. data/lib/mongoid/criteria.rb +5 -2
  23. data/lib/mongoid/criteria/marshalable.rb +2 -2
  24. data/lib/mongoid/criteria/modifiable.rb +17 -1
  25. data/lib/mongoid/criteria/options.rb +25 -0
  26. data/lib/mongoid/criteria/queryable.rb +87 -0
  27. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  28. data/lib/mongoid/criteria/queryable/extensions.rb +28 -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/forwardable.rb +65 -0
  46. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  47. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  48. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  49. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  50. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  51. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  52. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  53. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  54. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  55. data/lib/mongoid/document.rb +30 -37
  56. data/lib/mongoid/errors.rb +2 -0
  57. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  58. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  59. data/lib/mongoid/errors/invalid_field.rb +2 -2
  60. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  61. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  62. data/lib/mongoid/evolvable.rb +1 -1
  63. data/lib/mongoid/extensions.rb +0 -4
  64. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  65. data/lib/mongoid/extensions/date.rb +4 -1
  66. data/lib/mongoid/extensions/decimal128.rb +3 -3
  67. data/lib/mongoid/extensions/hash.rb +1 -0
  68. data/lib/mongoid/extensions/string.rb +4 -3
  69. data/lib/mongoid/extensions/time.rb +4 -1
  70. data/lib/mongoid/fields/validators/macro.rb +18 -0
  71. data/lib/mongoid/findable.rb +2 -2
  72. data/lib/mongoid/indexable.rb +15 -13
  73. data/lib/mongoid/interceptable.rb +5 -22
  74. data/lib/mongoid/matchable.rb +13 -7
  75. data/lib/mongoid/matchable/all.rb +2 -2
  76. data/lib/mongoid/matchable/and.rb +3 -3
  77. data/lib/mongoid/matchable/default.rb +2 -2
  78. data/lib/mongoid/matchable/elem_match.rb +28 -0
  79. data/lib/mongoid/matchable/exists.rb +2 -2
  80. data/lib/mongoid/matchable/gt.rb +4 -2
  81. data/lib/mongoid/matchable/gte.rb +4 -2
  82. data/lib/mongoid/matchable/in.rb +2 -2
  83. data/lib/mongoid/matchable/lt.rb +4 -2
  84. data/lib/mongoid/matchable/lte.rb +4 -2
  85. data/lib/mongoid/matchable/ne.rb +2 -2
  86. data/lib/mongoid/matchable/nin.rb +2 -2
  87. data/lib/mongoid/matchable/or.rb +3 -3
  88. data/lib/mongoid/matchable/regexp.rb +3 -3
  89. data/lib/mongoid/matchable/size.rb +2 -2
  90. data/lib/mongoid/persistable.rb +3 -5
  91. data/lib/mongoid/persistable/creatable.rb +2 -2
  92. data/lib/mongoid/persistable/deletable.rb +1 -1
  93. data/lib/mongoid/persistable/settable.rb +1 -1
  94. data/lib/mongoid/persistable/updatable.rb +5 -12
  95. data/lib/mongoid/persistable/upsertable.rb +1 -1
  96. data/lib/mongoid/persistence_context.rb +215 -0
  97. data/lib/mongoid/query_cache.rb +3 -6
  98. data/lib/mongoid/relations/accessors.rb +3 -0
  99. data/lib/mongoid/relations/auto_save.rb +12 -4
  100. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  101. data/lib/mongoid/relations/counter_cache.rb +15 -5
  102. data/lib/mongoid/relations/eager.rb +6 -11
  103. data/lib/mongoid/relations/eager/base.rb +3 -3
  104. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  105. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  106. data/lib/mongoid/relations/embedded/batchable.rb +12 -36
  107. data/lib/mongoid/relations/embedded/in.rb +13 -1
  108. data/lib/mongoid/relations/embedded/many.rb +28 -10
  109. data/lib/mongoid/relations/embedded/one.rb +14 -1
  110. data/lib/mongoid/relations/macros.rb +9 -1
  111. data/lib/mongoid/relations/metadata.rb +3 -3
  112. data/lib/mongoid/relations/options.rb +2 -2
  113. data/lib/mongoid/relations/proxy.rb +1 -31
  114. data/lib/mongoid/relations/referenced/in.rb +19 -10
  115. data/lib/mongoid/relations/referenced/many.rb +23 -17
  116. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  117. data/lib/mongoid/relations/referenced/one.rb +15 -1
  118. data/lib/mongoid/relations/synchronization.rb +11 -11
  119. data/lib/mongoid/relations/touchable.rb +6 -3
  120. data/lib/mongoid/reloadable.rb +1 -1
  121. data/lib/mongoid/serializable.rb +1 -1
  122. data/lib/mongoid/traversable.rb +1 -1
  123. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  124. data/lib/mongoid/version.rb +1 -1
  125. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +14 -3
  126. data/spec/app/models/album.rb +5 -1
  127. data/spec/app/models/artist.rb +21 -0
  128. data/spec/app/models/book.rb +2 -1
  129. data/spec/app/models/dokument.rb +1 -0
  130. data/spec/app/models/ordered_post.rb +5 -0
  131. data/spec/app/models/oscar.rb +1 -2
  132. data/spec/app/models/page.rb +1 -1
  133. data/spec/app/models/person.rb +3 -3
  134. data/spec/app/models/princess.rb +2 -0
  135. data/spec/app/models/record.rb +1 -0
  136. data/spec/app/models/subscription.rb +1 -0
  137. data/spec/app/models/thing.rb +1 -1
  138. data/spec/config/mongoid.yml +15 -0
  139. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  140. data/spec/mongoid/atomic_spec.rb +17 -17
  141. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  142. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  143. data/spec/mongoid/attributes_spec.rb +90 -5
  144. data/spec/mongoid/cacheable_spec.rb +112 -0
  145. data/spec/mongoid/changeable_spec.rb +58 -0
  146. data/spec/mongoid/clients/factory_spec.rb +31 -3
  147. data/spec/mongoid/clients/options_spec.rb +382 -96
  148. data/spec/mongoid/clients_spec.rb +243 -101
  149. data/spec/mongoid/composable_spec.rb +7 -0
  150. data/spec/mongoid/config_spec.rb +67 -11
  151. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  152. data/spec/mongoid/contextual/mongo_spec.rb +165 -20
  153. data/spec/mongoid/contextual/none_spec.rb +15 -0
  154. data/spec/mongoid/copyable_spec.rb +13 -4
  155. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  156. data/spec/mongoid/criteria/options_spec.rb +29 -0
  157. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  158. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  159. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  160. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  161. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  162. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  163. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  164. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  165. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  166. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  167. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  168. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  169. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  170. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  171. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  172. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  173. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  174. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  175. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  176. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  177. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  178. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  179. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  180. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  181. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  182. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  183. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  184. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  185. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4174 -0
  186. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  187. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  188. data/spec/mongoid/criteria_spec.rb +152 -21
  189. data/spec/mongoid/document_spec.rb +37 -88
  190. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  191. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  192. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  193. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  194. data/spec/mongoid/extensions/date_spec.rb +2 -6
  195. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  196. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  197. data/spec/mongoid/extensions/float_spec.rb +8 -1
  198. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  199. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  200. data/spec/mongoid/extensions/object_spec.rb +11 -0
  201. data/spec/mongoid/extensions/string_spec.rb +21 -0
  202. data/spec/mongoid/extensions/time_spec.rb +2 -6
  203. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  204. data/spec/mongoid/findable_spec.rb +46 -1
  205. data/spec/mongoid/indexable_spec.rb +15 -3
  206. data/spec/mongoid/interceptable_spec.rb +68 -10
  207. data/spec/mongoid/matchable/all_spec.rb +4 -4
  208. data/spec/mongoid/matchable/and_spec.rb +10 -10
  209. data/spec/mongoid/matchable/default_spec.rb +12 -12
  210. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  211. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  212. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  213. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  214. data/spec/mongoid/matchable/in_spec.rb +5 -5
  215. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  216. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  217. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  218. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  219. data/spec/mongoid/matchable/or_spec.rb +7 -7
  220. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  221. data/spec/mongoid/matchable/size_spec.rb +3 -3
  222. data/spec/mongoid/matchable_spec.rb +173 -53
  223. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  224. data/spec/mongoid/persistable/deletable_spec.rb +16 -1
  225. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  226. data/spec/mongoid/persistable/savable_spec.rb +35 -30
  227. data/spec/mongoid/persistable/settable_spec.rb +45 -29
  228. data/spec/mongoid/persistable/updatable_spec.rb +184 -5
  229. data/spec/mongoid/persistence_context_spec.rb +680 -0
  230. data/spec/mongoid/positional_spec.rb +10 -10
  231. data/spec/mongoid/query_cache_spec.rb +89 -0
  232. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  233. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  234. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  235. data/spec/mongoid/relations/builders_spec.rb +37 -10
  236. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  237. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  238. data/spec/mongoid/relations/eager_spec.rb +40 -0
  239. data/spec/mongoid/relations/embedded/many_spec.rb +63 -47
  240. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  241. data/spec/mongoid/relations/macros_spec.rb +395 -7
  242. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  243. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +13 -25
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  247. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  248. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  249. data/spec/mongoid/reloadable_spec.rb +51 -0
  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 +18 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +20 -11
  255. metadata +524 -469
  256. checksums.yaml.gz.sig +0 -0
  257. data.tar.gz.sig +0 -0
  258. data/lib/mongoid/clients/thread_options.rb +0 -19
  259. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  260. metadata.gz.sig +0 -0
@@ -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
@@ -1105,6 +1105,69 @@ describe Mongoid::Attributes do
1105
1105
  expect(person.delayed_atomic_unsets).to be_empty
1106
1106
  end
1107
1107
  end
1108
+
1109
+ context "when the attribute is aliased" do
1110
+
1111
+ context 'when the database name is used' do
1112
+
1113
+ let(:person) do
1114
+ Person.create(at: Time.now)
1115
+ end
1116
+
1117
+ before do
1118
+ person.remove_attribute(:at)
1119
+ end
1120
+
1121
+ it "removes the attribute" do
1122
+ expect(person.at).to be_nil
1123
+ end
1124
+
1125
+ it "removes the key from the attributes hash" do
1126
+ expect(person.has_attribute?(:at)).to be false
1127
+ end
1128
+
1129
+ context "when saving after the removal" do
1130
+
1131
+ before do
1132
+ person.save
1133
+ end
1134
+
1135
+ it "persists the removal" do
1136
+ expect(person.reload.has_attribute?(:at)).to be false
1137
+ end
1138
+ end
1139
+ end
1140
+
1141
+ context 'when the alias is used' do
1142
+
1143
+ let(:person) do
1144
+ Person.create(aliased_timestamp: Time.now)
1145
+ end
1146
+
1147
+ before do
1148
+ person.remove_attribute(:aliased_timestamp)
1149
+ end
1150
+
1151
+ it "removes the attribute" do
1152
+ expect(person.aliased_timestamp).to be_nil
1153
+ end
1154
+
1155
+ it "removes the key from the attributes hash" do
1156
+ expect(person.has_attribute?(:aliased_timestamp)).to be false
1157
+ end
1158
+
1159
+ context "when saving after the removal" do
1160
+
1161
+ before do
1162
+ person.save
1163
+ end
1164
+
1165
+ it "persists the removal" do
1166
+ expect(person.reload.has_attribute?(:aliased_timestamp)).to be false
1167
+ end
1168
+ end
1169
+ end
1170
+ end
1108
1171
  end
1109
1172
 
1110
1173
  describe "#respond_to?" do
@@ -1322,6 +1385,21 @@ describe Mongoid::Attributes do
1322
1385
  end
1323
1386
  end
1324
1387
 
1388
+ describe "#typed_attributes" do
1389
+
1390
+ let(:date_time) do
1391
+ DateTime.current
1392
+ end
1393
+
1394
+ let(:user) do
1395
+ User.new(last_login: date_time)
1396
+ end
1397
+
1398
+ it 'returns typecasted attributes' do
1399
+ expect(user.typed_attributes).to include("last_login" => date_time)
1400
+ end
1401
+ end
1402
+
1325
1403
  [:attributes=, :write_attributes].each do |method|
1326
1404
 
1327
1405
  describe "##{method}" do
@@ -1709,15 +1787,22 @@ describe Mongoid::Attributes do
1709
1787
 
1710
1788
  context 'when the attribute is localized' do
1711
1789
  let(:person) do
1712
- Person.create(desc: 'localized')
1790
+ Person.create
1713
1791
  end
1714
1792
 
1715
- before do
1716
- person.desc = nil
1793
+ context 'after initialization when the field is nil' do
1794
+
1795
+ it 'returns false' do
1796
+ expect(person.desc?).to be(false)
1797
+ end
1717
1798
  end
1718
1799
 
1719
- it 'applies the localization when checking the attribute' do
1720
- expect(person.desc?).to be(false)
1800
+ context 'when setting the field to nil' do
1801
+
1802
+ it 'applies the localization when checking the attribute' do
1803
+ person.desc = nil
1804
+ expect(person.desc?).to be(false)
1805
+ end
1721
1806
  end
1722
1807
 
1723
1808
  context 'when the field is a boolean' do