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,77 @@
1
+ require "spec_helper"
2
+
3
+ describe NilClass do
4
+
5
+ describe "#__add__" do
6
+
7
+ it "returns the object" do
8
+ expect(nil.__add__(1)).to eq(1)
9
+ end
10
+ end
11
+
12
+ describe "#__evolve_date__" do
13
+
14
+ it "returns nil" do
15
+ expect(nil.__evolve_date__).to be_nil
16
+ end
17
+ end
18
+
19
+ describe "#__evolve_time__" do
20
+
21
+ it "returns nil" do
22
+ expect(nil.__evolve_time__).to be_nil
23
+ end
24
+ end
25
+
26
+ describe "#__intersect__" do
27
+
28
+ context "when provided a non enumerable" do
29
+
30
+ it "returns the object" do
31
+ expect(nil.__intersect__(1)).to eq(1)
32
+ end
33
+ end
34
+
35
+ context "when provided an array" do
36
+
37
+ it "returns the array" do
38
+ expect(nil.__intersect__([ 1, 2 ])).to eq([ 1, 2 ])
39
+ end
40
+ end
41
+
42
+ context "when provided a hash" do
43
+
44
+ it "returns the hash" do
45
+ expect(nil.__intersect__({ "$in" => [ 1, 2 ] })).to eq(
46
+ { "$in" => [ 1, 2 ] }
47
+ )
48
+ end
49
+ end
50
+ end
51
+
52
+ describe "#__union__" do
53
+
54
+ context "when provided a non enumerable" do
55
+
56
+ it "returns the object" do
57
+ expect(nil.__union__(1)).to eq(1)
58
+ end
59
+ end
60
+
61
+ context "when provided an array" do
62
+
63
+ it "returns the array" do
64
+ expect(nil.__union__([ 1, 2 ])).to eq([ 1, 2 ])
65
+ end
66
+ end
67
+
68
+ context "when provided a hash" do
69
+
70
+ it "returns the hash" do
71
+ expect(nil.__union__({ "$in" => [ 1, 2 ] })).to eq(
72
+ { "$in" => [ 1, 2 ] }
73
+ )
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,108 @@
1
+ require "spec_helper"
2
+
3
+ describe Object do
4
+
5
+ describe "#__add__" do
6
+
7
+ context "when the other object is a non-enumerable" do
8
+
9
+ context "when the values are unique" do
10
+
11
+ it "returns an array of both" do
12
+ expect(5.__add__(6)).to eq([ 5, 6 ])
13
+ end
14
+ end
15
+
16
+ context "when the values are not unique" do
17
+
18
+ it "returns the original value" do
19
+ expect(5.__add__(5)).to eq(5)
20
+ end
21
+ end
22
+ end
23
+
24
+ context "when the other object is an array" do
25
+
26
+ context "when the values are unique" do
27
+
28
+ it "returns an array of both" do
29
+ expect(5.__add__([ 6, 7 ])).to eq([ 5, 6, 7 ])
30
+ end
31
+ end
32
+
33
+ context "when the values are not unique" do
34
+
35
+ it "returns a unique array of both" do
36
+ expect(5.__add__([ 5, 6, 7 ])).to eq([ 5, 6, 7 ])
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "#__intersect__" do
43
+
44
+ context "when the other object is a non-enumerable" do
45
+
46
+ context "when the values intersect" do
47
+
48
+ it "returns an intersected array" do
49
+ expect(5.__intersect__(5)).to eq([ 5 ])
50
+ end
51
+ end
52
+
53
+ context "when the values do not intersect" do
54
+
55
+ it "returns an empty array" do
56
+ expect(5.__intersect__(6)).to be_empty
57
+ end
58
+ end
59
+ end
60
+
61
+ context "when the other object is an array" do
62
+
63
+ context "when the values intersect" do
64
+
65
+ it "returns an intersected array" do
66
+ expect(5.__intersect__([ 5, 6 ])).to eq([ 5 ])
67
+ end
68
+ end
69
+
70
+ context "when the values do not intersect" do
71
+
72
+ it "returns an empty array " do
73
+ expect(5.__intersect__([ 6, 7 ])).to be_empty
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ describe "#__union__" do
80
+
81
+ context "when the other object is a non-enumerable" do
82
+
83
+ context "when the values are the same" do
84
+
85
+ it "returns an unioned array" do
86
+ expect(5.__union__(5)).to eq([ 5 ])
87
+ end
88
+ end
89
+
90
+ context "when the values are not the same" do
91
+
92
+ it "returns an empty array" do
93
+ expect(5.__union__(6)).to eq([ 5, 6 ])
94
+ end
95
+ end
96
+ end
97
+
98
+ context "when the other object is an array" do
99
+
100
+ context "when the values are not the same" do
101
+
102
+ it "returns an unioned array" do
103
+ expect(5.__union__([ 5, 6 ])).to eq([ 5, 6 ])
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,309 @@
1
+ require "spec_helper"
2
+
3
+ describe Range do
4
+
5
+ describe "#__array__" do
6
+
7
+ it "returns the range as an array" do
8
+ expect((1..3).__array__).to eq([ 1, 2, 3 ])
9
+ end
10
+ end
11
+
12
+ describe "#__evolve_date__" do
13
+
14
+ context "when the range are dates" do
15
+
16
+ let(:min) do
17
+ Date.new(2010, 1, 1)
18
+ end
19
+
20
+ let(:max) do
21
+ Date.new(2010, 1, 3)
22
+ end
23
+
24
+ let(:evolved) do
25
+ (min..max).__evolve_date__
26
+ end
27
+
28
+ let(:expected_min) do
29
+ Time.utc(2010, 1, 1, 0, 0, 0, 0)
30
+ end
31
+
32
+ let(:expected_max) do
33
+ Time.utc(2010, 1, 3, 0, 0, 0, 0)
34
+ end
35
+
36
+ it "returns a selection of times" do
37
+ expect(evolved).to eq(
38
+ { "$gte" => expected_min, "$lte" => expected_max }
39
+ )
40
+ end
41
+ end
42
+
43
+ context "when the range are strings" do
44
+
45
+ let(:min) do
46
+ Date.new(2010, 1, 1)
47
+ end
48
+
49
+ let(:max) do
50
+ Date.new(2010, 1, 3)
51
+ end
52
+
53
+ let(:evolved) do
54
+ (min.to_s..max.to_s).__evolve_date__
55
+ end
56
+
57
+ let(:expected_min) do
58
+ Time.utc(2010, 1, 1, 0, 0, 0, 0)
59
+ end
60
+
61
+ let(:expected_max) do
62
+ Time.utc(2010, 1, 3, 0, 0, 0, 0)
63
+ end
64
+
65
+ it "returns a selection of times" do
66
+ expect(evolved).to eq(
67
+ { "$gte" => expected_min, "$lte" => expected_max }
68
+ )
69
+ end
70
+ end
71
+
72
+ context "when the range is floats" do
73
+
74
+ let(:min_time) do
75
+ Time.utc(2010, 1, 1, 0, 0, 0, 0)
76
+ end
77
+
78
+ let(:max_time) do
79
+ Time.utc(2010, 1, 3, 0, 0, 0, 0)
80
+ end
81
+
82
+ let(:min) do
83
+ min_time.to_f
84
+ end
85
+
86
+ let(:max) do
87
+ max_time.to_f
88
+ end
89
+
90
+ let(:evolved) do
91
+ (min..max).__evolve_date__
92
+ end
93
+
94
+ it "returns a selection of times" do
95
+ expect(evolved).to eq(
96
+ { "$gte" => min_time, "$lte" => max_time }
97
+ )
98
+ end
99
+ end
100
+
101
+ context "when the range is integers" do
102
+
103
+ let(:min_time) do
104
+ Time.utc(2010, 1, 1, 0, 0, 0, 0)
105
+ end
106
+
107
+ let(:max_time) do
108
+ Time.utc(2010, 1, 3, 0, 0, 0, 0)
109
+ end
110
+
111
+ let(:min) do
112
+ min_time.to_i
113
+ end
114
+
115
+ let(:max) do
116
+ max_time.to_i
117
+ end
118
+
119
+ let(:evolved) do
120
+ (min..max).__evolve_date__
121
+ end
122
+
123
+ it "returns a selection of times" do
124
+ expect(evolved).to eq(
125
+ { "$gte" => min_time, "$lte" => max_time }
126
+ )
127
+ end
128
+ end
129
+ end
130
+
131
+ describe "#__evolve_time__" do
132
+
133
+ context "when the range are dates" do
134
+
135
+ let(:min) do
136
+ Time.new(2010, 1, 1, 12, 0, 0)
137
+ end
138
+
139
+ let(:max) do
140
+ Time.new(2010, 1, 3, 12, 0, 0)
141
+ end
142
+
143
+ let(:evolved) do
144
+ (min..max).__evolve_time__
145
+ end
146
+
147
+ let(:expected_min) do
148
+ Time.new(2010, 1, 1, 12, 0, 0).utc
149
+ end
150
+
151
+ let(:expected_max) do
152
+ Time.new(2010, 1, 3, 12, 0, 0).utc
153
+ end
154
+
155
+ it "returns a selection of times" do
156
+ expect(evolved).to eq(
157
+ { "$gte" => expected_min, "$lte" => expected_max }
158
+ )
159
+ end
160
+
161
+ it "returns the times in utc" do
162
+ expect(evolved["$gte"].utc_offset).to eq(0)
163
+ end
164
+ end
165
+
166
+ context "when the range are strings" do
167
+
168
+ let(:min) do
169
+ Time.new(2010, 1, 1, 12, 0, 0)
170
+ end
171
+
172
+ let(:max) do
173
+ Time.new(2010, 1, 3, 12, 0, 0)
174
+ end
175
+
176
+ let(:evolved) do
177
+ (min.to_s..max.to_s).__evolve_time__
178
+ end
179
+
180
+ it "returns a selection of times" do
181
+ expect(evolved).to eq(
182
+ { "$gte" => min.to_time, "$lte" => max.to_time }
183
+ )
184
+ end
185
+
186
+ it "returns the times in utc" do
187
+ expect(evolved["$gte"].utc_offset).to eq(0)
188
+ end
189
+ end
190
+
191
+ context "when the range is floats" do
192
+
193
+ let(:min) do
194
+ 1331890719.1234
195
+ end
196
+
197
+ let(:max) do
198
+ 1332890719.7651
199
+ end
200
+
201
+ let(:evolved) do
202
+ (min..max).__evolve_time__
203
+ end
204
+
205
+ let(:expected_min) do
206
+ Time.at(min).utc
207
+ end
208
+
209
+ let(:expected_max) do
210
+ Time.at(max).utc
211
+ end
212
+
213
+ it "returns a selection of times" do
214
+ expect(evolved).to eq(
215
+ { "$gte" => expected_min, "$lte" => expected_max }
216
+ )
217
+ end
218
+
219
+ it "returns the times in utc" do
220
+ expect(evolved["$gte"].utc_offset).to eq(0)
221
+ end
222
+ end
223
+
224
+ context "when the range is integers" do
225
+
226
+ let(:min) do
227
+ 1331890719
228
+ end
229
+
230
+ let(:max) do
231
+ 1332890719
232
+ end
233
+
234
+ let(:evolved) do
235
+ (min..max).__evolve_time__
236
+ end
237
+
238
+ let(:expected_min) do
239
+ Time.at(min).utc
240
+ end
241
+
242
+ let(:expected_max) do
243
+ Time.at(max).utc
244
+ end
245
+
246
+ it "returns a selection of times" do
247
+ expect(evolved).to eq(
248
+ { "$gte" => expected_min, "$lte" => expected_max }
249
+ )
250
+ end
251
+
252
+ it "returns the times in utc" do
253
+ expect(evolved["$gte"].utc_offset).to eq(0)
254
+ end
255
+ end
256
+ end
257
+
258
+ describe ".evolve" do
259
+
260
+ context "when provided a range" do
261
+
262
+ context "when the range is inclusive" do
263
+
264
+ let(:range) do
265
+ 1..3
266
+ end
267
+
268
+ it "returns the inclusize range criterion" do
269
+ expect(described_class.evolve(range)).to eq(
270
+ { "$gte" => 1, "$lte" => 3 }
271
+ )
272
+ end
273
+ end
274
+
275
+ context "when the range is not inclusve" do
276
+
277
+ let(:range) do
278
+ 1...3
279
+ end
280
+
281
+ it "returns the non inclusive range criterion" do
282
+ expect(described_class.evolve(range)).to eq(
283
+ { "$gte" => 1, "$lte" => 2 }
284
+ )
285
+ end
286
+ end
287
+
288
+ context "when the range is characters" do
289
+
290
+ let(:range) do
291
+ "a".."z"
292
+ end
293
+
294
+ it "returns the character range" do
295
+ expect(described_class.evolve(range)).to eq(
296
+ { "$gte" => "a", "$lte" => "z" }
297
+ )
298
+ end
299
+ end
300
+ end
301
+
302
+ context "when provided a string" do
303
+
304
+ it "returns the string" do
305
+ expect(described_class.evolve("testing")).to eq("testing")
306
+ end
307
+ end
308
+ end
309
+ end