mongoid 7.6.1 → 8.0.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.
Files changed (314) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -0
  3. data/README.md +3 -3
  4. data/Rakefile +21 -85
  5. data/lib/config/locales/en.yml +46 -30
  6. data/lib/mongoid/association/accessors.rb +32 -3
  7. data/lib/mongoid/association/bindable.rb +48 -0
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/eager_loadable.rb +29 -7
  10. data/lib/mongoid/association/embedded/batchable.rb +28 -5
  11. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  12. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  13. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  14. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  15. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  16. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  17. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  18. data/lib/mongoid/association/macros.rb +2 -1
  19. data/lib/mongoid/association/many.rb +5 -0
  20. data/lib/mongoid/association/nested/many.rb +2 -1
  21. data/lib/mongoid/association/proxy.rb +12 -0
  22. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  23. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  24. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  25. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  26. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  27. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  28. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  29. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  30. data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
  31. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  32. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  33. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  34. data/lib/mongoid/association/relatable.rb +38 -4
  35. data/lib/mongoid/attributes/processing.rb +9 -2
  36. data/lib/mongoid/attributes.rb +30 -27
  37. data/lib/mongoid/cacheable.rb +2 -2
  38. data/lib/mongoid/changeable.rb +37 -2
  39. data/lib/mongoid/clients/factory.rb +0 -4
  40. data/lib/mongoid/clients/options.rb +4 -0
  41. data/lib/mongoid/clients/sessions.rb +2 -14
  42. data/lib/mongoid/config.rb +15 -11
  43. data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
  44. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  45. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  46. data/lib/mongoid/contextual/memory.rb +55 -28
  47. data/lib/mongoid/contextual/mongo.rb +173 -287
  48. data/lib/mongoid/contextual/none.rb +33 -15
  49. data/lib/mongoid/copyable.rb +32 -8
  50. data/lib/mongoid/criteria/includable.rb +24 -20
  51. data/lib/mongoid/criteria/marshalable.rb +10 -2
  52. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  53. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  54. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  55. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  56. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  57. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  58. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  59. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  60. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  61. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  62. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  63. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  64. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  65. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  66. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  67. data/lib/mongoid/criteria/queryable/selectable.rb +2 -24
  68. data/lib/mongoid/criteria/queryable/selector.rb +90 -5
  69. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  70. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  71. data/lib/mongoid/criteria/queryable.rb +11 -6
  72. data/lib/mongoid/criteria.rb +1 -28
  73. data/lib/mongoid/deprecable.rb +36 -0
  74. data/lib/mongoid/deprecation.rb +25 -0
  75. data/lib/mongoid/document.rb +88 -33
  76. data/lib/mongoid/equality.rb +4 -4
  77. data/lib/mongoid/errors/document_not_found.rb +6 -2
  78. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  79. data/lib/mongoid/errors/invalid_field.rb +5 -1
  80. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  81. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  82. data/lib/mongoid/errors.rb +2 -2
  83. data/lib/mongoid/extensions/array.rb +8 -6
  84. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  85. data/lib/mongoid/extensions/binary.rb +42 -0
  86. data/lib/mongoid/extensions/boolean.rb +8 -2
  87. data/lib/mongoid/extensions/date.rb +26 -20
  88. data/lib/mongoid/extensions/date_time.rb +1 -1
  89. data/lib/mongoid/extensions/float.rb +4 -5
  90. data/lib/mongoid/extensions/hash.rb +13 -32
  91. data/lib/mongoid/extensions/integer.rb +4 -5
  92. data/lib/mongoid/extensions/object.rb +2 -0
  93. data/lib/mongoid/extensions/range.rb +41 -10
  94. data/lib/mongoid/extensions/regexp.rb +11 -4
  95. data/lib/mongoid/extensions/set.rb +11 -4
  96. data/lib/mongoid/extensions/string.rb +2 -13
  97. data/lib/mongoid/extensions/symbol.rb +3 -14
  98. data/lib/mongoid/extensions/time.rb +27 -16
  99. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  100. data/lib/mongoid/extensions.rb +1 -0
  101. data/lib/mongoid/factory.rb +42 -7
  102. data/lib/mongoid/fields/foreign_key.rb +7 -0
  103. data/lib/mongoid/fields/validators/macro.rb +3 -9
  104. data/lib/mongoid/fields.rb +49 -7
  105. data/lib/mongoid/findable.rb +21 -16
  106. data/lib/mongoid/indexable/specification.rb +1 -1
  107. data/lib/mongoid/indexable/validators/options.rb +4 -1
  108. data/lib/mongoid/interceptable.rb +69 -9
  109. data/lib/mongoid/persistable/creatable.rb +14 -5
  110. data/lib/mongoid/persistable/updatable.rb +12 -5
  111. data/lib/mongoid/persistence_context.rb +8 -42
  112. data/lib/mongoid/query_cache.rb +6 -258
  113. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  114. data/lib/mongoid/reloadable.rb +7 -3
  115. data/lib/mongoid/scopable.rb +9 -11
  116. data/lib/mongoid/selectable.rb +1 -2
  117. data/lib/mongoid/shardable.rb +11 -35
  118. data/lib/mongoid/stateful.rb +27 -1
  119. data/lib/mongoid/timestamps/created.rb +1 -1
  120. data/lib/mongoid/timestamps/updated.rb +1 -1
  121. data/lib/mongoid/touchable.rb +2 -3
  122. data/lib/mongoid/traversable.rb +1 -0
  123. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  124. data/lib/mongoid/version.rb +1 -5
  125. data/lib/mongoid/warnings.rb +3 -4
  126. data/lib/mongoid.rb +1 -0
  127. data/spec/config/mongoid.yml +16 -0
  128. data/spec/integration/app_spec.rb +8 -12
  129. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  130. data/spec/integration/associations/embedded_spec.rb +15 -0
  131. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  132. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  133. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  134. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  135. data/spec/integration/associations/has_one_spec.rb +97 -1
  136. data/spec/integration/associations/scope_option_spec.rb +1 -1
  137. data/spec/integration/callbacks_models.rb +95 -1
  138. data/spec/integration/callbacks_spec.rb +226 -4
  139. data/spec/integration/criteria/range_spec.rb +95 -1
  140. data/spec/integration/discriminator_key_spec.rb +115 -76
  141. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  142. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  143. data/spec/integration/matcher_examples_spec.rb +20 -13
  144. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  145. data/spec/integration/matcher_operator_spec.rb +3 -5
  146. data/spec/integration/persistence/range_field_spec.rb +350 -0
  147. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  148. data/spec/mongoid/association/depending_spec.rb +9 -9
  149. data/spec/mongoid/association/eager_spec.rb +2 -1
  150. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  151. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  152. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  153. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  154. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
  155. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  156. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  157. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  158. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  159. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  160. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  161. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  162. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  163. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  164. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  165. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  166. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -5
  167. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  168. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  169. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  170. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  171. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +62 -13
  172. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  173. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  174. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  175. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  176. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  177. data/spec/mongoid/association/syncable_spec.rb +14 -0
  178. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  179. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  180. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  181. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  182. data/spec/mongoid/attributes_spec.rb +480 -27
  183. data/spec/mongoid/cacheable_spec.rb +3 -3
  184. data/spec/mongoid/changeable_spec.rb +130 -13
  185. data/spec/mongoid/clients/factory_spec.rb +22 -60
  186. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  187. data/spec/mongoid/clients_spec.rb +2 -2
  188. data/spec/mongoid/config_spec.rb +52 -15
  189. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  190. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  191. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  192. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  193. data/spec/mongoid/contextual/memory_spec.rb +521 -14
  194. data/spec/mongoid/contextual/mongo_spec.rb +566 -426
  195. data/spec/mongoid/contextual/none_spec.rb +11 -19
  196. data/spec/mongoid/copyable_spec.rb +451 -2
  197. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  198. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  199. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  200. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  201. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  202. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  203. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +1 -2
  204. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  205. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  206. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +1 -2
  207. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  208. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  209. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  210. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  211. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  212. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  213. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  214. data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
  215. data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
  216. data/spec/mongoid/criteria_spec.rb +469 -1201
  217. data/spec/mongoid/document_fields_spec.rb +173 -24
  218. data/spec/mongoid/document_spec.rb +32 -41
  219. data/spec/mongoid/equality_spec.rb +12 -12
  220. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  221. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  222. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  223. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  224. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  225. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  226. data/spec/mongoid/extensions/array_spec.rb +16 -2
  227. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  228. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  229. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  230. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  231. data/spec/mongoid/extensions/date_spec.rb +71 -1
  232. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  233. data/spec/mongoid/extensions/float_spec.rb +48 -76
  234. data/spec/mongoid/extensions/hash_spec.rb +30 -236
  235. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  236. data/spec/mongoid/extensions/range_spec.rb +255 -54
  237. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  238. data/spec/mongoid/extensions/set_spec.rb +106 -0
  239. data/spec/mongoid/extensions/string_spec.rb +53 -25
  240. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  241. data/spec/mongoid/extensions/time_spec.rb +634 -66
  242. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  243. data/spec/mongoid/factory_spec.rb +61 -1
  244. data/spec/mongoid/fields_spec.rb +321 -50
  245. data/spec/mongoid/findable_spec.rb +64 -29
  246. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  247. data/spec/mongoid/indexable_spec.rb +16 -19
  248. data/spec/mongoid/interceptable_spec.rb +584 -5
  249. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  250. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  251. data/spec/mongoid/mongoizable_spec.rb +285 -0
  252. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  253. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  254. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  255. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  256. data/spec/mongoid/persistence_context_spec.rb +24 -0
  257. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  258. data/spec/mongoid/query_cache_spec.rb +1 -156
  259. data/spec/mongoid/reloadable_spec.rb +35 -2
  260. data/spec/mongoid/scopable_spec.rb +36 -34
  261. data/spec/mongoid/serializable_spec.rb +14 -7
  262. data/spec/mongoid/shardable_models.rb +0 -14
  263. data/spec/mongoid/shardable_spec.rb +61 -153
  264. data/spec/mongoid/stateful_spec.rb +28 -0
  265. data/spec/mongoid/timestamps_spec.rb +390 -0
  266. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  267. data/spec/mongoid/touchable_spec.rb +116 -0
  268. data/spec/mongoid/touchable_spec_models.rb +12 -8
  269. data/spec/mongoid/traversable_spec.rb +4 -11
  270. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  271. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  272. data/spec/mongoid/warnings_spec.rb +35 -0
  273. data/spec/mongoid_spec.rb +1 -7
  274. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  275. data/spec/rails/mongoid_spec.rb +4 -16
  276. data/spec/shared/lib/mrss/docker_runner.rb +1 -8
  277. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  278. data/spec/shared/lib/mrss/lite_constraints.rb +2 -10
  279. data/spec/shared/lib/mrss/server_version_registry.rb +24 -17
  280. data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
  281. data/spec/shared/lib/mrss/utils.rb +6 -28
  282. data/spec/shared/share/Dockerfile.erb +107 -33
  283. data/spec/shared/shlib/distro.sh +0 -10
  284. data/spec/shared/shlib/server.sh +33 -64
  285. data/spec/shared/shlib/set_env.sh +71 -12
  286. data/spec/support/constraints.rb +24 -0
  287. data/spec/support/expectations.rb +17 -20
  288. data/spec/support/macros.rb +30 -0
  289. data/spec/support/models/augmentation.rb +12 -0
  290. data/spec/support/models/band.rb +3 -0
  291. data/spec/support/models/catalog.rb +24 -0
  292. data/spec/support/models/circus.rb +3 -0
  293. data/spec/support/models/fanatic.rb +8 -0
  294. data/spec/support/models/implant.rb +9 -0
  295. data/spec/support/models/label.rb +2 -0
  296. data/spec/support/models/passport.rb +9 -0
  297. data/spec/support/models/person.rb +1 -0
  298. data/spec/support/models/player.rb +2 -0
  299. data/spec/support/models/powerup.rb +12 -0
  300. data/spec/support/models/registry.rb +1 -0
  301. data/spec/support/models/school.rb +14 -0
  302. data/spec/support/models/shield.rb +18 -0
  303. data/spec/support/models/student.rb +14 -0
  304. data/spec/support/models/weapon.rb +12 -0
  305. data.tar.gz.sig +0 -0
  306. metadata +695 -641
  307. metadata.gz.sig +0 -0
  308. data/lib/mongoid/errors/eager_load.rb +0 -23
  309. data/lib/mongoid/errors/invalid_value.rb +0 -17
  310. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  311. data/spec/shared/CANDIDATE.md +0 -28
  312. data/spec/shared/lib/mrss/release/candidate.rb +0 -281
  313. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  314. data/spec/shared/lib/tasks/candidate.rake +0 -64
