mongoid 5.4.1 → 6.0.0.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/config/locales/en.yml +23 -16
  5. data/lib/mongoid.rb +4 -9
  6. data/lib/mongoid/atomic.rb +1 -1
  7. data/lib/mongoid/atomic/modifiers.rb +8 -12
  8. data/lib/mongoid/attributes.rb +9 -11
  9. data/lib/mongoid/attributes/dynamic.rb +5 -6
  10. data/lib/mongoid/attributes/nested.rb +1 -1
  11. data/lib/mongoid/attributes/processing.rb +4 -0
  12. data/lib/mongoid/attributes/readonly.rb +22 -0
  13. data/lib/mongoid/cacheable.rb +36 -0
  14. data/lib/mongoid/changeable.rb +37 -1
  15. data/lib/mongoid/clients.rb +0 -63
  16. data/lib/mongoid/clients/factory.rb +0 -2
  17. data/lib/mongoid/clients/options.rb +54 -249
  18. data/lib/mongoid/clients/storage_options.rb +1 -69
  19. data/lib/mongoid/composable.rb +26 -2
  20. data/lib/mongoid/config.rb +1 -1
  21. data/lib/mongoid/config/options.rb +1 -1
  22. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
  23. data/lib/mongoid/contextual/atomic.rb +6 -9
  24. data/lib/mongoid/contextual/geo_near.rb +2 -3
  25. data/lib/mongoid/contextual/map_reduce.rb +97 -24
  26. data/lib/mongoid/contextual/memory.rb +7 -4
  27. data/lib/mongoid/contextual/mongo.rb +63 -54
  28. data/lib/mongoid/contextual/none.rb +2 -2
  29. data/lib/mongoid/copyable.rb +19 -19
  30. data/lib/mongoid/criteria.rb +5 -4
  31. data/lib/mongoid/criteria/findable.rb +2 -3
  32. data/lib/mongoid/criteria/includable.rb +63 -16
  33. data/lib/mongoid/criteria/marshalable.rb +2 -2
  34. data/lib/mongoid/criteria/modifiable.rb +17 -1
  35. data/lib/mongoid/criteria/options.rb +25 -0
  36. data/lib/mongoid/criteria/queryable.rb +86 -0
  37. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  38. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  39. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  40. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  41. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  42. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  43. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  44. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  45. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  46. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  47. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  48. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  49. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
  50. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  51. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  52. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  53. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  54. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  55. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  56. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  57. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  58. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  59. data/lib/mongoid/criteria/queryable/optional.rb +411 -0
  60. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  61. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  62. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  63. data/lib/mongoid/criteria/queryable/selector.rb +196 -0
  64. data/lib/mongoid/criteria/queryable/smash.rb +103 -0
  65. data/lib/mongoid/document.rb +9 -23
  66. data/lib/mongoid/errors.rb +2 -1
  67. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  68. data/lib/mongoid/errors/delete_restriction.rb +2 -2
  69. data/lib/mongoid/errors/invalid_field.rb +2 -2
  70. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  71. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  72. data/lib/mongoid/errors/inverse_not_found.rb +1 -1
  73. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  74. data/lib/mongoid/evolvable.rb +1 -1
  75. data/lib/mongoid/extensions.rb +0 -5
  76. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  77. data/lib/mongoid/extensions/date.rb +4 -1
  78. data/lib/mongoid/extensions/hash.rb +2 -3
  79. data/lib/mongoid/extensions/object.rb +2 -2
  80. data/lib/mongoid/extensions/string.rb +4 -3
  81. data/lib/mongoid/extensions/time.rb +5 -2
  82. data/lib/mongoid/factory.rb +1 -0
  83. data/lib/mongoid/fields/foreign_key.rb +2 -2
  84. data/lib/mongoid/fields/localized.rb +3 -8
  85. data/lib/mongoid/fields/validators/macro.rb +18 -0
  86. data/lib/mongoid/findable.rb +3 -3
  87. data/lib/mongoid/indexable.rb +17 -16
  88. data/lib/mongoid/indexable/specification.rb +1 -1
  89. data/lib/mongoid/indexable/validators/options.rb +1 -2
  90. data/lib/mongoid/interceptable.rb +6 -17
  91. data/lib/mongoid/loggable.rb +1 -1
  92. data/lib/mongoid/matchable.rb +3 -10
  93. data/lib/mongoid/matchable/gt.rb +2 -0
  94. data/lib/mongoid/matchable/gte.rb +2 -0
  95. data/lib/mongoid/matchable/lt.rb +2 -0
  96. data/lib/mongoid/matchable/lte.rb +2 -0
  97. data/lib/mongoid/persistable.rb +6 -5
  98. data/lib/mongoid/persistable/creatable.rb +2 -0
  99. data/lib/mongoid/persistable/deletable.rb +7 -3
  100. data/lib/mongoid/persistable/settable.rb +3 -16
  101. data/lib/mongoid/persistable/updatable.rb +10 -12
  102. data/lib/mongoid/persistence_context.rb +216 -0
  103. data/lib/mongoid/query_cache.rb +5 -30
  104. data/lib/mongoid/relations/accessors.rb +6 -2
  105. data/lib/mongoid/relations/auto_save.rb +12 -4
  106. data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
  107. data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
  108. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
  109. data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
  110. data/lib/mongoid/relations/builders.rb +2 -2
  111. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  112. data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
  113. data/lib/mongoid/relations/conversions.rb +1 -1
  114. data/lib/mongoid/relations/counter_cache.rb +28 -18
  115. data/lib/mongoid/relations/eager.rb +19 -7
  116. data/lib/mongoid/relations/eager/base.rb +5 -5
  117. data/lib/mongoid/relations/embedded/batchable.rb +9 -33
  118. data/lib/mongoid/relations/embedded/in.rb +16 -2
  119. data/lib/mongoid/relations/embedded/many.rb +23 -8
  120. data/lib/mongoid/relations/embedded/one.rb +17 -2
  121. data/lib/mongoid/relations/macros.rb +9 -2
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/nested_builder.rb +1 -1
  124. data/lib/mongoid/relations/options.rb +2 -2
  125. data/lib/mongoid/relations/proxy.rb +2 -33
  126. data/lib/mongoid/relations/referenced/in.rb +23 -11
  127. data/lib/mongoid/relations/referenced/many.rb +24 -16
  128. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  129. data/lib/mongoid/relations/referenced/one.rb +17 -1
  130. data/lib/mongoid/relations/reflections.rb +3 -5
  131. data/lib/mongoid/relations/touchable.rb +1 -1
  132. data/lib/mongoid/reloadable.rb +1 -1
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +2 -3
  135. data/lib/mongoid/tasks/database.rb +1 -2
  136. data/lib/mongoid/threaded.rb +4 -4
  137. data/lib/mongoid/traversable.rb +1 -1
  138. data/lib/mongoid/validatable.rb +1 -1
  139. data/lib/mongoid/validatable/macros.rb +2 -4
  140. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  141. data/lib/mongoid/version.rb +1 -1
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
  143. data/spec/app/models/album.rb +5 -1
  144. data/spec/app/models/artist.rb +21 -0
  145. data/spec/app/models/band.rb +0 -1
  146. data/spec/app/models/church.rb +0 -2
  147. data/spec/app/models/ordered_post.rb +5 -0
  148. data/spec/app/models/oscar.rb +1 -2
  149. data/spec/app/models/person.rb +3 -1
  150. data/spec/app/models/post.rb +0 -1
  151. data/spec/app/models/princess.rb +2 -0
  152. data/spec/app/models/record.rb +1 -0
  153. data/spec/app/models/thing.rb +1 -1
  154. data/spec/config/mongoid.yml +1 -5
  155. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  156. data/spec/mongoid/atomic_spec.rb +17 -17
  157. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  158. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  159. data/spec/mongoid/attributes_spec.rb +63 -0
  160. data/spec/mongoid/cacheable_spec.rb +112 -0
  161. data/spec/mongoid/changeable_spec.rb +58 -0
  162. data/spec/mongoid/clients/factory_spec.rb +3 -11
  163. data/spec/mongoid/clients/options_spec.rb +378 -96
  164. data/spec/mongoid/clients_spec.rb +207 -170
  165. data/spec/mongoid/composable_spec.rb +7 -0
  166. data/spec/mongoid/config_spec.rb +41 -21
  167. data/spec/mongoid/contextual/atomic_spec.rb +77 -343
  168. data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
  169. data/spec/mongoid/contextual/memory_spec.rb +56 -316
  170. data/spec/mongoid/contextual/mongo_spec.rb +104 -378
  171. data/spec/mongoid/copyable_spec.rb +8 -15
  172. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  173. data/spec/mongoid/criteria/options_spec.rb +29 -0
  174. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  175. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  176. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  177. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  178. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  179. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  180. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  181. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  182. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  183. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  184. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  185. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  186. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  187. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  188. data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
  189. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  190. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  191. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  192. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  193. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  194. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  195. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  196. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  197. data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
  198. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  199. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  200. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  201. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
  202. data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
  203. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  204. data/spec/mongoid/criteria_spec.rb +45 -63
  205. data/spec/mongoid/document_spec.rb +21 -88
  206. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  207. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  208. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  209. data/spec/mongoid/extensions/date_spec.rb +2 -6
  210. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  211. data/spec/mongoid/extensions/float_spec.rb +8 -1
  212. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  213. data/spec/mongoid/extensions/object_spec.rb +11 -0
  214. data/spec/mongoid/extensions/string_spec.rb +21 -0
  215. data/spec/mongoid/extensions/time_spec.rb +4 -8
  216. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  217. data/spec/mongoid/fields/localized_spec.rb +0 -91
  218. data/spec/mongoid/findable_spec.rb +46 -1
  219. data/spec/mongoid/indexable_spec.rb +6 -46
  220. data/spec/mongoid/interceptable_spec.rb +49 -10
  221. data/spec/mongoid/matchable/gt_spec.rb +11 -0
  222. data/spec/mongoid/matchable/gte_spec.rb +10 -0
  223. data/spec/mongoid/matchable/lt_spec.rb +11 -0
  224. data/spec/mongoid/matchable/lte_spec.rb +11 -0
  225. data/spec/mongoid/matchable_spec.rb +1 -51
  226. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  227. data/spec/mongoid/persistable/deletable_spec.rb +1 -1
  228. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  229. data/spec/mongoid/persistable/savable_spec.rb +30 -30
  230. data/spec/mongoid/persistable/settable_spec.rb +0 -185
  231. data/spec/mongoid/persistable/updatable_spec.rb +166 -5
  232. data/spec/mongoid/persistence_context_spec.rb +654 -0
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +89 -65
  235. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  236. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  237. data/spec/mongoid/relations/builders_spec.rb +37 -10
  238. data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
  239. data/spec/mongoid/relations/cyclic_spec.rb +0 -22
  240. data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
  241. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  242. data/spec/mongoid/relations/macros_spec.rb +395 -7
  243. data/spec/mongoid/relations/proxy_spec.rb +3 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
  247. data/spec/mongoid/relations/reflections_spec.rb +9 -9
  248. data/spec/mongoid/reloadable_spec.rb +51 -0
  249. data/spec/mongoid/scopable_spec.rb +0 -12
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +10 -10
  255. metadata +536 -479
  256. metadata.gz.sig +0 -0
  257. data/lib/mongoid/clients/thread_options.rb +0 -19
  258. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
  259. data/lib/mongoid/extensions/decimal128.rb +0 -39
  260. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  261. data/lib/mongoid/matchable/regexp.rb +0 -27
  262. data/spec/app/models/post_genre.rb +0 -6
  263. data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -0,0 +1,376 @@
