mongoid 4.0.2 → 5.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -1
  3. data/README.md +14 -13
  4. data/lib/config/locales/en.yml +28 -28
  5. data/lib/mongoid.rb +28 -21
  6. data/lib/mongoid/atomic.rb +2 -4
  7. data/lib/mongoid/attributes.rb +7 -7
  8. data/lib/mongoid/attributes/processing.rb +4 -1
  9. data/lib/mongoid/attributes/readonly.rb +2 -2
  10. data/lib/mongoid/changeable.rb +4 -6
  11. data/lib/mongoid/clients.rb +142 -0
  12. data/lib/mongoid/clients/factory.rb +78 -0
  13. data/lib/mongoid/{sessions → clients}/options.rb +30 -19
  14. data/lib/mongoid/{sessions → clients}/storage_options.rb +27 -13
  15. data/lib/mongoid/{sessions → clients}/thread_options.rb +6 -3
  16. data/lib/mongoid/clients/validators.rb +2 -0
  17. data/lib/mongoid/{sessions → clients}/validators/storage.rb +5 -2
  18. data/lib/mongoid/composable.rb +3 -3
  19. data/lib/mongoid/config.rb +39 -41
  20. data/lib/mongoid/config/environment.rb +1 -1
  21. data/lib/mongoid/config/validators.rb +1 -1
  22. data/lib/mongoid/config/validators/{session.rb → client.rb} +31 -28
  23. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  24. data/lib/mongoid/contextual/atomic.rb +11 -11
  25. data/lib/mongoid/contextual/command.rb +9 -6
  26. data/lib/mongoid/contextual/geo_near.rb +17 -1
  27. data/lib/mongoid/contextual/map_reduce.rb +12 -11
  28. data/lib/mongoid/contextual/memory.rb +2 -5
  29. data/lib/mongoid/contextual/mongo.rb +92 -82
  30. data/lib/mongoid/contextual/none.rb +13 -0
  31. data/lib/mongoid/copyable.rb +6 -1
  32. data/lib/mongoid/criteria.rb +36 -3
  33. data/lib/mongoid/document.rb +3 -4
  34. data/lib/mongoid/errors.rb +6 -6
  35. data/lib/mongoid/errors/{mixed_session_configuration.rb → mixed_client_configuration.rb} +5 -5
  36. data/lib/mongoid/errors/no_client_config.rb +22 -0
  37. data/lib/mongoid/errors/{no_session_database.rb → no_client_database.rb} +4 -4
  38. data/lib/mongoid/errors/{no_session_hosts.rb → no_client_hosts.rb} +4 -4
  39. data/lib/mongoid/errors/{no_sessions_config.rb → no_clients_config.rb} +4 -4
  40. data/lib/mongoid/errors/no_default_client.rb +23 -0
  41. data/lib/mongoid/extensions/hash.rb +5 -1
  42. data/lib/mongoid/extensions/object.rb +3 -2
  43. data/lib/mongoid/extensions/set.rb +5 -5
  44. data/lib/mongoid/factory.rb +4 -2
  45. data/lib/mongoid/fields.rb +7 -2
  46. data/lib/mongoid/findable.rb +4 -1
  47. data/lib/mongoid/indexable.rb +15 -9
  48. data/lib/mongoid/persistable.rb +1 -2
  49. data/lib/mongoid/persistable/creatable.rb +2 -2
  50. data/lib/mongoid/persistable/deletable.rb +3 -3
  51. data/lib/mongoid/persistable/incrementable.rb +1 -1
  52. data/lib/mongoid/persistable/logical.rb +1 -1
  53. data/lib/mongoid/persistable/poppable.rb +1 -1
  54. data/lib/mongoid/persistable/pullable.rb +2 -2
  55. data/lib/mongoid/persistable/pushable.rb +2 -2
  56. data/lib/mongoid/persistable/renamable.rb +1 -1
  57. data/lib/mongoid/persistable/settable.rb +1 -1
  58. data/lib/mongoid/persistable/unsettable.rb +1 -1
  59. data/lib/mongoid/persistable/updatable.rb +2 -2
  60. data/lib/mongoid/persistable/upsertable.rb +1 -1
  61. data/lib/mongoid/query_cache.rb +98 -104
  62. data/lib/mongoid/railtie.rb +1 -21
  63. data/lib/mongoid/railties/database.rake +1 -1
  64. data/lib/mongoid/relations/builders.rb +3 -1
  65. data/lib/mongoid/relations/counter_cache.rb +1 -1
  66. data/lib/mongoid/relations/embedded/batchable.rb +3 -10
  67. data/lib/mongoid/relations/embedded/many.rb +4 -2
  68. data/lib/mongoid/relations/many.rb +1 -0
  69. data/lib/mongoid/relations/proxy.rb +6 -6
  70. data/lib/mongoid/relations/referenced/many.rb +2 -1
  71. data/lib/mongoid/relations/targets/enumerable.rb +11 -11
  72. data/lib/mongoid/relations/touchable.rb +1 -1
  73. data/lib/mongoid/reloadable.rb +2 -2
  74. data/lib/mongoid/scopable.rb +6 -17
  75. data/lib/mongoid/selectable.rb +1 -36
  76. data/lib/mongoid/serializable.rb +2 -2
  77. data/lib/mongoid/stateful.rb +0 -1
  78. data/lib/mongoid/tasks/database.rake +2 -2
  79. data/lib/mongoid/tasks/database.rb +23 -16
  80. data/lib/mongoid/threaded.rb +54 -33
  81. data/lib/mongoid/threaded/lifecycle.rb +21 -16
  82. data/lib/mongoid/traversable.rb +16 -1
  83. data/lib/mongoid/validatable.rb +1 -1
  84. data/lib/mongoid/validatable/queryable.rb +1 -1
  85. data/lib/mongoid/validatable/uniqueness.rb +3 -20
  86. data/lib/mongoid/version.rb +1 -1
  87. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +91 -57
  88. data/lib/rails/mongoid.rb +2 -2
  89. data/spec/app/models/audio.rb +1 -1
  90. data/spec/app/models/band.rb +1 -0
  91. data/spec/app/models/company.rb +5 -0
  92. data/spec/app/models/label.rb +7 -0
  93. data/spec/app/models/pub.rb +6 -0
  94. data/spec/app/models/staff.rb +7 -0
  95. data/spec/app/models/store_as_dup_test1.rb +5 -0
  96. data/spec/app/models/store_as_dup_test2.rb +5 -0
  97. data/spec/config/mongoid.yml +7 -25
  98. data/spec/mongoid/atomic/paths_spec.rb +3 -11
  99. data/spec/mongoid/attributes/nested_spec.rb +16 -16
  100. data/spec/mongoid/attributes/readonly_spec.rb +80 -18
  101. data/spec/mongoid/attributes_spec.rb +3 -3
  102. data/spec/mongoid/changeable_spec.rb +70 -0
  103. data/spec/mongoid/clients/factory_spec.rb +284 -0
  104. data/spec/mongoid/{sessions → clients}/options_spec.rb +4 -6
  105. data/spec/mongoid/clients_spec.rb +739 -0
  106. data/spec/mongoid/config/environment_spec.rb +14 -11
  107. data/spec/mongoid/config_spec.rb +33 -48
  108. data/spec/mongoid/contextual/atomic_spec.rb +1 -17
  109. data/spec/mongoid/contextual/geo_near_spec.rb +35 -0
  110. data/spec/mongoid/contextual/mongo_spec.rb +26 -83
  111. data/spec/mongoid/contextual/none_spec.rb +15 -0
  112. data/spec/mongoid/copyable_spec.rb +35 -1
  113. data/spec/mongoid/criteria/findable_spec.rb +197 -0
  114. data/spec/mongoid/criteria/modifiable_spec.rb +7 -29
  115. data/spec/mongoid/criteria_spec.rb +74 -91
  116. data/spec/mongoid/document_spec.rb +1 -1
  117. data/spec/mongoid/errors/{mixed_session_configuration_spec.rb → mixed_client_configuration_spec.rb} +1 -1
  118. data/spec/mongoid/errors/{no_session_config_spec.rb → no_client_config_spec.rb} +4 -4
  119. data/spec/mongoid/errors/{no_session_database_spec.rb → no_client_database_spec.rb} +4 -4
  120. data/spec/mongoid/errors/{no_session_hosts_spec.rb → no_client_hosts_spec.rb} +3 -3
  121. data/spec/mongoid/errors/{no_sessions_config_spec.rb → no_clients_config_spec.rb} +2 -2
  122. data/spec/mongoid/fields/localized_spec.rb +1 -0
  123. data/spec/mongoid/fields_spec.rb +1 -0
  124. data/spec/mongoid/findable_spec.rb +2 -23
  125. data/spec/mongoid/indexable_spec.rb +12 -8
  126. data/spec/mongoid/interceptable_spec.rb +15 -0
  127. data/spec/mongoid/persistable/settable_spec.rb +16 -0
  128. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  129. data/spec/mongoid/persistable_spec.rb +4 -4
  130. data/spec/mongoid/query_cache_spec.rb +13 -8
  131. data/spec/mongoid/relations/auto_save_spec.rb +1 -1
  132. data/spec/mongoid/relations/counter_cache_spec.rb +34 -0
  133. data/spec/mongoid/relations/eager/belongs_to_spec.rb +9 -0
  134. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +3 -3
  135. data/spec/mongoid/relations/embedded/many_spec.rb +123 -1
  136. data/spec/mongoid/relations/embedded/one_spec.rb +3 -3
  137. data/spec/mongoid/relations/proxy_spec.rb +28 -0
  138. data/spec/mongoid/relations/referenced/in_spec.rb +1 -1
  139. data/spec/mongoid/relations/referenced/many_spec.rb +47 -23
  140. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +1 -1
  141. data/spec/mongoid/relations/referenced/one_spec.rb +1 -1
  142. data/spec/mongoid/relations/targets/enumerable_spec.rb +9 -2
  143. data/spec/mongoid/reloadable_spec.rb +6 -6
  144. data/spec/mongoid/scopable_spec.rb +41 -28
  145. data/spec/mongoid/selectable_spec.rb +6 -16
  146. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  147. data/spec/mongoid/tasks/database_spec.rb +2 -2
  148. data/spec/mongoid/threaded_spec.rb +0 -7
  149. data/spec/mongoid/traversable_spec.rb +2 -2
  150. data/spec/mongoid/validatable/uniqueness_spec.rb +30 -1
  151. data/spec/mongoid_spec.rb +13 -15
  152. data/spec/rails/mongoid_spec.rb +13 -4
  153. data/spec/spec_helper.rb +44 -27
  154. data/spec/support/authorization.rb +12 -0
  155. data/spec/support/expectations.rb +14 -0
  156. metadata +52 -59
  157. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  158. data/lib/mongoid/contextual/text_search.rb +0 -178
  159. data/lib/mongoid/criteria/#findable.rb# +0 -141
  160. data/lib/mongoid/errors/no_default_session.rb +0 -23
  161. data/lib/mongoid/errors/no_session_config.rb +0 -22
  162. data/lib/mongoid/log_subscriber.rb +0 -55
  163. data/lib/mongoid/positional.rb +0 -71
  164. data/lib/mongoid/sessions.rb +0 -125
  165. data/lib/mongoid/sessions/factory.rb +0 -131
  166. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  167. data/lib/mongoid/sessions/validators.rb +0 -2
  168. data/lib/mongoid/support/query_counter.rb +0 -23
  169. data/spec/helpers.rb +0 -18
  170. data/spec/mongoid/#atomic_spec.rb# +0 -365
  171. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  172. data/spec/mongoid/contextual/text_search_spec.rb +0 -209
  173. data/spec/mongoid/log_subscriber_spec.rb +0 -75
  174. data/spec/mongoid/positional_spec.rb +0 -222
  175. data/spec/mongoid/sessions/factory_spec.rb +0 -333
  176. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  177. data/spec/mongoid/sessions_spec.rb +0 -1252