@@ -16,142 +16,343 @@ describe Mongoid::Extensions::Range do
16
16
  end
17
17
 
18
18
  describe ".demongoize" do
19
+ subject { Range.demongoize(hash) }
19
20
 
20
21
  context "when the range is ascending" do
21
-
22
- let(:hash) do
23
- { "min" => 1, "max" => 3 }
24
- end
22
+ let(:hash) { { "min" => 1, "max" => 3 } }
25
23
 
26
24
  it "returns an ascending range" do
27
- expect(Range.demongoize(hash)).to eq(1..3)
25
+ is_expected.to eq(1..3)
28
26
  end
29
27
  end
30
28
 
31
29
  context "when the range is ascending with exclude end" do
32
-
33
- let(:hash) do
34
- { "min" => 1, "max" => 3, "exclude_end" => true }
35
- end
30
+ let(:hash) { { "min" => 1, "max" => 3, "exclude_end" => true } }
36
31
 
37
32
  it "returns an ascending range" do
38
- expect(Range.demongoize(hash)).to eq(1...3)
33
+ is_expected.to eq(1...3)
39
34
  end
40
35
  end
41
36
 
42
37
  context "when the range is descending" do
43
-
44
- let(:hash) do
45
- { "min" => 5, "max" => 1 }
46
- end
38
+ let(:hash) { { "min" => 5, "max" => 1 } }
47
39
 
