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,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
@@ -0,0 +1,112 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Cacheable do
4
+
5
+ describe ".included" do
6
+
7
+ let(:klass) do
8
+ Class.new do
9
+ include Mongoid::Cacheable
10
+ end
11
+ end
12
+
13
+ it "adds an cache_timestamp_format accessor" do
14
+ expect(klass).to respond_to(:cache_timestamp_format)
15
+ end
16
+
17
+ it "defaults cache_timestamp_format to :nsec" do
18
+ expect(klass.cache_timestamp_format).to be(:nsec)
19
+ end
20
+ end
21
+
22
+ describe "#cache_key" do
23
+
24
+ let(:document) do
25
+ Dokument.new
26
+ end
27
+
28
+ context "when the document is new" do
29
+
30
+ it "has a new key name" do
31
+ expect(document.cache_key).to eq("dokuments/new")
32
+ end
33
+ end
34
+
35
+ context "when persisted" do
36
+
37
+ before do
38
+ document.save
39
+ end
40
+
41
+ context "with updated_at" do
42
+
43
+ context "with the default cache_timestamp_format" do
44
+
45
+ let!(:updated_at) do
46
+ document.updated_at.utc.to_s(:nsec)
47
+ end
48
+
49
+ it "has the id and updated_at key name" do
50
+ expect(document.cache_key).to eq("dokuments/#{document.id}-#{updated_at}")
51
+ end
52
+ end
53
+
54
+ context "with a different cache_timestamp_format" do
55
+
56
+ before do
57
+ Dokument.cache_timestamp_format = :number
58
+ end
59
+
60
+ after do
61
+ Dokument.cache_timestamp_format = :nsec
62
+ end
63
+
64
+ let!(:updated_at) do
65
+ document.updated_at.utc.to_s(:number)
66
+ end
67
+
68
+ it "has the id and updated_at key name" do
69
+ expect(document.cache_key).to eq("dokuments/#{document.id}-#{updated_at}")
70
+ end
71
+ end
72
+ end
73
+
74
+ context "without updated_at, with Timestamps" do
75
+
76
+ before do
77
+ document.updated_at = nil
78
+ end
79
+
80
+ it "has the id key name" do
81
+ expect(document.cache_key).to eq("dokuments/#{document.id}")
82
+ end
83
+ end
84
+ end
85
+
86
+ context "when model dont have Timestamps" do
87
+
88
+ let(:artist) do
89
+ Artist.create!
90
+ end
91
+
92
+ it "should have the id key name" do
93
+ expect(artist.cache_key).to eq("artists/#{artist.id}")
94
+ end
95
+ end
96
+
97
+ context "when model has Short Timestamps" do
98
+
99
+ let(:agent) do
100
+ ShortAgent.create!
101
+ end
102
+
103
+ let!(:updated_at) do
104
+ agent.updated_at.utc.to_s(:nsec)
105
+ end
106
+
107
+ it "has the id and updated_at key name" do
108
+ expect(agent.cache_key).to eq("short_agents/#{agent.id}-#{updated_at}")
109
+ end
110
+ end
111
+ end
112
+ end
@@ -1289,6 +1289,64 @@ describe Mongoid::Changeable do
1289
1289
  end
1290
1290
  end
1291
1291
 
1292
+ describe '#previously_changed?' do
1293
+
1294
+ let(:person) do
1295
+ Person.new(title: "Grand Poobah")
1296
+ end
1297
+
1298
+ before do
1299
+ person.title = "Captain Obvious"
1300
+ end
1301
+
1302
+ context "when the document has been saved" do
1303
+
1304
+ before do
1305
+ person.save!
1306
+ end
1307
+
1308
+ it "returns true" do
1309
+ expect(person.title_previously_changed?).to be(true)
1310
+ end
1311
+ end
1312
+
1313
+ context "when the document has not been saved" do
1314
+
1315
+ it "returns false" do
1316
+ expect(person.title_previously_changed?).to be(false)
1317
+ end
1318
+ end
1319
+ end
1320
+
1321
+ describe '#previous_change' do
1322
+
1323
+ let(:person) do
1324
+ Person.new(title: "Grand Poobah")
1325
+ end
1326
+
1327
+ before do
1328
+ person.title = "Captain Obvious"
1329
+ end
1330
+
1331
+ context "when the document has been saved" do
1332
+
1333
+ before do
1334
+ person.save!
1335
+ end
1336
+
1337
+ it "returns the changes" do
1338
+ expect(person.title_previous_change).to eq([ nil, "Captain Obvious" ])
1339
+ end
1340
+ end
1341
+
1342
+ context "when the document has not been saved" do
1343
+
1344
+ it "returns no changes" do
1345
+ expect(person.title_previous_change).to eq(nil)
1346
+ end
1347
+ end
1348
+ end
1349
+
1292
1350
  context "when fields have been defined pre-dirty inclusion" do
1293
1351
 
1294
1352
  let(:document) do