mongoid 7.6.2 → 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 (333) 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 -56
  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/depending.rb +4 -8
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +28 -5
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  13. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  14. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  15. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  16. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  17. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  18. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  19. data/lib/mongoid/association/macros.rb +2 -1
  20. data/lib/mongoid/association/many.rb +5 -0
  21. data/lib/mongoid/association/nested/many.rb +5 -39
  22. data/lib/mongoid/association/nested/nested_buildable.rb +0 -14
  23. data/lib/mongoid/association/proxy.rb +12 -0
  24. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  25. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  26. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  27. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  28. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  29. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  30. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  31. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  32. data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -107
  33. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  34. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  35. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  36. data/lib/mongoid/association/relatable.rb +38 -4
  37. data/lib/mongoid/attributes/processing.rb +9 -2
  38. data/lib/mongoid/attributes.rb +30 -27
  39. data/lib/mongoid/cacheable.rb +2 -2
  40. data/lib/mongoid/changeable.rb +37 -2
  41. data/lib/mongoid/clients/factory.rb +0 -4
  42. data/lib/mongoid/clients/options.rb +4 -0
  43. data/lib/mongoid/clients/sessions.rb +2 -14
  44. data/lib/mongoid/config.rb +15 -73
  45. data/lib/mongoid/contextual/aggregable/memory.rb +22 -20
  46. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  47. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  48. data/lib/mongoid/contextual/memory.rb +63 -47
  49. data/lib/mongoid/contextual/mongo.rb +173 -287
  50. data/lib/mongoid/contextual/none.rb +33 -15
  51. data/lib/mongoid/copyable.rb +32 -8
  52. data/lib/mongoid/criteria/includable.rb +24 -20
  53. data/lib/mongoid/criteria/marshalable.rb +10 -2
  54. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  55. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  56. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  57. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  58. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  59. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  60. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  61. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  62. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  63. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  64. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  65. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  66. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  67. data/lib/mongoid/criteria/queryable/mergeable.rb +0 -12
  68. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  69. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  70. data/lib/mongoid/criteria/queryable/selectable.rb +2 -133
  71. data/lib/mongoid/criteria/queryable/selector.rb +90 -5
  72. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  73. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  74. data/lib/mongoid/criteria/queryable.rb +11 -6
  75. data/lib/mongoid/criteria.rb +1 -28
  76. data/lib/mongoid/deprecable.rb +36 -0
  77. data/lib/mongoid/deprecation.rb +25 -0
  78. data/lib/mongoid/document.rb +88 -33
  79. data/lib/mongoid/equality.rb +4 -4
  80. data/lib/mongoid/errors/document_not_found.rb +6 -2
  81. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  82. data/lib/mongoid/errors/invalid_field.rb +5 -1
  83. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  84. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  85. data/lib/mongoid/errors.rb +2 -3
  86. data/lib/mongoid/extensions/array.rb +8 -6
  87. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  88. data/lib/mongoid/extensions/binary.rb +42 -0
  89. data/lib/mongoid/extensions/boolean.rb +8 -2
  90. data/lib/mongoid/extensions/date.rb +26 -20
  91. data/lib/mongoid/extensions/date_time.rb +1 -1
  92. data/lib/mongoid/extensions/float.rb +4 -5
  93. data/lib/mongoid/extensions/hash.rb +13 -32
  94. data/lib/mongoid/extensions/integer.rb +4 -5
  95. data/lib/mongoid/extensions/object.rb +2 -0
  96. data/lib/mongoid/extensions/range.rb +41 -10
  97. data/lib/mongoid/extensions/regexp.rb +11 -4
  98. data/lib/mongoid/extensions/set.rb +11 -4
  99. data/lib/mongoid/extensions/string.rb +2 -13
  100. data/lib/mongoid/extensions/symbol.rb +3 -14
  101. data/lib/mongoid/extensions/time.rb +27 -16
  102. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  103. data/lib/mongoid/extensions.rb +1 -0
  104. data/lib/mongoid/factory.rb +42 -7
  105. data/lib/mongoid/fields/foreign_key.rb +7 -0
  106. data/lib/mongoid/fields/validators/macro.rb +3 -9
  107. data/lib/mongoid/fields.rb +49 -7
  108. data/lib/mongoid/findable.rb +21 -16
  109. data/lib/mongoid/indexable/specification.rb +1 -1
  110. data/lib/mongoid/indexable/validators/options.rb +4 -1
  111. data/lib/mongoid/interceptable.rb +69 -9
  112. data/lib/mongoid/matchable.rb +1 -6
  113. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +5 -3
  114. data/lib/mongoid/matcher/regex.rb +9 -8
  115. data/lib/mongoid/matcher.rb +0 -1
  116. data/lib/mongoid/persistable/creatable.rb +14 -5
  117. data/lib/mongoid/persistable/updatable.rb +12 -5
  118. data/lib/mongoid/persistence_context.rb +8 -42
  119. data/lib/mongoid/query_cache.rb +6 -258
  120. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  121. data/lib/mongoid/reloadable.rb +7 -3
  122. data/lib/mongoid/scopable.rb +9 -11
  123. data/lib/mongoid/selectable.rb +1 -2
  124. data/lib/mongoid/shardable.rb +11 -35
  125. data/lib/mongoid/stateful.rb +27 -1
  126. data/lib/mongoid/threaded.rb +0 -3
  127. data/lib/mongoid/timestamps/created.rb +1 -1
  128. data/lib/mongoid/timestamps/updated.rb +1 -1
  129. data/lib/mongoid/touchable.rb +2 -3
  130. data/lib/mongoid/traversable.rb +1 -0
  131. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  132. data/lib/mongoid/version.rb +1 -5
  133. data/lib/mongoid/warnings.rb +3 -5
  134. data/lib/mongoid.rb +1 -0
  135. data/spec/config/mongoid.yml +16 -0
  136. data/spec/integration/app_spec.rb +8 -20
  137. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  138. data/spec/integration/associations/embedded_spec.rb +15 -0
  139. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  140. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  141. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  142. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  143. data/spec/integration/associations/has_one_spec.rb +97 -1
  144. data/spec/integration/associations/scope_option_spec.rb +1 -1
  145. data/spec/integration/callbacks_models.rb +95 -1
  146. data/spec/integration/callbacks_spec.rb +226 -4
  147. data/spec/integration/criteria/range_spec.rb +95 -1
  148. data/spec/integration/discriminator_key_spec.rb +115 -76
  149. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  150. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  151. data/spec/integration/matcher_examples_spec.rb +20 -13
  152. data/spec/integration/matcher_operator_data/regex.yml +0 -21
  153. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  154. data/spec/integration/matcher_operator_spec.rb +3 -5
  155. data/spec/integration/persistence/range_field_spec.rb +350 -0
  156. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  157. data/spec/mongoid/association/depending_spec.rb +9 -9
  158. data/spec/mongoid/association/eager_spec.rb +2 -1
  159. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  160. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  161. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  162. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  163. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
  164. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  165. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  166. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  167. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  168. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  169. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  170. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  171. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  172. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  173. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  174. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  175. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +36 -51
  176. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  177. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  178. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  179. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  180. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +60 -156
  181. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  182. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  183. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  184. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  185. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  186. data/spec/mongoid/association/syncable_spec.rb +14 -0
  187. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  188. data/spec/mongoid/attributes/nested_spec.rb +73 -198
  189. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  190. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  191. data/spec/mongoid/attributes_spec.rb +480 -27
  192. data/spec/mongoid/cacheable_spec.rb +3 -3
  193. data/spec/mongoid/changeable_spec.rb +130 -13
  194. data/spec/mongoid/clients/factory_spec.rb +22 -60
  195. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  196. data/spec/mongoid/clients_spec.rb +2 -2
  197. data/spec/mongoid/config_spec.rb +52 -15
  198. data/spec/mongoid/contextual/aggregable/memory_spec.rb +371 -231
  199. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  200. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  201. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  202. data/spec/mongoid/contextual/memory_spec.rb +467 -156
  203. data/spec/mongoid/contextual/mongo_spec.rb +566 -426
  204. data/spec/mongoid/contextual/none_spec.rb +11 -19
  205. data/spec/mongoid/copyable_spec.rb +451 -2
  206. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  207. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  208. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  209. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  210. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  211. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  212. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +1 -2
  213. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  214. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  215. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +1 -2
  216. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  217. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  218. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  219. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  220. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  221. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -2
  222. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  223. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +0 -200
  224. data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
  225. data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
  226. data/spec/mongoid/criteria_spec.rb +469 -1203
  227. data/spec/mongoid/document_fields_spec.rb +173 -24
  228. data/spec/mongoid/document_spec.rb +32 -41
  229. data/spec/mongoid/equality_spec.rb +12 -12
  230. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  231. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  232. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  233. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  234. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  235. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  236. data/spec/mongoid/extensions/array_spec.rb +16 -2
  237. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  238. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  239. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  240. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  241. data/spec/mongoid/extensions/date_spec.rb +71 -1
  242. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  243. data/spec/mongoid/extensions/float_spec.rb +48 -76
  244. data/spec/mongoid/extensions/hash_spec.rb +30 -236
  245. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  246. data/spec/mongoid/extensions/range_spec.rb +255 -54
  247. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  248. data/spec/mongoid/extensions/set_spec.rb +106 -0
  249. data/spec/mongoid/extensions/string_spec.rb +53 -25
  250. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  251. data/spec/mongoid/extensions/time_spec.rb +634 -66
  252. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  253. data/spec/mongoid/factory_spec.rb +61 -1
  254. data/spec/mongoid/fields_spec.rb +321 -50
  255. data/spec/mongoid/findable_spec.rb +64 -29
  256. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  257. data/spec/mongoid/indexable_spec.rb +16 -19
  258. data/spec/mongoid/interceptable_spec.rb +584 -5
  259. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  260. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  261. data/spec/mongoid/mongoizable_spec.rb +285 -0
  262. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  263. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  264. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  265. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  266. data/spec/mongoid/persistence_context_spec.rb +24 -0
  267. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  268. data/spec/mongoid/query_cache_spec.rb +1 -156
  269. data/spec/mongoid/reloadable_spec.rb +35 -2
  270. data/spec/mongoid/scopable_spec.rb +36 -34
  271. data/spec/mongoid/serializable_spec.rb +14 -7
  272. data/spec/mongoid/shardable_models.rb +0 -14
  273. data/spec/mongoid/shardable_spec.rb +61 -153
  274. data/spec/mongoid/stateful_spec.rb +28 -0
  275. data/spec/mongoid/timestamps_spec.rb +390 -0
  276. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  277. data/spec/mongoid/touchable_spec.rb +116 -0
  278. data/spec/mongoid/touchable_spec_models.rb +12 -8
  279. data/spec/mongoid/traversable_spec.rb +4 -11
  280. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  281. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  282. data/spec/mongoid/warnings_spec.rb +35 -0
  283. data/spec/mongoid_spec.rb +1 -7
  284. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  285. data/spec/rails/mongoid_spec.rb +4 -16
  286. data/spec/shared/lib/mrss/cluster_config.rb +40 -5
  287. data/spec/shared/lib/mrss/constraints.rb +46 -7
  288. data/spec/shared/lib/mrss/docker_runner.rb +21 -17
  289. data/spec/shared/lib/mrss/eg_config_utils.rb +31 -0
  290. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  291. data/spec/shared/lib/mrss/lite_constraints.rb +2 -10
  292. data/spec/shared/lib/mrss/server_version_registry.rb +29 -18
  293. data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
  294. data/spec/shared/lib/mrss/utils.rb +6 -28
  295. data/spec/shared/share/Dockerfile.erb +114 -38
  296. data/spec/shared/shlib/distro.sh +0 -10
  297. data/spec/shared/shlib/server.sh +83 -64
  298. data/spec/shared/shlib/set_env.sh +81 -16
  299. data/spec/support/constraints.rb +24 -0
  300. data/spec/support/expectations.rb +17 -20
  301. data/spec/support/macros.rb +30 -0
  302. data/spec/support/models/augmentation.rb +12 -0
  303. data/spec/support/models/band.rb +3 -0
  304. data/spec/support/models/catalog.rb +24 -0
  305. data/spec/support/models/circus.rb +3 -0
  306. data/spec/support/models/fanatic.rb +8 -0
  307. data/spec/support/models/implant.rb +9 -0
  308. data/spec/support/models/label.rb +2 -0
  309. data/spec/support/models/passport.rb +9 -0
  310. data/spec/support/models/person.rb +1 -0
  311. data/spec/support/models/player.rb +2 -0
  312. data/spec/support/models/powerup.rb +12 -0
  313. data/spec/support/models/registry.rb +1 -0
  314. data/spec/support/models/school.rb +14 -0
  315. data/spec/support/models/shield.rb +18 -0
  316. data/spec/support/models/student.rb +14 -0
  317. data/spec/support/models/weapon.rb +12 -0
  318. data.tar.gz.sig +0 -0
  319. metadata +695 -650
  320. metadata.gz.sig +0 -0
  321. data/lib/mongoid/errors/eager_load.rb +0 -23
  322. data/lib/mongoid/errors/in_memory_regexp_timeout.rb +0 -26
  323. data/lib/mongoid/errors/invalid_value.rb +0 -17
  324. data/lib/mongoid/field_readable.rb +0 -70
  325. data/lib/mongoid/matcher/regexp_budget.rb +0 -389
  326. data/spec/integration/matcher_regexp_timeout_spec.rb +0 -215
  327. data/spec/integration/query_operator_guard_spec.rb +0 -89
  328. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  329. data/spec/mongoid/matcher/regexp_budget_spec.rb +0 -570
  330. data/spec/shared/CANDIDATE.md +0 -28
  331. data/spec/shared/lib/mrss/release/candidate.rb +0 -287
  332. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  333. data/spec/shared/lib/tasks/candidate.rake +0 -64