48
40
  it "returns an descending range" do
49
- expect(Range.demongoize(hash)).to eq(5..1)
41
+ is_expected.to eq(5..1)
50
42
  end
51
43
  end
52
44
 
53
45
  context "when the range is descending with exclude end" do
54
-
55
- let(:hash) do
56
- { "min" => 5, "max" => 1, "exclude_end" => true }
57
- end
46
+ let(:hash) { { "min" => 5, "max" => 1, "exclude_end" => true } }
58
47
 
59
48
  it "returns an descending range" do
60
- expect(Range.demongoize(hash)).to eq(5...1)
49
+ is_expected.to eq(5...1)
61
50
  end
62
51
  end
63
52
 
64
53
  context "when the range is letters" do
54
+ let(:hash) { { "min" => "a", "max" => "z" } }
65
55
 
66
- let(:hash) do
67
- { "min" => "a", "max" => "z" }
56
+ it "returns an alphabetic range" do
57
+ is_expected.to eq("a".."z")
68
58
  end
59
+ end
60
+
61
+ context "when the range is letters with exclude end" do
62
+ let(:hash) { { "min" => "a", "max" => "z", "exclude_end" => true } }
69
63
 
70
64
  it "returns an alphabetic range" do
71
- expect(Range.demongoize(hash)).to eq("a".."z")
65
+ is_expected.to eq("a"..."z")
72
66
  end