@@ -12,10 +12,10 @@ module Rails
12
12
  #
13
13
  # @param [ Application ] app The rails application.
14
14
  def load_models(app)
15
- app.config.paths["app/models"].each do |path|
15
+ app.config.paths["app/models"].expanded.each do |path|
16
16
  preload = ::Mongoid.preload_models
17
17
  if preload.resizable?
18
- files = preload.map { |model| "#{path}/#{model}.rb" }
18
+ files = preload.map { |model| "#{path}/#{model.underscore}.rb" }
19
19
  else
20
20
  files = Dir.glob("#{path}/**/*.rb")
21
21
  end
@@ -1,5 +1,5 @@
1
1
  class Audio
2
2
  include Mongoid::Document
3
3
  field :likes, type: Integer
4
- default_scope ->{ where(:likes.gt => 100) }
4
+ default_scope ->{ self.or({:likes => nil}, {:likes.gt => 100}) }
5
5
  end
@@ -15,6 +15,7 @@ class Band
15
15
  field :sales, type: BigDecimal
16
16
  field :y, as: :years, type: Integer
17
17
  field :founded, type: Date
18
+ field :deleted, type: Boolean
18
19
 
19
20
  embeds_many :records, cascade_callbacks: true
20
21
  embeds_many :notes, as: :noteable, cascade_callbacks: true, validate: false