@@ -9,10 +9,6 @@ describe Mongoid::Contextual::Aggregable::Memory do
9
9
  end
10
10
 
11
11
  describe "#aggregates" do
12
- let(:context) do
13
- Mongoid::Contextual::Memory.new(criteria)
14
- end
15
-
16
12
  subject { context.aggregates(:likes) }
17
13
 
18
14
  context 'when no documents found' do
@@ -50,384 +46,528 @@ describe Mongoid::Contextual::Aggregable::Memory do
50
46
 
51
47
  describe "#avg" do
52
48
 
53
- context "when provided a single field" do
49
+ context "when the types are Integers" do
54
50
 
55
- context "when there are matching documents" do
51
+ let!(:depeche) do
52
+ Band.create!(name: "Depeche Mode", likes: 1000)
53
+ end
56
54
 
57
- context "when the types are integers" do
55
+ let!(:tool) do
56
+ Band.create!(name: "Tool", likes: 500)
57
+ end
58
58
 
59
- let!(:depeche) do
60
- Band.create!(name: "Depeche Mode", likes: 1000)
61
- end
59
+ let(:criteria) do
60
+ Band.all.tap do |criteria|
61
+ criteria.documents = [ depeche, tool ]
62
+ end
63
+ end
62
64
 
63
- let!(:tool) do
64
- Band.create!(name: "Tool", likes: 500)
65
- end
65
+ let(:avg) do
66
+ context.avg(:likes)
67
+ end
66
68
 