73
67
  end
74
68
 
75
- context "when the range is letters with exclude end" do
69
+ context "when the range is endless" do
70
+ let(:hash) { { "min" => 1, "max" => nil } }
71
+
72
+ context 'kernel can support endless range' do
73
+ ruby_version_gte '2.6'
76
74
 
77
- let(:hash) do
78
- { "min" => "a", "max" => "z", "exclude_end" => true }
75
+ it "returns an alphabetic range" do
76
+ is_expected.to eq(eval('1..'))
77
+ end
79
78
  end
80
79
 
81
- it "returns an alphabetic range" do
82
- expect(Range.demongoize(hash)).to eq("a"..."z")
80
+ context 'kernel cannot support endless range' do
81
+ ruby_version_lt '2.6'
82
+
83
+ it "returns nil" do
84
+ is_expected.to be nil
85
+ end
86
+ end
87
+ end
88
+
89
+ context "when the range is endless with exclude end" do
90
+ let(:hash) { { "min" => 1, "max" => nil, "exclude_end" => true } }
91
+
92
+ context 'kernel can support endless range' do
93
+ ruby_version_gte '2.6'
94
+
95
+ it "returns an alphabetic range" do
96
+ is_expected.to eq(eval('1...'))
97
+ end
98
+ end
99
+
100
+ context 'kernel cannot support endless range' do
101
+ ruby_version_lt '2.6'
102
+
103
+ it "returns nil" do
104
+ is_expected.to be nil
105
+ end
106
+ end
107
+ end
108
+
109
+ context "when the range is beginning-less" do
110
+ let(:hash) { { "min" => nil, "max" => 3 } }
111
+
112
+ context 'kernel can support beginning-less range' do
113
+ ruby_version_gte '2.7'
114
+
115
+ it "returns an alphabetic range" do
116
+ is_expected.to eq(nil..3)
117
+ end
118
+ end
119
+
120
+ context 'kernel cannot support beginning-less range' do
121
+ ruby_version_lt '2.7'
122
+
123
+ it "returns nil" do
124
+ is_expected.to be nil
125
+ end
126
+ end
127
+ end
128
+
129
+ context "when the range is beginning-less with exclude end" do
130
+ let(:hash) { { "min" => nil, "max" => 3, "exclude_end" => true } }
131
+
132
+ context 'kernel can support endless range' do
133
+ ruby_version_gte '2.7'
134
+
135
+ it "returns an alphabetic beginning-less" do
136
+ is_expected.to eq(eval('...3'))
137
+ end
138
+ end
139
+
140
+ context 'kernel cannot support beginning-less range' do
141
+ ruby_version_lt '2.7'
142
+
143
+ it "returns nil" do
144
+ is_expected.to be nil
145
+ end
146
+ end
147
+ end
148
+
149
+ context "when the range doesn't have any correct keys" do
150
+ let(:hash) { { "min^" => "a", "max^" => "z", "exclude_end^" => true } }
151
+
152
+ it "returns nil" do
153
+ is_expected.to be nil
154
+ end
155
+ end
156
+
157
+ context "when the range has symbol keys" do
158
+ let(:hash) { { min: 1, max: 3 } }
159
+
160
+ it "returns an ascending range" do
161
+ is_expected.to eq(1..3)
83
162
  end
