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
@@ -0,0 +1,523 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Array do
|
4
|
+
describe ".evolve" do
|
5
|
+
|
6
|
+
context "when provided an Array" do
|
7
|
+
|
8
|
+
let(:array) do
|
9
|
+
[ 1, 2, 3 ]
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns an array" do
|
13
|
+
expect(described_class.evolve(array)).to eq([ 1, 2, 3 ])
|
14
|
+
end
|
15
|
+
|
16
|
+
it "doesn't mutate its argument" do
|
17
|
+
expect{ described_class.evolve(array.freeze) }.not_to raise_error
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when provided nil" do
|
22
|
+
|
23
|
+
it "returns nil" do
|
24
|
+
expect(described_class.evolve(nil)).to be_nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when provided another object" do
|
29
|
+
|
30
|
+
it "returns the object" do
|
31
|
+
expect(described_class.evolve("testing")).to eq("testing")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#__add__" do
|
37
|
+
|
38
|
+
context "when the other object is a non-enumerable" do
|
39
|
+
|
40
|
+
context "when all values are unique" do
|
41
|
+
|
42
|
+
it "returns an array of both" do
|
43
|
+
expect([ 5, 6 ].__add__(7)).to eq([ 5, 6, 7 ])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when values are not unique" do
|
48
|
+
|
49
|
+
it "returns a unique array of both" do
|
50
|
+
expect([ 5, 6 ].__add__(6)).to eq([ 5, 6 ])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "when the other object is an array" do
|
56
|
+
|
57
|
+
context "when all values are unique" do
|
58
|
+
|
59
|
+
it "returns an array of both" do
|
60
|
+
expect([ 4, 5 ].__add__([ 6, 7 ])).to eq([ 4, 5, 6, 7 ])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "when values are not unique" do
|
65
|
+
|
66
|
+
it "returns a unique array of both" do
|
67
|
+
expect([ 4, 5 ].__add__([ 5, 6, 7 ])).to eq([ 4, 5, 6, 7 ])
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when the other object is a hash" do
|
73
|
+
|
74
|
+
context "when all values are unique" do
|
75
|
+
|
76
|
+
it "returns a hash of both" do
|
77
|
+
expect([ 4, 5 ].__add__({ "$in" => [ 6, 7 ] })).to eq(
|
78
|
+
{ "$in" => [ 4, 5, 6, 7 ] }
|
79
|
+
)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "when values are not unique" do
|
84
|
+
|
85
|
+
it "returns a unique array of both" do
|
86
|
+
expect([ 4, 5 ].__add__({ "$in" => [ 5, 6, 7 ] })).to eq(
|
87
|
+
{ "$in" => [ 4, 5, 6, 7 ] }
|
88
|
+
)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#__array__" do
|
95
|
+
|
96
|
+
it "returns self" do
|
97
|
+
expect([ 1, 2, 3 ].__array__).to eq([ 1, 2, 3 ])
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "__deep_copy__" do
|
102
|
+
|
103
|
+
let(:inner) do
|
104
|
+
[ 3, 4 ]
|
105
|
+
end
|
106
|
+
|
107
|
+
let(:array) do
|
108
|
+
[ 1, 2, inner ]
|
109
|
+
end
|
110
|
+
|
111
|
+
let(:copy) do
|
112
|
+
array.__deep_copy__
|
113
|
+
end
|
114
|
+
|
115
|
+
it "returns an equal array" do
|
116
|
+
expect(copy).to eq(array)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "returns a copy" do
|
120
|
+
expect(copy).to_not equal(array)
|
121
|
+
end
|
122
|
+
|
123
|
+
it "deep copies the elements" do
|
124
|
+
expect(copy[2]).to_not equal(inner)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "#__evolve_date__" do
|
129
|
+
|
130
|
+
context "when the array is composed of dates" do
|
131
|
+
|
132
|
+
let(:date) do
|
133
|
+
Date.new(2010, 1, 1)
|
134
|
+
end
|
135
|
+
|
136
|
+
let(:evolved) do
|
137
|
+
[ date ].__evolve_date__
|
138
|
+
end
|
139
|
+
|
140
|
+
let(:expected) do
|
141
|
+
Time.utc(2010, 1, 1, 0, 0, 0, 0)
|
142
|
+
end
|
143
|
+
|
144
|
+
it "returns the array with evolved times" do
|
145
|
+
expect(evolved).to eq([ expected ])
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context "when the array is composed of strings" do
|
150
|
+
|
151
|
+
let(:date) do
|
152
|
+
Date.parse("1st Jan 2010")
|
153
|
+
end
|
154
|
+
|
155
|
+
let(:evolved) do
|
156
|
+
[ date.to_s ].__evolve_date__
|
157
|
+
end
|
158
|
+
|
159
|
+
it "returns the strings as a times" do
|
160
|
+
expect(evolved).to eq([ Time.new(2010, 1, 1, 0, 0, 0, 0).utc ])
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
context "when the array is composed of integers" do
|
165
|
+
|
166
|
+
let(:time) do
|
167
|
+
Time.utc(2010, 1, 1, 0, 0, 0, 0)
|
168
|
+
end
|
169
|
+
|
170
|
+
let(:integer) do
|
171
|
+
time.to_i
|
172
|
+
end
|
173
|
+
|
174
|
+
let(:evolved) do
|
175
|
+
[ integer ].__evolve_date__
|
176
|
+
end
|
177
|
+
|
178
|
+
let(:expected) do
|
179
|
+
Time.at(integer)
|
180
|
+
end
|
181
|
+
|
182
|
+
it "returns the integers as times" do
|
183
|
+
expect(evolved).to eq([ time ])
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context "when the array is composed of floats" do
|
188
|
+
|
189
|
+
let(:time) do
|
190
|
+
Time.utc(2010, 1, 1, 0, 0, 0, 0)
|
191
|
+
end
|
192
|
+
|
193
|
+
let(:float) do
|
194
|
+
time.to_f
|
195
|
+
end
|
196
|
+
|
197
|
+
let(:evolved) do
|
198
|
+
[ float ].__evolve_date__
|
199
|
+
end
|
200
|
+
|
201
|
+
let(:expected) do
|
202
|
+
Time.at(float)
|
203
|
+
end
|
204
|
+
|
205
|
+
it "returns the floats as times" do
|
206
|
+
expect(evolved).to eq([ time ])
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
describe "__evolve_time__" do
|
212
|
+
|
213
|
+
context "when the array is composed of times" do
|
214
|
+
|
215
|
+
let(:date) do
|
216
|
+
Time.new(2010, 1, 1, 12, 0, 0)
|
217
|
+
end
|
218
|
+
|
219
|
+
let(:evolved) do
|
220
|
+
[ date ].__evolve_time__
|
221
|
+
end
|
222
|
+
|
223
|
+
let(:expected) do
|
224
|
+
Time.new(2010, 1, 1, 12, 0, 0).utc
|
225
|
+
end
|
226
|
+
|
227
|
+
it "returns the array with evolved times" do
|
228
|
+
expect(evolved).to eq([ expected ])
|
229
|
+
end
|
230
|
+
|
231
|
+
it "returns utc times" do
|
232
|
+
expect(evolved.first.utc_offset).to eq(0)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
context "when the array is composed of strings" do
|
237
|
+
|
238
|
+
let(:date) do
|
239
|
+
Time.parse("1st Jan 2010 12:00:00+01:00")
|
240
|
+
end
|
241
|
+
|
242
|
+
let(:evolved) do
|
243
|
+
[ date.to_s ].__evolve_time__
|
244
|
+
end
|
245
|
+
|
246
|
+
it "returns the strings as a times" do
|
247
|
+
expect(evolved).to eq([ date.to_time ])
|
248
|
+
end
|
249
|
+
|
250
|
+
it "returns the times in utc" do
|
251
|
+
expect(evolved.first.utc_offset).to eq(0)
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
context "when the array is composed of integers" do
|
256
|
+
|
257
|
+
let(:integer) do
|
258
|
+
1331890719
|
259
|
+
end
|
260
|
+
|
261
|
+
let(:evolved) do
|
262
|
+
[ integer ].__evolve_time__
|
263
|
+
end
|
264
|
+
|
265
|
+
let(:expected) do
|
266
|
+
Time.at(integer).utc
|
267
|
+
end
|
268
|
+
|
269
|
+
it "returns the integers as times" do
|
270
|
+
expect(evolved).to eq([ expected ])
|
271
|
+
end
|
272
|
+
|
273
|
+
it "returns the times in utc" do
|
274
|
+
expect(evolved.first.utc_offset).to eq(0)
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
context "when the array is composed of floats" do
|
279
|
+
|
280
|
+
let(:float) do
|
281
|
+
1331890719.413
|
282
|
+
end
|
283
|
+
|
284
|
+
let(:evolved) do
|
285
|
+
[ float ].__evolve_time__
|
286
|
+
end
|
287
|
+
|
288
|
+
let(:expected) do
|
289
|
+
Time.at(float).utc
|
290
|
+
end
|
291
|
+
|
292
|
+
it "returns the floats as times" do
|
293
|
+
expect(evolved).to eq([ expected ])
|
294
|
+
end
|
295
|
+
|
296
|
+
it "returns the times in utc" do
|
297
|
+
expect(evolved.first.utc_offset).to eq(0)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
describe "#__expand_complex__" do
|
303
|
+
|
304
|
+
let(:array) do
|
305
|
+
[{ :test.in => [ "value" ] }]
|
306
|
+
end
|
307
|
+
|
308
|
+
it "expands all keys inside the array" do
|
309
|
+
expect(array.__expand_complex__).to eq([{ "test" => { "$in" => [ "value" ]}}])
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
describe "#__intersect__" do
|
314
|
+
|
315
|
+
context "when the other object is a non-enumerable" do
|
316
|
+
|
317
|
+
context "when the values intersect" do
|
318
|
+
|
319
|
+
it "returns an intersected array" do
|
320
|
+
expect([ 5, 6, 7 ].__intersect__(6)).to eq([ 6 ])
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
context "when the values do not intersect" do
|
325
|
+
|
326
|
+
it "returns an empty array" do
|
327
|
+
expect([ 5, 6, 7 ].__intersect__(8)).to be_empty
|
328
|
+
end
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
context "when the other object is an array" do
|
333
|
+
|
334
|
+
context "when the values intersect" do
|
335
|
+
|
336
|
+
it "returns an intersected array" do
|
337
|
+
expect([ 4, 5, 6 ].__intersect__([ 6, 7 ])).to eq([ 6 ])
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
context "when values do not intersect" do
|
342
|
+
|
343
|
+
it "returns an empty array" do
|
344
|
+
expect([ 4, 5 ].__intersect__([ 6, 7 ])).to be_empty
|
345
|
+
end
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
context "when the other object is a hash" do
|
350
|
+
|
351
|
+
context "when the values intersect" do
|
352
|
+
|
353
|
+
it "returns a hash of both" do
|
354
|
+
expect([ 4, 5 ].__intersect__({ "$in" => [ 5, 6 ] })).to eq(
|
355
|
+
{ "$in" => [ 5 ] }
|
356
|
+
)
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
context "when values do not intersect" do
|
361
|
+
|
362
|
+
it "returns an empty array" do
|
363
|
+
expect([ 4, 5 ].__intersect__({ "$in" => [ 6, 7 ] })).to eq(
|
364
|
+
{ "$in" => [] }
|
365
|
+
)
|
366
|
+
end
|
367
|
+
end
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
describe "#__sort_option__" do
|
372
|
+
|
373
|
+
context "when the array is one dimensional" do
|
374
|
+
|
375
|
+
it "returns a hash of sort options" do
|
376
|
+
expect([ :field, 1 ].__sort_option__).to eq({ field: 1 })
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
context "when the array is multi dimensional" do
|
381
|
+
|
382
|
+
it "returns a hash of sort options" do
|
383
|
+
expect([[ :field, 1 ]].__sort_option__).to eq({ field: 1 })
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
describe "#__sort_pair__" do
|
389
|
+
|
390
|
+
context "when the direction is a symbol" do
|
391
|
+
|
392
|
+
it "converts the symbol to an integer" do
|
393
|
+
expect([ :field, :asc ].__sort_pair__).to eq({ field: 1 })
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
context "when the direction is an integer" do
|
398
|
+
|
399
|
+
it "returns the array as a hash" do
|
400
|
+
expect([ :field, 1 ].__sort_pair__).to eq({ field: 1 })
|
401
|
+
end
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
describe "#__union__" do
|
406
|
+
|
407
|
+
context "when the other object is a non-enumerable" do
|
408
|
+
|
409
|
+
it "returns an unioned array" do
|
410
|
+
expect([ 5, 6, 7 ].__union__(6)).to eq([ 5, 6, 7 ])
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
context "when the other object is an array" do
|
415
|
+
|
416
|
+
it "returns an unioned array" do
|
417
|
+
expect([ 4, 5, 6 ].__union__([ 6, 7 ])).to eq([ 4, 5, 6, 7 ])
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
421
|
+
context "when the other object is a hash" do
|
422
|
+
|
423
|
+
it "returns a hash with a unioned array" do
|
424
|
+
expect([ 4, 5 ].__union__({ "$in" => [ 5, 6 ] })).to eq(
|
425
|
+
{ "$in" => [ 4, 5, 6 ] }
|
426
|
+
)
|
427
|
+
end
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
431
|
+
describe "#__sort_option__" do
|
432
|
+
|
433
|
+
context "when the array is multi-dimensional" do
|
434
|
+
|
435
|
+
context "when the arrays have integer values" do
|
436
|
+
|
437
|
+
let(:selection) do
|
438
|
+
[[ :field_one, 1 ],[ :field_two, -1 ]]
|
439
|
+
end
|
440
|
+
|
441
|
+
it "adds the sorting criteria" do
|
442
|
+
expect(selection.__sort_option__).to eq(
|
443
|
+
{ field_one: 1, field_two: -1 }
|
444
|
+
)
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
context "when the arrays have symbol values" do
|
449
|
+
|
450
|
+
let(:selection) do
|
451
|
+
[[ :field_one, :asc ],[ :field_two, :desc ]]
|
452
|
+
end
|
453
|
+
|
454
|
+
it "adds the sorting criteria" do
|
455
|
+
expect(selection.__sort_option__).to eq(
|
456
|
+
{ field_one: 1, field_two: -1 }
|
457
|
+
)
|
458
|
+
end
|
459
|
+
end
|
460
|
+
|
461
|
+
context "when the arrays have string values" do
|
462
|
+
|
463
|
+
let(:selection) do
|
464
|
+
[[ :field_one, "asc" ],[ :field_two, "desc" ]]
|
465
|
+
end
|
466
|
+
|
467
|
+
it "adds the sorting criteria" do
|
468
|
+
expect(selection.__sort_option__).to eq(
|
469
|
+
{ field_one: 1, field_two: -1 }
|
470
|
+
)
|
471
|
+
end
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
context "when the array is one-dimensional" do
|
476
|
+
|
477
|
+
context "when the arrays have integer values" do
|
478
|
+
|
479
|
+
let(:selection) do
|
480
|
+
[ :field_one, 1 ]
|
481
|
+
end
|
482
|
+
|
483
|
+
it "adds the sorting criteria" do
|
484
|
+
expect(selection.__sort_option__).to eq(
|
485
|
+
{ field_one: 1 }
|
486
|
+
)
|
487
|
+
end
|
488
|
+
end
|
489
|
+
end
|
490
|
+
|
491
|
+
context "when the array is selectable keys" do
|
492
|
+
|
493
|
+
let(:selection) do
|
494
|
+
[ :field_one.asc, :field_two.desc ]
|
495
|
+
end
|
496
|
+
|
497
|
+
it "adds the sorting criteria" do
|
498
|
+
expect(selection.__sort_option__).to eq(
|
499
|
+
{ field_one: 1, field_two: -1 }
|
500
|
+
)
|
501
|
+
end
|
502
|
+
end
|
503
|
+
end
|
504
|
+
|
505
|
+
describe "#update_values" do
|
506
|
+
|
507
|
+
let(:array) do
|
508
|
+
[ 1, 2, 3 ]
|
509
|
+
end
|
510
|
+
|
511
|
+
let(:updated) do
|
512
|
+
array.update_values(&:to_s)
|
513
|
+
end
|
514
|
+
|
515
|
+
it "replaces each of the values with the result of the block" do
|
516
|
+
expect(updated).to eq([ "1", "2", "3" ])
|
517
|
+
end
|
518
|
+
|
519
|
+
it "returns the same instance of the array" do
|
520
|
+
expect(updated).to equal(array)
|
521
|
+
end
|
522
|
+
end
|
523
|
+
end
|