67
- let(:criteria) do
68
- Band.all.tap do |criteria|
69
- criteria.documents = [ depeche, tool ]
70
- end
71
- end
69
+ it "returns the avg of the provided field" do
70
+ expect(avg).to eq(750)
71
+ end
72
72
 
73
- let(:context) do
74
- Mongoid::Contextual::Memory.new(criteria)
75
- end
73
+ it 'returns a float' do
74
+ avg.should be_a(Float)
75
+ end
76
76
 
77
- let(:avg) do
78
- context.avg(:likes)
79
- end
77
+ context 'when integers are negative' do
80
78
 
81
- it "returns the avg of the provided field" do
82
- expect(avg).to eq(750)
83
- end
79
+ let!(:depeche) do
80
+ Band.create!(name: "Depeche Mode", likes: -1000)
84
81
  end
85
82
 
86
- context "when the types are floats" do
87
-
88
- let!(:depeche) do
89
- Band.create!(name: "Depeche Mode", rating: 10)
90
- end
83
+ it "returns the avg of the provided field" do
84
+ expect(avg).to eq(-250)
85
+ end
91
86
 
92
- let!(:tool) do
93
- Band.create!(name: "Tool", rating: 5)
94
- end
87
+ it 'returns a float' do
88
+ avg.should be_a(Float)
89
+ end
90
+ end
91
+ end
95
92
 