84
163
  end
85
164
  end
86
165
 
87
- describe ".mongoize" do
166
+ shared_examples_for 'mongoize range' do
167
+
168
+ context 'given a normal range' do
169
+ let(:range) { 1..3 }
170
+
171
+ it "returns the object hash" do
172
+ is_expected.to eq("min" => 1, "max" => 3)
173
+ end
174
+ end
175
+
176
+ context 'given a normal range not inclusive' do
177
+ let(:range) { 1...3 }
178
+
179
+ it "returns the object hash" do
180
+ is_expected.to eq("min" => 1, "max" => 3, "exclude_end" => true)
181
+ end
182
+ end
183
+
184
+ context 'given a descending range' do
185
+ let(:range) { 5..1 }
88
186
 
89
- context "when the value is not nil" do
187
+ it "returns the object hash" do
188
+ is_expected.to eq("min" => 5, "max" => 1)
189
+ end
190
+ end
191
+
192
+ context 'given a descending range not inclusive' do
193
+ let(:range) { 5...1 }
90
194
 
91
195
  it "returns the object hash" do
92
- expect(Range.mongoize(1..3)).to eq({ "min" => 1, "max" => 3 })
196
+ is_expected.to eq("min" => 5, "max" => 1, "exclude_end" => true)
93
197
  end
198
+ end
199
+
200
+ context 'given an endless range' do
201
+ ruby_version_gte '2.6'
94
202
 
95
- it "returns the object hash when passed an inverse range" do
96
- expect(Range.mongoize(5..1)).to eq({ "min" => 5, "max" => 1 })
203
+ let(:range) { eval('5..') }
204
+
205
+ it "returns the object hash" do
206
+ is_expected.to eq("min" => 5)
97
207
  end
208
+ end
209
+
210
+ context 'given an endless range not inclusive' do
211
+ ruby_version_gte '2.6'
98
212
 
99
- it "returns the object hash when passed a letter range" do
100
- expect(Range.mongoize("a".."z")).to eq({ "min" => "a", "max" => "z" })
213
+ let(:range) { eval('5...') }
214
+
215
+ it "returns the object hash" do
216
+ is_expected.to eq("min" => 5, "exclude_end" => true)
101
217
  end
102
218
  end
103
219
 
104
- context "when the value is not nil with exclude end" do
220
+ context 'given a beginning-less range' do
221
+ ruby_version_gte '2.7'
222
+
223
+ let(:range) { eval('..5') }
105
224
 
