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.
- checksums.yaml +5 -5
- data/README.md +3 -3
- data/lib/config/locales/en.yml +19 -0
- data/lib/mongoid.rb +4 -4
- data/lib/mongoid/atomic.rb +2 -2
- data/lib/mongoid/atomic/modifiers.rb +8 -12
- data/lib/mongoid/attributes.rb +22 -21
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +36 -0
- data/lib/mongoid/clients.rb +8 -63
- data/lib/mongoid/clients/options.rb +55 -250
- data/lib/mongoid/clients/storage_options.rb +1 -69
- data/lib/mongoid/composable.rb +29 -3
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/atomic.rb +5 -8
- data/lib/mongoid/contextual/map_reduce.rb +0 -4
- data/lib/mongoid/contextual/memory.rb +2 -2
- data/lib/mongoid/contextual/mongo.rb +40 -22
- data/lib/mongoid/contextual/none.rb +12 -0
- data/lib/mongoid/copyable.rb +13 -6
- data/lib/mongoid/criteria.rb +5 -2
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +17 -1
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable.rb +87 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
- data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
- data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
- data/lib/mongoid/criteria/queryable/key.rb +103 -0
- data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
- data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
- data/lib/mongoid/criteria/queryable/optional.rb +429 -0
- data/lib/mongoid/criteria/queryable/options.rb +153 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
- data/lib/mongoid/criteria/queryable/selector.rb +212 -0
- data/lib/mongoid/criteria/queryable/smash.rb +104 -0
- data/lib/mongoid/document.rb +30 -37
- data/lib/mongoid/errors.rb +2 -0
- data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
- data/lib/mongoid/errors/invalid_field.rb +2 -2
- data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
- data/lib/mongoid/errors/invalid_relation.rb +66 -0
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions.rb +0 -4
- data/lib/mongoid/extensions/big_decimal.rb +17 -8
- data/lib/mongoid/extensions/date.rb +4 -1
- data/lib/mongoid/extensions/decimal128.rb +3 -3
- data/lib/mongoid/extensions/hash.rb +1 -0
- data/lib/mongoid/extensions/string.rb +4 -3
- data/lib/mongoid/extensions/time.rb +4 -1
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +2 -2
- data/lib/mongoid/indexable.rb +15 -13
- data/lib/mongoid/interceptable.rb +5 -22
- data/lib/mongoid/matchable.rb +13 -7
- data/lib/mongoid/matchable/all.rb +2 -2
- data/lib/mongoid/matchable/and.rb +3 -3
- data/lib/mongoid/matchable/default.rb +2 -2
- data/lib/mongoid/matchable/elem_match.rb +28 -0
- data/lib/mongoid/matchable/exists.rb +2 -2
- data/lib/mongoid/matchable/gt.rb +4 -2
- data/lib/mongoid/matchable/gte.rb +4 -2
- data/lib/mongoid/matchable/in.rb +2 -2
- data/lib/mongoid/matchable/lt.rb +4 -2
- data/lib/mongoid/matchable/lte.rb +4 -2
- data/lib/mongoid/matchable/ne.rb +2 -2
- data/lib/mongoid/matchable/nin.rb +2 -2
- data/lib/mongoid/matchable/or.rb +3 -3
- data/lib/mongoid/matchable/regexp.rb +3 -3
- data/lib/mongoid/matchable/size.rb +2 -2
- data/lib/mongoid/persistable.rb +3 -5
- data/lib/mongoid/persistable/creatable.rb +2 -2
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/settable.rb +1 -1
- data/lib/mongoid/persistable/updatable.rb +5 -12
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistence_context.rb +215 -0
- data/lib/mongoid/query_cache.rb +3 -6
- data/lib/mongoid/relations/accessors.rb +3 -0
- data/lib/mongoid/relations/auto_save.rb +12 -4
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
- data/lib/mongoid/relations/counter_cache.rb +15 -5
- data/lib/mongoid/relations/eager.rb +6 -11
- data/lib/mongoid/relations/eager/base.rb +3 -3
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
- data/lib/mongoid/relations/eager/has_many.rb +1 -1
- data/lib/mongoid/relations/embedded/batchable.rb +12 -36
- data/lib/mongoid/relations/embedded/in.rb +13 -1
- data/lib/mongoid/relations/embedded/many.rb +28 -10
- data/lib/mongoid/relations/embedded/one.rb +14 -1
- data/lib/mongoid/relations/macros.rb +9 -1
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/proxy.rb +1 -31
- data/lib/mongoid/relations/referenced/in.rb +19 -10
- data/lib/mongoid/relations/referenced/many.rb +23 -17
- data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
- data/lib/mongoid/relations/referenced/one.rb +15 -1
- data/lib/mongoid/relations/synchronization.rb +11 -11
- data/lib/mongoid/relations/touchable.rb +6 -3
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/serializable.rb +1 -1
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +14 -3
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/book.rb +2 -1
- data/spec/app/models/dokument.rb +1 -0
- data/spec/app/models/ordered_post.rb +5 -0
- data/spec/app/models/oscar.rb +1 -2
- data/spec/app/models/page.rb +1 -1
- data/spec/app/models/person.rb +3 -3
- data/spec/app/models/princess.rb +2 -0
- data/spec/app/models/record.rb +1 -0
- data/spec/app/models/subscription.rb +1 -0
- data/spec/app/models/thing.rb +1 -1
- data/spec/config/mongoid.yml +15 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
- data/spec/mongoid/atomic_spec.rb +17 -17
- data/spec/mongoid/attributes/nested_spec.rb +14 -14
- data/spec/mongoid/attributes/readonly_spec.rb +87 -44
- data/spec/mongoid/attributes_spec.rb +90 -5
- data/spec/mongoid/cacheable_spec.rb +112 -0
- data/spec/mongoid/changeable_spec.rb +58 -0
- data/spec/mongoid/clients/factory_spec.rb +31 -3
- data/spec/mongoid/clients/options_spec.rb +382 -96
- data/spec/mongoid/clients_spec.rb +243 -101
- data/spec/mongoid/composable_spec.rb +7 -0
- data/spec/mongoid/config_spec.rb +67 -11
- data/spec/mongoid/contextual/atomic_spec.rb +3 -3
- data/spec/mongoid/contextual/mongo_spec.rb +165 -20
- data/spec/mongoid/contextual/none_spec.rb +15 -0
- data/spec/mongoid/copyable_spec.rb +13 -4
- data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
- data/spec/mongoid/criteria/options_spec.rb +29 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
- data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +4174 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
- data/spec/mongoid/criteria_spec.rb +152 -21
- data/spec/mongoid/document_spec.rb +37 -88
- data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
- data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
- data/spec/mongoid/extensions/boolean_spec.rb +14 -0
- data/spec/mongoid/extensions/date_spec.rb +2 -6
- data/spec/mongoid/extensions/date_time_spec.rb +2 -6
- data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
- data/spec/mongoid/extensions/float_spec.rb +8 -1
- data/spec/mongoid/extensions/hash_spec.rb +15 -0
- data/spec/mongoid/extensions/integer_spec.rb +8 -1
- data/spec/mongoid/extensions/object_spec.rb +11 -0
- data/spec/mongoid/extensions/string_spec.rb +21 -0
- data/spec/mongoid/extensions/time_spec.rb +2 -6
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/findable_spec.rb +46 -1
- data/spec/mongoid/indexable_spec.rb +15 -3
- data/spec/mongoid/interceptable_spec.rb +68 -10
- data/spec/mongoid/matchable/all_spec.rb +4 -4
- data/spec/mongoid/matchable/and_spec.rb +10 -10
- data/spec/mongoid/matchable/default_spec.rb +12 -12
- data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
- data/spec/mongoid/matchable/exists_spec.rb +5 -5
- data/spec/mongoid/matchable/gt_spec.rb +18 -7
- data/spec/mongoid/matchable/gte_spec.rb +17 -7
- data/spec/mongoid/matchable/in_spec.rb +5 -5
- data/spec/mongoid/matchable/lt_spec.rb +18 -7
- data/spec/mongoid/matchable/lte_spec.rb +18 -7
- data/spec/mongoid/matchable/ne_spec.rb +5 -5
- data/spec/mongoid/matchable/nin_spec.rb +5 -5
- data/spec/mongoid/matchable/or_spec.rb +7 -7
- data/spec/mongoid/matchable/regexp_spec.rb +5 -5
- data/spec/mongoid/matchable/size_spec.rb +3 -3
- data/spec/mongoid/matchable_spec.rb +173 -53
- data/spec/mongoid/persistable/creatable_spec.rb +7 -2
- data/spec/mongoid/persistable/deletable_spec.rb +16 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
- data/spec/mongoid/persistable/savable_spec.rb +35 -30
- data/spec/mongoid/persistable/settable_spec.rb +45 -29
- data/spec/mongoid/persistable/updatable_spec.rb +184 -5
- data/spec/mongoid/persistence_context_spec.rb +680 -0
- data/spec/mongoid/positional_spec.rb +10 -10
- data/spec/mongoid/query_cache_spec.rb +89 -0
- data/spec/mongoid/relations/accessors_spec.rb +1 -1
- data/spec/mongoid/relations/auto_save_spec.rb +39 -6
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
- data/spec/mongoid/relations/builders_spec.rb +37 -10
- data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
- data/spec/mongoid/relations/eager_spec.rb +40 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +63 -47
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +395 -7
- data/spec/mongoid/relations/metadata_spec.rb +15 -1
- data/spec/mongoid/relations/proxy_spec.rb +27 -1
- data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +13 -25
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
- data/spec/mongoid/relations/synchronization_spec.rb +48 -2
- data/spec/mongoid/relations/touchable_spec.rb +40 -0
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/serializable_spec.rb +0 -50
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
- data/spec/mongoid/validatable_spec.rb +16 -0
- data/spec/spec_helper.rb +20 -11
- metadata +524 -469
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- 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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
-
|
5
|
+
before do
|
6
|
+
Person.attr_readonly(*attributes)
|
7
|
+
end
|
6
8
|
|
7
|
-
|
8
|
-
|
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
|
-
|
14
|
-
|
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
|
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
|
-
|
25
|
-
|
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
|
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
|
-
|
36
|
-
|
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
|
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
|
-
|
47
|
-
|
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
|
-
|
82
|
-
|
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
|
1790
|
+
Person.create
|
1713
1791
|
end
|
1714
1792
|
|
1715
|
-
|
1716
|
-
|
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
|
-
|
1720
|
-
|
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
|