@@ -0,0 +1,5 @@
1
+ class Company
2
+ include Mongoid::Document
3
+
4
+ embeds_many :staffs
5
+ end
@@ -8,15 +8,22 @@ class Label
8
8
  field :after_update_called, type: Mongoid::Boolean, default: false
9
9
  field :after_validation_called, type: Mongoid::Boolean, default: false
10
10
 
11
+ field :before_save_count, type: Integer, default: 0
12
+
11
13
  embedded_in :artist
12
14
  embedded_in :band
13
15
 
16
+ before_save :before_save_stub
14
17
  after_create :after_create_stub
15
18
  after_save :after_save_stub
16
19
  after_update :after_update_stub
17
20
  after_validation :after_validation_stub
18
21
  before_validation :cleanup
19
22
 
23
+ def before_save_stub
24
+ self.before_save_count += 1
25
+ end
26
+
20
27
  def after_create_stub
21
28
  self.after_create_called = true
22
29
  end
@@ -0,0 +1,6 @@
1
+ class Pub
2
+ include Mongoid::Document
3
+ include Mongoid::Attributes::Dynamic
4
+ field :location, type: Array
5
+ index location: "2dsphere"
6
+ end
@@ -0,0 +1,7 @@
1
+ class Staff
2
+ include Mongoid::Document
3
+
4
+ embedded_in :company
5
+
6
+ field :age, type: Integer
7
+ end
@@ -0,0 +1,5 @@
1
+ class StoreAsDupTest1
2
+ include Mongoid::Document
3
+ embeds_one :store_as_dup_test2, :store_as => :t
4
+ field :name
5
+ end
@@ -0,0 +1,5 @@
1
+ class StoreAsDupTest2
2
+ include Mongoid::Document
3
+ embedded_in :store_as_dup_test1
4
+ field :name
5
+ end
@@ -1,34 +1,16 @@
1
1
  test:
2
- sessions:
2
+ clients:
3
3
  default:
4
4
  database: mongoid_test
5
5
  hosts:
6
6
  - <%=ENV["MONGOID_SPEC_HOST"]%>:<%=ENV["MONGOID_SPEC_PORT"]%>
7
7
  options:
8
- read: primary
9
- mongohq_single:
10
- database: <%=ENV["MONGOHQ_SINGLE_NAME"]%>
11
- username: <%=ENV["MONGOHQ_SINGLE_USER"]%>
12
- password: <%=ENV["MONGOHQ_SINGLE_PASS"]%>
13
- hosts:
14
- - <%=ENV["MONGOHQ_SINGLE_URL"]%>
15
- options:
16
- write:
17
- w: 1
18
- read: primary
19
- mongohq_repl:
20
- database: <%=ENV["MONGOHQ_REPL_NAME"]%>
21
- username: <%=ENV["MONGOHQ_REPL_USER"]%>
22
- password: <%=ENV["MONGOHQ_REPL_PASS"]%>
23
- hosts:
24
- - <%=ENV["MONGOHQ_REPL_1_URL"]%>
25
- - <%=ENV["MONGOHQ_REPL_2_URL"]%>
26
- options:
27
- read: primary
28
- write:
29
- w: majority
30
- mongohq_repl_uri:
31
- uri: <%= ENV["MONGOHQ_REPL_URI"]%>
8
+ user: "mongoid-user"
9
+ password: "password"
10
+ auth_source: "admin"
11
+ read:
12
+ mode: primary
13
+ max_pool_size: 1
32
14
  options:
33
15
  include_root_in_json: false
34
16
  include_type_for_serialization: false
@@ -111,9 +111,7 @@ describe Mongoid::Atomic::Paths do
111
111
  end
112
112
 
113
113
  it "returns the association with id.atomic_selector" do
114
- expect(address.atomic_selector).to eq(
115
- { "_id" => person.id, "addresses._id" => address.id }
116
- )
114
+ expect(address.atomic_selector).to eq({ "_id" => person.id })
117
115
  end
118
116
  end
119
117
 