106
225
  it "returns the object hash" do
107
- expect(Range.mongoize(1...3)).to eq({ "min" => 1, "max" => 3, "exclude_end" => true })
226
+ is_expected.to eq("max" => 5)
108
227
  end
228
+ end
229
+
230
+ context 'given an endless range not inclusive' do
231
+ ruby_version_gte '2.7'
232
+
233
+ let(:range) { eval('...5') }
234
+
235
+ it "returns the object hash" do
236
+ is_expected.to eq("max" => 5, "exclude_end" => true)
237
+ end
238
+ end
239
+
240
+ context 'given a letter range' do
241
+ let(:range) { 'a'..'z' }
242
+
243
+ it "returns the object hash" do
244
+ is_expected.to eq("min" => "a", "max" => "z")
245
+ end
246
+ end
247
+
248
+ context 'given a letter range not inclusive' do
249
+ let(:range) { 'a'...'z' }
250
+
251
+ it "returns the object hash" do
252
+ is_expected.to eq("min" => "a", "max" => "z", "exclude_end" => true)
253
+ end
254
+ end
255
+
256
+ context 'given a Time range' do
257
+ let(:range) { Time.at(0)..Time.at(1) }
109
258
 
110
- it "returns the object hash when passed an inverse range" do
111
- expect(Range.mongoize(5...1)).to eq({ "min" => 5, "max" => 1, "exclude_end" => true })
259
+ it "returns the object hash" do
260
+ is_expected.to eq("min" => Time.at(0), "max" => Time.at(1))
261
+ expect(subject["min"].utc?).to be(true)
262
+ expect(subject["max"].utc?).to be(true)
112
263
  end
264
+ end
113
265
 
114
- it "returns the object hash when passed a letter range" do
115
- expect(Range.mongoize("a"..."z")).to eq({ "min" => "a", "max" => "z", "exclude_end" => true })
266
+ context 'given an ActiveSupport::TimeWithZone range' do
267
+ let(:range) { Time.at(0)..Time.at(1) }
268
+
269
+ it "returns the object hash" do
270
+ is_expected.to eq("min" => Time.at(0).in_time_zone, "max" => Time.at(1).in_time_zone)
271
+ expect(subject["min"].utc?).to be(true)
272
+ expect(subject["max"].utc?).to be(true)
116
273
  end
274
+ end
275
+
276
+ context 'given a Date range' do
277
+ let(:range) { Date.new(2020, 1, 1)..Date.new(2020, 1, 2) }
117
278
 
279
+ it "returns the object hash" do
280
+ is_expected.to eq("min" => Time.utc(2020, 1, 1), "max" => Time.utc(2020, 1, 2))
281
+ expect(subject["min"].utc?).to be(true)
282
+ expect(subject["max"].utc?).to be(true)
283
+ end
118
284
  end
119
285
 
120
- context "when the value is nil" do
286
+ context "given nil" do
287
+ let(:range) { nil }
121
288
 
122
289
  it "returns nil" do
123
- expect(Range.mongoize(nil)).to be_nil
290
+ is_expected.to be_nil
291
+ end
292
+ end
293
+
294
+ context "given a hash" do
295
+ let(:range) { { 'min' => 1, 'max' => 5, 'exclude_end' => true } }
296
+
297
+ it "returns the hash" do
298
+ is_expected.to eq(range)
299
+ end
300
+ end
301
+
302
+ context "given a hash missing fields" do
303
+ let(:range) { { 'min' => 1 } }
304
+
305
+ it "returns the hash" do
306
+ is_expected.to eq(range)
124
307
  end
125
308
  end
126
309
  end
127
310
 
128
311
  describe "#mongoize" do
312
+ subject { range.mongoize }
129
313
 
130
- context "when the value is not nil" do
314
+ context 'given a String' do
315
+ let(:range) { '3' }
131
316
 
132
- it "returns the object hash" do
133
- expect((1..3).mongoize).to eq({ "min" => 1, "max" => 3 })
317
+ it 'returns a string' do
318
+ is_expected.to eq('3')
134
319
  end
320
+ end
321
+
322
+ it_behaves_like 'mongoize range'
323
+ end
324
+
325
+ describe ".mongoize" do
326
+ subject { Range.mongoize(range) }
327
+
328
+ context 'given a String' do
329
+ let(:range) { '3' }
135
330
 