96
- let(:criteria) do
97
- Band.all.tap do |criteria|
98
- criteria.documents = [ depeche, tool ]
99
- end
100
- end
93
+ context "when the types are Floats" do
101
94
 
102
- let(:context) do
103
- Mongoid::Contextual::Memory.new(criteria)
104
- end
95
+ let!(:depeche) do
96
+ Band.create!(name: "Depeche Mode", rating: 10)
97
+ end
105
98
 
106
- let(:avg) do
107
- context.avg(:rating)
108
- end
99
+ let!(:tool) do
100
+ Band.create!(name: "Tool", rating: 5)
101
+ end
109
102
 
110
- it "returns the avg of the provided field" do
111
- expect(avg).to eq(7.5)
112
- end
103
+ let(:criteria) do
104
+ Band.all.tap do |criteria|
105
+ criteria.documents = [ depeche, tool ]
113
106
  end
114
107
  end
115
108
 
116
- context "when no documents match" do
109
+ let(:avg) do
110
+ context.avg(:rating)
111
+ end
117
112
 
118
- let!(:depeche) do
119
- Band.create!(name: "Depeche Mode", likes: 1000)
120
- end
113
+ it "returns the avg of the provided field" do
114
+ expect(avg).to eq(7.5)
115
+ end
116
+ end
121
117
 
122
- let(:criteria) do
123
- Band.where(name: "New Order")
124
- end
118
+ context "when no documents match" do
125
119
 
126
- let(:context) do
127
- Mongoid::Contextual::Memory.new(criteria)
128
- end
120
+ let!(:depeche) do
121
+ Band.create!(name: "Depeche Mode", likes: 1000)
122
+ end
129
123
 