@@ -124,14 +122,8 @@ describe Mongoid::Atomic::Paths do
124
122
  person.addresses << address
125
123
  end
126
124
 
127
- it "returns the JSON notation to the document with ids" do
128
- expect(location.atomic_selector).to eq(
129
- {
130
- "_id" => person.id,
131
- "addresses._id" => address.id,
132
- "addresses.locations._id" => location.id
133
- }
134
- )
125
+ it "returns the JSON notation to the document with id" do
126
+ expect(location.atomic_selector).to eq({ "_id" => person.id })
135
127
  end
136
128
  end
137
129
  end
@@ -2936,11 +2936,11 @@ describe Mongoid::Attributes::Nested do
2936
2936
  context "when reloading the document" do
2937
2937
 
2938
2938
  it "updates the first existing document" do
2939
- expect(person.posts(true).first.title).to eq("First")
2939
+ expect(person.posts(true)[0].title).to eq("First")
2940
2940
  end
2941
2941
 
2942
2942
  it "updates the second existing document" do
2943
- expect(person.posts(true).last.title).to eq("Second")
2943
+ expect(person.posts(true)[1].title).to eq("Second")
2944
2944
  end
2945
2945
 
2946
2946
  it "does not add new documents" do
@@ -3094,11 +3094,11 @@ describe Mongoid::Attributes::Nested do
3094
3094
  context "when reloading the document" do
3095
3095
 
3096
3096
  it "does not ignore the marked document" do
3097
- expect(person.posts(true).first.title).to eq("Another Title")
3097
+ expect(person.posts(true)[0].title).to eq("Another Title")
3098
3098
  end
3099
3099
 
3100
3100
  it "does not delete the unmarked document" do
3101
- expect(person.posts(true).last.title).to eq("New Title")
3101
+ expect(person.posts(true)[1].title).to eq("New Title")
3102
3102
  end
3103
3103
 
3104
3104
  it "does not add additional documents" do
@@ -3127,7 +3127,7 @@ describe Mongoid::Attributes::Nested do
3127
3127
  end
3128
3128
 
3129
3129
  it "does not delete the unmarked document" do
3130
- expect(person.posts(true).last.title).to eq("New Title")
3130
+ expect(person.posts(true)[1].title).to eq("New Title")
3131
3131
  end
3132
3132
  end
3133
3133
  end
@@ -3198,7 +3198,7 @@ describe Mongoid::Attributes::Nested do
3198
3198
  end
3199
3199
 
3200
3200
  it "does not delete the unmarked document" do
3201
- expect(person.posts(true).last.title).to eq("New Title")
3201
+ expect(person.posts(true)[1].title).to eq("New Title")
3202
3202
  end
3203
3203
  end
3204
3204
  end
@@ -3224,15 +3224,15 @@ describe Mongoid::Attributes::Nested do
3224
3224
  end
3225
3225
 
3226
3226
  it "builds a new first document" do
3227
- expect(person.posts.first.title).to eq("First")
3227
+ expect(person.posts[0].title).to eq("First")
3228
3228
  end
3229
3229
 
3230
3230
  it "builds a new second document" do
3231
- expect(person.posts.second.title).to eq("Second")
3231
+ expect(person.posts[1].title).to eq("Second")
3232
3232
  end
3233
3233
 
3234
3234
  it "builds a new third document" do
3235
- expect(person.posts.third.title).to eq("Third")
3235
+ expect(person.posts[2].title).to eq("Third")
3236
3236
  end
3237
3237
 
3238
3238
  it "does not add extra documents" do
@@ -3776,7 +3776,7 @@ describe Mongoid::Attributes::Nested do
3776
3776
  end
3777
3777
 
3778
3778
  it "does not delete the unmarked document" do
3779
- expect(person.preferences(true).last.name).to eq("My Blog")
3779
+ expect(person.preferences(true)[1].name).to eq("My Blog")
3780
3780
  end
3781
3781
  end
3782
3782
  end
@@ -3811,11 +3811,11 @@ describe Mongoid::Attributes::Nested do
3811
3811
  context "when reloading the document" do
3812
3812
 
3813
3813
  it "does not ignore the marked document" do
3814
- expect(person.preferences(true).first.name).to eq("Another Title")
3814
+ expect(person.preferences(true)[0].name).to eq("Another Title")
3815
3815
  end
3816
3816
 
3817
3817
  it "does not delete the unmarked document" do