136
- it "returns the object hash when passed an inverse range" do
137
- expect((5..1).mongoize).to eq({ "min" => 5, "max" => 1 })
331
+ it "returns nil" do
332
+ is_expected.to be_nil
138
333
  end
334
+ end
139
335
 
140
- it "returns the object hash when passed a letter range" do
141
- expect(("a".."z").mongoize).to eq({ "min" => "a", "max" => "z" })
336
+ context "given a hash with wrong fields" do
337
+ let(:range) { { 'min' => 1, 'max' => 5, 'exclude_end^' => true} }
338
+
339
+ it "removes the bogus fields" do
340
+ is_expected.to eq({ 'min' => 1, 'max' => 5 })
142
341
  end
143
342
  end
144
343
 
145
- context 'when the value is a string' do
344
+ context "given a hash with no correct fields" do
345
+ let(:range) { { 'min^' => 1, 'max^' => 5, 'exclude_end^' => true} }
146
346
 
147
- it 'returns a string' do
148
- expect(Range.mongoize('3')).to eq('3')
347
+ it "returns nil" do
348
+ is_expected.to be_nil
149
349
  end
150
350
  end
351
+
352
+ it_behaves_like 'mongoize range'
151
353
  end
152
354
 
153
355
  describe "#resizable?" do
154
-
155
356
  let(:range) do
156
357
  1...3
157
358
  end
@@ -4,61 +4,86 @@ require "spec_helper"
4
4
 
5
5
  describe Mongoid::Extensions::Regexp do
6
6
 
7
- describe ".demongoize" do
7
+ [ :mongoize, :demongoize ].each do |method|
8
8
 
9
- let(:value) do
10
- Regexp.demongoize(/[^abc]/)
11
- end
9
+ describe ".#{method}" do
12
10
 
13
- it "returns the provided value" do
14
- expect(value).to eq(/[^abc]/)
15
- end
16
- end
11
+ context "when providing a regex" do
17
12
 
18
- describe ".mongoize" do
19
-
20
- context "when providing a regex" do
13
+ let(:value) do
14
+ Regexp.send(method, /[^abc]/)
15
+ end
21
16
 
22
- let(:value) do
23
- Regexp.mongoize(/[^abc]/)
17
+ it "returns the provided value" do
18
+ expect(value).to eq(/[^abc]/)
19
+ end
24
20
  end
25
21
 
26
- it "returns the provided value" do
27
- expect(value).to eq(/[^abc]/)
28
- end
29
- end
22
+ context "when providing a string" do
30
23
 
31
- context "when providing a string" do
24
+ let(:value) do
25
+ Regexp.send(method, "[^abc]")
26
+ end
32
27
 
33
- let(:value) do
34
- Regexp.mongoize("[^abc]")
35
- end
28
+ it "returns the provided value as a regex" do
29
+ expect(value).to eq(/[^abc]/)
30
+ end
36
31
 