130
- let(:avg) do
131
- context.avg(:likes)
124
+ let(:criteria) do
125
+ Band.where(name: "New Order")
126
+ end
127
+
128
+ let(:avg) do
129
+ context.avg(:likes)
130
+ end
131
+
132
+ it "returns nil" do
133
+ expect(avg).to be_nil
134
+ end
135
+ end
136
+
137
+ context "when there are a mix of types" do
138
+
139
+ let!(:bands) do
140
+ [ Band.create!(name: "The Flaming Lips", mojo: 7.7),
141
+ Band.create!(name: "Spirit of the Beehive", mojo: 10),
142
+ Band.create!(name: "Justin Bieber", mojo: nil) ]
143
+ end
144
+
145
+ let(:criteria) do
146
+ Band.all.tap do |criteria|
147
+ criteria.documents = bands
132
148
  end
149
+ end
133
150
 
134
- it "returns nil" do
135
- expect(avg).to be_nil
151
+ let(:avg) do
152
+ context.avg(:mojo)
153
+ end
154
+
155
+ it "coerces types to calculate avg" do
156
+ expect(avg).to eq(8.85)
157
+ end
158
+
159
+ it "database only averages Numeric types" do
160
+ expect(Band.all.avg(:mojo)).to be_within(0.000001).of(8.85)
161
+ end
162
+ end
163
+
164
+ context "when there no numeric values" do
165
+
166
+ let!(:bands) do
167
+ [ Band.create!(name: "Justin Bieber", mojo: nil) ]
168
+ end
169
+
170
+ let(:criteria) do
171
+ Band.all.tap do |criteria|
172
+ criteria.documents = bands
136
173
  end
137
174
  end
175
+
176
+ let(:avg) do
177
+ context.avg(:mojo)
178
+ end
179
+
180
+ it "returns avg as nil" do
181
+ expect(avg).to be_nil
182
+ end
183
+
184
+ it "database returns avg as nil" do
185
+ expect(Band.all.avg(:mojo)).to eq(nil)
186
+ end
138
187
  end
139
188
  end
140
189
 
141
190
  describe "#max" do
142
191
 
143
- context "when provided a single field" do
192
+ let!(:depeche) do
193
+ Band.create!(name: "Depeche Mode", likes: 1000)
194
+ end
195
+
196
+ let!(:tool) do
197
+ Band.create!(name: "Tool", likes: 500)
198
+ end
144
199
 
145
- let!(:depeche) do
146
- Band.create!(name: "Depeche Mode", likes: 1000)
200
+ let(:criteria) do
201
+ Band.all.tap do |crit|
202
+ crit.documents = [ depeche, tool ]
147
203
  end
204
+ end
148
205
 
149
- let!(:tool) do
150
- Band.create!(name: "Tool", likes: 500)
151
- end
206
+ context "when provided a Symbol" do
152
207
 
153
- let(:criteria) do
154
- Band.all.tap do |crit|
155
- crit.documents = [ depeche, tool ]
156
- end
208
+ let(:max) do
209
+ context.max(:likes)
157
210
  end
158
211
 
159
- let(:context) do
160
- Mongoid::Contextual::Memory.new(criteria)
212
+ it "returns the max of the provided field" do
213
+ expect(max).to eq(1000)
161
214
  end
162
215
 
163
- context "when provided a symbol" do
216
+ context "when no documents match" do
217
+
218
+ let(:criteria) do
219
+ Band.where(name: "New Order")
220
+ end
164
221
 
165
222
  let(:max) do
166
223
  context.max(:likes)
167
224
  end
168
225
 
169
- it "returns the max of the provided field" do
170
- expect(max).to eq(1000)
226
+ it "returns nil" do
227
+ expect(max).to be_nil
171
228
  end
229
+ end
172
230
 
173
- context "when no documents match" do
231
+ context "when there are a mix of types" do
174
232
 
175
- let(:criteria) do
176
- Band.where(name: "New Order")
177
- end
233
+ let!(:bands) do
234
+ [ Band.create!(name: "The Flaming Lips", mojo: 7.7),
235
+ Band.create!(name: "Spirit of the Beehive", mojo: 10),
236
+ Band.create!(name: "Justin Bieber", mojo: nil) ]
237
+ end
178
238
 
179
- let(:context) do
180
- Mongoid::Contextual::Memory.new(criteria)
239
+ let(:criteria) do
240
+ Band.all.tap do |criteria|
241
+ criteria.documents = bands
181
242
  end
243
+ end
182
244
 
183
- let(:max) do
184
- context.max(:likes)
185
- end
245
+ let(:max) do
246
+ context.max(:mojo)
247
+ end
186
248
 
187
- it "returns nil" do
188
- expect(max).to be_nil
189
- end
249
+ it "coerces types to calculate max" do
250
+ expect(max).to eq 10
251
+ expect(max).to be_a Integer
190
252
  end
191
253
  end
192
254
 
