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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +66 -1
- data/README.md +14 -13
- data/lib/config/locales/en.yml +28 -28
- data/lib/mongoid.rb +28 -21
- data/lib/mongoid/atomic.rb +2 -4
- data/lib/mongoid/attributes.rb +7 -7
- data/lib/mongoid/attributes/processing.rb +4 -1
- data/lib/mongoid/attributes/readonly.rb +2 -2
- data/lib/mongoid/changeable.rb +4 -6
- data/lib/mongoid/clients.rb +142 -0
- data/lib/mongoid/clients/factory.rb +78 -0
- data/lib/mongoid/{sessions → clients}/options.rb +30 -19
- data/lib/mongoid/{sessions → clients}/storage_options.rb +27 -13
- data/lib/mongoid/{sessions → clients}/thread_options.rb +6 -3
- data/lib/mongoid/clients/validators.rb +2 -0
- data/lib/mongoid/{sessions → clients}/validators/storage.rb +5 -2
- data/lib/mongoid/composable.rb +3 -3
- data/lib/mongoid/config.rb +39 -41
- data/lib/mongoid/config/environment.rb +1 -1
- data/lib/mongoid/config/validators.rb +1 -1
- data/lib/mongoid/config/validators/{session.rb → client.rb} +31 -28
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +11 -11
- data/lib/mongoid/contextual/command.rb +9 -6
- data/lib/mongoid/contextual/geo_near.rb +17 -1
- data/lib/mongoid/contextual/map_reduce.rb +12 -11
- data/lib/mongoid/contextual/memory.rb +2 -5
- data/lib/mongoid/contextual/mongo.rb +92 -82
- data/lib/mongoid/contextual/none.rb +13 -0
- data/lib/mongoid/copyable.rb +6 -1
- data/lib/mongoid/criteria.rb +36 -3
- data/lib/mongoid/document.rb +3 -4
- data/lib/mongoid/errors.rb +6 -6
- data/lib/mongoid/errors/{mixed_session_configuration.rb → mixed_client_configuration.rb} +5 -5
- data/lib/mongoid/errors/no_client_config.rb +22 -0
- data/lib/mongoid/errors/{no_session_database.rb → no_client_database.rb} +4 -4
- data/lib/mongoid/errors/{no_session_hosts.rb → no_client_hosts.rb} +4 -4
- data/lib/mongoid/errors/{no_sessions_config.rb → no_clients_config.rb} +4 -4
- data/lib/mongoid/errors/no_default_client.rb +23 -0
- data/lib/mongoid/extensions/hash.rb +5 -1
- data/lib/mongoid/extensions/object.rb +3 -2
- data/lib/mongoid/extensions/set.rb +5 -5
- data/lib/mongoid/factory.rb +4 -2
- data/lib/mongoid/fields.rb +7 -2
- data/lib/mongoid/findable.rb +4 -1
- data/lib/mongoid/indexable.rb +15 -9
- data/lib/mongoid/persistable.rb +1 -2
- data/lib/mongoid/persistable/creatable.rb +2 -2
- data/lib/mongoid/persistable/deletable.rb +3 -3
- data/lib/mongoid/persistable/incrementable.rb +1 -1
- data/lib/mongoid/persistable/logical.rb +1 -1
- data/lib/mongoid/persistable/poppable.rb +1 -1
- data/lib/mongoid/persistable/pullable.rb +2 -2
- data/lib/mongoid/persistable/pushable.rb +2 -2
- data/lib/mongoid/persistable/renamable.rb +1 -1
- data/lib/mongoid/persistable/settable.rb +1 -1
- data/lib/mongoid/persistable/unsettable.rb +1 -1
- data/lib/mongoid/persistable/updatable.rb +2 -2
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/query_cache.rb +98 -104
- data/lib/mongoid/railtie.rb +1 -21
- data/lib/mongoid/railties/database.rake +1 -1
- data/lib/mongoid/relations/builders.rb +3 -1
- data/lib/mongoid/relations/counter_cache.rb +1 -1
- data/lib/mongoid/relations/embedded/batchable.rb +3 -10
- data/lib/mongoid/relations/embedded/many.rb +4 -2
- data/lib/mongoid/relations/many.rb +1 -0
- data/lib/mongoid/relations/proxy.rb +6 -6
- data/lib/mongoid/relations/referenced/many.rb +2 -1
- data/lib/mongoid/relations/targets/enumerable.rb +11 -11
- data/lib/mongoid/relations/touchable.rb +1 -1
- data/lib/mongoid/reloadable.rb +2 -2
- data/lib/mongoid/scopable.rb +6 -17
- data/lib/mongoid/selectable.rb +1 -36
- data/lib/mongoid/serializable.rb +2 -2
- data/lib/mongoid/stateful.rb +0 -1
- data/lib/mongoid/tasks/database.rake +2 -2
- data/lib/mongoid/tasks/database.rb +23 -16
- data/lib/mongoid/threaded.rb +54 -33
- data/lib/mongoid/threaded/lifecycle.rb +21 -16
- data/lib/mongoid/traversable.rb +16 -1
- data/lib/mongoid/validatable.rb +1 -1
- data/lib/mongoid/validatable/queryable.rb +1 -1
- data/lib/mongoid/validatable/uniqueness.rb +3 -20
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +91 -57
- data/lib/rails/mongoid.rb +2 -2
- data/spec/app/models/audio.rb +1 -1
- data/spec/app/models/band.rb +1 -0
- data/spec/app/models/company.rb +5 -0
- data/spec/app/models/label.rb +7 -0
- data/spec/app/models/pub.rb +6 -0
- data/spec/app/models/staff.rb +7 -0
- data/spec/app/models/store_as_dup_test1.rb +5 -0
- data/spec/app/models/store_as_dup_test2.rb +5 -0
- data/spec/config/mongoid.yml +7 -25
- data/spec/mongoid/atomic/paths_spec.rb +3 -11
- data/spec/mongoid/attributes/nested_spec.rb +16 -16
- data/spec/mongoid/attributes/readonly_spec.rb +80 -18
- data/spec/mongoid/attributes_spec.rb +3 -3
- data/spec/mongoid/changeable_spec.rb +70 -0
- data/spec/mongoid/clients/factory_spec.rb +284 -0
- data/spec/mongoid/{sessions → clients}/options_spec.rb +4 -6
- data/spec/mongoid/clients_spec.rb +739 -0
- data/spec/mongoid/config/environment_spec.rb +14 -11
- data/spec/mongoid/config_spec.rb +33 -48
- data/spec/mongoid/contextual/atomic_spec.rb +1 -17
- data/spec/mongoid/contextual/geo_near_spec.rb +35 -0
- data/spec/mongoid/contextual/mongo_spec.rb +26 -83
- data/spec/mongoid/contextual/none_spec.rb +15 -0
- data/spec/mongoid/copyable_spec.rb +35 -1
- data/spec/mongoid/criteria/findable_spec.rb +197 -0
- data/spec/mongoid/criteria/modifiable_spec.rb +7 -29
- data/spec/mongoid/criteria_spec.rb +74 -91
- data/spec/mongoid/document_spec.rb +1 -1
- data/spec/mongoid/errors/{mixed_session_configuration_spec.rb → mixed_client_configuration_spec.rb} +1 -1
- data/spec/mongoid/errors/{no_session_config_spec.rb → no_client_config_spec.rb} +4 -4
- data/spec/mongoid/errors/{no_session_database_spec.rb → no_client_database_spec.rb} +4 -4
- data/spec/mongoid/errors/{no_session_hosts_spec.rb → no_client_hosts_spec.rb} +3 -3
- data/spec/mongoid/errors/{no_sessions_config_spec.rb → no_clients_config_spec.rb} +2 -2
- data/spec/mongoid/fields/localized_spec.rb +1 -0
- data/spec/mongoid/fields_spec.rb +1 -0
- data/spec/mongoid/findable_spec.rb +2 -23
- data/spec/mongoid/indexable_spec.rb +12 -8
- data/spec/mongoid/interceptable_spec.rb +15 -0
- data/spec/mongoid/persistable/settable_spec.rb +16 -0
- data/spec/mongoid/persistable/updatable_spec.rb +3 -2
- data/spec/mongoid/persistable_spec.rb +4 -4
- data/spec/mongoid/query_cache_spec.rb +13 -8
- data/spec/mongoid/relations/auto_save_spec.rb +1 -1
- data/spec/mongoid/relations/counter_cache_spec.rb +34 -0
- data/spec/mongoid/relations/eager/belongs_to_spec.rb +9 -0
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +3 -3
- data/spec/mongoid/relations/embedded/many_spec.rb +123 -1
- data/spec/mongoid/relations/embedded/one_spec.rb +3 -3
- data/spec/mongoid/relations/proxy_spec.rb +28 -0
- data/spec/mongoid/relations/referenced/in_spec.rb +1 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +47 -23
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +1 -1
- data/spec/mongoid/relations/referenced/one_spec.rb +1 -1
- data/spec/mongoid/relations/targets/enumerable_spec.rb +9 -2
- data/spec/mongoid/reloadable_spec.rb +6 -6
- data/spec/mongoid/scopable_spec.rb +41 -28
- data/spec/mongoid/selectable_spec.rb +6 -16
- data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
- data/spec/mongoid/tasks/database_spec.rb +2 -2
- data/spec/mongoid/threaded_spec.rb +0 -7
- data/spec/mongoid/traversable_spec.rb +2 -2
- data/spec/mongoid/validatable/uniqueness_spec.rb +30 -1
- data/spec/mongoid_spec.rb +13 -15
- data/spec/rails/mongoid_spec.rb +13 -4
- data/spec/spec_helper.rb +44 -27
- data/spec/support/authorization.rb +12 -0
- data/spec/support/expectations.rb +14 -0
- metadata +52 -59
- data/lib/mongoid/contextual/find_and_modify.rb +0 -69
- data/lib/mongoid/contextual/text_search.rb +0 -178
- data/lib/mongoid/criteria/#findable.rb# +0 -141
- data/lib/mongoid/errors/no_default_session.rb +0 -23
- data/lib/mongoid/errors/no_session_config.rb +0 -22
- data/lib/mongoid/log_subscriber.rb +0 -55
- data/lib/mongoid/positional.rb +0 -71
- data/lib/mongoid/sessions.rb +0 -125
- data/lib/mongoid/sessions/factory.rb +0 -131
- data/lib/mongoid/sessions/mongo_uri.rb +0 -93
- data/lib/mongoid/sessions/validators.rb +0 -2
- data/lib/mongoid/support/query_counter.rb +0 -23
- data/spec/helpers.rb +0 -18
- data/spec/mongoid/#atomic_spec.rb# +0 -365
- data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
- data/spec/mongoid/contextual/text_search_spec.rb +0 -209
- data/spec/mongoid/log_subscriber_spec.rb +0 -75
- data/spec/mongoid/positional_spec.rb +0 -222
- data/spec/mongoid/sessions/factory_spec.rb +0 -333
- data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
- data/spec/mongoid/sessions_spec.rb +0 -1252
data/lib/rails/mongoid.rb
CHANGED
@@ -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
|
data/spec/app/models/audio.rb
CHANGED
data/spec/app/models/band.rb
CHANGED
@@ -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
|
data/spec/app/models/label.rb
CHANGED
@@ -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
|
data/spec/config/mongoid.yml
CHANGED
@@ -1,34 +1,16 @@
|
|
1
1
|
test:
|
2
|
-
|
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
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
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).
|
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).
|
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).
|
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).
|
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).
|
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).
|
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.
|
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.
|
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.
|
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).
|
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).
|
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).
|
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).
|
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).
|
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).
|
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).
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|