37
- it "returns the provided value as a regex" do
38
- expect(value).to eq(/[^abc]/)
32
+
33
+ context "when the string is empty" do
34
+
35
+ let(:value) do
36
+ Regexp.send(method, "")
37
+ end
38
+
39
+ it "returns an empty regex" do
40
+ expect(value).to eq(//)
41
+ end
42
+ end
39
43
  end
40
44
 
45
+ context "when the value is nil" do
41
46
 
42
- context "when the string is empty" do
47
+ let(:value) do
48
+ Regexp.send(method, nil)
49
+ end
50
+
51
+ it "returns the nil" do
52
+ expect(value).to be_nil
53
+ end
54
+ end
55
+
56
+ context "when providing a BSON::Regexp::Raw" do
43
57
 
44
58
  let(:value) do
45
- Regexp.mongoize("")
59
+ Regexp.send(method, BSON::Regexp::Raw.new("hello"))
46
60
  end
47
61
 
48
- it "returns an empty regex" do
49
- expect(value).to eq(//)
62
+ it "returns a Regexp" do
63
+ expect(value).to eq(/hello/)
50
64
  end
51
65
  end
52
- end
53
66
 
54
- context "when the value is nil" do
67
+ context "when providing an invalid regexp" do
68
+
69
+ let(:value) do
70
+ Regexp.send(method, "[")
71
+ end
55
72
 
56
- let(:value) do
57
- Regexp.mongoize(nil)
73
+ it "returns nil" do
74
+ expect(value).to be_nil
75
+ end
58
76
  end
59
77
 
60
- it "returns the nil" do
61
- expect(value).to be_nil
78
+ context "when providing an invalid Regexp to a BSON::Regexp::Raw" do
79
+
80
+ let(:value) do
81
+ Regexp.send(method, BSON::Regexp::Raw.new("["))
82
+ end
83
+
84
+ it "returns nil" do
85
+ expect(value).to be_nil
86
+ end
62
87
  end
63
88
  end
64
89
  end
@@ -22,6 +22,37 @@ describe Mongoid::Extensions::Set do
22
22
  end
23
23
  end
24
24
 
25
+ describe ".demongoize" do
26
+
27
+ context "when passing an array" do
28
+
29
+ it "returns a set" do
30
+ expect(Set.demongoize([ "test" ])).to eq([ "test" ].to_set)
31
+ end
32
+ end
33
+
34
+ context "when passing a set" do
35
+
36
+ it "returns a set " do
37
+ expect(Set.demongoize(Set.new([ "test" ]))).to eq([ "test" ].to_set)
38
+ end
39
+ end
40
+
41
+ context "when passing nil" do
42
+
43
+ it "returns nil" do
44
+ expect(Set.demongoize(nil)).to be_nil
45
+ end
46
+ end
47
+
48
+ context "when passing an uncastable value" do
49
+
50
+ it "returns nil" do
51
+ expect(Set.demongoize("bogus")).to be_nil
52
+ end
53
+ end
54
+ end
55
+
25
56
  describe "#mongoize" do
26
57
 
27
58
  let(:set) do
@@ -31,5 +62,80 @@ describe Mongoid::Extensions::Set do
31
62
  it "returns an array" do
32
63
  expect(set.mongoize).to eq([ "test" ])
33
64
  end
65
+
66
+ context "when there are mongoizable values in the container" do
67
+ let(:date) do
68
+ Date.new(2012, 1, 1)
69
+ end
70
+
71
+ let(:mongoized) do
72
+ Set.mongoize(input)
73
+ end
74
+
75
+ context "when the input is an array" do
76
+
77
+ let(:input) do
78
+ [ date ]
79
+ end
80
+
81
+ it "mongoizes to a set" do
82
+ expect(mongoized).to be_a(Array)
83
+ end
84
+
85
+ it "mongoizes each element in the array" do
86
+ expect(mongoized.first).to be_a(Time)
87
+ end
88
+
89
+ it "converts the elements properly" do
90
+ expect(mongoized.first).to eq(Time.utc(2012, 1, 1, 0, 0, 0))
91
+ end
92
+ end
93
+
94
+ context "when the input is a set" do
95
+ let(:input) do
96
+ [ date ].to_set
97
+ end
98
+
99
+ it "mongoizes to a set" do
100
+ expect(mongoized).to be_a(Array)
101
+ end
102
+
103
+ it "converts the elements properly" do
104
+ expect(mongoized.first).to eq(Time.utc(2012, 1, 1, 0, 0, 0))
105
+ end
106
+ end
107
+ end
108
+
109
+ context "when the mongoizer creates duplicate elements" do
110
+ let(:mongoized) do
111
+ Set.mongoize(input)
112
+ end
113
+
114
+ before do
115
+ expect(BigDecimal).to receive(:mongoize).exactly(4).times.and_wrap_original do |m, *args|
116
+ 1
117
+ end
118
+ end
119
+
120
+ context "when the input is a set" do
121
+ let(:input) do
122
+ [ 1, 2, 3, 4 ].map(&:to_d).to_set
123
+ end
124
+
125
+ it "removes duplicates" do
126
+ expect(mongoized).to eq([ 1 ])
127
+ end
128
+ end
129
+
130
+ context "when the input is an array" do
131
+ let(:input) do
132
+ [ 1, 2, 3, 4 ].map(&:to_d)
133
+ end
134
+
135
+ it "removes duplicates" do
136
+ expect(mongoized).to eq([ 1 ])
137
+ end
138
+ end
139
+ end
34
140
  end
35
141
  end