193
- context "when provided a block" do
255
+ context "when there no numeric values" do
194
256
 
195
- let(:max) do
196
- context.max do |a, b|
197
- a.likes <=> b.likes
257
+ let!(:bands) do
258
+ [ Band.create!(name: "Justin Bieber", mojo: nil) ]
259
+ end
260
+
261
+ let(:criteria) do
262
+ Band.all.tap do |criteria|
263
+ criteria.documents = bands
198
264
  end
199
265
  end
200
266
 
201
- it "returns the document with the max value for the field" do
202
- expect(max).to eq(depeche)
267
+ let(:max) do
268
+ context.avg(:mojo)
269
+ end
270
+
271
+ it "returns max as nil" do
272
+ expect(max).to be_nil
203
273
  end
204
274
  end
205
275
  end
276
+
277
+ context "when provided a block" do
278
+
279
+ let(:max) do
280
+ context.max do |a, b|
281
+ a.likes <=> b.likes
282
+ end
283
+ end
284
+
285
+ it "returns the document with the max value for the field" do
286
+ expect(max).to eq(depeche)
287
+ end
288
+ end
206
289
  end
207
290
 
208
291
  describe "#min" do
209
292
 
210
- context "when provided a single field" do
293
+ let!(:depeche) do
294
+ Band.create!(name: "Depeche Mode", likes: 1000)
295
+ end
211
296
 
212
- let!(:depeche) do
213
- Band.create!(name: "Depeche Mode", likes: 1000)
214
- end
297
+ let!(:tool) do
298
+ Band.create!(name: "Tool", likes: 500)
299
+ end
215
300
 
216
- let!(:tool) do
217
- Band.create!(name: "Tool", likes: 500)
301
+ let(:criteria) do
302
+ Band.all.tap do |crit|
303
+ crit.documents = [ depeche, tool ]
218
304
  end
305
+ end
219
306
 
220
- let(:criteria) do
221
- Band.all.tap do |crit|
222
- crit.documents = [ depeche, tool ]
223
- end
307
+ context "when provided a Symbol" do
308
+
309
+ let(:min) do
310
+ context.min(:likes)
224
311
  end
225
312
 
226
- let(:context) do
227
- Mongoid::Contextual::Memory.new(criteria)
313
+ it "returns the min of the provided field" do
314
+ expect(min).to eq(500)
228
315
  end
229
316
 
230
- context "when provided a symbol" do
317
+ context "when no documents match" do
318
+
319
+ let(:criteria) do
320
+ Band.where(name: "New Order")
321
+ end
231
322
 
232
323
  let(:min) do
233
324
  context.min(:likes)
234
325
  end
235
326
 
236
- it "returns the min of the provided field" do
237
- expect(min).to eq(500)
327
+ it "returns nil" do
328
+ expect(min).to be_nil
238
329
  end
330
+ end
239
331
 
240
- context "when no documents match" do
332
+ context "when there are a mix of types" do
241
333
 
242
- let(:criteria) do
243
- Band.where(name: "New Order")
244
- end
334
+ let!(:bands) do
335
+ [ Band.create!(name: "The Flaming Lips", mojo: 7.7),
336
+ Band.create!(name: "Spirit of the Beehive", mojo: 10),
337
+ Band.create!(name: "Justin Bieber", mojo: nil) ]
338
+ end
245
339
 
246
- let(:context) do
247
- Mongoid::Contextual::Memory.new(criteria)
340
+ let(:criteria) do
341
+ Band.all.tap do |criteria|
342
+ criteria.documents = bands
248
343
  end
344
+ end
249
345
 
250
- let(:min) do
251
- context.min(:likes)
252
- end
346
+ let(:min) do
347
+ context.min(:mojo)
348
+ end
253
349
 
254
- it "returns nil" do
255
- expect(min).to be_nil
256
- end
350
+ it "coerces types to calculate min" do
351
+ expect(min).to eq 7.7
352
+ expect(min).to be_a Float
257
353
  end
258
354
  end
259
355
 
260
- context "when provided a block" do
356
+ context "when there no numeric values" do
261
357
 
262
- let(:min) do
263
- context.min do |a, b|
264
- a.likes <=> b.likes
358
+ let!(:bands) do
359
+ [ Band.create!(name: "Justin Bieber", mojo: nil) ]
360
+ end
361
+
362
+ let(:criteria) do
363
+ Band.all.tap do |criteria|
364
+ criteria.documents = bands
265
365
  end
266
366
  end
267
367
 
268
- it "returns the document with the min value for the field" do
269
- expect(min).to eq(tool)
368
+ let(:min) do
369
+ context.min(:mojo)
370
+ end
371
+
372
+ it "returns min as nil" do
373
+ expect(min).to be_nil
270
374
  end