3818
- expect(person.preferences(true).last.name).to eq("New Title")
3818
+ expect(person.preferences(true)[1].name).to eq("New Title")
3819
3819
  end
3820
3820
 
3821
3821
  it "does not add additional documents" do
@@ -3844,7 +3844,7 @@ describe Mongoid::Attributes::Nested do
3844
3844
  end
3845
3845
 
3846
3846
  it "does not delete the unmarked document" do
3847
- expect(person.preferences(true).last.name).to eq("New Title")
3847
+ expect(person.preferences(true)[1].name).to eq("New Title")
3848
3848
  end
3849
3849
  end
3850
3850
  end
@@ -3874,11 +3874,11 @@ describe Mongoid::Attributes::Nested do
3874
3874
  context "when reloading" do
3875
3875
 
3876
3876
  it "does not ignore the marked document" do
3877
- expect(person.preferences(true).first.name).to eq("Another Title")
3877
+ expect(person.preferences(true)[0].name).to eq("Another Title")
3878
3878
  end
3879
3879
 
3880
3880
  it "does not delete the unmarked document" do
3881
- expect(person.preferences(true).last.name).to eq("New Title")
3881
+ expect(person.preferences(true)[1].name).to eq("New Title")
3882
3882
  end
3883
3883
 
3884
3884
  it "does not add additional documents" do
@@ -3907,7 +3907,7 @@ describe Mongoid::Attributes::Nested do
3907
3907
  end
3908
3908
 
3909
3909
  it "does not delete the unmarked document" do
3910
- expect(person.preferences(true).last.name).to eq("New Title")
3910
+ expect(person.preferences(true)[1].name).to eq("New Title")
3911
3911
  end
3912
3912
  end
3913
3913
  end
@@ -19,6 +19,17 @@ describe Mongoid::Attributes::Readonly do
19
19
  end
20
20
  end
21
21
 
22
+ context "when providing a field alias" do
23
+
24
+ before do
25
+ Person.attr_readonly :aliased_timestamp
26
+ end
27
+
28
+ it "adds the database field name to readonly attributes" do
29
+ expect(Person.readonly_attributes.to_a).to eq([ "at" ])
30
+ end
31
+ end
32
+
22
33
  context "when providing multiple fields" do
23
34
 
24
35
  before do
@@ -33,54 +44,71 @@ describe Mongoid::Attributes::Readonly do
33
44
  context "when creating a new document with a readonly field" do
34
45
 
35
46
  before do
36
- Person.attr_readonly :title, :terms
47
+ Person.attr_readonly :title, :terms, :aliased_timestamp
37
48
  end
38
49
 
39
50
  let(:person) do
40
- Person.create(title: "sir", terms: true)
51
+ Person.create(title: "sir", terms: true, aliased_timestamp: Time.at(42))
41
52
  end
42
53
 
43
54
  it "sets the first readonly value" do
44
55
  expect(person.title).to eq("sir")
45
56
  end
46
57
 
47
- it "sets subsequent readonly values" do
58
+ it "sets the second readonly value" do
48
59
  expect(person.terms).to be true
49
60
  end
50
61
 
62
+ it "sets the third readonly value" do
63
+ expect(person.aliased_timestamp).to eq(Time.at(42))
64
+ end
65
+
51
66
  it "persists the first readonly value" do
52
67
  expect(person.reload.title).to eq("sir")
53
68
  end
54
69
 
55
- it "persists subsequent readonly values" do
70
+ it "persists the second readonly value" do
56
71
  expect(person.reload.terms).to be true
57
72
  end
73
+
74
+ it "persists the third readonly value" do
75
+ expect(person.reload.aliased_timestamp).to eq(Time.at(42))
76
+ end
58
77
  end
59
78
 
60
79
  context "when updating an existing readonly field" do
61
80
 
62
81
  before do
63
- Person.attr_readonly :title, :terms, :score
82
+ Person.attr_readonly :title, :terms, :score, :aliased_timestamp
64
83
  end
65
84
 
66
85
  let(:person) do
67
- Person.create(title: "sir", terms: true, score: 1)
86
+ Person.create(title: "sir", terms: true, score: 1, aliased_timestamp: Time.at(42))
68
87
  end
69
88
 
70
89
  context "when updating via the setter" do
71
90
 
72
91
  before do
73
92
  person.title = "mr"
93
+ person.aliased_timestamp = Time.at(43)
74
94
  person.save
