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,405 @@
1
+ require "spec_helper"
2
+
3
+ describe DateTime do
4
+
5
+ describe "#__evolve_time" do
6
+
7
+ context "when the date time is not utc" do
8
+
9
+ let(:date) do
10
+ DateTime.new(2010, 1, 1, 12, 0, 0, "+01:00")
11
+ end
12
+
13
+ let(:evolved) do
14
+ date.__evolve_time__
15
+ end
16
+
17
+ let(:expected) do
18
+ Time.new(2010, 1, 1, 12, 0, 0).utc
19
+ end
20
+
21
+ it "returns the time" do
22
+ expect(evolved).to eq(expected)
23
+ end
24
+
25
+ it "returns the time in utc" do
26
+ expect(evolved.utc_offset).to eq(0)
27
+ end
28
+ end
29
+
30
+ context "when the date time is already in utc" do
31
+
32
+ let(:date) do
33
+ DateTime.new(2010, 1, 1, 12, 0, 0).utc
34
+ end
35
+
36
+ let(:evolved) do
37
+ date.__evolve_time__
38
+ end
39
+
40
+ let(:expected) do
41
+ Time.utc(2010, 1, 1, 12, 0, 0)
42
+ end
43
+
44
+ it "returns the time" do
45
+ expect(evolved).to eq(expected)
46
+ end
47
+
48
+ it "returns the time in utc" do
49
+ expect(evolved.utc_offset).to eq(0)
50
+ end
51
+ end
52
+
53
+ context "when the date time has millisecond precision" do
54
+ let(:date) do
55
+ DateTime.parse("2012-10-22T04:05:06.942")
56
+ end
57
+
58
+ let(:evolved) do
59
+ date.__evolve_time__
60
+ end
61
+
62
+ let(:expected) do
63
+ Time.utc(2012, 10, 22, 4, 5, 6, 942000)
64
+ end
65
+
66
+ it "returns the time with millisecond precision" do
67
+ expect(evolved).to eq(expected)
68
+ end
69
+ end
70
+ end
71
+
72
+ describe ".evolve" do
73
+
74
+ context "when provided a date time" do
75
+
76
+ let(:date) do
77
+ DateTime.new(2010, 1, 1, 12, 0, 0, "+01:00")
78
+ end
79
+
80
+ let(:evolved) do
81
+ described_class.evolve(date)
82
+ end
83
+
84
+ let(:expected) do
85
+ Time.new(2010, 1, 1, 12, 0, 0).utc
86
+ end
87
+
88
+ it "returns the time" do
89
+ expect(evolved).to eq(expected)
90
+ end
91
+
92
+ it "returns the time in utc" do
93
+ expect(evolved.utc_offset).to eq(0)
94
+ end
95
+ end
96
+
97
+ context "when provided a date time with millisecond precision" do
98
+ let(:date) do
99
+ DateTime.parse("2012-10-22T04:05:06.942")
100
+ end
101
+
102
+ let(:evolved) do
103
+ described_class.evolve(date)
104
+ end
105
+
106
+ let(:expected) do
107
+ Time.utc(2012, 10, 22, 4, 5, 6, 942000)
108
+ end
109
+
110
+ it "returns the time with millisecond precision" do
111
+ expect(evolved).to eq(expected)
112
+ end
113
+ end
114
+
115
+ context "when provided an array" do
116
+
117
+ context "when the array is composed of date times" do
118
+
119
+ let(:date) do
120
+ DateTime.new(2010, 1, 1, 12, 0, 0, "+01:00")
121
+ end
122
+
123
+ let(:evolved) do
124
+ described_class.evolve([ date ])
125
+ end
126
+
127
+ let(:expected) do
128
+ Time.new(2010, 1, 1, 12, 0, 0).utc
129
+ end
130
+
131
+ it "returns the array with evolved times" do
132
+ expect(evolved).to eq([ expected ])
133
+ end
134
+
135
+ it "returns the times in utc" do
136
+ expect(evolved.first.utc_offset).to eq(0)
137
+ end
138
+ end
139
+
140
+ context "when the array is composed of strings" do
141
+
142
+ let(:date) do
143
+ DateTime.parse("1st Jan 2010 12:00:00+01:00")
144
+ end
145
+
146
+ let(:evolved) do
147
+ described_class.evolve([ date.to_s ])
148
+ end
149
+
150
+ it "returns the strings as a times" do
151
+ expect(evolved).to eq([ date.to_time ])
152
+ end
153
+
154
+ it "returns the times in utc" do
155
+ expect(evolved.first.utc_offset).to eq(0)
156
+ end
157
+ end
158
+
159
+ context "when the array is composed of integers" do
160
+
161
+ let(:integer) do
162
+ 1331890719
163
+ end
164
+
165
+ let(:evolved) do
166
+ described_class.evolve([ integer ])
167
+ end
168
+
169
+ let(:expected) do
170
+ Time.at(integer).utc
171
+ end
172
+
173
+ it "returns the integers as times" do
174
+ expect(evolved).to eq([ expected ])
175
+ end
176
+
177
+ it "returns the times in utc" do
178
+ expect(evolved.first.utc_offset).to eq(0)
179
+ end
180
+ end
181
+
182
+ context "when the array is composed of floats" do
183
+
184
+ let(:float) do
185
+ 1331890719.413
186
+ end
187
+
188
+ let(:evolved) do
189
+ described_class.evolve([ float ])
190
+ end
191
+
192
+ let(:expected) do
193
+ Time.at(float).utc
194
+ end
195
+
196
+ it "returns the floats as times" do
197
+ expect(evolved).to eq([ expected ])
198
+ end
199
+
200
+ it "returns the times in utc" do
201
+ expect(evolved.first.utc_offset).to eq(0)
202
+ end
203
+ end
204
+ end
205
+
206
+ context "when provided a range" do
207
+
208
+ context "when the range are dates" do
209
+
210
+ let(:min) do
211
+ DateTime.new(2010, 1, 1, 12, 0, 0, "+01:00")
212
+ end
213
+
214
+ let(:max) do
215
+ DateTime.new(2010, 1, 3, 12, 0, 0, "+01:00")
216
+ end
217
+
218
+ let(:evolved) do
219
+ described_class.evolve(min..max)
220
+ end
221
+
222
+ let(:expected_min) do
223
+ Time.new(2010, 1, 1, 12, 0, 0)
224
+ end
225
+
226
+ let(:expected_max) do
227
+ Time.new(2010, 1, 3, 12, 0, 0)
228
+ end
229
+
230
+ it "returns a selection of times" do
231
+ expect(evolved).to eq(
232
+ { "$gte" => expected_min, "$lte" => expected_max }
233
+ )
234
+ end
235
+
236
+ it "returns the times in utc" do
237
+ expect(evolved["$gte"].utc_offset).to eq(0)
238
+ end
239
+ end
240
+
241
+ context "when the range are strings" do
242
+
243
+ let(:min) do
244
+ DateTime.new(2010, 1, 1, 12, 0, 0)
245
+ end
246
+
247
+ let(:max) do
248
+ DateTime.new(2010, 1, 3, 12, 0, 0)
249
+ end
250
+
251
+ let(:evolved) do
252
+ described_class.evolve(min.to_s..max.to_s)
253
+ end
254
+
255
+ it "returns a selection of times" do
256
+ expect(evolved).to eq(
257
+ { "$gte" => min.to_time, "$lte" => max.to_time }
258
+ )
259
+ end
260
+
261
+ it "returns the times in utc" do
262
+ expect(evolved["$gte"].utc_offset).to eq(0)
263
+ end
264
+ end
265
+
266
+ context "when the range is floats" do
267
+
268
+ let(:min) do
269
+ 1331890719.1234
270
+ end
271
+
272
+ let(:max) do
273
+ 1332890719.7651
274
+ end
275
+
276
+ let(:evolved) do
277
+ described_class.evolve(min..max)
278
+ end
279
+
280
+ let(:expected_min) do
281
+ Time.at(min)
282
+ end
283
+
284
+ let(:expected_max) do
285
+ Time.at(max)
286
+ end
287
+
288
+ it "returns a selection of times" do
289
+ expect(evolved).to eq(
290
+ { "$gte" => expected_min, "$lte" => expected_max }
291
+ )
292
+ end
293
+
294
+ it "returns the times in utc" do
295
+ expect(evolved["$gte"].utc_offset).to eq(0)
296
+ end
297
+ end
298
+
299
+ context "when the range is integers" do
300
+
301
+ let(:min) do
302
+ 1331890719
303
+ end
304
+
305
+ let(:max) do
306
+ 1332890719
307
+ end
308
+
309
+ let(:evolved) do
310
+ described_class.evolve(min..max)
311
+ end
312
+
313
+ let(:expected_min) do
314
+ Time.at(min)
315
+ end
316
+
317
+ let(:expected_max) do
318
+ Time.at(max)
319
+ end
320
+
321
+ it "returns a selection of times" do
322
+ expect(evolved).to eq(
323
+ { "$gte" => expected_min, "$lte" => expected_max }
324
+ )
325
+ end
326
+
327
+ it "returns the times in utc" do
328
+ expect(evolved["$gte"].utc_offset).to eq(0)
329
+ end
330
+ end
331
+ end
332
+
333
+ context "when provided a string" do
334
+
335
+ let(:date) do
336
+ DateTime.parse("1st Jan 2010 12:00:00+01:00")
337
+ end
338
+
339
+ let(:evolved) do
340
+ described_class.evolve(date.to_s)
341
+ end
342
+
343
+ it "returns the string as a time" do
344
+ expect(evolved).to eq(date.to_time)
345
+ end
346
+
347
+ it "returns the time in utc" do
348
+ expect(evolved.utc_offset).to eq(0)
349
+ end
350
+ end
351
+
352
+ context "when provided a float" do
353
+
354
+ let(:float) do
355
+ 1331890719.8170738
356
+ end
357
+
358
+ let(:evolved) do
359
+ described_class.evolve(float)
360
+ end
361
+
362
+ let(:expected) do
363
+ Time.at(float)
364
+ end
365
+
366
+ it "returns the float as a time" do
367
+ expect(evolved).to eq(expected)
368
+ end
369
+
370
+ it "returns the time in utc" do
371
+ expect(evolved.utc_offset).to eq(0)
372
+ end
373
+ end
374
+
375
+ context "when provided an integer" do
376
+
377
+ let(:integer) do
378
+ 1331890719
379
+ end
380
+
381
+ let(:evolved) do
382
+ described_class.evolve(integer)
383
+ end
384
+
385
+ let(:expected) do
386
+ Time.at(integer)
387
+ end
388
+
389
+ it "returns the integer as a time" do
390
+ expect(evolved).to eq(expected)
391
+ end
392
+
393
+ it "returns the time in utc" do
394
+ expect(evolved.utc_offset).to eq(0)
395
+ end
396
+ end
397
+
398
+ context "when provided nil" do
399
+
400
+ it "returns nil" do
401
+ expect(described_class.evolve(nil)).to be_nil
402
+ end
403
+ end
404
+ end
405
+ end
@@ -0,0 +1,58 @@
1
+ require "spec_helper"
2
+
3
+ describe Fixnum do
4
+
5
+ describe ".evolve" do
6
+
7
+ context "when provided a string" do
8
+
9
+ context "when the string is a number" do
10
+
11
+ context "when the string is an fixnum" do
12
+
13
+ it "returns an fixnum" do
14
+ expect(described_class.evolve("1")).to eq(1)
15
+ end
16
+ end
17
+
18
+ context "when the string is a float" do
19
+
20
+ it "converts it to a float" do
21
+ expect(described_class.evolve("2.23")).to eq(2.23)
22
+ end
23
+ end
24
+ end
25
+
26
+ context "when the string is not a number" do
27
+
28
+ it "returns the string" do
29
+ expect(described_class.evolve("testing")).to eq("testing")
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ context "when provided a number" do
36
+
37
+ context "when the number is an fixnum" do
38
+
39
+ it "returns an fixnum" do
40
+ expect(described_class.evolve(1)).to eq(1)
41
+ end
42
+ end
43
+
44
+ context "when the number is a float" do
45
+
46
+ it "returns the float" do
47
+ expect(described_class.evolve(2.23)).to eq(2.23)
48
+ end
49
+ end
50
+ end
51
+
52
+ context "when provided nil" do
53
+
54
+ it "returns nil" do
55
+ expect(described_class.evolve(nil)).to be_nil
56
+ end
57
+ end
58
+ end