271
375
  end
272
376
  end
377
+
378
+ context "when provided a block" do
379
+
380
+ let(:min) do
381
+ context.min do |a, b|
382
+ a.likes <=> b.likes
383
+ end
384
+ end
385
+
386
+ it "returns the document with the min value for the field" do
387
+ expect(min).to eq(tool)
388
+ end
389
+ end
273
390
  end
274
391
 
275
392
  describe "#sum" do
276
393
 
277
- context "when provided a single field" do
394
+ let!(:depeche) do
395
+ Band.create!(name: "Depeche Mode", likes: 1000)
396
+ end
278
397
 
279
- let!(:depeche) do
280
- Band.create!(name: "Depeche Mode", likes: 1000)
398
+ let!(:tool) do
399
+ Band.create!(name: "Tool", likes: 500)
400
+ end
401
+
402
+ let(:criteria) do
403
+ Band.all.tap do |crit|
404
+ crit.documents = [ depeche, tool ]
281
405
  end
406
+ end
282
407
 
283
- let!(:tool) do
284
- Band.create!(name: "Tool", likes: 500)
408
+ context 'when values are integers' do
409
+
410
+ let(:sum) do
411
+ context.sum(:likes)
285
412
  end
286
413
 
287
- let(:criteria) do
288
- Band.all.tap do |crit|
289
- crit.documents = [ depeche, tool ]
414
+ shared_examples 'sums and returns an integer' do
415
+ it 'sums' do
416
+ sum.should == 1500
290
417
  end
291
- end
292
418
 
293
- let(:context) do
294
- Mongoid::Contextual::Memory.new(criteria)
419
+ it 'returns integer' do
420
+ sum.should be_a(Integer)
421
+ end
295
422
  end
296
423
 
297
- context "when provided a symbol" do
424
+ include_examples 'sums and returns an integer'
298
425
 
299
- let(:sum) do
300
- context.sum(:likes)
301
- end
426
+ context 'when values are numeric strings' do
302
427
 
303
- it "returns the sum of the provided field" do
304
- expect(sum).to eq(1500)
428
+ let!(:depeche) do
429
+ Band.create!(name: "Depeche Mode", likes: '1000')
305
430
  end
306
431
 
307
- context "when no documents match" do
432
+ include_examples 'sums and returns an integer'
433
+ end
308
434
 
309
- let(:criteria) do
310
- Band.where(name: "New Order")
311
- end
435
+ context 'when values are negative integers' do
312
436
 
313
- let(:context) do
314
- Mongoid::Contextual::Memory.new(criteria)
315
- end
437
+ let!(:depeche) do
438
+ Band.create!(name: "Depeche Mode", likes: -1000)
439
+ end
316
440
 
317
- let(:sum) do
318
- context.sum(:likes)
441
+ shared_examples 'sums and returns an integer' do
442
+ it 'sums' do
443
+ sum.should == -500
319
444
  end
320
445
 
321
- it "returns zero" do
322
- expect(sum).to eq(0)
446
+ it 'returns integer' do
447
+ sum.should be_a(Integer)
323
448
  end
324
449
  end
325
- end
326
450
 
327
- context "when provided a block" do
451
+ include_examples 'sums and returns an integer'
328
452
 
329
- let(:sum) do
330
- context.sum(&:likes)
331
- end
453
+ context 'when values are negative numeric strings' do
332
454
 
333
- it "returns the sum for the provided block" do
334
- expect(sum).to eq(1500)
455
+ let!(:depeche) do
456
+ Band.create!(name: "Depeche Mode", likes: '-1000')
457
+ end
458
+
459
+ include_examples 'sums and returns an integer'
335
460
  end
336
461
  end
337
462
  end
338
- end
339
463
 
340
- context "when the field name is a method name" do
464
+ context 'when values are floats' do
341
465
 
342
- let!(:depeche) do
343
- Band.create!(name: "Depeche Mode", likes: 1000)
344
- end
466
+ let!(:depeche) do
467
+ Band.create!(name: "Depeche Mode", likes: 1000.0)
468
+ end
345
469
 
346
- let(:criteria) do
347
- Band.all.tap do |crit|
348
- crit.documents = [ depeche ]
470
+ let(:sum) do
471
+ context.sum(:likes)
349
472
  end
350
- end
351
473
 
352
- it "does not call the method for sum" do
353
- expect(depeche).not_to receive(:delete)
354
- expect(context.sum(:delete)).to eq(0)
355
- end
474
+ it 'sums' do
475
+ sum.should == 1500
476
+ end
356
477
 
357
- it "does not call the method for min" do
358
- expect(depeche).not_to receive(:delete)
359
- expect(context.min(:delete)).to be_nil
478
+ it 'returns integer' do
479
+ sum.should be_a(Integer)
480
+ end
360
481
  end