1
+ require "spec_helper"
2
+
3
+ describe Time do
4
+
5
+ describe ".evolve" do
6
+
7
+ context "when provided a time" do
8
+
9
+ context "when the time is not in utc" do
10
+
11
+ let(:date) do
12
+ Time.new(2010, 1, 1, 12, 0, 0)
13
+ end
14
+
15
+ let(:evolved) do
16
+ described_class.evolve(date)
17
+ end
18
+
19
+ let(:expected) do
20
+ Time.new(2010, 1, 1, 12, 0, 0).utc
21
+ end
22
+
23
+ it "returns the same time" do
24
+ expect(evolved).to eq(expected)
25
+ end
26
+
27
+ it "returns the time in utc" do
28
+ expect(evolved.utc_offset).to eq(0)
29
+ end
30
+ end
31
+
32
+ context "when the time is already utc" do
33
+
34
+ let(:date) do
35
+ Time.new(2010, 1, 1, 12, 0, 0).utc
36
+ end
37
+
38
+ let(:evolved) do
39
+ described_class.evolve(date)
40
+ end
41
+
42
+ let(:expected) do
43
+ Time.new(2010, 1, 1, 12, 0, 0).utc
44
+ end
45
+
46
+ it "returns the same time" do
47
+ expect(evolved).to eq(expected)
48
+ end
49
+
50
+ it "returns the time in utc" do
51
+ expect(evolved.utc_offset).to eq(0)
52
+ end
53
+ end
54
+ end
55
+
56
+ context "when provided an array" do
57
+
58
+ context "when the array is composed of times" do
59
+
60
+ let(:date) do
61
+ Time.new(2010, 1, 1, 12, 0, 0)
62
+ end
63
+
64
+ let(:evolved) do
65
+ described_class.evolve([ date ])
66
+ end
67
+
68
+ let(:expected) do
69
+ Time.new(2010, 1, 1, 12, 0, 0).utc
70
+ end
71
+
72
+ it "returns the array with evolved times" do
73
+ expect(evolved).to eq([ expected ])
74
+ end
75
+
76
+ it "returns utc times" do
77
+ expect(evolved.first.utc_offset).to eq(0)
78
+ end
79
+ end
80
+
81
+ context "when the array is composed of strings" do
82
+
83
+ let(:date) do
84
+ Time.parse("1st Jan 2010 12:00:00+01:00")
85
+ end
86
+
87
+ let(:evolved) do
88
+ described_class.evolve([ date.to_s ])
89
+ end
90
+
91
+ it "returns the strings as a times" do
92
+ expect(evolved).to eq([ date.to_time ])
93
+ end
94
+
95
+ it "returns the times in utc" do
96
+ expect(evolved.first.utc_offset).to eq(0)
97
+ end
98
+ end
99
+
100
+ context "when the array is composed of integers" do
101
+
102
+ let(:integer) do
103
+ 1331890719
104
+ end
105
+
106
+ let(:evolved) do
107
+ described_class.evolve([ integer ])
108
+ end
109
+
110
+ let(:expected) do
111
+ Time.at(integer).utc
112
+ end
113
+
114
+ it "returns the integers as times" do
115
+ expect(evolved).to eq([ expected ])
116
+ end
117
+
118
+ it "returns the times in utc" do
119
+ expect(evolved.first.utc_offset).to eq(0)
120
+ end
121
+ end
122
+
123
+ context "when the array is composed of floats" do
124
+
125
+ let(:float) do
126
+ 1331890719.413
127
+ end
128
+
129
+ let(:evolved) do
130
+ described_class.evolve([ float ])
131
+ end
132
+
133
+ let(:expected) do
134
+ Time.at(float).utc
135
+ end
136
+
137
+ it "returns the floats as times" do
138
+ expect(evolved).to eq([ expected ])
139
+ end
140
+
141
+ it "returns the times in utc" do
142
+ expect(evolved.first.utc_offset).to eq(0)
143
+ end
144
+ end
145
+ end
146
+
147
+ context "when provided a range" do
148
+
149
+ context "when the range are dates" do
150
+
151
+ let(:min) do
152
+ Time.new(2010, 1, 1, 12, 0, 0)
153
+ end
154
+
155
+ let(:max) do
156
+ Time.new(2010, 1, 3, 12, 0, 0)
157
+ end
158
+
159
+ let(:evolved) do
160
+ described_class.evolve(min..max)
161
+ end
162
+
163
+ let(:expected_min) do
164
+ Time.new(2010, 1, 1, 12, 0, 0).utc
165
+ end
166
+
167
+ let(:expected_max) do
168
+ Time.new(2010, 1, 3, 12, 0, 0).utc
169
+ end
170
+
171
+ it "returns a selection of times" do
172
+ expect(evolved).to eq(
173
+ { "$gte" => expected_min, "$lte" => expected_max }
174
+ )
175
+ end
176
+
177
+ it "returns the times in utc" do
178
+ expect(evolved["$gte"].utc_offset).to eq(0)
179
+ end
180
+ end
181
+
182
+ context "when the range are strings" do
183
+
184
+ let(:min) do
185
+ Time.new(2010, 1, 1, 12, 0, 0)
186
+ end
187
+
188
+ let(:max) do
189
+ Time.new(2010, 1, 3, 12, 0, 0)
190
+ end
191
+
192
+ let(:evolved) do
193
+ described_class.evolve(min.to_s..max.to_s)
194
+ end
195
+
196
+ it "returns a selection of times" do
197
+ expect(evolved).to eq(
198
+ { "$gte" => min.to_time, "$lte" => max.to_time }
199
+ )
200
+ end
201
+
202
+ it "returns the times in utc" do
203
+ expect(evolved["$gte"].utc_offset).to eq(0)
204
+ end
205
+ end
206
+
207
+ context "when the range is floats" do
208
+
209
+ let(:min) do
210
+ 1331890719.1234
211
+ end
212
+
213
+ let(:max) do
214
+ 1332890719.7651
215
+ end
216
+
217
+ let(:evolved) do
218
+ described_class.evolve(min..max)
219
+ end
220
+
221
+ let(:expected_min) do
222
+ Time.at(min).utc
223
+ end
224
+
225
+ let(:expected_max) do
226
+ Time.at(max).utc
227
+ end
228
+
229
+ it "returns a selection of times" do
230
+ expect(evolved).to eq(
231
+ { "$gte" => expected_min, "$lte" => expected_max }
232
+ )
233
+ end
234
+
235
+ it "returns the times in utc" do
236
+ expect(evolved["$gte"].utc_offset).to eq(0)
237
+ end
238
+ end
239
+
240
+ context "when the range is integers" do
241
+
242
+ let(:min) do
243
+ 1331890719
244
+ end
245
+
246
+ let(:max) do
247
+ 1332890719
248
+ end
249
+
250
+ let(:evolved) do
251
+ described_class.evolve(min..max)
252
+ end
253
+
254
+ let(:expected_min) do
255
+ Time.at(min).utc
256
+ end
257
+
258
+ let(:expected_max) do
259
+ Time.at(max).utc
260
+ end
261
+
262
+ it "returns a selection of times" do
263
+ expect(evolved).to eq(
264
+ { "$gte" => expected_min, "$lte" => expected_max }
265
+ )
266
+ end
267
+
268
+ it "returns the times in utc" do
269
+ expect(evolved["$gte"].utc_offset).to eq(0)
270
+ end
271
+ end
272
+ end
273
+
274
+ context "when provided a string" do
275
+
276
+ let(:date) do
277
+ Time.parse("1st Jan 2010 12:00:00+01:00")
278
+ end
279
+
280
+ let(:evolved) do
281
+ described_class.evolve(date.to_s)
282
+ end
283
+
284
+ it "returns the string as a time" do
285
+ expect(evolved).to eq(date.to_time)
286
+ end
287
+
288
+ it "returns the time in utc" do
289
+ expect(evolved.utc_offset).to eq(0)
290
+ end
291
+ end
292
+
293
+ context "when provided a float" do
294
+
295
+ let(:float) do
296
+ 1331890719.8170738
297
+ end
298
+
299
+ let(:evolved) do
300
+ described_class.evolve(float)
301
+ end
302
+
303
+ let(:expected) do
304
+ Time.at(float)
305
+ end
306
+
307
+ it "returns the float as a time" do
308
+ expect(evolved).to eq(expected)
309
+ end
310
+
311
+ it "returns the time in utc" do
312
+ expect(evolved.utc_offset).to eq(0)
313
+ end
314
+ end
315
+
316
+ context "when provided an integer" do
317
+
318
+ let(:integer) do
319
+ 1331890719
320
+ end
321
+
322
+ let(:evolved) do
323
+ described_class.evolve(integer)
324
+ end
325
+
326
+ let(:expected) do
327
+ Time.at(integer)
328
+ end
329
+
330
+ it "returns the integer as a time" do
331
+ expect(evolved).to eq(expected)
332
+ end
333
+
334
+ it "returns the time in utc" do
335
+ expect(evolved.utc_offset).to eq(0)
336
+ end
337
+ end
338
+
339
+ context "when provided nil" do
340
+
341
+ it "returns nil" do
342
+ expect(described_class.evolve(nil)).to be_nil
343
+ end
344
+ end
345
+ end
346
+
347
+ describe "#__evolve_date__" do
348
+
349
+ let(:time) do
350
+ Time.new(2010, 1, 1, 12, 0, 0)
351
+ end
352
+
353
+ let(:evolved) do
354
+ time.__evolve_date__
355
+ end
356
+
357
+ it "returns midnight utc" do
358
+ expect(evolved).to eq(Time.utc(2010, 1, 1, 0, 0, 0))
359
+ end
360
+ end
361
+
362
+ describe "#__evolve_time__" do
363
+
364
+ let(:time) do
365
+ Time.new(2010, 1, 1, 12, 0, 0)
366
+ end
367
+
368
+ let(:evolved) do
369
+ time.__evolve_time__
370
+ end
371
+
372
+ it "returns self as utc" do
373
+ expect(evolved).to eq(Time.new(2010, 1, 1, 12, 0, 0).utc)
374
+ end
375
+ end
376
+ end
@@ -0,0 +1,347 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveSupport::TimeWithZone do
4
+
5
+ let(:time_zone) do
6
+ ActiveSupport::TimeZone.new("Eastern Time (US & Canada)")
7
+ end
8
+
9
+ describe ".evolve" do
10
+
11
+ context "when provided a time" do
12
+
13
+ let(:date) do
14
+ time_zone.local(2010, 1, 1, 12, 0, 0)
15
+ end
16
+
17
+ let(:evolved) do
18
+ described_class.evolve(date)
19
+ end
20
+
21
+ let(:expected) do
22
+ Time.utc(2010, 1, 1, 17, 0, 0)
23
+ end
24
+
25
+ it "returns the same time" do
26
+ expect(evolved).to eq(expected)
27
+ end
28
+
29
+ it "returns the time in utc" do
30
+ expect(evolved.utc_offset).to eq(0)
31
+ end
32
+ end
33
+
34
+ context "when provided an array" do
35
+
36
+ context "when the array is composed of times" do
37
+
38
+ let(:date) do
39
+ time_zone.local(2010, 1, 1, 12, 0, 0)
40
+ end
41
+
42
+ let(:evolved) do
43
+ described_class.evolve([ date ])
44
+ end
45
+
46
+ let(:expected) do
47
+ Time.utc(2010, 1, 1, 17, 0, 0)
48
+ end
49
+
50
+ it "returns the array with evolved times" do
51
+ expect(evolved).to eq([ expected ])
52
+ end
53
+
54
+ it "returns utc times" do
55
+ expect(evolved.first.utc_offset).to eq(0)
56
+ end
57
+ end
58
+
59
+ context "when the array is composed of strings" do
60
+
61
+ let(:date) do
62
+ time_zone.parse("1st Jan 2010 12:00:00+01:00")
63
+ end
64
+
65
+ let(:evolved) do
66
+ described_class.evolve([ date.to_s ])
67
+ end
68
+
69
+ it "returns the strings as a times" do
70
+ expect(evolved).to eq([ date.to_time ])
71
+ end
72
+
73
+ it "returns the times in utc" do
74
+ expect(evolved.first.utc_offset).to eq(0)
75
+ end
76
+ end
77
+
78
+ context "when the array is composed of integers" do
79
+
80
+ let(:integer) do
81
+ 1331890719
82
+ end
83
+
84
+ let(:evolved) do
85
+ described_class.evolve([ integer ])
86
+ end
87
+
88
+ let(:expected) do
89
+ Time.at(integer).utc
90
+ end
91
+
92
+ it "returns the integers as times" do
93
+ expect(evolved).to eq([ expected ])
94
+ end
95
+
96
+ it "returns the times in utc" do
97
+ expect(evolved.first.utc_offset).to eq(0)
98
+ end
99
+ end
100
+
101
+ context "when the array is composed of floats" do
102
+
103
+ let(:float) do
104
+ 1331890719.413
105
+ end
106
+
107
+ let(:evolved) do
108
+ described_class.evolve([ float ])
109
+ end
110
+
111
+ let(:expected) do
112
+ Time.at(float).utc
113
+ end
114
+
115
+ it "returns the floats as times" do
116
+ expect(evolved).to eq([ expected ])
117
+ end
118
+
119
+ it "returns the times in utc" do
120
+ expect(evolved.first.utc_offset).to eq(0)
121
+ end
122
+ end
123
+ end
124
+
125
+ context "when provided a range" do
126
+
127
+ context "when the range are dates" do
128
+
129
+ let(:min) do
130
+ time_zone.local(2010, 1, 1, 12, 0, 0)
131
+ end
132
+
133
+ let(:max) do
134
+ time_zone.local(2010, 1, 3, 12, 0, 0)
135
+ end
136
+
137
+ let(:evolved) do
138
+ described_class.evolve(min..max)
139
+ end
140
+
141
+ let(:expected_min) do
142
+ Time.utc(2010, 1, 1, 17, 0, 0)
143
+ end
144
+
145
+ let(:expected_max) do
146
+ Time.utc(2010, 1, 3, 17, 0, 0)
147
+ end
148
+
149
+ it "returns a selection of times" do
150
+ expect(evolved).to eq(
151
+ { "$gte" => expected_min, "$lte" => expected_max }
152
+ )
153
+ end
154
+
155
+ it "returns the times in utc" do
156
+ expect(evolved["$gte"].utc_offset).to eq(0)
157
+ end
158
+ end
159
+
160
+ context "when the range are strings" do
161
+
162
+ let(:min) do
163
+ time_zone.local(2010, 1, 1, 12, 0, 0)
164
+ end
165
+
166
+ let(:max) do
167
+ time_zone.local(2010, 1, 3, 12, 0, 0)
168
+ end
169
+
170
+ let(:evolved) do
171
+ described_class.evolve(min.to_s..max.to_s)
172
+ end
173
+
174
+ it "returns a selection of times" do
175
+ expect(evolved).to eq(
176
+ { "$gte" => min.to_time, "$lte" => max.to_time }
177
+ )
178
+ end
179
+
180
+ it "returns the times in utc" do
181
+ expect(evolved["$gte"].utc_offset).to eq(0)
182
+ end
183
+ end
184
+
185
+ context "when the range is floats" do
186
+
187
+ let(:min) do
188
+ 1331890719.1234
189
+ end
190
+
191
+ let(:max) do
192
+ 1332890719.7651
193
+ end
194
+
195
+ let(:evolved) do
196
+ described_class.evolve(min..max)
197
+ end
198
+
199
+ let(:expected_min) do
200
+ Time.at(min).utc
201
+ end
202
+
203
+ let(:expected_max) do
204
+ Time.at(max).utc
205
+ end
206
+
207
+ it "returns a selection of times" do
208
+ expect(evolved).to eq(
209
+ { "$gte" => expected_min, "$lte" => expected_max }
210
+ )
211
+ end
212
+
213
+ it "returns the times in utc" do
214
+ expect(evolved["$gte"].utc_offset).to eq(0)
215
+ end
216
+ end
217
+
218
+ context "when the range is integers" do
219
+
220
+ let(:min) do
221
+ 1331890719
222
+ end
223
+
224
+ let(:max) do
225
+ 1332890719
226
+ end
227
+
228
+ let(:evolved) do
229
+ described_class.evolve(min..max)
230
+ end
231
+
232
+ let(:expected_min) do
233
+ Time.at(min).utc
234
+ end
235
+
236
+ let(:expected_max) do
237
+ Time.at(max).utc
238
+ end
239
+
240
+ it "returns a selection of times" do
241
+ expect(evolved).to eq(
242
+ { "$gte" => expected_min, "$lte" => expected_max }
243
+ )
244
+ end
245
+
246
+ it "returns the times in utc" do
247
+ expect(evolved["$gte"].utc_offset).to eq(0)
248
+ end
249
+ end
250
+ end
251
+
252
+ context "when provided a string" do
253
+
254
+ let(:date) do
255
+ time_zone.parse("1st Jan 2010 12:00:00+01:00")
256
+ end
257
+
258
+ let(:evolved) do
259
+ described_class.evolve(date.to_s)
260
+ end
261
+
262
+ it "returns the string as a time" do
263
+ expect(evolved).to eq(date.to_time)
264
+ end
265
+
266
+ it "returns the time in utc" do
267
+ expect(evolved.utc_offset).to eq(0)
268
+ end
269
+ end
270
+
271
+ context "when provided a float" do
272
+
273
+ let(:float) do
274
+ 1331890719.8170738
275
+ end
276
+
277
+ let(:evolved) do
278
+ described_class.evolve(float)
279
+ end
280
+
281
+ let(:expected) do
282
+ Time.at(float)
283
+ end
284
+
285
+ it "returns the float as a time" do
286
+ expect(evolved).to eq(expected)
287
+ end
288
+
289
+ it "returns the time in utc" do
290
+ expect(evolved.utc_offset).to eq(0)
291
+ end
292
+ end
293
+
294
+ context "when provided an integer" do
295
+
296
+ let(:integer) do
297
+ 1331890719
298
+ end
299
+
300
+ let(:evolved) do
301
+ described_class.evolve(integer)
302
+ end
303
+
304
+ let(:expected) do
305
+ Time.at(integer)
306
+ end
307
+
308
+ it "returns the integer as a time" do
309
+ expect(evolved).to eq(expected)
310
+ end
311
+
312
+ it "returns the time in utc" do
313
+ expect(evolved.utc_offset).to eq(0)
314
+ end
315
+ end
316
+
317
+ context "when provided nil" do
318
+
319
+ it "returns nil" do
320
+ expect(described_class.evolve(nil)).to be_nil
321
+ end
322
+ end
323
+ end
324
+
325
+ describe "#__evolve_time__" do
326
+
327
+ let(:date) do
328
+ time_zone.local(2010, 1, 1, 12, 0, 0)
329
+ end
330
+
331
+ let(:evolved) do
332
+ date.__evolve_time__
333
+ end
334
+
335
+ let(:expected) do
336
+ Time.utc(2010, 1, 1, 17, 0, 0)
337
+ end
338
+
339
+ it "returns the same time" do
340
+ expect(evolved).to eq(expected)
341
+ end
342
+
343
+ it "returns the time in utc" do
344
+ expect(evolved.utc_offset).to eq(0)
345
+ end
346
+ end
347
+ end