75
95
  end
76
96
 
77
- it "does not update the field" do
97
+ it "does not update the first field" do
78
98
  expect(person.title).to eq("sir")
79
99
  end
80
100
 
81
- it "does not persist the changes" do
101
+ it "does not update the second field" do
102
+ expect(person.aliased_timestamp).to eq(Time.at(42))
103
+ end
104
+
105
+ it "does not persist the first field" do
82
106
  expect(person.reload.title).to eq("sir")
83
107
  end
108
+
109
+ it "does not persist the second field" do
110
+ expect(person.reload.aliased_timestamp).to eq(Time.at(42))
111
+ end
84
112
  end
85
113
 
86
114
  context "when updating via inc" do
@@ -127,64 +155,98 @@ describe Mongoid::Attributes::Readonly do
127
155
 
128
156
  before do
129
157
  person[:title] = "mr"
158
+ person[:aliased_timestamp] = Time.at(43)
130
159
  person.save
131
160
  end
132
161
 
133
- it "does not update the field" do
162
+ it "does not update the first field" do
134
163
  expect(person.title).to eq("sir")
135
164
  end
136
165
 
137
- it "does not persist the changes" do
166
+ it "does not update the second field" do
167
+ expect(person.aliased_timestamp).to eq(Time.at(42))
168
+ end
169
+
170
+ it "does not persist the first field" do
138
171
  expect(person.reload.title).to eq("sir")
139
172
  end
173
+
174
+ it "does not persist the second field" do
175
+ expect(person.reload.aliased_timestamp).to eq(Time.at(42))
176
+ end
140
177
  end
141
178
 
142
179
  context "when updating via write_attribute" do
143
180
 
144
181
  before do
145
182
  person.write_attribute(:title, "mr")
183
+ person.write_attribute(:aliased_timestamp, Time.at(43))
146
184
  person.save
147
185
  end
148
186
 
149
- it "does not update the field" do
187
+ it "does not update the first field" do
150
188
  expect(person.title).to eq("sir")
151
189
  end
152
190
 
153
- it "does not persist the changes" do
191
+ it "does not update the second field" do
192
+ expect(person.aliased_timestamp).to eq(Time.at(42))
193
+ end
194
+
195
+ it "does not persist the first field" do
154
196
  expect(person.reload.title).to eq("sir")
155
197
  end
198
+
199
+ it "does not persist the second field" do
200
+ expect(person.reload.aliased_timestamp).to eq(Time.at(42))
201
+ end
156
202
  end
157
203
 
158
204
  context "when updating via update_attributes" do
159
205
 
160
206
  before do
161
- person.update_attributes(title: "mr")
207
+ person.update_attributes(title: "mr", aliased_timestamp: Time.at(43))
162
208
  person.save
163
209
  end
164
210
 
165
- it "does not update the field" do
211
+ it "does not update the first field" do
166
212
  expect(person.title).to eq("sir")
167
213
  end
168
214
 
169
- it "does not persist the changes" do
215
+ it "does not update the second field" do
216
+ expect(person.aliased_timestamp).to eq(Time.at(42))
217
+ end
218
+
219
+ it "does not persist the first field" do
170
220
  expect(person.reload.title).to eq("sir")
171
221
  end
222
+
223
+ it "does not persist the second field" do
224
+ expect(person.reload.aliased_timestamp).to eq(Time.at(42))
225
+ end
172
226
  end
173
227
 
174
228
  context "when updating via update_attributes!" do
175
229
 
176
230
  before do
177
- person.update_attributes!(title: "mr")
231
+ person.update_attributes!(title: "mr", aliased_timestamp: Time.at(43))
178
232
  person.save
179
233
  end
180
234
 
181
- it "does not update the field" do
235
+ it "does not update the first field" do
182
236
  expect(person.title).to eq("sir")
183
237
  end
184
238
 
185
- it "does not persist the changes" do
239
+ it "does not update the second field" do
240
+ expect(person.aliased_timestamp).to eq(Time.at(42))
241
+ end
242
+
243
+ it "does not persist the first field" do
186
244
  expect(person.reload.title).to eq("sir")
187
245
  end
246
+
247
+ it "does not persist the second field" do
248
+ expect(person.reload.aliased_timestamp).to eq(Time.at(42))
249
+ end
188
250
  end
189
251
 
190
252
  context "when updating via update_attribute" do