361
482
 
362
- it "does not call the method for max" do
363
- expect(depeche).not_to receive(:delete)
364
- expect(context.max(:delete)).to be_nil
365
- end
483
+ context "when provided a Symbol" do
366
484
 
367
- it "does not call the method for avg" do
368
- expect(depeche).not_to receive(:delete)
369
- expect(context.avg(:delete)).to eq(0.0)
370
- end
485
+ let(:sum) do
486
+ context.sum(:likes)
487
+ end
371
488
 
372
- it "does not call the method for aggregates" do
373
- expect(depeche).not_to receive(:delete)
374
- expect(context.aggregates(:delete))
375
- .to eq("count" => 0, "avg" => 0.0, "max" => nil, "min" => nil, "sum" => 0)
376
- end
489
+ it "returns the sum of the provided field" do
490
+ expect(sum).to eq(1500)
491
+ end
377
492
 
378
- it "does not call a private method for avg" do
379
- expect(depeche).not_to receive(:exit)
380
- expect(context.avg(:exit)).to eq(0.0)
381
- end
382
- end
493
+ context "when no documents match" do
383
494
 
384
- context "when the field is not defined" do
495
+ let(:criteria) do
496
+ Band.where(name: "New Order")
497
+ end
385
498
 
386
- let!(:depeche) do
387
- Band.create!(name: "Depeche Mode", likes: 1000)
388
- end
499
+ let(:sum) do
500
+ context.sum(:likes)
501
+ end
389
502
 
390
- let(:criteria) do
391
- Band.all.tap do |crit|
392
- crit.documents = [ depeche ]
503
+ it "returns zero" do
504
+ expect(sum).to eq(0)
505
+ end
393
506
  end
394
- end
395
507
 
396
- it "returns zero for sum" do
397
- expect(context.sum(:not_a_field)).to eq(0)
398
- end
508
+ context "when there are a mix of types" do
399
509
 
400
- it "returns nil for min" do
401
- expect(context.min(:not_a_field)).to be_nil
402
- end
510
+ let!(:bands) do
511
+ [ Band.create!(name: "The Flaming Lips", mojo: 7.7),
512
+ Band.create!(name: "Spirit of the Beehive", mojo: 10),
513
+ Band.create!(name: "Justin Bieber", mojo: nil) ]
514
+ end
403
515
 
404
- it "returns nil for max" do
405
- expect(context.max(:not_a_field)).to be_nil
406
- end
516
+ let(:criteria) do
517
+ Band.all.tap do |criteria|
518
+ criteria.documents = bands
519
+ end
520
+ end
407
521
 
408
- it "returns zero for avg" do
409
- expect(context.avg(:not_a_field)).to eq(0.0)
410
- end
411
- end
522
+ let(:sum) do
523
+ context.sum(:mojo)
524
+ end
412
525
 
413
- context "when the field is the foreign key of a many to many association" do
526
+ it "coerces types to calculate sum" do
527
+ expect(sum).to eq 17.7
528
+ expect(sum).to be_a Float
529
+ end
414
530
 
415
- let!(:preference) do
416
- Preference.create!(name: "nature")
417
- end
531
+ it "database only sums Float and Integer types" do
532
+ expect(Band.all.sum(:mojo)).to be_within(Float::EPSILON).of(17.7)
533
+ end
534
+ end
418
535
 
419
- let!(:person) do
420
- Person.new(preferences: [ preference ])
421
- end
536
+ context "when there no numeric values" do
422
537
 
423
- let(:criteria) do
424
- Person.all.tap do |crit|
425
- crit.documents = [ person ]
538
+ let!(:bands) do
539
+ [ Band.create!(name: "Justin Bieber", mojo: nil) ]
540
+ end
541
+
542
+ let(:criteria) do
543
+ Band.all.tap do |criteria|
544
+ criteria.documents = bands
545
+ end
546
+ end
547
+
548
+ let(:sum) do
549
+ context.sum(:mojo)
550
+ end
551
+
552
+ it "returns sum as zero" do
553
+ expect(sum).to eq 0
554
+ end
555
+
556
+ it "database returns sum as zero" do
557
+ expect(Band.all.sum(:mojo)).to eq(0)
558
+ end
426
559
  end
427
560
  end
428
561
 
429
- it "aggregates the stored ids" do
430
- expect(context.max(:preference_ids)).to eq([ preference.id ])
562
+ context "when provided a block" do
563
+
564
+ let(:sum) do
565
+ context.sum(&:likes)
566
+ end
567
+
568
+ it "returns the sum for the provided block" do
569
+ expect(sum).to eq(1500)
570
+ end
431
571
  end
432
572
  end
433
573
  end